R 在混合效应模型nlme中指定协方差矩阵的pdBlocked语法

R 在混合效应模型nlme中指定协方差矩阵的pdBlocked语法,r,covariance,mixed-models,nlme,R,Covariance,Mixed Models,Nlme,我有一个混合效果模型,我想在随机效果协方差矩阵中去掉一些相关性,以减少自由度。要做到这一点,我想我应该使用pdBlocked,但无法获得正确的语法来获得我想要的 示例代码: library(nlme) m3 <- lme(distance ~ age +I(age^2) + I(age^3), data = Orthodont, random = list(Subject = pdBlocked(list(~ age,~0 + I(age^2),~0+I(age^3

我有一个混合效果模型,我想在随机效果协方差矩阵中去掉一些相关性,以减少自由度。要做到这一点,我想我应该使用
pdBlocked
,但无法获得正确的语法来获得我想要的

示例代码:

library(nlme)
m3 <- lme(distance ~ age +I(age^2) + I(age^3), data = Orthodont, 
           random = list(Subject = pdBlocked(list(~ age,~0 + I(age^2),~0+I(age^3)))))
这是接近我想要的,但不是完全。我希望保持
I(年龄^3)
截距
年龄
之间的相关性为零,但允许与
I(年龄^2)
进行相关性。大概是这样的:

getVarCov(m3)
Random effects variance covariance matrix
            (Intercept)      age         I(age^2)                     I(age^3)
(Intercept)      5.2217 -0.30418 0.00000000000000 0.00000000000000000000000000
age             -0.3042  0.04974 0.00000000000000 0.00000000000000000000000000
I(age^2)         0.0000  0.00000 0.00000000003593 a_value
I(age^3)         0.0000  0.00000 a_value          0.00000000000000000000002277
  Standard Deviations: 2.285 0.223 0.000005994 0.000000000004772 
也是为了这个场景

getVarCov(m3)
    Random effects variance covariance matrix
                (Intercept)      age         I(age^2)                     I(age^3)
    (Intercept)      5.2217 -0.30418 c_value          b_value          
    age             -0.3042  0.04974 d_value          0.00000000000000000000000000
    I(age^2)         c_value d_value 0.00000000003593 a_value
    I(age^3)         b_value 0.00000 a_value          0.00000000000000000000002277
      Standard Deviations: 2.285 0.223 0.000005994 0.000000000004772 
我只是不知道如何制作一个灵活的协方差矩阵来选择哪些是零。这些链接非常有用,但仍然无法准确地理解


谢谢你的帮助。谢谢

age^2
age^3
术语放在一个术语中似乎就可以了

m4 <- lme(distance ~ age +I(age^2) + I(age^3), data = Orthodont, 
          random = list(Subject = pdBlocked(list(~ age,
                                                 ~0 + I(age^2)+I(age^3)))),
          control=lmeControl(opt="optim"))
getVarCov(m4)
## Random effects variance covariance matrix
##             (Intercept)       age    I(age^2)    I(age^3)
## (Intercept)     5.00960 -0.225450  0.0000e+00  0.0000e+00
## age            -0.22545  0.019481  0.0000e+00  0.0000e+00
## I(age^2)        0.00000  0.000000  4.1676e-04 -1.5164e-05
## I(age^3)        0.00000  0.000000 -1.5164e-05  5.5376e-07
##   Standard Deviations: 2.2382 0.13957 0.020415 0.00074415 

然而,我建议你仔细考虑这样做是否有意义。我认为,以这种方式删除术语实际上不会在精度/能力方面获得太多收益(一般来说,从事后模型简化中获得的假设检验能力的明显收益是虚幻的——参见Harrell回归建模策略)除非你有机械的或基于主题的理由期待这种特殊的协方差结构,否则我想我不会麻烦你。

有趣。当我运行非结构化模型时,相关性非常低,为0.5。即使它们非常小,你会把它们留在里面吗?你能同样地说把它们拿出来是有害的吗?为了我自己,您知道上面第二个场景所需的语法吗?谢谢你的第二个场景,仅仅是完整的(非结构化)模型,即
random=~1+age+i(age^2)+i(age^3)
?不,
age
i(age^3)
是不相关的。不像我想的那么直截了当。我有一个更大的数据集,每个人50个读数,1000个读数,所以没有同样的问题。我将对此进行调查,但我认为在你提到哈雷尔时,这可能不再必要了。有书,一定要找参考!谢谢
m4 <- lme(distance ~ age +I(age^2) + I(age^3), data = Orthodont, 
          random = list(Subject = pdBlocked(list(~ age,
                                                 ~0 + I(age^2)+I(age^3)))),
          control=lmeControl(opt="optim"))
getVarCov(m4)
## Random effects variance covariance matrix
##             (Intercept)       age    I(age^2)    I(age^3)
## (Intercept)     5.00960 -0.225450  0.0000e+00  0.0000e+00
## age            -0.22545  0.019481  0.0000e+00  0.0000e+00
## I(age^2)        0.00000  0.000000  4.1676e-04 -1.5164e-05
## I(age^3)        0.00000  0.000000 -1.5164e-05  5.5376e-07
##   Standard Deviations: 2.2382 0.13957 0.020415 0.00074415 
lf <- lFormula(distance ~ age +I(age^2) + I(age^3) +
                 (age+ I(age^2) + I(age^3)|Subject), data = Orthodont,
               control=lmerControl(check.nobs.vs.nRE="ignore"))
devfun <- do.call(mkLmerDevfun,lf)
trans_theta <- function(theta)
  c(theta[1:6],-theta[2]*theta[4]/theta[5],theta[7:9])
devfun2 <- function(theta) {
  return(devfun(trans_theta(theta)))
}
diagval <- (lf$reTrms$lower==0)
opt <- minqa::bobyqa(fn=devfun2,par=ifelse(diagval,1,0)[-7],
             lower=lf$reTrms$lower[-7])
opt$par <- trans_theta(opt$par)
opt$conv <- 0
m1 <- mkMerMod(environment(devfun), opt, lf$reTrms, fr = lf$fr)
VarCorr(m1)