spearman - R-Mensaje de advertencia: "En cor(...): la desviación estándar es cero"
correlation variables in r (2)
Tengo un solo vector de datos de flujo (29 datos) y datos de matriz 3D (360 * 180 * 29)
Quiero encontrar la correlación entre un solo vector y un vector 3D. La matriz de correlación tendrá un tamaño de 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
Lo anterior es la estructura del vector y la matriz 3D. La matriz 3D tiene muchos valores como 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)
Esta parte del código anterior es el código para encontrar la correlación. Pero da waring como
> 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
Además, el resultado de la matriz de correlación es todo NULO. ¿Cómo pasó esto?
> str(cor_ScottsCk_SF_SST_JJA)
num [1:360, 1:180] NA NA NA NA NA NA NA NA NA NA ...
He utilizado exactamente el mismo código bfr con 350 vectores de flujo y 360 * 180 * 350 matrices. Este código funciona perfectamente.
Algunos pensamientos.
Primero, utilizando apply()
, puedes reemplazar ese bucle anidado con algo como esto:
cor_ScottsCk_SF_SST_JJA <-
apply(ssta_winter, MARGIN = 1:2, FUN = cor, ScottsCk_flow_1981_2010_JJA)
En segundo lugar, parece que> 31% ( 596849/(360*180*29)
) de los puntos en ssta_winter
son NaN
o (posiblemente) NA_real_
. Dado el valor de retorno de una correlación calculada en vectores que contienen incluso un solo NaN
,
cor(c(1:3, NaN), c(1:4))
# [1] NA
¿no es probable que todos esos NaN
causen que cor_ScottsCk_SF_SST_JJA
se llene con NA
s?
Tercero, como los mensajes de advertencia le dicen claramente, algunos de los vectores que está pasando a cor()
tienen una variación cero. No tienen nada que ver con los NaN
s: como se muestra a continuación, R no se queja de las desviaciones estándar de 0 cuando se trata de NaN
. (También con bastante sensatez, ya que no puede calcular las desviaciones estándar para números no definidos):
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
La siguiente utiliza la 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 contiene NA para SAT.
partial.r(subset,c("GPA","SAT"),"GRADE1", use = "complete.obs")
no warnings
subconjunto ha eliminado las NA