Python中Kruskal Wallis测试的输入格式

Python中Kruskal Wallis测试的输入格式,python,arrays,kruskal-wallis,Python,Arrays,Kruskal Wallis,我正在比较癌症患者和健康人的DNA结构断裂区域。我试图对每个区域的中断次数进行Kruskal-Wallis测试(SciPy统计),看看这两个分布之间是否存在差异。 我不确定Kruskal-Wallis的输入是数组(文档),还是数组列表(互联网上的其他地方) 首先,我尝试了一个用于sample+控件的数组,如下所示: controls = ['1', '2', '3', '4', '5'] samples = ['10', '20', '30', '40', '50'] n=0 for item

我正在比较癌症患者和健康人的DNA结构断裂区域。我试图对每个区域的中断次数进行Kruskal-Wallis测试(SciPy统计),看看这两个分布之间是否存在差异。 我不确定Kruskal-Wallis的输入是数组(文档),还是数组列表(互联网上的其他地方)

首先,我尝试了一个用于sample+控件的数组,如下所示:

controls = ['1', '2', '3', '4', '5']
samples = ['10', '20', '30', '40', '50']
n=0
for item in controls:
    array_item = np.array([item, samples[n]])
    kw_test = stats.mstats.kruskalwallis(array_item)
    print(kw_test)
    n+=1
这为所有项目提供了以下输出:

(0.0, nan)
我还尝试转换阵列中的各个数据点,然后运行KW测试

controls = ['1', '2', '3', '4', '5']
samples = ['10', '20', '30', '40', '50']
n=0
kw_results = []
for item in controls:
    array_controls = np.array([item])
    array_samples = np.array([samples[n]])
    kw_test = stats.mstats.kruskalwallis(array_samples, array_controls)
    kw_results.append(kw_test)
    n+=1
print(kw_results)
这就为所有的比较提供了
(1.0,0.31731050786291404)
,即使我大幅更改了其中一个列表

深入挖掘,我读到输入应该是数组列表,所以我认为只给出两个数据点(一个样本,一个控件)可能会导致“(0.0,nan)”,所以我也尝试了

controls = ['1', '2', '3', '4', '5']
samples = ['10', '20', '30', '40', '50']
list_ = []
n=0
for item in controls:
    array_item = np.array([item, samples[n]])
    list_.append(array_item)
    n+=1
kw_test = stats.mstats.kruskalwallis(list_)
print(kw_test)
这给了我一个错误:

TypeError: Not implemented for this type
现在我不确定使用什么格式/类型,希望任何人都能帮助我

模块使用数组。这些可以是具有不均匀观测数的阵列

如果您将CSV文件中的数据放在单独的列中,则类似这样的操作应该可以:

import pandas
from scipy.stats import mstats

Data = pandas.read_csv("CSVfile.csv")
Col_1 = Data['Colname1']
Col_2 = Data['Colname2']
Col_3 = Data['Colname3']
Col_4 = Data['Colname4']

print("Kruskal Wallis H-test test:")

H, pval = mstats.kruskalwallis(Col_1, Col_2, Col_3, Col_4)

print("H-statistic:", H)
print("P-Value:", pval)

if pval < 0.05:
    print("Reject NULL hypothesis - Significant differences exist between groups.")
if pval > 0.05:
    print("Accept NULL hypothesis - No significant difference between groups.")
导入熊猫
从scipy.stats导入mstats
数据=pandas.read_csv(“CSVfile.csv”)
Col_1=数据['Colname1']
Col_2=数据['Colname2']
Col_3=数据['Colname3']
Col_4=数据['Colname4']
打印(“Kruskal-Wallis H测试:”)
H、 pval=mstats.kruskalwallis(第1列、第2列、第3列、第4列)
打印(“H-统计:,H)
打印(“P值:”,pval)
如果pval<0.05:
打印(“拒绝无效假设-组间存在显著差异。”)
如果pval>0.05:
打印(“接受无效假设-各组之间无显著差异。”)

奥辛的回答对我帮助很大。我想假设第一列是某种标识符,而不是数据,我还想让测试在不手动输入列标题的情况下评估所有数据列。以下是符合我的标准的对Osian代码的修改

import pandas, sys
from scipy.stats import mstats

Data = pandas.read_csv(sys.argv[1], index_col=0, sep='\t')
H, pval = mstats.kruskalwallis([Data[col] for col in Data.columns])


print "H-statistic:\t%s\nP-value:\t%s" % (str(H),str(pval))
if pval < 0.05:
    print("Reject NULL hypothesis - Significant differences exist between groups.")
if pval > 0.05:
    print("Accept NULL hypothesis - No significant difference between groups.")
导入熊猫,系统 从scipy.stats导入mstats Data=pandas.read\u csv(sys.argv[1],index\u col=0,sep='\t') H、 pval=mstats.kruskalwallis([Data[col]表示Data.columns中的col]) 打印“H-统计:\t%s\nP值:\t%s”%(str(H),str(pval)) 如果pval<0.05: 打印(“拒绝无效假设-组间存在显著差异。”) 如果pval>0.05: 打印(“接受无效假设-各组之间无显著差异。”)
我认为Kruskal-Wallis测试在所有情况下给出相同p值的原因是,在每种情况下,您只比较了两个值

要将数组列表传递给kruskal测试,似乎需要将其作为mstats.kruskalwallis(*args)传递。见()

如果列中有数据,Patrick的修改很有用,但我无法将列表直接传递到kruskal函数中,但传递它*args有效

import pandas, sys
from scipy.stats import mstats

Data = pandas.read_csv(sys.argv[1], index_col=0, sep='\t')
args = [Data[col] for col in Data.columns]
H, pval = mstats.kruskalwallis(*args)

我试图完全像这样做,但它给出了错误TypeError:float()参数必须是字符串或数字,而不是“SingleBlockManager”。有什么想法吗?在我的情况下,没有列是动态的,我可以得到3-10列。如何处理这个案件
import pandas, sys
from scipy.stats import mstats

Data = pandas.read_csv(sys.argv[1], index_col=0, sep='\t')
args = [Data[col] for col in Data.columns]
H, pval = mstats.kruskalwallis(*args)