使用lmer拟合模型时遇报错:(p <- ncol(X)) == ncol(Y) is not TRUE
解决lmer报错:
(p <- ncol(X)) == ncol(Y) is not TRUE 你遇到的这个错误确实和缺失值(NA)直接相关,但本质是自变量、因变量和分组变量的有效样本行数不匹配导致的。当你用data$变量名的方式传入变量时,lmer会单独处理每个变量的NA——比如自变量里有NA的行被自动剔除,但因变量还是完整的,最终导致两者维度不一致,触发这个报错。下面是具体的解决步骤:
1. 统一清理缺失值,保证样本匹配
首先,筛选出所有用到的变量(因变量、自变量、分组变量)都没有NA的行,确保所有变量的有效样本完全一致:
# 方式1:用base R的complete.cases clean_data <- data[complete.cases(data$im.adpt, data$pnr, data$female_c, data$age_c, data$age_c2, data$nomem_encr, data$nohouse_encr), ] # 方式2:用dplyr更简洁(需要先加载dplyr包) library(dplyr) clean_data <- data %>% select(im.adpt, pnr, female_c, age_c, age_c2, nomem_encr, nohouse_encr) %>% drop_na()
2. 用规范的语法拟合模型
不要用data$变量名的方式传参,而是把数据集通过data参数传给lmer,直接写变量名即可。这种写法不仅更简洁,还能从根源上避免维度不匹配的问题:
model.covars.im.adapt <- lmer( im.adpt ~ pnr + female_c + age_c + age_c2 + (1 | nomem_encr) + (1 | nohouse_encr), data = clean_data )
3. 额外注意事项
- 别忘了检查分组变量(
nomem_encr和nohouse_encr)的NA值,这些变量的缺失也会导致样本被剔除,进而影响维度匹配。 - 如果你不想删除缺失值、想保留样本,可以用多重插补的方式处理,比如用
mice包生成插补数据集,再用mitml包拟合多水平模型,这样能最大程度保留数据信息。
内容的提问来源于stack exchange,提问作者Panagiotis Kokkoris
相关产品推荐
相关产品推荐

