«условные» участки - PullRequest
       3

«условные» участки

3 голосов
/ 11 сентября 2011

Мне любопытно, как построить функцию, которая определена примерно так:

 if(x < 1)
   f(x) = x/10 * 1.2
 if(x < 3)
   f(x) = x/12 * 1.7
 ...
 else
   f(x) = x/15 * 2

Если бы функция была простой, скажем, f (x) = x / 10 * x / 5, тогда было бынет проблем, и можно использовать метод кривой ().Однако я не уверен, как лучше всего справляться с более сложными функциями, такими как приведенная выше.Есть идеи?Бонусные баллы, если можно использовать ggplot ():)

Ответы [ 3 ]

8 голосов
/ 11 сентября 2011

Кривая все еще возможна.(И когда вы читаете статистическую литературу, эта формулировка проявляется как I [x], где «I» означает «индикатор».)

curve( (x <1)*( (x/10)*1.2 ) +       # one line for each case
       (!(x <1)&(x<3) )*(x/12)*1.7 + # logical times (local) function
        (x >=3)*(x/15)*2 ,
        0,4)                         # limits

enter image description here

4 голосов
/ 13 сентября 2011

Дело вкуса, но я предпочитаю ifelse, чем Показатели Двинса (как в комментарии к MBQ). Для сравнения:

curve(
    (x <1)           * ( (x/10)*1.2 ) +
    (!(x <1)&(x<3) ) * ( (x/12)*1.7 ) +
    (x >=3)          * ( (x/15)*2   ) ,
    0,4)

# versus

curve(
    ifelse(x < 1, (x/10)*1.2,
    ifelse(x < 3, (x/12)*1.7,
                  (x/15)*2    )),
    0,4)
4 голосов
/ 11 сентября 2011

Вы ищете что-то вроде stepfun?

fn <- stepfun(c(1,2,3,4,5),c(0,1,2,3,4,5))
plot(fn,verticals = FALSE)

enter image description here

Способ задания функции будет немного другим, но его довольно легко понять, прочитав ?stepfun и подготовив несколько примеров самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...