【问题标题】:Looking for an efficient way to compute the variances of a multinomial distribution in R寻找一种有效的方法来计算 R 中多项分布的方差
【发布时间】:2023-04-11 10:23:01
【问题描述】:

我有一个 R 矩阵,其尺寸约为 20,000,000 行 x 1,000 列。第一列表示计数,其余列表示这些计数的多项分布的概率。所以换句话说,在每一行中,第一列是 n,其余的 k 列是 k 类别的概率。还有一点是矩阵是稀疏的,也就是说每一行有很多列的值为0。

这是我创建的玩具矩阵:

mat=rbind(c(5,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1),c(2,0.2,0.2,0.2,0.2,0.2,0,0,0,0,0),c(22,0.4,0.6,0,0,0,0,0,0,0,0),c(5,0.5,0.2,0,0.1,0.2,0,0,0,0,0),c(4,0.4,0.15,0.15,0.15,0.15,0,0,0,0,0),c(10,0.6,0.1,0.1,0.1,0.1,0,0,0,0,0))

我想做的是对每个类别的计数方差进行经验测量。想到的自然的事情是获得随机抽取,然后计算它们的方差。比如:

draws = apply(mat,1,function(x) rmultinom(samples,x[1],x[2:ncol(mat)]))

在哪里说samples=100000

然后我可以在draws 上运行apply 来计算方差。

但是,对于我的真实数据维度,至少在 RAM 方面,这将变得令人望而却步。在 R 中是否有更有效的解决方案来解决这个问题?

【问题讨论】:

  • 数据表包对你有用。不过,我对它还不够熟悉,无法提供解决方案。

标签: r matrix


【解决方案1】:

如果您只需要计数的方差,只需立即计算它,而不是返回中间模拟抽签。

draws = apply(mat,1,function(x) var(rmultinom(samples,x[1],x[2:ncol(mat)])))

【讨论】:

  • 谢谢。但我想,如果我碰巧对其他汇总统计数据(例如平均值)感兴趣,则必须保存抽签?
  • 你可以从你的函数中返回任何你想要的东西,你只需要对其进行编程。没有理由不能返回包含均值和方差协方差矩阵的列表。
  • 我不确定我是否理解如何直接计算方差而不是保存平局然后计算方差来节省 RAM。在计算方差之前不是保存所有的平局吗?
  • 每行进行 100,000 个样本,因此它将使用更多内存来保存完整的 100,000*20,000,000 个样本,然后一次只计算一行的统计信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2014-12-06
  • 1970-01-01
  • 2023-01-19
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多