0

我正在寻找一个简单的解决方案来在 python 中执行多因素方差分析。2 因素嵌套方差分析是我所追求的,SPM1D python 模块是做到这一点的一种方法,但是我遇到了一个问题。

http://www.spm1d.org/doc/Stats1D/anova.html#two-way-nested-anova

对于任何嵌套方法示例,从来没有打印任何 F 统计量或 p_values,我也找不到任何方法来打印它们或将它们发送到变量。

通过运行其中一个示例的动作,其中 B 嵌套在 A 中,并带有 Y 观察:

import numpy as np
from matplotlib import pyplot
import spm1d

dataset      = spm1d.data.uv1d.anova2nested.SPM1D_ANOVA2NESTED_3x3()
Y,A,B        = dataset.get_data()

#(1) Conduct ANOVA:
alpha        = 0.05
FF           = spm1d.stats.anova2nested(Y, A, B, equal_var=True)
FFi          = FF.inference(0.05)
print( FFi )

#(2) Plot results:
pyplot.close('all')
FFi.plot(plot_threshold_label=True, plot_p_values=True)
pyplot.show()

提供的统计显着性的唯一指示是 h0 假设是否被拒绝。

> print( FFi )

SPM{F} inference list
   design    :  ANOVA2nested
   nEffects  :  2
Effects:
   A     z=(1x101) array      df=(2, 6)    h0reject=True
   B     z=(1x101) array      df=(6, 36)   h0reject=False

实际上,这应该足够了。然而,在科学中,科学家们喜欢认为某事或多或少是重要的,这实际上是一种废话……意义是二元的。但他们就是这么想的,所以我必须配合才能发表作品。

示例代码生成了一个 matplotlib 图,这确实有 f 统计量和 p_values !

#(2) Plot results:
pyplot.close('all')
FFi.plot(plot_threshold_label=True, plot_p_values=True)
pyplot.show()

\spm1d\examples\stats1d\ex_anova2nest.py 但我似乎无法得到任何打印它的输出。

FFi.get_p_values

FFi.get_f_values

产生输出:

<bound method SPMFiList.get_p_values <kabammi edit -- or get_f_values> of SPM{F} inference list
   design    :  ANOVA2nested
   nEffects  :  2
Effects:
   A     z=(1x101) array      df=(2, 6)    h0reject=True
   B     z=(1x101) array      df=(6, 36)   h0reject=False

所以我不知道该怎么办。显然 FFi.plot 类可以访问 p_values(使用 plot_p_values)但 FFi.get_p_values 不能!!?任何人都可以伸出援助之手吗?

干杯,K

4

1 回答 1

1

获取 p 值的最简单方法是使用get_p_values您提到的方法,您只需通过添加()到末尾来调用该方法。

p = FFi.get_p_values()
print(p)

这产生:

([0.016584151119287904], [])

要查看 2+-way ANOVA 中每个效应的更详细信息,包括 p 值,print请与单个 F 统计量一起使用,如下所示:

print( FFi[0] )
print( FFi[1] )

第一个打印语句将产生如下输出:

SPM{F} inference field
   SPM.effect    :   Main A
   SPM.z         :  (1x101) raw test stat field
   SPM.df        :  (2, 6)
   SPM.fwhm      :  11.79254
   SPM.resels    :  (1, 8.47993)
Inference:
   SPM.alpha     :  0.050
   SPM.zstar     :  24.30619
   SPM.h0reject  :  True
   SPM.p_set     :  0.017
   SPM.p_cluster :  (0.017)

您可以像这样检索集群的 p 值:

p = [F.p  for  F in FFi]

这给出了与调用相同的结果get_p_values

请注意,在这种情况下没有 p 值,FFi[1]因为测试统计量未能超过 -定义的alpha阈值(参见上图中的“主 B”面板)。如果您还需要在这种情况下报告 p 值,则一种选择是简单地使用“p > alpha”。在 p = 0.5 之前,可以通过参数获得更精确的 p 值,但使用参数方法时,更大的 p 值不是很准确,因此如果您需要所有情况下的 p 值,请考虑使用非参数版本 spm1d.stats.nonparam.anova2nested

于 2018-01-17T15:12:13.597 回答