使用cov.wt和data.table的加权相关性,按组别分列。

问题描述 投票:0回答:1

我有一个 data.table 像这个。

set.seed(12345)
mydt <- data.table(gr1 = sample(letters[1:2], size = 100, replace = TRUE),
        gr2 = sample(letters[3:4], size = 100, replace = TRUE),
        a = rnorm(100), b = rnorm(100), weight = rnorm(100, 5, 1))

The gr1gr2 指定每个案例的组成员。我想从以下数据中获得相关矩阵 cov.wt 的组别成员来执行该功能。gr1gr2,使用 weight 栏目。栏。cov.wt 返回相关矩阵,如果 cor = TRUE. 我可以分开 mydtgr1gr2 再用 lapply 来进行计算并提取每个相关矩阵。

mydt <- split(x = mydt, by = c("gr1", "gr2"), drop = TRUE)

lapply(X = mydt, FUN = function(i) {
  cov.wt(x = as.matrix(i[ , c("a", "b")]), wt = i[ , weight], cor = TRUE)[["cor"]]
})

我得到的正是我想要的。

$b.c
                    a                   b
a 0.99999999999999978 0.26861150206539375
b 0.26861150206539375 0.99999999999999978

$a.c
                     a                    b
a  0.99999999999999978 -0.13281683546112405
b -0.13281683546112405  1.00000000000000000

$b.d
                     a                    b
a  1.00000000000000000 -0.13064774898011455
b -0.13064774898011455  1.00000000000000000

$a.d
                     a                    b
a  0.99999999999999978 -0.61122086293705469
b -0.61122086293705458  0.99999999999999978

然而,对于大数据集,这种方法相当缓慢。我想使用 data.table 的方式来实现,就像Dan Y的帖子一样。在此问题下. 我正在努力,你,因为额外的参数和提取相关矩阵从返回的列表中的 cov.wt 功能。我尝试了以下方法(加上许多变化)。

mydt[ , .(cov.wt(as.matrix(a, b), wt = weight, cor = TRUE)["cor"]), by = c("gr1", "gr2")]

最后得到的只是每个矩阵对角线的第一个值。

我做错了什么?

r data.table grouping weighted
1个回答
2
投票

在这里 as.matrix 是错误的,因为'x'是一个单一元素,而不是多个元素(根据 ?as.matrix). 一种方法是通过以下方式转换为矩阵 cbinding向量'a', 'b',然后将输出包在一个列表中(用 .())

library(data.table)
out <- mydt[ , .(.(cov.wt(cbind(a,b), wt = weight, cor = TRUE)["cor"])), 
    by = c("gr1", "gr2")]
out$V1
#[[1]]
#[[1]]$cor
#          a         b
#a 1.0000000 0.2686115
#b 0.2686115 1.0000000


#[[2]]
#[[2]]$cor
#           a          b
#a  1.0000000 -0.1328168
#b -0.1328168  1.0000000


#[[3]]
#[[3]]$cor
#           a          b
#a  1.0000000 -0.1306477
#b -0.1306477  1.0000000


#[[4]]
#[[4]]$cor
#           a          b
#a  1.0000000 -0.6112209
#b -0.6112209  1.0000000

注:由于种子的原因,数值会有差异。

© www.soinside.com 2019 - 2024. All rights reserved.