如何使用 R 包 poLCA 生成的模型将新数据分类为属于其中一个类?

数据挖掘 r 聚类
2022-03-09 12:40:36

例如,在文档中的选举示例中,如果我创建一组新的问题答案,我如何使用 poLCA 模型告诉我它最有可能在哪个类(集群)中?

似乎没有执行此操作的函数,尽管模型中有一个 df ,其中列出了每个清单变量的每个值的类成员资格的概率。我的任务是转换一些 sql 代码,该代码采用第二个数据集并将那里的患者分类为从第一个创建的集群的成员。从表面上看,这是一个编程问题。执行此操作的功能似乎是对包的合理补充。更深一层,如果真的没有这样的功能,那将成为如何使用概率表对新数据进行分类的问题。

如果读者不熟悉 R 包 poLCA,它是一个处理离散/分类数据的 LCA 包。

(完全披露:我在交叉验证时询问,并且该问题的较短版本被搁置。)

2个回答

使用 poLCA 包中可用的癌症数据和 4 个潜在类别解决方案:

 library poLCA
 data(carcinoma)
 f <- cbind(A, B, C, D, E, F, G) ~ 1
 lc4 <- poLCA(f, carcinoma, nclass = 4)

以下行根据预测概率给出分类

 lc4$predclass

它们可以有效地绑定到原始数​​据以进行进一步的可视化或分析

 carcinoma.predclass <- cbind(carcinoma, "Predicted LC" = lc4$predclass)
 head(carcinoma.predclass)

您可以拥有一个新数据框,其中包含先前分析中使用的相同列/变量。

new.data <- data.frame(A=c(1,2,1), B=c(2,2,1), C=c(1,2,1), D=c(1,1,1), E=c(1,2,1), F=c(2,2,1), G=c(1,2,1))

  A B C D E F G
1 1 2 1 1 1 2 1
2 2 2 2 1 2 2 2
3 1 1 1 1 1 1 1

一个简单的方法可以将新数据帧中观察到的数据模式与先前数据中估计的潜在类别概率联系起来。事实上,第一个模式缺少预测,因为它不在训练数据中。

left_join(new.data, unique(carcinoma.predclass))

Joining, by = c("A", "B", "C", "D", "E", "F", "G")
  A B C D E F G Predicted LC
1 1 2 1 1 1 2 1           NA
2 2 2 2 1 2 2 2            1
3 1 1 1 1 1 1 1            4

最好的方法是使用 poLCA 的后验。根据潜在类模型估计的参数,该函数计算指定模式属于每个潜在类的概率。此函数可以计算新数据的后验类成员概率,无论是否在训练数据中观察到。

new.lc4.posterior <- poLCA.posterior(lc4, new.data)

并将预测的潜在类别(后验概率最高的类别)绑定到新数据。

cbind(new.data, "Predicted LC" = apply(new.lc4.posterior,1, FUN=which.max))

  A B C D E F G Predicted LC
1 1 2 1 1 1 2 1            2
2 2 2 2 1 2 2 2            1
3 1 1 1 1 1 1 1            4

正如 Paolo 所说,使用该poLCA.poseterior()功能。数据的格式与 poLCA 函数返回的 lca_model$posterior 结构相同。

library(poLCA)
data(election)
column_names <- c('MORALG', 'CARESG', 'KNOWG', 'LEADG', 'DISHONG', 
                  'INTELG', 'MORALB',
                  'CARESB', 'KNOWB', 'LEADB', 'DISHONB', 'INTELB')
election_matrix = as.matrix(mapply(as.numeric,election[,column_names]))
election_matrix_no_na =election_matrix[apply(election_matrix, 1,  
    function(x) all(is.finite(x))   ),]
preds =  poLCA.posterior(lc=lca_model, y=election_matrix_no_na)