You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:25:23