R:グループごとの相関を計算する


17

Rには、クラスラベルC(因子)と2つの測定値M1およびM2を含むデータフレームがあります。各クラス内でM1M2の相関を計算するにはどうすればよいですか?

理想的には、クラスごとに1行、クラスラベルCと相関関係の2列のデータフレームが返されます。

回答:


20

パッケージplyrがその方法です。

簡単な解決策は次のとおりです。

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

require(plyr)
func <- function(xx)
{
return(data.frame(COR = cor(xx$a, xx$b)))
}

ddply(xx, .(group), func)

出力は次のようになります。

  group         COR
1     1  0.05152923
2     2 -0.15066838
3     3 -0.04717481
4     4  0.07899114

1
(+1)素敵なplyrパッケージですね。:)
chl

これはうまく機能します。plyrパッケージを指摘してくれてありがとう!「。(グループ)」構文について説明していただけますか?
NPE

2
エクス-確かに。これは、「。()の間の変数でデータを分割し、各サブセットで機能を実行する」ことを意味します。より多くの変数を含めるには、単に。(var1、var2、var3)の構文を使用する必要があります。これは、var1、var2、var3のレベルの各組み合わせでデータをカットするようなものです。そして、カットごとに機能を実行します。このパッケージはHadley(ggplot2の作者でもある)によって管理されているので、開発を続けると信じています。
タルガリリ

2
ああ、ところで、いくつかのコアで並列コンピューティングでplyrを使用することもできます(ほぼ自動的に)。r
Tal Galili

1
...それは素敵な答えだが、私はCOR(= ZによってX、Y、)のようなものはそう直感的になり、内蔵されたこのための解決策がない驚きだ
Waldir Leoncio

12

基本パッケージで関数を使用する場合は、関数を使用してからbyデータを再構築できます。

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)

# This returns a "by" object
result <- by(xx[,2:3], xx$group, function(x) {cor(x$a, x$b)})

# You get pretty close to what you want if you coerce it into a data frame via a matrix
result.dataframe <- as.data.frame(as.matrix(result))

# Add the group column from the row names
result.dataframe$C <- rownames(result)

1
よかった、ありがとう!を試してきましたがby、結果をデータフレームに変換する方法がわかりませんでした。
NPE

9

基本パッケージとTalのサンプルデータを使用した別の例:

DataCov <- do.call( rbind, lapply( split(xx, xx$group),
             function(x) data.frame(group=x$group[1], mCov=cov(x$a, x$b)) ) )

エレガントなソリューションJoshue。あるソリューションが別のソリューションより優れている場合があると思いますか?
タルガリリ

2
好みの問題だと思います。私の例は基本的に何をするものですplyrが、それはあなたがより細かく制御することができますが、それほどきれいではありません。1つのソリューションの時間/メモリプロファイルが改善された場合、私の意見は変わります。私はそれらを比較していません。
ジョシュアウルリッヒ

これはどのように相関を返しますか?

2

data.tableの使用はdplyrよりも短い

dt <- data.table(xx)
dtCor <- dt[, .(mCor = cor(M1,M2)), by=C]

0

同様の方法で、各相関のn値とp値を含むテーブルが得られます(便宜上、小数点以下3桁に丸められます)。

library(Hmisc)
corrByGroup <- function(xx){
  return(data.frame(cbind(correl = round(rcorr(xx$a, xx$b)$r[1,2], digits=3),
                          n = rcorr(xx$a, xx$b)$n[1,2],
                          pvalue = round(rcorr(xx$a, xx$b)$P[1,2], digits=3))))
}

0

dplyrパッケージを使用した、より現代的なソリューションを次に示します(質問が行われた時点ではまだ存在していませんでした)。

入力を作成します。

xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )

相関を計算します。

library(dplyr)
xx %>%
  group_by(group) %>%
  summarize(COR=cor(a,b))

出力:

Source: local data frame [4 x 2]

  group         COR
  (int)       (dbl)
1     1  0.05112400
2     2  0.14203033
3     3 -0.02334135
4     4  0.10626273
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.