【问题标题】:Randomly sampling and averaging data in a matrix在矩阵中随机采样和平均数据
【发布时间】:2014-01-27 21:15:23
【问题描述】:

我有一个包含计数信息的 200x200 矩阵。我想在我的矩阵中随机抽取一个 5 行 x 5 列的子集,并取该子集中的计数的平均值。我想在整个矩阵中随机执行 8 次(所以也许使用 for 循环?),然后取这 8 次的平均值。我还需要使用限制,以便随机数生成器不会在边缘采样我的矩阵。

我是 R 和一般编程的新手,因此朝着正确的方向推进会非常有帮助。

【问题讨论】:

  • 这个采样有替换吗?子集是否允许重叠。
  • 这不是带替换的采样。是的,允许子集重叠。我想随机采样矩阵的 5x5 部分并找到该 5x5 部分的平均值。我想这样做 8 次,然后取 5x5 部分的平均值。对不起,如果这令人困惑。并感谢您的帮助!

标签: r matrix average subset random-sample


【解决方案1】:

这是一种方法:

# an example 10x10 matrix
mat <- matrix(1:100, 10)
nc <- ncol(mat) # number of columns
nr <- nrow(mat) # number of rows

size <- 5 # size of the subset matrix
nmat <- 8 # number of submatrices

# sample indices of submatrices
set.seed(1)
idxc <- sample(seq(2, nc - size), size = nmat, replace = TRUE)
idxr <- sample(seq(2, nr - size), size = nmat, replace = TRUE)

# create a list of 8 submatrices
res <- mapply(function(x, y) mat[seq(x, x + size - 1), seq(y, y + size - 1)],
              idxr, idxc, SIMPLIFY = FALSE)

# calculate the average of the averages
mean(unlist(res))
# [1] 53.875

【讨论】:

  • 第一部分效果很好!谢谢!不过,对于平均而言,我想找到 5x5 子集(1 个数字)中计数的平均值。我想对所有 8 个不同的子集执行此操作。然后我想找到这 8 个子集的平均值(而不是找到不同单元格值的平均值)。这将在最后给我 1 个数字。
  • 有没有办法让代码在每次运行时随机采样矩阵的不同部分?目前,每次运行它都会给我相同的答案。
  • @MaryR 不要运行set.seed(1)。它将随机数生成器重置为特定状态。该方法没有必要。我用它来重现性。
【解决方案2】:

假设您总是拉出一个正方形的替代方案。 (即,行/列彼此相邻)。

y <- matrix(round(rep(runif(200),200)*100),ncol=200,nrow=200)

sq <- seq(1,196,1) 
blocks <- sample(sq,8) # no replacements of squares

mean(
  sapply(blocks, 
    function(x) mean(y[x:(4+x),x:(4+x)])
  )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-23
    • 2018-12-16
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多