我的任务是手动计算两个数据集(D $ Nload和D $ Pload)之间的样本相关性,然后将结果与内置cor()函数中的R进行比较。
我计算样本相关性
cov(D$Nload,D$Pload, use="complete.obs")/(sd(D$Nload)*sd(D$Pload, na.rm=TRUE))
哪个给我结果0.5693599
然后我尝试使用R的cov()函数
cor(D[, c("Nload","Pload")], use="pairwise.complete.obs")
这给了我结果:
Nload Pload
Nload 1.0000000 0.6244952
Pload 0.6244952 1.0000000
这是不同的结果。谁能看到我哪里出问题了?
答案 0 :(得分:4)
发生这种情况的原因是,当您在单个引导程序上调用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