3

我正在尝试使用 corr() 函数来计算加权思考。它的工作方式是第一个参数应该是一个矩阵,其中两列对应于我们希望计算其相关性的两个变量,第二个参数是要应用于每对观察值的权重向量。

这是一个例子。

> 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

使用bycbind,

 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 回答