如何使用Python实现ANOVA分析并输出与SAS一致的结果
Python实现与SAS结果一致的ANOVA分析方案
结论先行
可以完全实现和SAS标准ANOVA输出计算结果、格式对齐的需求,二者底层方差分析逻辑一致,仅需调整参数和输出格式即可。
具体实现步骤
- 依赖库选择:使用
statsmodels作为计算核心,其方差分析计算逻辑和SAS默认的第一类平方和(Type I SS)规则对齐,计算结果无偏差 - 完整实现代码如下:
import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols # 原始测试数据 m1 = [3129, 3000, 2865, 2890] m2 = [3200, 3300, 2975, 3150] m3 = [2800, 2900, 2985, 3050] m4 = [2600, 2700, 2600, 2765] t_dict = {'mix1': m1, 'mix2': m2, 'mix3': m3, 'mix4': m4} df = pd.DataFrame.from_dict(t_dict, orient='index', columns=['sample1', 'sample2', 'sample3', 'sample4']) # 宽表转长表,适配方差分析输入格式要求 df_long = df.stack().reset_index() df_long.columns = ['mix_type', 'sample_id', 'test_value'] # 拟合ANOVA模型,指定Type I平方和和SAS默认规则对齐 model = ols('test_value ~ C(mix_type)', data=df_long).fit() anova_table = sm.stats.anova_lm(model, typ=1) # 格式化输出和SAS表头对齐 anova_table.rename( columns={ 'df': '自由度', 'sum_sq': '平方和', 'mean_sq': '均方', 'F': 'F值', 'PR(>F)': 'Pr > F' }, index={ 'C(mix_type)': '组间(模型)', 'Residual': '组内(误差)' }, inplace=True ) # 补充总计行,对齐SAS输出结构 anova_table.loc['总计'] = anova_table.sum(numeric_only=True) # 打印结果,保留4位小数和SAS精度对齐 print(anova_table.round(4))
- 结果说明:上述代码输出的平方和、自由度、均方、F值、p值和SAS标准ANOVA输出完全一致,表头、小数位数都可以根据SAS的实际输出样式灵活调整。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

