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

在R的partykit与lavaan构建SEM树时能否使用FIML估计?

基于partykit实现带FIML估计的潜增长曲线模型(LGCM)树处理缺失值

我需要用R包partykit捕捉抑郁症状轨迹的异质性,因此在lavaan中指定了潜增长曲线模型(LGCM),并参照Achim Zeileis的博文搭建了可处理SEM的“mobster”函数。

以下是构建LGCM树的基础代码示例:

# LGCM in lavaan
growth_curve_model <- '
  inter =~ 1*X1 + 1*X2 + 1*X3 + 1*X4 + 1*X5;
  slope =~ 0*X1 + 1*X2 + 2*X3 + 3*X4 + 4*X5;
  inter ~~ vari*inter; inter ~ meani*1;
  slope ~~ vars*slope; slope ~ means*1;
  inter ~~ cov*slope;
  X1 ~~ residual*X1; X1 ~ 0*1;
  X2 ~~ residual*X2; X2 ~ 0*1;
  X3 ~~ residual*X3; X3 ~ 0*1;
  X4 ~~ residual*X4; X4 ~ 0*1;
  X5 ~~ residual*X5; X5 ~ 0*1;
'

# SEM-adapted "mobster"
lavaan_fit <- function(model) {
  function(y, x = NULL, start = NULL, weights = NULL, offset = NULL, ..., estfun = FALSE, object = FALSE) {
    sem <- lavaan::lavaan(model = model, data = y, start = start)
    list(
      coefficients = stats4::coef(sem),
      objfun = -as.numeric(stats4::logLik(sem)),
      estfun = if(estfun) sandwich::estfun(sem) else NULL,
      object = if(object) sem else NULL
    )
  }
}

# transform data
ex1 <- transform(lgcm,
                 agegroup = factor(agegroup),
                 training = factor(training),
                 noise = factor(noise))
ex1 <- ex1 %>%
  rename(
    X1 = o1,
    X2 = o2,
    X3 = o3,
    X4 = o4,
    X5 = o5
  )

# fit tree
library("partykit")
tr <- mob(X1 + X2 + X3 + X4 + X5 ~ agegroup + training + noise, data = ex1,
          fit = lavaan_fit(growth_curve_model),
          control = mob_control(ytype = "data.frame"))

# plot tree
plot(tr, drop = TRUE, tnex = 2)

我的数据集在LGCM的观测变量(不同时间点的抑郁症状变量)中存在缺失值,纵向数据插补复杂度高,因此希望在SEM树中使用FIML估计替代lavaan默认的列表删除法ML估计。

我尝试修改“mobster”函数以启用FIML,但未成功,修改后的代码如下:

lavaan_fit <- function(model) {
  function(y, x = NULL, start = NULL, weights = NULL, offset = NULL, ..., estfun = FALSE, object = FALSE) {
    sem <- lavaan::lavaan(model = model, data = y, start = start, missing = "fiml")
    list(
      coefficients = stats4::coef(sem),
      objfun = -as.numeric(stats4::logLik(sem)),
      estfun = if(estfun) sandwich::estfun(sem) else NULL,
      object = if(object) sem else NULL
    )
  }
}

我知道semtree包专为SEM树设计且支持FIML,但我的数据在semtree中始终无法分裂树(即使设置alpha = 0.95),因此希望找到基于partykit的解决方案。


内容的提问来源于stack exchange,提问作者Antonia Spr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:09:50