cor () gedrag in R verschilt tussen individuele vectoren en data.frame

ik probeer de Pearson-correlatiecoëfficiënt voor alle rijen in een dataframe ten opzichte van elkaar te krijgen. er zijn lege waarden (NA) en dit lijkt een probleem te zijn dat ik niet tegenkom bij het uitvoeren van cor() op 2 vectoren met ontbrekende waarden. Dit is het juiste resultaat op 2 vectoren:

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

en hier is het resultaat als ze deel uitmaken van een dataframe:

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

Waarom heeft de gebruiksparameter niet hetzelfde effect? Dit is hoe het dataframe van critici1 eruit ziet;

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
5
Misschien zijn er eigenlijk geen volledige waarnemingen in uw matrix, in welk geval u mogelijk pairwise.complete.obs moet gebruiken? De enige manier om het zeker te weten is om de structuur van je matrix te delen, zoals Josh zegt.
toegevoegd de auteur joran, de bron
Hoe ziet het data.frame critics1 er uit? Zou je een paar rijen in je vraag kunnen opnemen?
toegevoegd de auteur Josh O'Brien, de bron
@joran. Bingo. Er zijn slechts twee volledige observaties en (om op te starten), toont y geen variantie onder hen. Met pairwise.complete.obs werkt het prima.
toegevoegd de auteur Josh O'Brien, de bron

1 antwoord

Zoals @joran speculeerde, zijn er, wanneer je critici1 transponeert, slechts twee volledige waarnemingen (dat wil zeggen rijen zonder ontbrekende waarden). Daarom zijn alle correlaties 1 of -1 of (voor die met y , die waarde 3.5 heeft in beide volledige rijen), 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

Als u use = "pairwise.complete.obs" gebruikt in plaats van use = "complete.obs" , werkt het zoals u wilt:

cor(t(df), use="pairwise.complete.obs")["y","x"] # Extract correlation of y and x
# [1] 0.9912407
7
toegevoegd