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
-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.
Этот код работает отлично.
Ответы
Ответ 1
Несколько мыслей.
Во-первых, используя 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
s?
В-третьих, поскольку предупреждающие сообщения прямо говорят вам, некоторые из векторов, которые вы передаете в cor()
, имеют нулевую дисперсию. Они не имеют ничего общего с NaN
s: как показано ниже, R не жалуется на стандартные отклонения 0, когда NaN
задействован. (Совершенно разумно, так как вы не можете рассчитать стандартные отклонения для чисел undefined):
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
Следующее использует 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
Ответ 3
Эта ошибка может также отображаться, если столбец имеет одинаковые значения для всех наблюдений. Итак, вы можете удалить эти строки.