提问人:Sointu 提问时间:9/7/2023 更新时间:9/7/2023 访问量:40
计算潜在类分析的相对熵 - 两种方法给出不同的结果
Calculating relative entropy for a latent class analysis - two methods give different results
问:
我正在使用 R poLCA 运行具有 4 个分类指标(3 个级别、3 个级别、9 个级别和 5 个级别)的潜在类模型。由于 poLCA 不计算相对熵,因此我找到了两个从结果中手动计算相对熵的公式,这两个公式都在这里的答案中介绍。但是,对于我自己的数据,我从这些公式中得到的结果略有不同,但对于 poLCA 包示例数据(癌)却没有,我想知道为什么会这样。
以下是我的数据摘录,用于一个可重现的示例
var1<-c(1,1,1,1,1,1,1,3,1,1,3,1,2,2,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,2,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,2,1,1,3,1,1,1,3,1,1,3,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
var2<-c(3,2,2,1,2,1,2,2,1,1,1,3,2,3,1,3,2,1,1,3,1,2,1,3,1,1,3,3,3,3,1,2,1,3,2,3,1,1,1,3,3,3,1,3,3,2,3,3,3,3,2,2,2,3,3,1,3,1,1,1,2,3,1,3,2,1,1,1,1,1,3,1,3,2,1,1,1,1,1,1,2,1,1,1,1,2,1,2,3,3,3,2,1,1,2,3,3,2,1,3,3,3,3,3,3,1,2,3,3,1,3,3,3,3,3,2,1,3,2,3,1,1,1,2,2,2,1,2,1,2,2,1,1,3,1,3,1,2,3,2,1,2,1,3,1,1,1,1,2,2,2,2,1,2,3,1,3,1,1,1,2,2,1,2,2,3,2,3,1,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3,1,3,1,3,3,1,1,2,1,1,1,3,2,3,3,1,3)
var3<-c(3,8,2,3,1,8,1,1,8,8,1,8,2,8,6,6,8,9,8,4,2,2,8,6,6,6,5,6,2,6,8,2,2,9,2,9,2,8,8,4,4,2,5,8,6,2,2,2,3,2,8,8,2,4,5,9,1,1,1,8,5,3,8,3,4,3,6,1,1,2,8,1,6,5,8,4,8,8,8,8,9,8,4,3,4,1,9,1,4,3,1,2,1,2,5,8,8,4,9,4,8,8,8,4,8,8,2,8,5,2,3,6,4,9,8,2,2,1,1,3,8,1,1,4,2,5,8,1,2,8,4,1,8,8,8,4,9,4,8,5,8,4,8,4,3,8,9,8,4,9,4,4,9,9,3,8,8,8,8,8,4,3,8,4,9,4,4,4,8,4,9,4,5,8,6,8,4,4,1,2,3,3,8,4,3,3,2,6,9,2,8,4,4,8,9,8,9,2,4,1,6)
var4<-c(1,2,1,1,1,1,1,2,1,1,2,2,1,2,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,1,1,2,2,1,1,2,1,3,2,1,1,1,1,1,1,1,4,1,1,4,1,1,1,1,1,2,1,1,3,1,1,1,2,1,1,1,1,1,1,1,3,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,3,1,1,1,1,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,2,1,1,3,1,2,1,1,1,1,1,1,2,2,1,1,1,4,1,1,2,1,2,1,1,1,1,3,1,2,1,1,1,1,1,1,1,1,1,1,1,1,4,2,1,1,1,1)
ex.data<-data.frame(var1, var2, var3, var4)
f <- cbind(var1, var2, var3, var4)~1
lc.ex<-poLCA(f, ex.data, nclass=3) #I run a 3-class model for the example
#First I tried Israel Souza's formula:
nume.E<- -sum(lc.ex$posterior * log(lc.ex$posterior), na.rm=T)
deno.E<-201*log(3)
ent.ex<-1-(nume.E/deno.E)
ent.ex
[1] 0.7379364
##
#Then, I tried Daniel Oberski's formula
(Originally from here: http://daob.nl/wp-content/uploads/2015/07/ESRA-course-slides.pdf)
entropy<-function (p) sum(-p*log(p))
error_prior <- entropy(lc.ex$P)
error_post <- mean(apply(lc.ex$posterior, 1, entropy), na.rm=T)
ent.ex2 <- (error_prior - error_post) / error_prior
ent.ex2
[1] 0.7254486
当然,这些值非常接近,但是对于我的完整数据(N > 6000),我得到了更大的差异:令人沮丧的是,对于同一模型,我的第一个公式得到的熵为.72,第二个公式的熵为.68。此外,使用癌症数据(如链接回复中以色列的例子),我得到了两个公式的相同值。谁能向我解释一下这两个公式之间有什么区别(如果有的话)?还是我应用错了?我已经删除了所有缺少任何变量的观测值,所以这应该不是问题。
提前致谢!
答: 暂无答案
评论