在 scipy.stats.kruskal 中使用类似于 R cran kruskal.test 的组
Use groups in scipy.stats.kruskal similar to R cran kruskal.test
我正在尝试用 Python (scipy) 替换 Python 脚本中的一些 rpy2 代码。在这种情况下,我需要用 (Python:scipy.stats.kruskal
).
替换 Kruskal-Wallis 测试 (R:kruskal.test()
)
scipy.stats.kruskal
returns 仅比较 integers/floats 时类似的 H 统计量和 P 值。但是,我在应用以字符串表示的组时遇到了一些困难。
下面是数据的子样本:
y = [4.33917022422, 2.96541899883, 6.70475220836, 9.19889096119, 2.14087398016,
5.39520023918, 1.58443224287, 3.59625224078, 4.01998599966, 2.58058624352]
x = ['High_O2', 'High_O2', 'High_O2', 'High_O2', 'Low_O2',
'Low_O2', 'Low_O2', 'Low_O2', 'Mid_O2', 'Mid_O2']
在 R 中,只需键入:
kruskal.test(y,as.factor(x))
使用 scipy (0.17) 在 Python (2.7) 中做同样的事情:
from scipy import stats
stats.kruskal(y,x)
但是,在使用 scipy 时,我得到非常低的 p 值 (p<e-07)
和相当高的 H 统计量 (26)
,这是不正确的。我已尝试用 {0,1,2}
替换 x
列表,但没有任何改进。
如何告诉 scipy 在排名期间将 x
视为组?
传递给 scipy.stats.kruskal
的每个非关键字参数都被视为一组单独的 y 值。通过将 x
作为参数之一传递,kruskal
会尝试将您的标签字符串视为第二组 y 值。字符串将转换为 NaN(应该引发 RuntimeWarning
)。
相反,您需要按标签对 y
值进行分组,然后将它们作为 单独的 输入数组传递给 kruskal
。例如:
# convert `y` to a numpy array for more convenient indexing
y = np.array(y)
# find unique group labels and their corresponding indices
label, idx = np.unique(x, return_inverse=True)
# make a list of arrays containing the y-values corresponding to each unique label
groups = [y[idx == i] for i, l in enumerate(label)]
# use `*` to unpack the list as a sequence of arguments to `stats.kruskal`
H, p = stats.kruskal(*groups)
print(H, p)
# 2.94545454545 0.22929927
旧post,但值得一个更简单的答案!
#!pip install pingouin
from pingouin import kruskal
kruskal(dataset, dv='y', between='x')
我正在尝试用 Python (scipy) 替换 Python 脚本中的一些 rpy2 代码。在这种情况下,我需要用 (Python:scipy.stats.kruskal
).
kruskal.test()
)
scipy.stats.kruskal
returns 仅比较 integers/floats 时类似的 H 统计量和 P 值。但是,我在应用以字符串表示的组时遇到了一些困难。
下面是数据的子样本:
y = [4.33917022422, 2.96541899883, 6.70475220836, 9.19889096119, 2.14087398016,
5.39520023918, 1.58443224287, 3.59625224078, 4.01998599966, 2.58058624352]
x = ['High_O2', 'High_O2', 'High_O2', 'High_O2', 'Low_O2',
'Low_O2', 'Low_O2', 'Low_O2', 'Mid_O2', 'Mid_O2']
在 R 中,只需键入:
kruskal.test(y,as.factor(x))
使用 scipy (0.17) 在 Python (2.7) 中做同样的事情:
from scipy import stats
stats.kruskal(y,x)
但是,在使用 scipy 时,我得到非常低的 p 值 (p<e-07)
和相当高的 H 统计量 (26)
,这是不正确的。我已尝试用 {0,1,2}
替换 x
列表,但没有任何改进。
如何告诉 scipy 在排名期间将 x
视为组?
传递给 scipy.stats.kruskal
的每个非关键字参数都被视为一组单独的 y 值。通过将 x
作为参数之一传递,kruskal
会尝试将您的标签字符串视为第二组 y 值。字符串将转换为 NaN(应该引发 RuntimeWarning
)。
相反,您需要按标签对 y
值进行分组,然后将它们作为 单独的 输入数组传递给 kruskal
。例如:
# convert `y` to a numpy array for more convenient indexing
y = np.array(y)
# find unique group labels and their corresponding indices
label, idx = np.unique(x, return_inverse=True)
# make a list of arrays containing the y-values corresponding to each unique label
groups = [y[idx == i] for i, l in enumerate(label)]
# use `*` to unpack the list as a sequence of arguments to `stats.kruskal`
H, p = stats.kruskal(*groups)
print(H, p)
# 2.94545454545 0.22929927
旧post,但值得一个更简单的答案!
#!pip install pingouin
from pingouin import kruskal
kruskal(dataset, dv='y', between='x')