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

时间:2023-02-01 14:57:37

I have a single vector of flow data (29 data) and a 3D matrix data(360*180*29)

我有一个流量数据矢量(29个数据)和一个3D矩阵数据(360 * 180 * 29)

i want to find the correlation between single vector and 3D vector. The correlation matrix will have a size of 360*180.

我想找到单个矢量和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 

This above is the structure of the vector and 3D matrix. 3D matrix has many values as Null.

以上是矢量和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)

This part of code above is the code to find correlation. But it gives waring as

上面这段代码是找到相关性的代码。但它提供了警告

> 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

also, the result of the correlation matrix is all NULL. how did this happen?

此外,相关矩阵的结果全为NULL。这怎么发生的?

> str(cor_ScottsCk_SF_SST_JJA)
 num [1:360, 1:180] NA NA NA NA NA NA NA NA NA NA ...

I have used exact same code bfr with 350 flow vector and 360*180*350 matrix. This code works perfectly.

我使用完全相同的代码bfr与350流向量和360 * 180 * 350矩阵。这段代码完美无缺。

2 个解决方案

#1


16  

A few thoughts.

一些想法。

First, by using apply(), you can replace that nested loop with something like this:

首先,通过使用apply(),您可以使用以下内容替换该嵌套循环:

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

Second, it appears that >31% (596849/(360*180*29)) of the points in ssta_winter are NaN or (possibly) NA_real_. Given the return value of a correlation calculated on vectors that contain even a single NaN,

其次,ssta_winter中的点> 31%(596849 /(360 * 180 * 29))似乎是NaN或(可能)NA_real_。给定在包含甚至单个NaN的向量上计算的相关性的返回值,

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

isn't it likely that all those NaNs are causing cor_ScottsCk_SF_SST_JJA to be filled with NAs?

是不是所有这些NaN都可能导致cor_ScottsCk_SF_SST_JJA被NAs填充?

Third, as the warning messages plainly tell you, some of the vectors you are passing to cor() have zero variance. They have nothing to do with the NaNs: as the following shows, R doesn't complain about standard deviations of 0 when NaN are involved. (Quite sensibly too, since you can't calculate standard deviations for undefined numbers):

第三,正如警告信息明确告诉你的那样,你传递给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

#2


0  

The following uses library("psych")

以下使用库(“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 contains NA for SAT.

sd包含SAT的NA。

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

subset has NA's removed

子集已删除NA

#1


16  

A few thoughts.

一些想法。

First, by using apply(), you can replace that nested loop with something like this:

首先,通过使用apply(),您可以使用以下内容替换该嵌套循环:

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

Second, it appears that >31% (596849/(360*180*29)) of the points in ssta_winter are NaN or (possibly) NA_real_. Given the return value of a correlation calculated on vectors that contain even a single NaN,

其次,ssta_winter中的点> 31%(596849 /(360 * 180 * 29))似乎是NaN或(可能)NA_real_。给定在包含甚至单个NaN的向量上计算的相关性的返回值,

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

isn't it likely that all those NaNs are causing cor_ScottsCk_SF_SST_JJA to be filled with NAs?

是不是所有这些NaN都可能导致cor_ScottsCk_SF_SST_JJA被NAs填充?

Third, as the warning messages plainly tell you, some of the vectors you are passing to cor() have zero variance. They have nothing to do with the NaNs: as the following shows, R doesn't complain about standard deviations of 0 when NaN are involved. (Quite sensibly too, since you can't calculate standard deviations for undefined numbers):

第三,正如警告信息明确告诉你的那样,你传递给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

#2


0  

The following uses library("psych")

以下使用库(“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 contains NA for SAT.

sd包含SAT的NA。

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

subset has NA's removed

子集已删除NA