【问题标题】:Creating this covariance matrix manually in R在 R 中手动创建这个协方差矩阵
【发布时间】:2017-02-04 16:14:21
【问题描述】:

我有两个样本,每个样本长度为 1000,我需要为这两个样本构建协方差矩阵。

每个样本由 10 个大小为 100 的集群组成。现在,每个单元都有一个附加变量来标识它来自哪个集群,如果两个单元来自同一个集群,则它们之间的协方差将为 X,如果它们来自不同的集群,则为 Y。

所以我需要找到一种方法来构造一个如下图所示的协方差矩阵,只是 X 的块是 100x100 而不是 3x3:

有什么方法可以轻松做到这一点吗?矩阵太大,手动输入数据无法创建,需要在一个循环中重复上千次。

【问题讨论】:

  • 包'multiwayvcov'有一个用于聚类方差协方差矩阵的函数。如果它看起来像上面那个我不确定。

标签: r matrix statistics covariance


【解决方案1】:

你的意思是这样的?

m <- c(rep(1, 100), rep(0, 300),
   rep(0, 100), rep(1, 100), rep(0, 200),
   rep(0, 200), rep(1, 100), rep(0, 100),
   rep(0, 300), rep(1, 100))
m <- matrix(m, byrow = TRUE)
m

【讨论】:

  • 不幸的是,它太大了,无法以这种方式构建。矩阵为 1000x1000,其中包含 10 个 100x100 的“1”框。所以在这里使用 rep() 并没有太大帮助:(
【解决方案2】:

我设法找到了一个不需要额外软件包的简单解决方案,因此我将在此处发布解决方案,以防其他人遇到同样的问题。

对我来说最简单的方法是创建一个双循环,遍历矩阵的每个索引并手动输入项目。显然,这在计算上非常详尽,因此如果您需要多次执行此操作,我建议使用更有效的方法。

    m<-matrix(rep(NA,1000000),ncol=1000)

for(i in 1:1000){
    for(j in 1:1000){
       if(sampleA$cluster[i]==sampleA$cluster[j]){
           m[i,j]<-"X"
           }
       else{
           m[i,j]<-"Y"
   }
}
}

【讨论】:

  • 这是一个很大的循环,可能会很慢。您可能会发现使用outer 会更快。
  • 是的 - 它的效率非常低,但是,我实际上需要这样的矩阵,使得样本不是按集群顺序排列的(所以不是像 OP 这样的好块)。不知道如何使用 %o% 构造这样的矩阵:\
  • 可能不是%o%,但函数outer比这更灵活。你可以写你需要的function(i,j)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多