首先,我想澄清一下,我需要对特定大国的疾病和许多其他环境因素之间的数据进行回归,因此我有大量数据。
现在,我已将此数据存储在tiff
个文件中,并通过numpy
将其读入gdal
数组。每个数据集都被读入numpy
形状<54L,53L>
数组。我为每个数据集都有几个这样的数组。我需要在这两个2-D numpy
数组之间执行回归。数组中的值为Float64
。这是一个例子:
[[ 162.32145691 158.19345093 153.15704346 ..., 123.77481079 123.63883972 123.6770401 ]
[ 164.55152893 160.59266663 155.75968933 ..., 121.28504181 121.1164093 121.16275024] ...,
[ 321.38272095 329.53326416 338.85699463 ..., 193.69404602 192.50938416 191.42672729]]
像DiseaseDataset vs EnvironmentFactor1,DiseasDataset vs EnvironementFactor2等。由于关系相当未知,任意和复杂,我想首先绘制这些二维数组,但我找不到合适的方法。
那么如何在matplotlib
中的散点图中绘制二维数组?我说散点图因为我更容易推断出这种关系并转向适当的回归模型(线性,非线性,对数等)。我使用下面的代码来绘制每个numpy数组之间的行关系:
for i in range(55):
plt.scatter(JanTemp[i],can02[i])
plt.title('Disease vs Temperature')
plt.ylabel('DiseaseCases')
plt.xlabel('Temp')
plt.show()
此处can02
是响应变量,JanTemp
是预测变量。正如预期的那样,我得到了54个连续的图形和两个变量的相同颜色,这是令人沮丧的(这是我第一次使用matplotlib
的经历,我不知道如何让每个变量都有自己的颜色)。 有更好的方法吗?如果是,请建议我认为这将是三维可视化,但那么我将如何从中推断?所以请建议一种在二维空间中可视化的方法,但比上面更好。
由于我无法从图中获得太多信息,因此我决定从线性回归开始。我按以下方式迭代地使用与上面类似的scipy.stats.linregress
:
months =[JanTemp,FebTemp,MarTemp1,AprTemp,MayTemp,JunTemp,JulTemp,AugTemp,SepTemp,OctTemp,NovTemp,DecTemp]
for month in months:
csum=0
pcsum=0
for i in range(54):
slope, intercept, r_value, p_value, std_err = stats.linregress(month[i],can02[i])
csum +=r_value
pcsum += (r_value**2)*100
print "mean correlation coefficient is", csum/53
print "The avg COD is", pcsum/53
此处JanTemp
,FebTemp
等是维度54,53
的每个文件。对于每个文件,我正在进行行与行回归53次。这也很平凡。 是否有更好的方法,如功能,模块等?
我所知道的另一种方法是以下列方式使用statsmodels.api
模块的普通最小二乘(OLS):
y = can02
x = JanTemp
X = sm.add_constant(x) #Adds a constant to the linear eq of regression
est = sm.OLS(y, X) #OLS performs the regression of predictor on response
est = est.fit() #fit object of OLS fits the mode
est.summary() #Gives the summary of whole calculation
est.params #gives the coefficient of regression
但我收到以下长错误:
Traceback (most recent call last):
File "H:\Python\results.py", line 77, in <module>
est.summary() #Gives the summary of whole calculation
File "C:\Python27\lib\site-packages\statsmodels\regression\linear_model.py", line 1230, in summary
top_right = [('R-squared:', ["%#8.3f" % self.rsquared]),
File "C:\Python27\lib\site-packages\statsmodels\tools\decorators.py", line 95, in __get__
_cachedval = self.fget(obj)
File "C:\Python27\lib\site-packages\statsmodels\regression\linear_model.py", line 959, in rsquared
return 1 - self.ssr/self.centered_tss
File "C:\Python27\lib\site-packages\statsmodels\tools\decorators.py", line 95, in __get__
_cachedval = self.fget(obj)
File "C:\Python27\lib\site-packages\statsmodels\regression\linear_model.py", line 931, in ssr
return np.dot(wresid, wresid)
ValueError: matrices are not aligned
我没有得到矩阵如何不对齐。无论如何,坚持我的原始问题,还有其他类似的方法来执行回归,我将如何在二维数组上进行 谢谢,我知道我在这个漫长的问题上花了很多宝贵的时间,但我想说清楚。我在本网站和其他网站上搜索了很多问题,但我找不到合适的或相关的解决方案。感谢。
答案 0 :(得分:0)
你真的拥有轴位置,参数,年份的3D数据吗?那么这里的地理位置很少。
我认为问题根本不是numpy
,而是如何分析数据。 (一旦你知道你想要什么,你可能会对pandas
感兴趣。)
这类工作有一些非常复杂的统计方法,但您可以从一些简单的概念开始,就像使用线性回归一样。首先,你应该将因变量(结果,例如疾病)和自变量(例如温度)分开,并一次查看一个因变量。
一个简单的例子:只吃一种疾病。为此,您可以在M年内在N个地点获得案例数量。然后采取你拥有的所有P环境因素。现在,您可以计算疾病与所有P环境因素之间每个位置的时间序列相关性。这导致每N个位置的P数。
如果将其显示为图像(N行,P列),则可以查找高强度的列。它们代表疾病 - 环境因子对,似乎在许多地方重复。这不是一个统计上严格的方法,但它提供了一个快速概述。
我没有给出太多的代码示例,因为在进行任何可视化之前需要考虑统计基础。然后,可视化部分通常更容易。不幸的是,您所拥有的数据类型没有简单的可视化。
但对于散点图:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter。例如,要绘制红色标记而不是蓝色标记:scatter(x, y, c='r')
如果您只需要每个数据系列单色,您也可以使用plt.plot(x, y, 'r.')
(r
定义颜色,{{1}我们想要单独的数据点。)