使用长数据帧进行分组交叉相关,按行值进行子集化

时间:2013-07-14 01:54:29

标签: r correlation

我想做什么

我有一个同时观察多个站点值的数据框。这些观察结果多次重复(想想一组气象站,所有气象站都在一小时测量温度,每天测量一年)。

我想获得每个站点的测量值之间的相关性,逐个月。我对获得R平方特别感兴趣。因此,1月,2月,3月等站点1:站点2,站点1:站点3等的R平方等。

到目前为止的故事

让我们伪造一些数据:

df <- data.frame("B" = c(rep("January",20),rep("February",20)),
                 "D" = c(seq(1,20,1),seq(1,20,1)),
                 "site1" = c(seq(1,20,1),seq(0.1,2,0.1)),
                 "site2" = c(seq(2,40,2),seq(0.2,4,0.2)),
                 "site3" = c(seq(3,60,3),seq(0.3,6,0.3)))

现在,因为我们有大量的网站(而且我们在运行时间之前几乎不知道有多少网站),让我们将它们融合成一个长数据框架。

require(reshape)
df.melt <- melt(data = df,
                id.vars = c("B","D"),
                values = c("site1","site2","site3"))

我遇到的地方

我想我会尝试nlme套餐。我首先创建一个groupedData对象:

require(nlme)
df.melt.grp <- groupedData(value ~ value | variable,
                           data = df.melt,
                           inner = ~ B)

我认为我在这里所说的是value依赖于value,按variable分组(在融化之后是网站),然后是其他子集到月份。

然后我尝试应用lmlist来获得回归

lm.model <- lmList(object = df.melt.grp)

不幸的是,当我要求总结时,看起来好像我没有按月收到交叉关联或子集:

> summary(lm.model)
Call:
  Model: value ~ value | variable 
   Data: df.melt.grp 

Coefficients:
   (Intercept) 
      Estimate Std. Error  t value     Pr(>|t|)
site1    5.775   2.163481 2.669309 8.680907e-03
site2   11.550   2.163481 5.338618 4.658854e-07
site3   17.325   2.163481 8.007927 9.612311e-13

Residual standard error: 13.68306 on 117 degrees of freedom

问题

如何逐月获得不同地点的测量值之间的相关性(使用r平方测量),而不需要使用一堆“for”循环?

1 个答案:

答案 0 :(得分:1)

Hmisc库包含将采用矩阵参数的rcorr函数

require(Hmisc)
 lapply(split(df[, 3:5], df$B),
              function(mo) rcorr(as.matrix(mo))[[1]]^2 )
$February
      site1 site2 site3
site1     1     1     1
site2     1     1     1
site3     1     1     1

$January
      site1 site2 site3
site1     1     1     1
site2     1     1     1
site3     1     1     1