我期望对于scipy.stats.mstats.pearsonr的掩码数组输入结果将为scipy.stats.pearsonr的结果与输入数据的未掩码值相同,但是不会:
from pylab import randn,rand
from numpy import ma
import scipy.stats
# Normally distributed data with noise
x=ma.masked_array(randn(10000),mask=False)
y=x+randn(10000)*0.6
# Randomly mask one tenth of each of x and y
x[rand(10000)<0.1]=ma.masked
y[rand(10000)<0.1]=ma.masked
# Identify indices for which both data are unmasked
bothok=((~x.mask)*(~y.mask))
# print results of both functions, passing only the data where
# both x and y are good to scipy.stats
print "scipy.stats.mstats.pearsonr:", scipy.stats.mstats.pearsonr(x,y)[0]
print "scipy.stats.pearsonr:", scipy.stats.pearsonr(x[bothok].data,y[bothok].data)[0]
每次您执行此操作时,答案都会有所不同,但是对于我来说,值相差约0.1,并且被屏蔽的分数越大,分歧越大.
我注意到,如果x和y都使用相同的掩码,则两个函数的结果都相同,即:
mask=rand(10000)<0.1
x[mask]=ma.masked
y[mask]=ma.masked
...
这是一个错误,还是我应该对输入数据进行预处理,以确保x和y中的掩码相同(肯定不一样)?
我正在使用numpy版本’1.8.0’和scipy版本’0.11.0b1′
解决方法:
这看起来像scipy.stats.mstats.pearsonr中的错误.看来x和y中的值应该与索引配对,因此,如果其中一个被屏蔽,则应忽略另一个.也就是说,如果x和y看起来像(使用-作为掩码值):
x = [1, --, 3, 4, 5]
y = [9, 8, --, 6, 5]
那么(-,8)和(3,-)都将被忽略,其结果应与scipy.stats.pearsonr([1,4,5],[9,6,5] ).
the mstats
version中的错误是compute the means of x
and y
的代码未使用通用掩码.
我在scipy github网站上为此创建了一个问题:https://github.com/scipy/scipy/issues/3645