3

私はcorr()関数を使って加重熟考を計算しようとしています。最初の引数は、相関を計算したい 2 つの変数に対応する 2 つの列を持つ行列であり、2 番目の引数は観測値の各ペアに適用される重みのベクトルです。

ここに例があります。

> head(d)
 Shade_tolerance htot
1            4.56 25.0
2            2.73 23.5
3            2.73 21.5
4            3.97 17.0
5            4.00 25.5
6            4.00 23.5

> head(poids)
[1] 5.200440e-07 5.200440e-07 1.445016e-06 1.445016e-06 1.445016e-06 1.445016e-06

> corr(d,poids)
[1] 0.1357279

それで私はそれを手に入れ、それを自分のマトリックスで使用することができましたが、因子のレベルに応じて異なる相関を計算したいと思います。tapply() 関数を使用しているかのようにしましょう。

> head(d2)
  Shade_tolerance htot idp
1            4.56 25.0  19
2            2.73 23.5  19
3            2.73 21.5  19
4            3.97 17.0  18
5            4.00 25.5  18
6            4.00 23.5  18

だから私の夢は次のようなことをすることです:

tapply(as.matrix(d2[,c(1,2)]), d2$idp, corr)

ただし、tapply() でわかるように、最初の要素は行列ではなくベクトルである必要があります。

誰かが私に解決策を持っていますか?

どうもありがとうございました。

編集:私があなたに示したデータフレームの一部で、加重相関の重みが欠落していることに気付きました。したがって、因子のレベルに応じて行列と重みの両方を取得する方法がいくつかあります。

> head(df)
  Shade_tolerance htot idp        poids
1            4.56 25.0  19 5.200440e-07
2            2.73 23.5  19 5.200440e-07
3            2.73 21.5  19 1.445016e-06
4            3.97 17.0  19 1.445016e-06
5            4.00 25.5  19 1.445016e-06
6            4.00 23.5  19 1.445016e-06

明確であることを願っています。

4

3 に答える 3

2

「巨大な」data.frame がある場合は、次を使用data.tableすると役立つ場合があります。

require(data.table)
dt <- as.data.table(df)
setkey(dt, "idp")
dt[, list(corr = corr(cbind(Shade_tolerance, htot), poids)), by=idp]

#    idp      corr
# 1:  18 0.9743547
# 2:  19 0.8387363
于 2013-03-13T09:04:28.247 に答える
1

ddply()ライブラリの関数を使用したソリューションを次に示しますplyr

ddply(df,.(idp),
   summarise,kor=corr(cbind(Shade_tolerance, htot),poids))
  idp       kor
1  18 0.9743547
2  19 0.8387363
于 2013-03-13T09:11:28.337 に答える
0

とを使用byしてcbind

 library(boot)
 by(dat,dat$idp,FUN=function(x)corr(cbind(x$Shade_tolerance,x$htot),x$poids))
dat$idp: 18
[1] 0.9743547
--------------------------------------------------------------------------------------- 
dat$idp: 19
[1] 0.7474093
于 2013-03-13T09:12:55.817 に答える