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

R/flexmix中多分类结局潜类别增长模型实现及分层问题咨询

问题

需要在R的flexmix包中实现带多分类结局变量的潜类别增长模型(LCGM),同时按性别这类分类变量对类别分层,让性别按簇影响增长曲线(参考Mikolai和Lyons-Amos 2017的Mplus分层实现)。

尝试的代码如下:

lcgm_formula <- as.formula(rel_stat~age + I(age^2) + gender + gender:age)
lcgm <- flexmix::stepFlexmix(.~ .| id,
                         data=d,
                         k=nr_of_classes,       # 实际分析中为1:12
                         nrep=1,                # 实际分析中为50以避免局部最优
                         control = list(iter.max = 500, minprior = 0),
                         model = flexmix::FLXMRmultinom(lcgm_formula,varFix=T,fixed = ~0))

该代码参考了Wardenaar(2020)针对连续结局的LCGM代码,但发现FLXMRmultinom不支持varFix和fixed参数,怀疑类内固定斜率、截距等约束未正确设定。模型结果虽合理,但出现标签切换问题:相似轨迹的男女被分到错位类别(预期1↔1、2↔2、3↔3,实际为1↔3、2↔1、3↔2),寻求正确的模型设定及标签切换的解决方法。

解决方案

一、修正FLXMRmultinom的模型设定

FLXMRmultinom确实不支持varFix和fixed参数,要实现按簇分层的多分类结局LCGM,需调整公式结构和模型参数:

  1. 明确分层逻辑:将性别与增长项的交互项纳入类特异性参数,确保类内固定效应通过公式正确传递。
  2. 使用FLXMRmultinom的正确参数:该模型默认类内参数为固定效应,无需额外指定varFix,只需通过公式明确类特异性项。

修正后的代码示例:

# 定义公式:将增长项、性别及交互项设为类特异性
lcgm_formula <- as.formula(rel_stat ~ 1 + age + I(age^2) + gender + gender:age)

# 拟合flexmix模型
lcgm <- flexmix::stepFlexmix(
  rel_stat ~ age + I(age^2) + gender + gender:age | id,
  data = d,
  k = nr_of_classes,
  nrep = 50,  # 实际分析保留50次重复避免局部最优
  control = list(iter.max = 500, minprior = 0),
  model = flexmix::FLXMRmultinom(formula = . ~ ., fixed = ~0)
)
  • 拆分公式结构,确保所有增长相关项(含性别交互)均按簇估计;
  • fixed = ~0表示无全局固定效应,所有参数为类特异性,符合分层LCGM的要求。

二、解决标签切换问题

标签切换是潜类别模型的常见问题,可通过以下方法解决:

  1. 基于簇特征排序:提取各簇核心特征(如平均截距、斜率),按特征大小统一簇标签:
# 提取各簇的参数估计
cluster_params <- lapply(lcgm@models, function(m) coef(m))

# 按截距(或其他关键增长参数)排序簇
sorted_indices <- order(sapply(cluster_params, function(p) p["(Intercept)"]))

# 重新分配簇标签
d$cluster <- factor(lcgm@cluster, levels = sorted_indices, labels = 1:nr_of_classes)
  1. 添加锚定约束:拟合时对某一簇的参数设置固定值作为锚点,避免标签切换。例如固定第一簇的截距:
# 自定义带锚定约束的FLXMRmultinom模型
anchored_model <- flexmix::FLXMRmultinom(
  formula = rel_stat ~ 1 + age + I(age^2) + gender + gender:age,
  fixed = ~1,  # 全局固定项,锚定第一簇
  ref = 1      # 指定第一簇为锚定簇
)

# 拟合锚定模型
lcgm_anchored <- flexmix::stepFlexmix(
  rel_stat ~ age + I(age^2) + gender + gender:age | id,
  data = d,
  k = nr_of_classes,
  nrep = 50,
  control = list(iter.max = 500, minprior = 0),
  model = anchored_model
)
  1. 多次拟合后择优:利用nrep参数进行多次拟合,选择对数似然最高的模型,再对该模型的簇进行特征排序,确保标签一致性。

内容的提问来源于stack exchange,提问作者Samuel Saari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:01:13