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

潜类别增长分析:为观测值分配类别时出错的解决求助

使用lcmm包分配潜类别时出现行数不匹配错误的解决方法

问题详情

使用R语言lcmm包对纵向数据建模,尝试通过postprob获取潜类别后验概率并给每个观测分配类别时,触发以下错误:

Error in $<-.data.frame(tmp, groups, value = c(1L, 1L, 1L, 1L, 1L, : replacement has 39964 rows, data has 40000

使用的代码如下:

#install.packages("lcmm")
#devtools::install_github("hlennon/LCTMtools")

library(lcmm)
library(LCTMtools)

data( bmi_long, package = "LCTMtools" )
data <- data.frame(bmi_long)

data$id <- as.numeric(data$id)
data$x <-data$age
data$y<-as.numeric(data$bmi)
data <-subset(data, select=c("id", "x", "y"))

m1 <- lcmm(fixed=y ~ x, subject = 'id', data = data)
summary(m1)
postprob(m1)
data$id <- as.numeric(data$id)
groups <- as.data.frame(m1$pprob[,1:2])
data$groups <- factor(groups$class[sapply(data$id, function(x) which(groups$id==x))])

错误原因

m1$pprob存储的是每个去重个体的后验概率,每行对应一个唯一id;而原data是纵向数据,每个个体对应多行观测。当模型拟合时自动剔除了部分含缺失值或不符合要求的观测/个体,原data的行数就会大于groups关联后的结果行数,导致赋值时维度不匹配。

修复方案

方案1:直接使用postprob输出完整观测级后验概率

postprob函数支持传入原数据集,直接返回每个观测的后验概率,再提取最可能的类别:

# 获取每个观测的后验概率
pp_matrix <- postprob(m1, data = data)
# 为每个观测分配概率最高的类别
data$groups <- factor(apply(pp_matrix, 1, which.max))

方案2:用predict函数直接预测类别

lcmm的predict函数可以直接输出每个观测的预测类别,更简洁:

# 直接预测每个观测的潜类别
data$groups <- factor(predict(m1, data = data, type = "class"))

方案3:修复手动匹配逻辑(若需保留原思路)

先筛选出模型实际使用的个体对应的观测,再进行匹配:

# 提取模型中包含的个体id
valid_ids <- groups$id
# 筛选原数据中仅包含有效id的观测
data_valid <- data[data$id %in% valid_ids, ]
# 用match函数精准匹配每个id对应的类别
data_valid$groups <- factor(groups$class[match(data_valid$id, groups$id)])

内容的提问来源于stack exchange,提问作者Katherine Drummond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:55:15