R语言循环运行lme模型报variable lengths differ错误排查
报错根因
这个长度不匹配错误是循环内数据构造的两个问题叠加导致的:
- 提取结果变量的写法错误:你用
data01[n]取列时,单中括号返回的是单列数据框而非原子向量,赋值给data.frame()的outcome参数时,最终生成的列名会沿用原数据的列名(第一次循环是n1,第二次是n2),rsa.data里根本不存在名为outcome的列。 - 变量作用域匹配错误:因为数据里找不到
outcome列,lme()会自动到全局环境搜索同名对象,正好你全局环境定义了outcome <- c('n1', 'n2')——这个长度为2的字符向量,和其他长度为2000的预测变量长度完全不匹配,直接触发报错。
你逐行跑单个结果变量不报错,是因为单跑时你大概率用
data01$n1这种$索引直接提取向量赋值,此时rsa.data里确实存在名为outcome、长度匹配的列,模型可以正常读取。
修正方案
只需要把取结果变量的单中括号改成双中括号[[,确保提取的是原子向量,赋值后列名正确为outcome即可。另外注意lme()函数来自nlme包,运行前需要先加载包。
修正后的可运行代码:
library(nlme) # 提前加载依赖包 n1 = rnorm(n = 2000, mean = 0, sd = 1) n2 = rnorm(n = 2000, mean = 0, sd = 1) Z_familism = rnorm(n = 2000, mean = 0, sd = 1) Z_avoidance = rnorm(n = 2000, mean = 0, sd = 1) Country = rnorm(n = 2000, mean = 0, sd = 1) Z_anxiety = rnorm(n = 2000, mean = 0, sd = 1) data01<-data.frame(n1,n2,Z_familism,Z_avoidance,Country,Z_anxiety) outcome<-c('n1', 'n2') for (n in outcome){ rsa.data<-data.frame(predictor1=data01$Z_familism, predictor2=data01$Z_avoidance, nest=as.factor(data01$Country), control=data01$Z_anxiety, multilevel=data01$Country, outcome=data01[[n]]) # 这里把[]改成[[]],提取原子向量 rsa.data <- within(rsa.data, { centered.predictor1 <- predictor1 - 0 centered.predictor2 <- predictor2 - 0 squared.predictor1 <- centered.predictor1* centered.predictor1 squared.predictor2 <- centered.predictor2* centered.predictor2 interaction <- centered.predictor1* centered.predictor2 }) mlm.model <- lme(outcome ~ centered.predictor1+centered.predictor2 + squared.predictor1 + interaction +squared.predictor2+control, data = rsa.data, random = ~ 1|multilevel, na.action = "na.omit") print(summary(mlm.model)) # 循环内要显式print输出结果 print(intervals(mlm.model, which = "fixed")) print(vcov(mlm.model)) }
额外提示:R的for循环不会自动输出控制台结果,所以summary()、intervals()这类输出函数前面最好加print(),不然你看不到模型结果。
内容的提问来源于stack exchange,提问作者Xian Zhao
相关产品推荐
相关产品推荐

