如何在 R 中的 lme 中编写分段混合模型?
How do I code a piecewise mixed-model in lme in R?
我按照 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
?谢谢!
看起来 lme
不喜欢你在公式中使用的变量不在你正在拟合模型的 data.frame 中。一种选择是先构建您的公式,然后将其传递给 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))
这也行。
我按照 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
?谢谢!
看起来 lme
不喜欢你在公式中使用的变量不在你正在拟合模型的 data.frame 中。一种选择是先构建您的公式,然后将其传递给 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))
这也行。