python计算Friedman排名代码

python计算Friedman排名代码

首先先说输入数据,为了迅速处理,采用csv格式的表格,读者可以先理解这里提供的示例和代码,再自行调整
在这里插入图片描述
下面是代码,代码会生成一个排名文件Rank.csv。其除了会生成每个方法再每个案例下排名,还会得到一行平均排名,故最后生成的形状为19*33

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  9 10:15:36 2022

@author: Administrator
"""

import numpy as np

da=np.loadtxt("values.csv",delimiter=",",dtype="str")#np.float32
n=11 #n是11个方法进行排名
#[bpd,apd,wpd]分别是最优,平均和最差指标值
bpd=da[:,:n]
apd=da[:,n:n+n]
wpd=da[:,n+n:]
all_pd=[bpd,apd,wpd]
all_pd1=[]
#如果不需要最优,平均和最差指标值分别计算,可以去掉这个for循环直接用da
for pd in all_pd:
    pd=pd.tolist()
    pd1=[]
    for x in pd:
        x1=[float(i) for i in x]
        rank1=1
        used=0
        minn=1000000000000
        same_l=[]
        x2=[0 for _ in range(n)]
        while used<n:
            # print(used)
            for j in range(0,n):
                if x2[j]==0:
                    item=x1[j]
                    if item<minn:
                        minn=item
                        same_l=[]
                        same_l.append(j)
                    elif item==minn:
                        same_l.append(j)
            if len(same_l)==1:
                avg_pd=rank1
            else:
                avg_pd=rank1+(len(same_l)-1)/2
            for j in same_l:
                x2[j]=avg_pd
            rank1=len(same_l)+rank1
            used=used+len(same_l)
            same_l=[]
            minn=1000000000000

        pd1.append(np.array(x2))
    pd=pd1
    all_pd1.append(np.array(pd))

all_pd1=np.array(all_pd1)
tmp=np.hstack((all_pd1[1],all_pd1[2]))
all_pd1=np.hstack((all_pd1[0],tmp))
tmp=np.mean(all_pd1,axis=0)
tmp=tmp.reshape((1,n*3))
all_pd1=np.vstack((all_pd1,tmp))
np.savetxt("ranks.csv",all_pd1,delimiter=",",fmt="%.3f")
<think>好的,用户想了解如何在Python中实现Friedman检验的事后比较。首先,我需要回忆一下Friedman检验的基本概念和应用场景。Friedman检验是非参数方法,用于比较三个或更多相关组之间的差异,通常用于重复测量或匹配样本的情况。当Friedman检验显示存在显著差异时,需要进行事后比较来确定具体哪些组之间存在差异。 接下来,用户的问题集中在事后比较的实现上。Python中常用的统计库是scipy和statsmodels,但scipy的friedmanchisquare函数只返回检验统计量和p值,不提供事后分析。因此,可能需要手动实现或使用其他库。 我记得在R语言中,有专门的函数如pairwise.wilcox.test来进行事后比较,但Python中可能需要类似的方法。可能的步骤包括:进行Friedman检验,如果结果显著,再使用Wilcoxon符号秩检验进行两两比较,并调整p值以控制多重比较的错误率,比如Bonferroni校正或Holm方法。 然后,我需要查阅相关资料,确保步骤正确。例如,使用scipy的friedmanchisquare进行初步检验,然后使用wilcoxon函数进行两两比较,再使用statsmodels的multipletests进行p值校正。同时,要注意数据的排列方式是否符合函数的要求,比如数据是否以样本为行,组别为列。 还需要考虑用户可能的实际应用场景,比如实验设计中的重复测量数据,或者多个处理条件下的比较。要确保示例代码清晰,步骤明确,便于用户理解和应用。此外,需要提醒用户关于数据正态性假设不满足时使用非参数方法,以及多重比较校正的必要性。 可能的问题包括:如何安装所需的库,如何处理数据格式,如何解释输出结果。因此,在回答中需要包含安装命令、数据准备的示例,以及结果解释的说明。同时,引用相关的文献或资料来支持方法的有效性,比如引用统计教材或官方文档。 最后,生成的相关问题需要围绕Friedman检验和事后比较的扩展,例如前提条件、其他检验方法、结果可视化等,帮助用户进一步学习。</think>要使用Python进行Friedman检验的事后比较,需分步实现。以下是具体操作步骤和代码实现: ### 1. Friedman检验基础 Friedman检验用于判断$k$个相关样本组是否存在统计差异,其原假设是各组分布相同。检验统计量为: $$ \chi_F^2 = \frac{12N}{k(k+1)}\left(\sum R_j^2 - \frac{k(k+1)^2}{4}\right) $$ 其中$N$为样本量,$R_j$为第$j$组的秩和[^1]。 ### 2. 实现步骤 #### (1) 执行Friedman检验 ```python from scipy.stats import friedmanchisquare # 示例数据:3个处理组,10个样本 data_group1 = [5.1, 6.2, 4.9, 7.3, 5.8, 6.5, 5.4, 6.0, 5.7, 6.1] data_group2 = [6.3, 7.1, 6.8, 7.5, 6.9, 7.4, 6.7, 7.2, 6.5, 7.0] data_group3 = [4.8, 5.6, 4.5, 5.9, 5.2, 5.7, 4.9, 5.5, 5.1, 5.3] stat, p_value = friedmanchisquare(data_group1, data_group2, data_group3) print(f"Friedman检验统计量:{stat:.3f}, p值:{p_value:.4f}") ``` #### (2) 事后比较实现 当p<0.05时,使用Wilcoxon符号秩检验进行两两比较,并进行p值校正: ```python from scipy.stats import wilcoxon from statsmodels.stats.multitest import multipletests # 生成所有组别组合 pairs = [(0,1), (0,2), (1,2)] raw_pvalues = [] for i,j in pairs: stat, p = wilcoxon(eval(f"data_group{i+1}"), eval(f"data_group{j+1}")) raw_pvalues.append(p) # Bonferroni校正 reject, adj_pvalues, _, _ = multipletests(raw_pvalues, method='bonferroni') # 输出结果 for (i,j), p, adj_p in zip(pairs, raw_pvalues, adj_pvalues): print(f"Group{i+1} vs Group{j+1}: 原始p值={p:.4f}, 校正后p值={adj_p:.4f}") ``` ### 3. 结果解读 - 校正后p值<0.05表示两组存在显著差异 - 示例输出可能显示: ``` Group1 vs Group2: 校正后p值=0.012* Group1 vs Group3: 校正后p值=0.846 Group2 vs Group3: 校正后p值=0.009** ``` ### 4. 注意事项 - 建议样本量≥10以保证检验效力 - 可使用Holm方法替代Bonferroni(method='holm') - 数据应满足重复测量或匹配样本条件 - 对于非参数检验,效应量可计算匹配对间的秩次差异
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽会微笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值