Путаница в вычислении выборочной корреляции в r - PullRequest
0 голосов
/ 24 октября 2018

Мне было поручено вручную вычислить корреляцию выборки между двумя наборами данных (D $ Nload и D $ Pload), а затем сравнить результат с R в встроенной функции cor ().

Я вычисляю выборкукорреляция с

cov(D$Nload,D$Pload, use="complete.obs")/(sd(D$Nload)*sd(D$Pload, na.rm=TRUE))

, что дает мне результат 0,5693599

Затем я пытаюсь использовать функцию cov () R

cor(D[, c("Nload","Pload")], use="pairwise.complete.obs")

, которая дает мне результат:

          Nload     Pload
Nload 1.0000000 0.6244952
Pload 0.6244952 1.0000000

Это другой результат.Кто-нибудь может увидеть, где я ошибся?

1 Ответ

0 голосов
/ 24 октября 2018

Это происходит потому, что когда вы вызываете sd() для одного вектора, он не может проверить, являются ли данные попарно полными.Пример:

x <- rnorm(100)
y <- rexp(100)
y[1] <- NA
df <- data.frame(x = x, y = y)

Итак, здесь мы имеем

df[seq(2), ]
           x         y
1  1.0879645        NA
2 -0.3919369 0.2191193

Мы видим, что хотя вторая строка попарно завершена (все столбцы, используемые для ваших вычислений, не являются NA), первая строкане.Однако, если вы вычислите sd() только для одного столбца, он не будет иметь никакой информации о парах.Так что в вашем случае sd(df$x) будет использовать все доступные данные, хотя следует избегать первой строки.

cov(df$x, df$y, use = "complete.obs") / (sd(df$x)*sd(df$y, na.rm=TRUE))
[1] 0.09301583

cor(df$x, df$y, use = "pairwise.complete.obs")
[1] 0.09313766

Но если вы удалите первую строку из ваших вычислений, результат будет равен

df <- df[complete.cases(df), ]
cov(df$x, df$y, use = "complete.obs") / (sd(df$x)*sd(df$y, na.rm=TRUE))
[1] 0.09313766
cor(df$x, df$y, use = "pairwise.complete.obs")
[1] 0.09313766
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...