警告消息:“在cor(.)中:标准偏差为零”

hfsqlsce  于 2023-07-31  发布在  其他
关注(0)|答案(5)|浏览(670)

我有一个流数据(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矩阵。这段代码工作得很好。

qhhrdooz

qhhrdooz1#

一些想法。
首先,通过使用apply(),你可以用类似这样的代码替换嵌套循环:

cor_ScottsCk_SF_SST_JJA <- 
    apply(ssta_winter, MARGIN = 1:2, FUN = cor, ScottsCk_flow_1981_2010_JJA)

字符串
第二,ssta_winter中有>31%(596849/(360*180*29))的点是NaN或(可能)NA_real_。给定在包含单个NaN的向量上计算的相关性的返回值,

cor(c(1:3, NaN), c(1:4))
# [1] NA


是不是所有这些NaN s导致cor_ScottsCk_SF_SST_JJANA s填充?
第三,正如警告消息清楚地告诉您的那样,您传递给cor()的一些向量的方差为零。与NaN无关:如下所示,当涉及NaN时,R不会抱怨标准差为0。(这也很合理,因为你不能计算未定义数字的标准差):

cor(c(NaN, NaN, NaN, NaN), c(1,1,1,1))
# [1] NA

cor(c(1,1,1,1), c(1,2,3,4))
# [1] NA
# Warning message:
# In cor(c(1, 1, 1, 1), c(1, 2, 3, 4)) : the standard deviation is zero

2wnc66cl

2wnc66cl2#

如果某列的所有观测值都相同,也可能显示此错误。因此,您可能需要删除这些行。

e5nszbig

e5nszbig3#

以下使用library("psych")

partial.r(sd,c("GPA","SAT"),"GRADE1",use = "complete.obs")
Warning Message:
 In cor(data, use = use, method = method) : the standard deviation is zero

字符串
sd包含SAT的NA。

partial.r(subset,c("GPA","SAT"),"GRADE1", use = "complete.obs")
no warnings


子集已删除NA

fquxozlt

fquxozlt4#

如果您的数据对于存储格式来说太大,也会出现此警告。例如,如果你有数万亿的数据(可能是GDP),并且数据存储为32位整数,R可能会将它们识别为数字,即使它无法对这种格式的数据进行计算(这就是为什么它认为标准差为0,即使你所有的值都不同)。
如果是这种情况,当您查看数据并将鼠标悬停在列标题上时,可能会看到类似“column X:范围未定义的数字-未定义。”
在这种情况下,除以一个常数(比如1,000,000)来减小值的大小可以解决这个问题。

zte4gxcn

zte4gxcn5#

这种解决办法可能会奏效

x <- rep(1, 5)    
y <- 1:5   

if(sd(x) == 0){
  print("denem")
  x[1] <- x[1] * .99
}
cor(x,y)

字符串

相关问题