TraMineR熵公式手动计算与ggseqplot结果不符,求解析
问题分析与解决
公式理解纠正
首先你搞反了归一化熵的计算顺序,TraMineR里的归一化Shannon熵正确公式是:
$$H_{norm} = \frac{-\sum_{i=1}^k p_i \cdot \ln(p_i)}{\ln(k)}$$
其中:
- $k$ 是字母表大小(这里为3)
- $p_i$ 是对应状态的频率/概率
- $\ln$ 是自然对数(TraMineR默认用自然对数计算熵)
你写的第一个公式把分子分母搞反了,第二个公式是未归一化的原始熵,这两个都不符合TraMineR的计算逻辑。
手动计算与工具结果不符的原因
你用的概率(1/26、22/26、3/26)并非TraMineR计算熵时的对象。ggseqdplot(mine_mvad.seq, with.entropy = TRUE)输出的熵是所有时间点的状态分布归一化熵的平均值,而非基于整个序列集的边际状态频率:
- TraMineR会先计算序列中每个时间点的状态频率分布
- 对每个时间点单独计算归一化熵
- 最后取所有时间点熵的平均值,得到你看到的0.265087328
你用的单一概率分布对应的归一化熵约为0.47,远高于工具输出的平均值,说明这个分布并非单个时间点的状态分布,或是你误解了概率的来源。
验证方法
用TraMineR自带的函数可拆解计算过程,验证工具结果:
# 计算每个时间点的状态频率分布 time_distr <- seqstatd(mine_mvad.seq) # 字母表大小 k <- ncol(time_distr) # 计算每个时间点的归一化熵 entropy_per_t <- apply(time_distr, 1, function(x) { p <- x / sum(x) p <- p[p > 0] # 排除概率为0的状态 raw_entropy <- -sum(p * log(p)) raw_entropy / log(k) }) # 计算平均归一化熵,结果与ggseqdplot一致 mean(entropy_per_t)
内容的提问来源于stack exchange,提问作者JC_
相关产品推荐
相关产品推荐

