You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从statsmodels的MANOVA检验结果中提取p值及解决索引错误问题

提取statsmodels MANOVA结果中的p值

嘿,我来帮你解决这个问题!首先咱们得先搞懂manova.mv_test()返回的结果到底是什么结构——它不是普通的pandas DataFrame,而是一个嵌套的MultivariateTestResults对象,里面的results属性是字典套字典,最终的统计量表格其实是藏在['x0']['stat']里的pandas DataFrame,这也是你之前索引出错的原因。

正确提取p值的方法

方式1:直接用DataFrame的标签索引(最直观)

你可以先把统计量表格单独取出来,然后用行名和列名直接定位p值:

# 先获取完整的MANOVA结果
mv_results = manova.mv_test()
# 提取x0对应的统计量表格(这是一个pandas DataFrame)
stat_table = mv_results.results['x0']['stat']

# 提取你需要的统计量的p值,比如Hotelling-Lawley trace的p值
hotelling_p = stat_table.loc['Hotelling-Lawley trace', 'Pr > F']

# 如果要提取Wilks' lambda的p值,就改成:
wilks_p = stat_table.loc['Wilks' lambda', 'Pr > F']

方式2:用整数索引(适合批量操作)

如果你习惯用数组索引,也可以先找到行的位置,再用整数定位列(Pr > F是第5列,对应索引4,因为从0开始计数):

# 找到目标统计量的行索引
row_pos = stat_table.index.get_loc('Hotelling-Lawley trace')
# 提取p值
hotelling_p = stat_table.values[row_pos, 4]

方式3:一次性提取所有统计量的p值

如果需要所有方法的p值,可以直接提取Pr > F这一列:

all_p_values = stat_table['Pr > F']
# 比如查看所有p值
print(all_p_values)
# 保存为字典方便后续调用
p_value_dict = all_p_values.to_dict()

为什么你的代码会报错?

你之前写的manova.mv_test().results['x0']['stat'].values['Hotelling-Lawley trace',4],问题出在.values——这个属性会把DataFrame转换成numpy数组,而numpy数组只能接受整数、切片这类索引,不能用字符串行名,所以才会抛出IndexError。直接用DataFrame本身的loc方法就能避免这个问题啦。

最后,把提取到的p值保存成变量就很简单了,比如:

# 保存Hotelling-Lawley trace的p值到变量
target_p = stat_table.loc['Hotelling-Lawley trace', 'Pr > F']

内容的提问来源于stack exchange,提问作者Reut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:17:35