nlme包varIdent函数参考类别依赖数据顺序问题问询
关于nlme包varIdent函数参考类别依赖数据顺序的问题解答
问题原因
varIdent函数的参考类别并非遵循因子本身的预设水平顺序,而是以数据中首次出现的分组水平作为参考类别,将其权重固定为1,其余水平的权重则相对于该参考进行估计。而模型的均值结构(y~sex部分)使用的是因子本身的水平顺序(默认按字母排序,这里F在前、M在后),因此不受数据排序影响,系数结果保持一致。
在你的示例中:
m0使用升序排列的数据,F是第一个出现的水平,因此作为参考,M的权重是0.53(即M组的标准差是F组的0.53倍)m1使用降序排列的数据,M是第一个出现的水平,因此作为参考,F的权重是1.88(即F组的标准差是M组的1.88倍)
两种模型本质等价,只是参考基准不同,因此AIC、BIC、logLik等拟合指标完全一致。
解决办法
要避免这种依赖数据顺序的行为,核心是固定分组变量的水平顺序,让varIdent始终以你指定的参考水平作为基准:
方法1:提前设定因子的水平顺序
在构建数据时显式指定因子水平,确保参考水平始终是第一个:
z0$sex <- factor(z0$sex, levels = c("F", "M")) # 将F设为固定参考水平
之后无论数据如何排序,varIdent都会以F作为参考类别。
方法2:使用varIdent的fixed参数手动锁定参考权重
通过fixed参数指定参考水平的权重为1,其余水平留空待估计:
# 固定F的权重为1,估计M的权重 m_fixed <- gls(y~sex, weights=varIdent(form=~1|sex, fixed=c(F=1, M=NA)), data=z0)
这种方式无需修改因子水平,直接在方差函数中指定参考基准。
验证示例
修改后重新运行模型,无论数据排序如何,varIdent的参考类别都会保持一致:
set.seed(123) library(tidyverse) library(nlme) n_smpl<-10 z0<-data.frame(sex=sample(c("F","M"),n_smpl,prob = c(0.6,0.4),replace = T) %>% factor(levels = c("F", "M"))) # 固定因子水平 sd_e<-1.3 e<-rnorm(nrow(z0),0,sd_e) my_bts<-c(10,1.4) z0$y<-(model.matrix(~sex, z0) %*% my_bts+e)%>% drop m0<-gls(model=y~sex,weights=varIdent(form=~1|sex),data=z0[order(z0$sex),]) m1<-gls(model=y~sex,weights=varIdent(form=~1|sex),data=z0[order(z0$sex,decreasing =T),]) summary(m0)$varStruct # 参考类别为F summary(m1)$varStruct # 参考类别仍为F
内容的提问来源于stack exchange,提问作者Nicolas Molano
相关产品推荐
相关产品推荐

