Как подобрать модель NLS со смешанными эффектами - PullRequest
1 голос
/ 21 апреля 2019

Я хочу подобрать модель линейного плато со случайными эффектами. Я нашел способ согласовать функцию с nls(), но я не знаю, как включить случайные эффекты. Вот что у меня есть:

#create data
x=c(1:6,1:6)
y=c(10,21,27,35,33,35,9,20,28,32,30,31)
z=c("A","A","A","A","A","A","B","B","B","B","B","B")
df<-data.frame(x,y,z)

#create linear-plateau function
lp=function(x, a, b, c){
  ifelse(x > c, a + b * c, a + b * x)
  }

#fit the model without random effects
p10=nls(y ~ lp(x, a, b, c), data = df, start = list(a = 0, b = 15, c = 4))


plot(y~x)
lines(x=c(0, coef(p10)["c"],max(df$x)), 
      y=c(coef(p10)["a"],
          (coef(p10)["a"] + coef(p10)["b"] * coef(p10)["c"]),
          (coef(p10)["a"] + coef(p10)["b"] * coef(p10)["c"])),lty=2)

Я хочу включить z в качестве случайного эффекта, поскольку все данные, собранные с одного и того же уровня z, не являются независимыми. Я знаю, как моделировать смешанные эффекты с помощью функции nlmer из пакета lme4, но я не знаю, как совместить с ней модель линейного плато.

1 Ответ

1 голос
/ 21 апреля 2019

Вы можете сделать это с пакетом nlme, но данных, которые вы нам предоставили, будет недостаточно для подбора модели со случайными эффектами.

Начните с подбора *Модель 1004 * (обобщенные нелинейные наименьшие квадраты), которая допускает фиксированный эффект различия между группами:

library(nlme)
p20 = gnls(y ~ lp(x, a, b, c),
           params= list(a+b~z, c~1),
           data = df,
           start = list(a = c(0,0), b=c(15,15), c=4))

(я изначально пробовал params = list(a+b+c~z), с соответствующими изменениями start, но подгонка не удалась. Возможно можно настроить параметры управления, чтобы эта модель работала ...)

Теперь как модель со случайными эффектами.Это не удастся - вам почти наверняка понадобится более двух групп - но это должно дать вам идею.

p30 = nlme(y ~ lp(x, a, b, c),
           random = a+b~1|z,
           fixed = a+b+c ~ 1,
           data = df,
           start = c(a=0, b=15, c=4)
           )

Делать это с nlmer немного сложнее, так как вам нужно определить,функция, которая возвращает градиенты, а также значение целевой функции.

...