我正在学习统计学,在进行事后测试时,我注意到 Dunn 的测试两次返回相同的 p 值。我尝试了不同的数据集,但错误再次出现。
import pandas as pd
from scipy.stats import kruskal
from scikit_posthocs import posthoc_dunn
data = {
'Group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'Values': [10, 15, 12, 18, 20, 22, 25, 28, 30]
}
df = pd.DataFrame(data)
statistic, p_value = kruskal(df[df['Group'] == 'A']['Values'],
df[df['Group'] == 'B']['Values'],
df[df['Group'] == 'C']['Values'])
print(f"Kruskal-Wallis p-value: {p_value}")
posthoc_results = posthoc_dunn(df, val_col='Values', group_col='Group', p_adjust='holm')
print("\nDunna's Test Results:")
print(posthoc_results)
我明白了。 Dunna 的测试结果:
A B C
A 1.000000 0.359425 0.021871
B 0.359425 1.000000 0.359425
C 0.021871 0.359425 1.000000
为什么 A 与 B 比较中的 p 值与 B 与 C 相同
Dunn 对值进行排名并使用它们来计算 p 值,而不是实际值本身。只要您的数据具有相同的排名,并且随每个组连续增长,您的 p 值矩阵将是正定(对称)矩阵。
如果您更改了数据的排名,您会发现对称性破裂 - A 和 B 与 B 和 C 不同。例如,在示例中切换不同组中的两个值:
import pandas as pd
from scipy.stats import kruskal
from scikit_posthocs import posthoc_dunn
data = {
'Group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'Values': [10, 18, 12, 15, 20, 22, 25, 28, 30]
}
df = pd.DataFrame(data)
statistic, p_value = kruskal(df[df['Group'] == 'A']['Values'],
df[df['Group'] == 'B']['Values'],
df[df['Group'] == 'C']['Values'])
print(f"Kruskal-Wallis p-value: {p_value}")
posthoc_results = posthoc_dunn(df, val_col='Values', group_col='Group', p_adjust='holm')
print("\nDunn's Test Results:")
print(posthoc_results)
[1]:
Kruskal-Wallis p-value: 0.0389902195744873
Dunn's Test Results:
A B C
A 1.000000 0.296718 0.033810
B 0.296718 1.000000 0.272074
C 0.033810 0.272074 1.000000
会给你不同的p值。这不是错误,而是 Dunn 检验的计算方式 - 按
排名!尝试 [0, 1, 2, 15, 20, 22, 250, 280, 300]
,您将获得与示例相同的 p 值,因为您的排名 是相同的。 总结并回答你的问题,根据 Dunn 的说法,从 A 到 B 的“排名距离”与 B 到 C 相同,因此 p 值相同。