R - Предупреждающее сообщение: в cor(): стандартное отклонение равно нулю

У меня есть один вектор данных потока (29 данных) и данные трехмерной матрицы (360 * 180 * 29).

я хочу найти корреляцию между одиночным вектором и трехмерным вектором. Корреляционная матрица будет иметь размер 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-матрица имеет множество значений, таких как 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)

Эта часть кода выше — это код для поиска корреляции. Но это дает Waring как

> 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. Этот код работает отлично.


person Yu Deng    schedule 03.02.2012    source источник
comment
Для цикла все счетчики циклов не жестко закодированы, жесткое кодирование здесь просто для упрощения вопроса.   -  person Yu Deng    schedule 03.02.2012


Ответы (3)


Несколько мыслей.

Во-первых, используя apply(), вы можете заменить этот вложенный цикл чем-то вроде этого:

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

Во-вторых, оказывается, что >31% (596849/(360*180*29)) точек в ssta_winter являются NaN или (возможно) NA_real_. Учитывая возвращаемое значение корреляции, вычисленной для векторов, содержащих хотя бы один NaN,

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

разве не вероятно, что все эти NaN заставляют cor_ScottsCk_SF_SST_JJA заполняться NA?

В-третьих, как ясно говорят предупреждающие сообщения, некоторые из векторов, которые вы передаете cor(), имеют нулевую дисперсию. Они не имеют ничего общего с NaNs: как показано ниже, R не жалуется на стандартное отклонение 0, когда задействованы NaN. (Вполне разумно, так как вы не можете вычислить стандартное отклонение для неопределенных чисел):

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
person Josh O'Brien    schedule 03.02.2012
comment
Но почему раньше работало, те же сста данных, много НС. - person Yu Deng; 03.02.2012
comment
Мне это тоже любопытно, но у меня нет возможности узнать (или узнать что-либо) без данных передо мной. Удачи! - person Josh O'Brien; 03.02.2012
comment
извините, проблема в массиве ssta_winter, цикл не проходит, данные сохраняются в соответствии с последним счетчиком цикла. Спасибо за помощь. - person Yu Deng; 04.02.2012

Эта ошибка также может отображаться, если столбец имеет одинаковые значения для всех наблюдений. Итак, вы можете удалить эти строки.

person Dimple Singhania    schedule 31.08.2019

Следующее использует 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 содержит NA для SAT.

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

подмножество имеет удаленные NA

person Robert Calvert    schedule 15.07.2018