使用MplusAutomation运行带远端结局的LCA时遇vapply错误求助
解决MplusAutomation运行BCH-LCA时的vapply错误
错误场景
在R中使用MplusAutomation运行包含远端结局的潜在类别分析(LCA),指标变量为1-5分序数变量,远端变量为1-4分序数变量,运行以下代码后出现错误:
m_bch <- mplusObject( TITLE = "BCH lca with distal outcome;", DATA = "LISTWISE=ON;", VARIABLE = "usevar = int_3 sw_3 soc_3 alt_3 gov_3 for_3; auxiliary = claim_5 claim_6 (bch); classes = c(5);", ANALYSIS = "estimator = mlr; type = mixture; starts = 500 100; processors = 10;", OUTPUT = "type = plot3; series = int_3 sw_3 soc_3 alt_3 gov_3 for_3(*);", usevariables = c("int_3", "sw_3", "soc_3", "alt_3", "gov_3", "for_3", "claim_5", "claim_6"), rdata = data_lca_distal_Mpanel_220918 ) m_bch_fit <- mplusModeler(m_bch, dataout=here("paper 2"), modelout=here("paper 2"), check=TRUE, run = TRUE, hashfilename = FALSE)
报错信息:
Error in vapply(df, class, FUN.VALUE = NA_character_) : values must be length 1, but FUN(X[[1]]) result is length 3
错误原因
这个错误的核心是输入数据框data_lca_distal_Mpanel_220918中存在至少一个变量具有多种数据类型属性。MplusAutomation在将R数据转换为Mplus可读格式时,会用vapply检查每个变量的类型,要求每个变量只能返回1种类型,但部分变量返回了多个类(比如同时是ordered、factor、integer),导致触发报错。
常见触发场景:
- 变量被手动标记为
ordered因子,但同时保留了integer属性 - 数据中混合了字符型数值(如"3"和3),导致R识别为
character类型,后续转换时生成多类属性 - 处理缺失值时的操作导致变量类型混乱
解决办法
1. 检查并统一变量类型
首先定位问题变量,再将所有序数变量统一为单一类型:
# 查看所有变量的类型,找到返回长度>1的变量 sapply(data_lca_distal_Mpanel_220918, class) # 将所有序数变量转换为有序因子(单一类型) ord_vars <- c("int_3", "sw_3", "soc_3", "alt_3", "gov_3", "for_3", "claim_5", "claim_6") data_lca_distal_Mpanel_220918[ord_vars] <- lapply(data_lca_distal_Mpanel_220918[ord_vars], function(x) { # 先转为整数确保数值格式正确,再转为有序因子 as.ordered(as.integer(x)) }) # 再次确认变量类型,确保每个变量仅返回1种类型 sapply(data_lca_distal_Mpanel_220918, class)
2. 清理数据中的混合格式
如果变量中存在字符型数值(如"5"而非5),会导致类型混乱,需要排查并修正:
# 检查每个序数变量中无法转为整数的元素数量 lapply(data_lca_distal_Mpanel_220918[ord_vars], function(x) { sum(is.na(as.integer(as.character(x)))) })
如果返回值大于0,说明存在非数值字符,可通过以下方式处理:
- 替换异常值:将字符型数值转为整数,如
x[x == "5"] <- 5 - 删除包含异常值的观测:
data_lca_distal_Mpanel_220918 <- data_lca_distal_Mpanel_220918[!is.na(as.integer(as.character(x))), ]
3. 优化Mplus代码的变量定义
在Mplus的VARIABLE块中明确指定所有变量为分类/序数变量,避免Mplus自动识别出错:
VARIABLE = "usevar = int_3 sw_3 soc_3 alt_3 gov_3 for_3; auxiliary = claim_5 claim_6 (bch); classes = c(5); categorical = int_3 sw_3 soc_3 alt_3 gov_3 for_3 claim_5 claim_6; # 明确变量类型 ";
内容的提问来源于stack exchange,提问作者Sofia
相关产品推荐
相关产品推荐

