我有一个流数据(29个数据)和一个3D矩阵数据(36018029)
我想找到单个矢量和3D矢量之间的相关性。相关矩阵将具有360*180的大小。
> str(ScottsCk_flow_1981_2010_JJA)
num [1:29] 0.151 0.644 0.996 0.658 1.702 ...
> str(ssta_winter)
num [1:360, 1:180, 1:29] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
> summary(ssta_winter)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-2.8 -0.2 0.1 0.2 0.6 6.0 596849.0
字符串
以上是矢量和3D矩阵的结构。3D矩阵有许多值为Null。
> for (i in 1:360) {
+ for(j in 1:180){
+ cor_ScottsCk_SF_SST_JJA[i,j] = cor(ScottsCk_flow_1981_2010_JJA,ssta_winter[i,j,])
+ }
+ }
There were 50 or more warnings (use warnings() to see the first 50)
型
上面的这部分代码是查找相关性的代码。但它给予警告作为
> warnings()
Warning messages:
1: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
2: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
3: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
4: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
5: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
型
相关矩阵的结果也全为空。怎么会这样?
> str(cor_ScottsCk_SF_SST_JJA)
num [1:360, 1:180] NA NA NA NA NA NA NA NA NA NA ...
型
我使用了完全相同的代码bfr与350流矢量和360180350矩阵。这段代码工作得很好。
5条答案
按热度按时间qhhrdooz1#
一些想法。
首先,通过使用
apply()
,你可以用类似这样的代码替换嵌套循环:字符串
第二,
ssta_winter
中有>31%(596849/(360*180*29)
)的点是NaN
或(可能)NA_real_
。给定在包含单个NaN
的向量上计算的相关性的返回值,型
是不是所有这些
NaN
s导致cor_ScottsCk_SF_SST_JJA
被NA
s填充?第三,正如警告消息清楚地告诉您的那样,您传递给
cor()
的一些向量的方差为零。与NaN
无关:如下所示,当涉及NaN
时,R不会抱怨标准差为0。(这也很合理,因为你不能计算未定义数字的标准差):型
2wnc66cl2#
如果某列的所有观测值都相同,也可能显示此错误。因此,您可能需要删除这些行。
e5nszbig3#
以下使用
library("psych")
字符串
sd包含SAT的NA。
型
子集已删除NA
fquxozlt4#
如果您的数据对于存储格式来说太大,也会出现此警告。例如,如果你有数万亿的数据(可能是GDP),并且数据存储为32位整数,R可能会将它们识别为数字,即使它无法对这种格式的数据进行计算(这就是为什么它认为标准差为0,即使你所有的值都不同)。
如果是这种情况,当您查看数据并将鼠标悬停在列标题上时,可能会看到类似“column X:范围未定义的数字-未定义。”
在这种情况下,除以一个常数(比如1,000,000)来减小值的大小可以解决这个问题。
zte4gxcn5#
这种解决办法可能会奏效
字符串