[英]Correlations between columns with NAs in them
我正在嘗試計算以下前 3 個國家(德國、意大利、日本)與第二個 3 個國家(美國、加拿大、英國)之間的一些相關性。
例如,它將是德國對美國,德國對加拿大,德國對英國,然后是意大利對美國,意大利,對加拿大,意大利對英國等等。
但是,由於我的數據在前幾行(如德國和日本)中確實存在一些空白,因此通常的 corr 函數不起作用。 因此,在這種情況下,數據應跳過德國的前 2 行和日本的前 3 行,並從德國和日本的第 3 行和第 4 行開始,以與美國/加拿大/英國的類似行進行比較,同時具有完整的相關性意大利的數據。
所以我想知道我該怎么做?
謝謝
df11 <-
tibble(
date = 2001:2010,
Germany = runif(10),
Italy = runif(10),
Japan = runif(10),
US = runif(10),
Canada = runif(10),
UK = runif(10)
)
df11$Germany[1:2] <- NA
df11$Japan[1:3] <- NA
在combn
使用cor
。 而不是df[-1]
,它只是排除日期列,您可以明確定義例如df11[c("Germany", "Italy", "Japan")]
來進行特定的國家選擇。 use="complete.obs"
僅包含完整的觀察結果,請參閱文檔?cor
了解其他選項。
res <- combn(df11[-1], 2, cor, use="complete.obs", simplify=FALSE)
res
# [[1]]
# Germany Italy
# Germany 1.00000000 -0.08586634
# Italy -0.08586634 1.00000000
#
# [[2]]
# Germany Japan
# Germany 1.0000000 0.3699611
# Japan 0.3699611 1.0000000
#
# [[3]]
# Germany US
# Germany 1.00000000 0.07002937
# US 0.07002937 1.00000000
#
# [[4]]
# Germany Canada
# Germany 1.0000000 0.3949677
# Canada 0.3949677 1.0000000
#
# [[5]]
# Germany UK
# Germany 1.0000000 0.5248062
# UK 0.5248062 1.0000000
#
# [[6]]
# Italy Japan
# Italy 1.00000000 0.09700777
# Japan 0.09700777 1.00000000
#
# [[7]]
# Italy US
# Italy 1.0000000 -0.1351394
# US -0.1351394 1.0000000
#
# [[8]]
# Italy Canada
# Italy 1.0000000 -0.1587657
# Canada -0.1587657 1.0000000
#
# [[9]]
# Italy UK
# Italy 1.0000000 -0.5379418
# UK -0.5379418 1.0000000
#
# [[10]]
# Japan US
# Japan 1.000000 -0.744641
# US -0.744641 1.000000
#
# [[11]]
# Japan Canada
# Japan 1.0000000 0.5813378
# Canada 0.5813378 1.0000000
#
# [[12]]
# Japan UK
# Japan 1.0000000 -0.1877573
# UK -0.1877573 1.0000000
#
# [[13]]
# US Canada
# US 1.0000000 -0.5947739
# Canada -0.5947739 1.0000000
#
# [[14]]
# US UK
# US 1.00000000 0.01007044
# UK 0.01007044 1.00000000
#
# [[15]]
# Canada UK
# Canada 1.0000000 0.3784406
# UK 0.3784406 1.0000000
如果您對系數而不是矩陣感興趣,那就去做吧。
sapply(res, `[`, 2)
# [1] -0.08586634 0.36996112 0.07002937 0.39496772 0.52480618 0.09700777
# [7] -0.13513936 -0.15876568 -0.53794180 -0.74464099 0.58133779 -0.18775725
# [13] -0.59477393 0.01007044 0.37844058
或者如果你想要矩陣,
cor(df11[-1], use="complete.obs")
# Germany Italy Japan US Canada UK
# Germany 1.00000000 0.05086447 0.36996112 -0.02672511 0.3531181 0.4261229
# Italy 0.05086447 1.00000000 0.09700777 -0.03657892 -0.1514971 -0.6038602
# Japan 0.36996112 0.09700777 1.00000000 -0.74464099 0.5813378 -0.1877573
# US -0.02672511 -0.03657892 -0.74464099 1.00000000 -0.6574211 0.2106356
# Canada 0.35311813 -0.15149706 0.58133779 -0.65742113 1.0000000 0.2452463
# UK 0.42612287 -0.60386019 -0.18775725 0.21063562 0.2452463 1.0000000
如果你的目標是使用cor.test
可以使用names
中combn
並粘貼as.formula
使用sprintf
。 請參閱上文如何獲得一個子集。
res2 <- combn(names(df11[-1]), 2, \(x)
cor.test(as.formula(sprintf('~ %s + %s', x[1], x[2])), data=df11),
simplify=F)
res2[[1]] ## first result
# Pearson's product-moment correlation
#
# data: Germany and Italy
# t = -0.21111, df = 6, p-value = 0.8398
# alternative hypothesis: true correlation is not equal to 0
# 95 percent confidence interval:
# -0.7454347 0.6586606
# sample estimates:
# cor
# -0.08586634
從mycor
函數中,您可以在r-bloggers 中找到,
mycor<- function(x,...){
r<- apply(x, 2, function(j){
apply(x, 2, function(i){
as.numeric(cor.test(i,j)$estimate)
})
})
P<- apply(x, 2, function(j){
apply(x, 2, function(i){
as.numeric(cor.test(i,j)$p.value)
})
})
out<-c()
out$P<- P
out$r<- r
return(out)
}
mycor(df11)$r
date Germany Italy Japan US Canada UK
date 1.00000000 0.3829687 -0.09309048 -0.46562050 -0.44324591 0.41293491 0.7908250
Germany 0.38296868 1.0000000 0.32186956 -0.19135611 -0.49111087 -0.38151625 0.6377928
Italy -0.09309048 0.3218696 1.00000000 0.04341171 0.09589073 -0.32724552 0.2138135
Japan -0.46562050 -0.1913561 0.04341171 1.00000000 0.52800797 0.25226383 -0.4802936
US -0.44324591 -0.4911109 0.09589073 0.52800797 1.00000000 0.08124373 -0.4869257
Canada 0.41293491 -0.3815163 -0.32724552 0.25226383 0.08124373 1.00000000 0.1033160
UK 0.79082499 0.6377928 0.21381349 -0.48029364 -0.48692567 0.10331600 1.0000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.