首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用nlme::lme将代码转换为lme 4::lmer

使用nlme::lme将代码转换为lme 4::lmer
EN

Stack Overflow用户
提问于 2022-11-14 20:09:39
回答 1查看 34关注 0票数 1

我正在遵循R码(这里)在应用纵向分析由Fitzmaurice,Laird和Ware进行惩罚样条回归分析使用nlme::lme。我的实际应用程序将有更多的随机系数,所以我计划使用lme4::lmer。我很难将链接代码中的随机样条术语bf1-bf22转换为在lmer中兼容的。如果我理解lme实现,就会为分段样条(前缀为bf的变量)指定随机截取。我(天真地)尝试将s(time,k=22,bs='re')添加到lmer公式的RHS中(下面的代码显示了使用lme4函数的gamm4 ),但这似乎行不通。

数据可以从这里下载,代码如下所示。

代码语言:javascript
复制
library(foreign)

ds <- read.dta("progesterone.dta") #Wherever the file is stored)
attach(ds)

bf1 <- (time+7)*I(time > -7)
bf2 <- (time+6)*I(time > -6)
bf3 <- (time+5)*I(time > -5)
bf4 <- (time+4)*I(time > -4)
bf5 <- (time+3)*I(time > -3)
bf6 <- (time+2)*I(time > -2)
bf7 <- (time+1)*I(time > -1)
bf8 <- (time)*I(time > 0)
bf9 <- (time-1)*I(time > 1)
bf10 <- (time-2)*I(time > 2)
bf11 <- (time-3)*I(time > 3)
bf12 <- (time-4)*I(time > 4)
bf13 <- (time-5)*I(time > 5)
bf14 <- (time-6)*I(time > 6)
bf15 <- (time-7)*I(time > 7)
bf16 <- (time-8)*I(time > 8)
bf17 <- (time-9)*I(time > 9)
bf18 <- (time-10)*I(time > 10)
bf19 <- (time-11)*I(time > 11)
bf20 <- (time-12)*I(time > 12)
bf21 <- (time-13)*I(time > 13)
bf22 <- (time-14)*I(time > 14)


Const <- factor(rep(1,length(logp)))

group.time <- group*time
group.bf15 <- group*bf15
require(nlme)
model_lme <- lme(logp ~ time + group + group.time + group.bf15, 
              random=list(Const=pdIdent(~-1 + bf1 + bf2 + bf3 + bf4 + bf5 + bf6 + 
                                        bf7 + bf8 + bf9 + bf10 + bf11 + bf12 + bf13 + bf14 + bf15 + bf16 + 
                                        bf17 + bf18 + bf19 + bf20 + bf21 + bf22), 
                          id=pdSymm(~time)))


require(gamm4)
require(mgcv)
model_lmer <- gamm4(logp ~ time + group + group.time + group.bf15 +
                   s(time,k=22,bs="re") + s(time,id,k=22,bs="re"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 01:14:42

装载包

代码语言:javascript
复制
library(foreign)
library(nlme)
library(gamm4)
library(mgcv)
library(ggplot2); theme_set(theme_bw())
library(cowplot)

过程数据

我简化了创建单个线性样条基函数的过程. (attach()几乎不是一个好主意.)

代码语言:javascript
复制
ds <- read.dta("progesterone.dta") #Wherever the file is stored)
dss <- within(ds, {
    for (i in (-7):14) {
        assign(paste0("bf",i+8), (time+i)*as.numeric(time > i))
    }
})
matplot(dss[dss$id==1,5:26], type ="l")
dss$Const <- factor(rep(1,nrow(dss)))

线性样条拟合lme模型

同样,精简(使用reformulate而不是写出所有bf1 + bf2 + ...术语;使用time*group而不是手工构建所有虚拟/交互)。

代码语言:javascript
复制
model_lme <- lme(logp ~ time*group + I(group*bf15), 
                 random=list(Const=pdIdent(
                                 reformulate(c("-1",
                                               paste0("bf",1:22)))),
                             id=pdSymm(~time)),
                 data = dss)

gamm4版本

代码语言:javascript
复制
ds$bf15 <- dss$bf15
model_gamm4 <- gamm4(logp ~time*group + I(group*bf15) +
                         s(time, bs = "cs"),
                     ## need parentheses!
                     random = ~(time|id),
                     data = ds)

这里需要注意的几点是:(1)样条项的集合用s(time, bs = "cs")表示(其中"cs“表示”三次样条“:参见?smooth.construct.cs.smooth.spec代替'cs‘来查看对其他平滑选择的帮助);(2)原始模型中的另一个RE项是关于时间的随机斜率项(id = pdSymm(~time)),在这里表示为一个单独的random = (time|id);这个组件是在lmer-fitting侧处理的,而不是为它构造mgcv基。

比较预测

代码语言:javascript
复制
dss2 <- data.frame(ds, pred1 = predict(model_lme), pred2 = predict(model_gamm4$mer))
gg0 <- ggplot(dss, aes(time, logp, colour = factor(group))) + geom_point()
plot_grid(gg0 + geom_line(data=dss2, aes(group=id, y = pred1)) + 
                 labs(title = "lme (linear)"),
   gg0 + geom_line(data=dss2, aes(group=id, y = pred2)) + 
                 labs(title = "gamm4 (cubic)"))

我也在mgcv上试过这个

代码语言:javascript
复制
model_gam <- gam(logp ~time*group + I(group*bf15) +
                     s(time, bs = "cs") + s(id, time, bs = "re") +
                     s(id, bs = "re"),
                 data = dss, method = "REML")

唯一明显的区别是,斜率和截距区域是独立指定的,而不是相互关联的,但预测值有很大不同;我不知道这是关于模型是否合适,还是在预测过程中如何处理随机效应。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74437286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档