使用python进行单因素方差分析(ANOVA)和事后多重比较(LSD)

#idea来源#

    在使用spss帮朋友做单因素分析时,发现个别数据需要调整到符合显著性的要求,在spss中修改数据,再在spss中操作步骤太麻烦,于是有了这个想法。

程序思路

1、将数据放到excel里,确定两列数据,Group(分组数据)和B(对应数据列)

2、程序读取excel数据

3、整理数据格式,将数据分组,将数据从宽格式转换为长格式,以便于进行ANOVA分析。

4、执行单因素方差分析(ANOVA),使用 statsmodelsolsanova_lm 方法进行单因素方差分析。

5、计算均方误差(MSE)和LSD值,计算每组的均值和标准差,根据均方误差和样本量计算LSD值。

6、进行LSD多重比较,比较各组之间的均值差异,判断是否显著。

程序代码:


import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import ols

# 读取数据
file_path = 'data.xlsx'  # 替换为你的数据文件路径
df = pd.read_excel(file_path)

# 查看数据结构
print(df.head())

# 转换数据格式为长格式
data_long = pd.melt(df, id_vars=['Group'], value_vars=['B'], var_name='Sample', value_name='Value')

# 查看长格式数据
print(data_long.head())

# 执行单因素方差分析(ANOVA)
model = ols('Value ~ C(Group)', data=data_long).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print("\n单因素方差分析结果:")
print(anova_table)


# 提取均方误差 (MSE)
mse = anova_table['sum_sq'][1] / anova_table['df'][1]

# 计算每组的均值和标准差
group_stats = data_long.groupby('Group')['Value'].agg(['mean', 'std', 'count'])
print("\n各组统计信息:")
print(group_stats)



# 计算LSD
alpha = 0.05
n = data_long['Value'].count() / len(data_long['Group'].unique())  # 每组样本量
t_value = stats.t.ppf(1 - alpha / 2, df=(len(data_long['Value']) - len(data_long['Group'].unique())))
lsd = t_value * np.sqrt(2 * mse / n)
print(f"\nLSD值: {lsd}")


# 多重比较:计算组间均值差异并判断显著性
groups = data_long['Group'].unique()
comparisons = []

for i in range(len(groups)):
    for j in range(i + 1, len(groups)):
        group1 = groups[i]
        group2 = groups[j]
        mean_diff = abs(group_stats.loc[group1, 'mean'] - group_stats.loc[group2, 'mean'])
        if mean_diff > lsd:
            comparisons.append((group1, group2, mean_diff, True))
        else:
            comparisons.append((group1, group2, mean_diff, False))



# 输出比较结果
print("\nLSD多重比较结果:")
for group1, group2, mean_diff, significant in comparisons:
    if significant:
        print(f"组 {group1} 和 组 {group2} 之间的均值差异 {mean_diff:.2f} 显著大于 LSD 值 {lsd:.2f}")
    else:
        print(f"组 {group1} 和 组 {group2} 之间的均值差异 {mean_diff:.2f} 不显著")

同样的数据 执行结果与spss执行结果一致。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值