如何在R中用lme编写分段混合模型?

时间:2017-06-22 20:09:08

标签: r lme4 mixed-models nlme piecewise

我跟着this example使用lmer运行分段混合模型,效果非常好。但是,我无法将模型翻译为lme,因为我需要处理异方差性,lmer没有这种能力。

重现问题的代码是here。如果您认为有必要回答这个问题,我会在代码中包含有关实验设计的详细信息。

这是没有断点的模型:

linear <- lmer(mass ~ lat + (1 | pop/line), data = df)

以下是我如何使用断点运行它:

bp = 30
b1 <- function(x, bp) ifelse(x < bp, x, 0)
b2 <- function(x, bp) ifelse(x < bp, 0, x)
breakpoint <- lmer(mass ~ b1(lat, bp) + b2(lat, bp) + (1 | pop/line), data = df)

问题在于我有非常严重的异方差性。据我了解,这意味着我应该使用nlme包中的lme。以下是lme中的线性模型:

ctrl <- lmeControl(opt='optim')
linear2 <- lme(mass ~ lat , random=~1|pop/line, na.action = na.exclude, data=df, control = ctrl, weights=varIdent(form=~1|pop))

这就是断点模型,它打破了:

breakpoint2 <- lme(mass ~ b1(lat, bp) + b2(lat, bp), random=~1|pop/line, na.action = na.exclude, data=df, control = ctrl, weights=varIdent(form=~1|pop))

以下是错误消息:

Error in model.frame.default(formula = ~pop + mass + lat + bp + line,  : variable lengths differ (found for 'bp')

如何将这个可爱的断点模型从lmer转换为lme?谢谢!

1 个答案:

答案 0 :(得分:0)

当您在公式中使用不适合您的模型的数据框架中的变量时,lme看起来并不喜欢它。一种选择是首先建立你的公式,然后将其传递给lme。例如

myform <- eval(substitute(mass ~ b1(lat, bp) + b2(lat, bp), list(bp=bp)))
breakpoint2 <- lme(myform, random=~1|pop/line, na.action = na.exclude, data=df, control = ctrl, weights=varIdent(form=~1|pop))

eval()/substitute()只是将公式中的bp换成变量值bp

或者,如果bp始终为30,那么您只需将其直接放在公式

breakpoint2 <- lme(mass ~ b1(lat, 30) + b2(lat, 30), random=~1|pop/line, na.action = na.exclude, data=df, control = ctrl, weights=varIdent(form=~1|pop))

这也可以。