来自具有分组因子的社区列表的协方差矩阵

时间:2014-02-19 16:52:07

标签: r data.table

我仍在学习使用data.table(来自data.table包),甚至在网上寻找帮助和帮助文件之后,我仍然在努力做我想做的事情。 我有一个超过60列的大型数据表(前三个对应于因子,其余对应于响应变量,在这种情况下是不同的物种)和几行对应于不同的处理水平和物种丰度。一个非常小的版本看起来像这样:

> TEST<-data.table(Time=c("0","0","0","7","7","7","12"),
             Zone=c("1","1","0","1","0","0","1"),
             quadrat=c(1,2,3,1,2,3,1),
             Sp1=c(0,4,29,9,1,2,10),
             Sp2=c(20,17,11,15,32,15,10),
             Sp3=c(1,0,1,1,1,1,0)) 
>setkey(TEST,Time)

> TEST
    Time Zone quadrat Sp1 Sp2 Sp3
1:    0    1       1   0  20   1
2:    0    1       2   4  17   0
3:    0    0       3  29  11   1
4:   12    1       1  10  10   0
5:    7    1       1   9  15   1
6:    7    0       2   1  32   1
7:    7    0       3   2  15   1   

我需要计算每个Zone x quadrat组的协方差之和。如果我只有给定的Zone x quadrat组合的物种列表,那么我可以使用cov()函数但使用cov()的方式与我在

中使用mean()或sum()的方式相同
 Abundance = TEST[,lapply(.SD,mean),by="Zone,quadrat"]  

不起作用,因为我收到以下错误消息:

Error in cov(value) : supply both 'x' and 'y' or a matrix-like 'x'

我理解为什么,但我无法弄清楚如何解决这个问题。

我真正想要的是,对于每个Zone x quadrat组合,能够获得所有采样时间点上所有物种的协方差矩阵。从每个矩阵开始,我需要计算所有物种对的协方差之和,这样我就可以得到每个Zone x quadrat组合的协方差和。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

在@Frank上面提供的帮助和我使用upper.tri函数的其他搜索中,以下代码有效:

Cov= TEST[,sum(cov(.SD)[upper.tri(cov(.SD), diag = FALSE)]), by='Zone,quadrat', .SDcols=paste('Sp',1:3,sep='')]

建议的初始版本,其中upper.tri()未出现在[]中,仅从协方差矩阵中提取逻辑值,并且diag = FALSE允许在对矩阵的上三角形求和之前排除对角线值。就我而言,我并不关心它是上三角还是下三角,但我确信使用lower.tri()同样可以正常工作。

我希望这可以帮助可能遇到类似问题的其他用户。