使用lavaan包Knit Rmd文档时出现argument is of length zero错误求助
R Markdown Knit报错:
Error in if (categorical.flag) ...: ! argument is of length zero 报错详情
Knit Week-4-Assignment_KK.Rmd时,执行第25-90行代码块退出,错误信息:
Error in if (categorical.flag) ...: ! argument is of length zero
回溯显示错误源于lavaan:::print.lavaan.parameterEstimates(x)。
代码重现
options(repos = "https://cloud.r-project.org/") install.packages("psych") install.packages("semTools") install.packages("Amelia") install.packages("lavaan") library(psych) library(semTools) library(Amelia) library(lavaan) data(bfi) edu3 <- bfi[which(bfi$education == 3),] #only include people with edu = 3 bfi_new <- edu3[, 1:25] #removes all the non BFI item #define model and order ordinal variables cfa_mod<-'F1=~E1+E2+E3+E4+E5 F2=~N1+N2+N3+N4+N5 F3=~C1+C2+C3+C4+C5 F4=~O1+O2+O3+O4+O5 F5=~A1+A2+A3+A4+A5' #do MI after specify SE to be robust and specify ordinal data out <- cfa.mi(cfa_mod, data = bfi_new, m = 20, seed = 712, se="robust", miArgs = list(ordered=c("E1","E2","E3","E4","E5", "N1","N2","N3","N4","N5", "O1","O2","O3","O4","O5", "C1","C2","C3","C4","C5", "A1","A2","A3","A4","A5"))) #run CFA summary(out,fit=T, pool = TRUE) fit <- cfa(cfa_mod, bfi_new) summary(fit,standardize=T)
已尝试的解决方法
- 设置镜像源为
https://cloud.r-project.org/ - 卸载并重装
psych、semTools、Amelia、lavaan包 - 多次重启R
解决方案建议
1. 修正cfa.mi的参数传递逻辑
ordered是lavaan::cfa()的参数,而非Amelia::amelia()的参数,不应放在miArgs列表中。将ordered直接作为cfa.mi的参数传入:
out <- cfa.mi(cfa_mod, data = bfi_new, m = 20, seed = 712, se="robust", ordered=c("E1","E2","E3","E4","E5", "N1","N2","N3","N4","N5", "O1","O2","O3","O4","O5", "C1","C2","C3","C4","C5", "A1","A2","A3","A4","A5"))
原代码中ordered被错误传递给amelia(),导致cfa()未识别到有序变量,后续处理时categorical.flag变量未被正确初始化,出现长度为0的错误。
2. 确保变量为因子类型
确认所有指定为有序的变量是因子类型,若为整数需转换:
# 提取所有有序变量名 ordered_vars <- c("E1","E2","E3","E4","E5", "N1","N2","N3","N4","N5", "O1","O2","O3","O4","O5", "C1","C2","C3","C4","C5", "A1","A2","A3","A4","A5") # 转换为因子 bfi_new[, ordered_vars] <- lapply(bfi_new[, ordered_vars], as.factor)
3. 单独执行多重插补再调用cfa.mi
先手动生成插补数据集,再传入cfa.mi,便于排查插补过程中的问题:
# 生成多重插补数据集 amelia_fit <- amelia(bfi_new, m = 20, seed = 712, ordered = ordered_vars) # 基于插补数据集运行CFA out <- cfa.mi(cfa_mod, data = amelia_fit, se = "robust")
4. 更新相关包到最新版本
运行以下命令确保lavaan和semTools为最新稳定版:
update.packages(c("lavaan", "semTools", "Amelia"), ask = FALSE)
内容的提问来源于stack exchange,提问作者Kat.Kabel
相关产品推荐
相关产品推荐

