【问题标题】:R - Warning message: "In cor(...): the standard deviation is zero"R - 警告消息:“在 cor(...) 中:标准偏差为零”
【发布时间】:2026-01-17 18:35:01
【问题描述】:

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

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

另外,相关矩阵的结果都是NULL。这是怎么发生的?

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

我使用了完全相同的代码 bfr,带有 350 个流向量和 360*180*350 矩阵。 此代码完美运行。

【问题讨论】:

  • for循环,所有循环计数器都没有硬编码,这里的硬编码只是为了简化问题。

标签: r multidimensional-array matrix warnings correlation


【解决方案1】:

如果列的所有观察值都相同,也可能会显示此错误。因此,您可能希望删除这些行。

【讨论】:

    【解决方案2】:

    以下使用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

    【讨论】:

      【解决方案3】:

      一些想法。

      首先,通过使用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
      

      难道不是所有NaNs 都导致cor_ScottsCk_SF_SST_JJANAs 填充吗?

      第三,警告信息清楚地告诉您,您传递给cor() 的一些向量的方差为零。它们与NaNs 无关:如下所示,当涉及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
      

      【讨论】:

      • 但是为什么它以前可以工作,相同的 ssta 数据,很多 NA。
      • 我对此也很好奇,但如果没有我面前的数据,我无法知道(或学习任何东西)。祝你好运!
      • 对不起,问题出在ssta_winter数组,循环不向下传递,数据保存在最后一个循环计数器对应的位置。感谢您的帮助。