【问题标题】:How to find covariance matrix by category in data.table in R如何在R中的data.table中按类别查找协方差矩阵
【发布时间】:2014-11-03 03:02:18
【问题描述】:

假设我的数据包含 3 个类别。我想找到每个类别的协方差矩阵,并期望返回是一个数组。

set.seed(7)    
x <- rbind(cbind(rnorm(120,-1,0.1), rnorm(120,-0.5,0.1)),
               cbind(rnorm(120,-0.4,0.1), rnorm(120,0,0.1)),
               cbind(rnorm(120,.2,0.1), rnorm(120,0,0.1)))
lab <- c(rep(1, 120), rep(2, 120), rep(3, 120))
newx <- cbind(x, lab = lab)
s <- sapply(1:3, function(k){ var(newx[lab == k, -3]) })
dim(s) <- c(2,2,3)

返回,

, , 1

             [,1]         [,2]
[1,]  0.008880447 -0.001116058
[2,] -0.001116058  0.009229061

, , 2

             [,1]         [,2]
[1,]  0.012193536 -0.001217923
[2,] -0.001217923  0.009391710

, , 3

            [,1]        [,2]
[1,] 0.010752319 0.001231336
[2,] 0.001231336 0.008226595

我知道如何使用sapply,但如果我想使用data.table,我该怎么做?

我试过了:

library(data.table)
dt <- data.table(newx)
dt[,lapply(.SD, var), by = lab]

但它没有提供我预期的回报。

【问题讨论】:

  • 你想要什么输出?数据表是数据框,而不是 3 维数组
  • @rawr 我想要的输出是上面包含每个类别的协方差的数组。在这种情况下,我有 3 个类别,所以我希望有 3 个协方差矩阵。

标签: r data.table covariance lapply sapply


【解决方案1】:

如果您需要将结果作为 3 维矩阵,那么显然这不是 data.table。但是,您可以使用 data.table 进行计算。

library(data.table)
DT <- as.data.table(newx)
result <- DT[,var(.SD),by=lab]
result <- as.matrix(result$V1)
dim(result) <- c(2,2,3)
result
# , , 1
# 
#              [,1]         [,2]
# [1,]  0.008880447 -0.001116058
# [2,] -0.001116058  0.009229061
# 
# , , 2
# 
#              [,1]         [,2]
# [1,]  0.012193536 -0.001217923
# [2,] -0.001217923  0.009391710
# 
# , , 3
#
#             [,1]        [,2]
# [1,] 0.010752319 0.001231336
# [2,] 0.001231336 0.008226595

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2019-04-15
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多