我正在比较癌症患者和健康人DNA中结构断裂的区域。我正在尝试对每个区域的中断数量运行Kruskal-Wallis测试(SciPy统计),以查看两个发行版之间是否存在差异。我不确定Kruskal - Wallis的输入应该是数组(文档),还是数组列表(互联网上的其他地方)。
首先,我尝试了sample+control的一个数组,如下所示:
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-test。
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现在我不确定使用哪种格式/类型,希望有人能帮助我!
发布于 2015-07-25 19:51:04
scipy.stats.mstats.kruskalwallis模块使用数组。这些可以是观察值数量不均匀的数组。
如果您将数据放在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.")发布于 2017-11-29 08:26:47
我认为Kruskal Wallis测试在所有情况下都给出相同p值的原因是因为您只比较了每种情况下的两个值。
要将数组列表传递给kruskal测试,似乎需要将其作为mstats.kruskalwallis(*args)传递。请参见(create vectors for Kruskal-Wallis H-test python)
import pandas, sys
from scipy.stats import mstats
H, pval = mstats.kruskalwallis(*args)
controls = ['1', '2', '3', '4', '5']
samples = ['10', '20', '30', '70', '50']
n=0
kw_results = []
list_ = []
for item in controls:
array_item = np.array([item, samples[n]])
list_.append(array_item)
n+=1
args=[l for l in list_]
kw_test = mstats.kruskalwallis(*args)
print(kw_results)如果你有列中的数据,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)发布于 2016-03-04 00:35:51
Osian的回答对我帮助很大。我想假设第一列是某种类型的标识符,而不是数据,我还想让测试在不手动输入列标题的情况下评估所有数据列。以下是符合我的标准的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.")https://stackoverflow.com/questions/30374219
复制相似问题