2017-12-02 158 views
1

问题Python-如何做2D数组的f测试?

我有两个数组,我们会打电话给他们AR1和AR2(大小(192289)),代表LAT-LON标准偏差的地图,我有一个同样大小的数组区别。我想绘制这个差异,并且在两个阵列之间的差异在统计上显着的95%置信水平(α= 0.05)上的点状模式上。

我是用我的coding-这个例子的代码

How do I do a F-test in python

我用乔尔·科内特的解决方案,替代ar1并在X ar2和Y

F = np.var(ar1)/np.var(ar2) 
print np.var(ar1), np.var(ar2) 
print F 

0.118586507371 0.161485609461 0.734347213766

对于下一部分,我想要N-2自由度用于我的分析,其中N是阵列中的点数,在本例中为55848(192 x 289)。 len(ar1)len(ar2)在这里不起作用,因为它们只给出第一维的长度,所以我尝试将数组展平为正确的长度。

df1 = len(np.ndarray.flatten(sdmod)) - 2 
df2 = len(np.ndarray.flatten(sdcon)) - 2 
print df1, df2 

55486 55486

然而,这个我结束了9.88365269356e-289的p值(基本为0)前进。这是一个单一的值,正如我在这个特殊情况下所预期的那样,统计上并不重要,但是我需要一个值为的数组,以便进行点划分,以便我可以查看网格中是否存在差异显着的地方。我只是不确定如何在二维数组上执行此测试,因为我找到的所有示例都使用了列表或其他一维数据类型,而且我以前也从未做过这样的分析。 (我正在应我的顾问的要求,他不使用Python)。

如何执行上的两个2 d阵列,其中的结果给出了一个类似尺寸的阵列,让你为每个网格点的p值的t-检验的问题?

我可以修改这个,如果可能的话填写任何我可能由于缺乏对主题的理解而丢失的东西(并且让我知道是我得到的p值看起来不正确),但是如果这样复杂或不完整的帮助,我会删除它。

回答

0

这取决于你的数组。如果步长足够大,经纬度/长度数组可以分成较小的块,则可以评估24x24的平方而不是整个数组。你可以检查不同的尺度,看看有什么意义。为了实现这种尝试沿着此线的东西:

F = np.zeros((derp.shape[0]-24, derp.shape[1]-24)) 
for a in np.arange(0, F.shape[0]): 
    for b in np.arange(0, F.shape[1]): 
     F[a,b] = np.var(ar1[a:a+24, b:b+24])/np.var(ar2[a:a+24, b:b+24]) 

这将产生类似的大小输出(168265)阵列,因为24×24平方的1步骤不一定意义上面的代码进行评估了。半重叠的正方形将产生更小的步长的更明智的结果:

F = np.zeros(((derp.shape[0]-24)//12, (derp.shape[1]-24)//12)) 
for a in np.arange(0, F.shape[0]): 
    for b in np.arange(0, F.shape[1]): 
     F[a,b] = np.var(derp[a*12:a*12+24, b*12:b*12+24])/np.var(derp2[a*12:a*12+24, b*12:b*12+24]) 

这会产生(14,22)数组。

+0

感谢您的回复。我已经尝试过你的方法,并将p_value < (>)alpha的值赋给一个数组,其中它们的值为1(0)。然而,在结果数组中,我的“重要”结果并不符合我所期望的ar1和ar2之间差别很大的区域。需要说明的是,df1和df2 = F中使用的尺寸大小? – ChristineB