comportamento cor () in R diverso tra i singoli vettori e data.frame
-
28-10-2019 - |
Domanda
Sto cercando di ottenere il coefficiente di correlazione di Pearson per tutte le righe in un frame di dati l'una rispetto all'altra.ci sono valori che sono vuoti (NA) e questo sembra presentare un problema che non incontro durante l'esecuzione di cor () su 2 vettori con valori mancanti.Questo è il risultato corretto su 2 vettori:
x <- c(NA, 4.5, NA, 4, NA, 1)
y <- c(2.5, 3.5, 3, 3.5, 3, 2.5)
cor(x,y, use = "complete.obs")
[1] 0.9912407
ed ecco il risultato quando fanno parte di un data frame:
cor(t(critics1), use = "complete.obs")
y a b c d e x
y 1 NA NA NA NA NA NA
a NA 1 1 1 -1 1 -1
b NA 1 1 1 -1 1 -1
c NA 1 1 1 -1 1 -1
d NA -1 -1 -1 1 -1 1
e NA 1 1 1 -1 1 -1
x NA -1 -1 -1 1 -1 1
Warning message:
In cor(t(critics1), use = "complete.obs") : the standard deviation is zero
Perché il parametro use non ha lo stesso effetto? Ecco come appare il dataframe critics1;
film1 film2 film3 film4 film5 film6
y 2.5 3.5 3.0 3.5 3.0 2.5
a 3.0 3.5 1.5 5.0 3.0 3.5
b 2.5 3.0 NA 3.5 4.0 NA
c NA 3.5 3.0 4.0 4.5 2.5
d 3.0 4.0 2.0 3.0 3.0 2.0
e 3.0 4.0 NA 5.0 3.0 3.5
x NA 4.5 NA 4.0 NA 1.0
Soluzione
Come ha ipotizzato @joran, quando trasponi critics1
, ci sono solo due osservazioni complete (cioè righe senza valori mancanti).Ecco perché tutte le correlazioni sono 1
o -1
o (per quelle che coinvolgono y
, che ha valore 3.5 in entrambe le righe complete), NA
.
t(critics1)
# y a b c d e x
# film1 2.5 3.0 2.5 NA 3 3.0 NA
# film2 3.5 3.5 3.0 3.5 4 4.0 4.5
# film3 3.0 1.5 NA 3.0 2 NA NA
# film4 3.5 5.0 3.5 4.0 3 5.0 4.0
# film5 3.0 3.0 4.0 4.5 3 3.0 NA
# film6 2.5 3.5 NA 2.5 2 3.5 1.0
Se utilizzi use="pairwise.complete.obs"
invece di use="complete.obs"
, funziona come desideri:
cor(t(df), use="pairwise.complete.obs")["y","x"] # Extract correlation of y and x
# [1] 0.9912407