R nlme:使用CSH协方差模型拟合混合模型

R nlme:使用CSH协方差模型拟合混合模型,r,nlme,R,Nlme,我正在尝试使用nlme包在R中拟合一个混合模型和重复测量(MMRM)模型 数据结构如下: 每位患者属于三个组(grp)中的一个,并被分配到一个治疗组(trt)。 患者结果(y)在6次就诊(就诊)期间进行测量 我想使用一个复合对称模型,在不同的访问中具有不同的方差(如SAS的PROC MIXED的CSH类型) 为此,我使用lme中的相关参数将相关结构设置为CS(corCompSymm)和权重参数,因此方差是访问的函数 我还尝试将visit添加到corCompSymm本身的form参数中 我的问题是

我正在尝试使用nlme包在R中拟合一个混合模型和重复测量(MMRM)模型

数据结构如下: 每位患者属于三个组(grp)中的一个,并被分配到一个治疗组(trt)。 患者结果(y)在6次就诊(就诊)期间进行测量

我想使用一个复合对称模型,在不同的访问中具有不同的方差(如SAS的PROC MIXED的CSH类型)

为此,我使用lme中的相关参数将相关结构设置为CS(corCompSymm)和权重参数,因此方差是访问的函数

我还尝试将visit添加到corCompSymm本身的form参数中

我的问题是:无论我是否在调用中将权重参数设置为lme(换句话说,似乎我得到的是CS模型而不是CSH模型),我都会得到相同的结果

执行下面的代码,您会注意到,无论使用什么模型,模型参数估计的协方差矩阵的对角线都是相同的,这表明权重参数被忽略

remove(list = objects())
library(nlme)

set.seed(55)

npatients     = 200; 
nvisits       = 6;

#---
# Generate some data:
subject_table = data.frame(subject = sprintf("S%03d", 1:npatients),
                           trt     = sample(x = c("P", "D"),       replace = T, size = npatients),
                           grp     = sample(x = c("A", "B", "C"),  replace = T, size = npatients))
subject_table = merge(subject_table, 
                      data.frame(visit.number = 1:6))
subject_table = transform(subject_table, 
                          visit = sprintf("V%02d", visit.number),
                          y     = rnorm(nrow(subject_table), mean = 0, sd = visit.number^2))
subject_table = transform(subject_table, 
                          visit   = factor(visit),
                          subject = factor(subject, ordered = T, levels =     sort(unique(as.character(subject)))),
                          grp     = factor(grp),
                          trt     = factor(trt))
#---
# Fit MMRM model to data using nlme
cs_model       = lme(y ~ trt*visit*grp,                              # fixed     effects 
                     random      = ~1|subject,                       # random effects 
                     data        = subject_table,                    # data
                     correlation = corCompSymm(form=~1|subject))     # CS correlation matrix within patient

csh_model_v1   = lme(y ~ trt*visit*grp,                              # fixed effects 
                     random      = ~1|subject,                       # random effects 
                     data        = subject_table,                    # data
                     weights     = varIdent(~1|visit),               # different "weight" within each visit (I think)
                     correlation = corCompSymm(form=~1|subject))     # CS correlation matrix within patient

csh_model_v2   = lme(y ~ trt*visit*grp,                              # fixed effects 
                     random      = ~1|subject,                       # random effects 
                     data        = subject_table,                    # data
                     weights     = varIdent(~visit|subject),         # different "weight" within each visit (I think)
                     correlation = corCompSymm(form=~1|subject))     # CS correlation matrix within patient

csh_model_v3   = lme(y ~ trt*visit*grp,                              # fixed effects 
                     random      = ~1|subject,                       # random effects 
                     data        = subject_table,                    # data
                     correlation = corCompSymm(form=~visit|subject)) # CS correlation matrix within patient

diag(vcov(cs_model))
diag(vcov(csh_model_v1))
diag(vcov(csh_model_v2))
diag(vcov(csh_model_v3))
问题是:
如何让nlme为不同的访问适应不同的方差参数?

在几个死胡同之后,问题似乎是确保在调用varIdent时设置了正确的参数

正确的方法似乎是:

csh_model_right = lme(y ~ trt*visit*grp,                          # fixed effects 
                  random      = ~1|subject,                   # random effects 
                  data        = subject_table,                # data
                  weights     = varIdent(form=~1|visit),      # different "weight" within each visit (I know)
                  correlation = corCompSymm(),                # CS correlation matrix within subject per random statement above
                  control     = lme.control) 
看起来是一样的,但请注意,传递给varIdent的参数被显式标识为“form”。我原以为如果用其他方式来解释,会发生崩溃,但我错了