Это происходит потому, что когда вы вызываете 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