【问题标题】:Fitting the same models in nlme and lme4在 nlme 和 lme4 中拟合相同的模型
【发布时间】:2017-11-28 19:38:09
【问题描述】:

数据来自here

library(nlme)
dat0 <- read.table("aids.dat2",head=T)
dat1 <- dat0[dat0$day<=90, ]   # use only first 90-day data
dat2 <- dat1[!apply(is.na(dat1),1,any),]  # remove missing data 

# Next, let's treat the data as longitudinal (or grouped) data 
aids.dat <- groupedData(lgcopy ~ day | patid, data=dat2)

# A NLME model fit, with random effects on all 4 parameters 
start <- c(10,0.5,6,0.005)  # starting value 

aids.dat$log10copy = log10(aids.dat$lgcopy)

nlme.fit <- nlme(log10copy ~ exp(p1-b1*day) + exp(p2-b2*day + 1),
                 fixed = list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1),
                 random = list(patid = pdDiag(list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1))),
                 data =aids.dat, start=c(start)) 
summary(nlme.fit)

在这里,我使用 nlme 包中的 nlme 拟合了一个非线性混合效应模型。该模型有 4 个固定效应和 4 个随机效应。我在方差-协方差矩阵上指定了一个对角结构,每个patid组成一个组。

library(lme4)
deriv_mod <- deriv( ~ exp(p1 - b1*t) + exp(p2 - b2*t + 1), 
                    c("p1", "b1", "p2", "b2"), function(t, p1, b1, p2, b2){})
nlmer.fit <- nlmer(deriv_mod ~ list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1) + 
                     list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1), data = aids.dat, start = c(start))

在这里,我想使用lme4 包来拟合相同的模型。从文档看来,nlmerformula 似乎也必须有一个渐变组件,因此我首先使用了deriv 函数。但是,我不确定如何指定其余参数?

deriv_mod ~ list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1) + 
                     list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1)

是指定4个固定效果(在第一个列表对象中)及其对应的4个随机效果(在第二个列表对象中)。但是,我不太确定如何指定对角方差-协方差结构并确保观察按patid 分组,就像我在random = list(patid = pdDiag(list(p1 ~ 1, b1 ~ 1, p2 ~ 1, b2 ~ 1)))nlme 中指定的那样。

【问题讨论】:

  • lme4 没有像nlme 那样在方差-协方差结构上提供足够的灵活性...您的 RE 是交叉分类的、嵌套的等吗?请您提供更多详细信息吗?
  • RE 既不交叉分类也不嵌套。由于我在方差协方差矩阵上指定了对角线结构,因此假设它们彼此独立。

标签: r lme4 mixed-models nlme


【解决方案1】:

指定固定效果FE1 ... FE4和独立随机效果RE1 ... RE4的标准方式如下所示

mod_fit <- lme4::nlmer(Y ~ FE1 + FE2 + FE3 + FE4 + 
  (1|RE1) + (1|RE2) + (1|RE3) + (1|RE4), data= dat)

nlme 包的语法与lme4 包的语法略有不同。

mod_fit <- nlme::nlme(Y ~ FE1 + FE2 + FE3 + FE4 + 
      (1|RE1) + (1|RE2) + (1|RE3) + (1|RE4), 
  fixed= FE1 + FE2 + FE3 + FE4 ~ Y,
  groups= 1 ~ RE1 + RE2 + RE3 + RE4,
  data= dat)

也就是说,我不确定我是否完全理解你的问题的细微差别,所以你的情况可能意味着这需要稍微修改。如果您提供 cmets,我很乐意根据需要修改我的答案

【讨论】:

  • 我想使用nlmenlmer 拟合相同的精确模型(即我希望看到相似的,如果不是相同的参数估计、SE 等)来自两个输出。我能够在nlme 中拟合模型,但不能在nlmer 中拟合。
  • @Adrian 正在更新答案
  • lme4.fit &lt;- lme4::nlmer(log10copy ~ exp(p1-b1*day) + exp(p2-b2*day + 1) + (1|p1) + (1|b1) + (1|p2) + (1|b2), data= aids.dat) 我试过了,但它说log10copy 找不到?但该变量确实存在于我的 data.frame 中?
  • 请在我的原始帖子中运行我的第一段代码...它将log10copy 定义为一个变量。这是一个可重复的例子,除非我错过了什么......
  • @Adrian 谢谢!您收到不准确的错误消息。问题似乎在于将deriv_mod 传递到调用堆栈中。具体来说,nlformula 无法解析您的模型规范。我不太清楚你的意图是什么;但您可以尝试在nlmer 中更直接地指定模型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多