web-dev-qa-db-fra.com

R - Message d'avertissement: "En cor (...): la déviation standard est zéro"

J'ai un seul vecteur de données de flux (29 données) et une donnée de matrice 3D (360 * 180 * 29)

je veux trouver la corrélation entre un seul vecteur et un vecteur 3D. La matrice de corrélation aura une taille 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 

Ceci est la structure du vecteur et de la matrice 3D. La matrice 3D a beaucoup de valeurs comme 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)

Cette partie du code ci-dessus est le code permettant de trouver une corrélation. Mais il donne waring comme 

> 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

de plus, le résultat de la matrice de corrélation est NULL. comment est-ce arrivé?

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

J'ai utilisé exactement le même code bfr avec le vecteur de flux 350 et la matrice 360 ​​* 180 * 350. Ce code fonctionne parfaitement.

18
Yu Deng

Quelques réflexions 

Tout d'abord, en utilisant apply(), vous pouvez remplacer cette boucle imbriquée par quelque chose comme ceci:

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

Deuxièmement, il apparaît que> 31% (596849/(360*180*29)) des points dans ssta_winter sont NaN ou (éventuellement) NA_real_. Étant donné la valeur de retour d’une corrélation calculée sur des vecteurs contenant même une seule variable NaN,

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

n'est-il pas probable que tous ces NaNs font que cor_ScottsCk_SF_SST_JJA soit rempli avec NAs?

Troisièmement, comme l'indiquent clairement les messages d'avertissement, certains des vecteurs que vous transmettez à cor() ont une variance nulle. Ils n’ont rien à voir avec les NaNs: comme le montre ce qui suit, R ne se plaint pas des écarts-types de 0 lorsque NaN sont impliqués. (C'est assez logique aussi, car vous ne pouvez pas calculer les écarts-types pour des nombres non définis):

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
17
Josh O'Brien

Les utilisations suivantes 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 contient NA pour SAT.

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

le sous-ensemble a NA supprimé

1
Robert Calvert