R语言lcmm包使用postprob函数报错:invalid subscript type 'list'
解决lcmm包中postprob分配类别时的"invalid subscript type 'list'"错误
错误原因
错误出在data$groups <- factor(groups$class[sapply(data$id, function(x) which(groups$id==x))])这一行:sapply返回的结果是列表类型(或嵌套向量),无法直接作为索引提取groups$class的元素。本质是groups存储的是个体水平的分类(每个id仅一行),而data是重复测量的纵向数据(每个id对应多行),循环匹配的逻辑有误。
解决方案
直接用merge函数将个体分类与原始纵向数据匹配,替代循环索引的方式,代码更简洁且避免错误:
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")) # 拟合lcmm模型 m1 <- lcmm(fixed = y ~ x, subject = 'id', data = data) summary(m1) # 提取个体水平的id与对应潜在类别 groups <- as.data.frame(m1$pprob[, c("id", "class")]) # 合并类别到原始纵向数据,自动匹配每个id的所有观测行 data <- merge(data, groups, by = "id", all.x = TRUE) # 将类别转为因子类型 data$class <- factor(data$class)
补充说明
m1$pprob是lcmm模型输出的个体水平后验概率数据框,自带id(个体标识)和class(分配的潜在类别)列,直接提取这两列即可,无需通过列索引选取。merge函数通过id列自动匹配,all.x = TRUE确保保留原始数据的所有行,每个重复测量的观测都会对应到所属个体的潜在类别。
内容的提问来源于stack exchange,提问作者Katherine Drummond
相关产品推荐
相关产品推荐

