Python Dunn 事后测试相同的 p 值

问题描述 投票:0回答:1

我正在学习统计学,在进行事后测试时,我注意到 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 相同

python python-3.x statistics dunn.test
1个回答
0
投票

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 值相同。

© www.soinside.com 2019 - 2024. All rights reserved.