随机抽样 - 矩阵

5
我该如何从一个由1和0填充的矩阵中随机取n个点的样本?
a=rep(0:1,5)
b=rep(0,10)
c=rep(1,10)
dataset=matrix(cbind(a,b,c),nrow=10,ncol=3)

dataset
      [,1] [,2] [,3]
 [1,]    0    0    1
 [2,]    1    0    1
 [3,]    0    0    1
 [4,]    1    0    1
 [5,]    0    0    1
 [6,]    1    0    1
 [7,]    0    0    1
 [8,]    1    0    1
 [9,]    0    0    1
[10,]    1    0    1

我希望确保我取 N 个样本的位置 (行、列) 是随机的。
我知道sample {base},但它似乎不允许我这样做。我知道的其他方法是强制添加 x 和 y 并将其更改为空间对象,再转换回普通矩阵的空间方法。
随机指的是在 "矩阵空间" 内也要分布均匀,例如,如果我取出4个点,我不希望结果是4个相邻的点,我希望它们在 "矩阵空间" 中分布。
了解在矩阵中取出随机点的位置(行、列)也很重要。

为什么示例似乎不按您的意愿执行? - Paul Hiemstra
我没有看到“随机”选项。也许这在函数sample{base}中是隐含的。我想要确保选择的点是分散的,而不是聚集在矩阵内部。如果对10个点进行采样,则这10个点应该在矩阵空间中是随机的。 - Gago-Silva
我同意样本并不真正清楚地表现出随机性,尽管它确实是随机的。如果你想要扩展性,那么随机抽样并不能保证。 - Paul Hiemstra
我在我的回答中增加了有关抽样的更多哲学讨论。 - Paul Hiemstra
2个回答

12

有一种非常简单的方法可以对矩阵进行采样,只要您理解R在内部将矩阵表示为向量即可。

这意味着您可以直接在矩阵上使用sample。例如,假设您想要进行10次取样(有放回):

n <- 10
replace=TRUE

现在只需在您的矩阵上使用sample即可:

set.seed(1)
sample(dataset, n, replace=replace)
 [1] 1 0 0 1 0 1 1 0 0 1
为了演示这个过程,让我们将它分解为两个步骤。第一步是生成采样位置的索引,第二步是在矩阵中找到这些位置。
set.seed(1)
mysample <- sample(length(dataset), n, replace=replace)
mysample
 [1]  8 12 18 28  7 27 29 20 19  2

dataset[mysample]
 [1] 1 0 0 1 0 1 1 0 0 1

嘿,哎呦,这两种方法的结果完全相同。


4

对于您来说,样本似乎是最好的选择。要获取1000个随机位置,可以执行以下操作:

rows = sample(1:nrow(dataset), 1000, replace = TRUE)
columns = sample(1:ncol(dataset), 1000, replace = TRUE)

我认为这就是你想要的,但当然我可能错了。

从矩阵中提取项目可以像这样完成:

random_sample = mapply(function(row, col) 
                           return(dataset[row,col]), 
                    row = rows, col = columns)

抽样策略

您在评论中提到您的样本需要具有分散性。随机采样不能保证不会出现聚集,因为其是随机的。还有其他几种可能感兴趣的抽样方案:

  • 定期抽样,跳过随机性,只是定期抽样。平均采样整个矩阵空间,但没有随机性。
  • 分层随机抽样,将矩阵空间划分为规则子集,然后在这些子集中进行随机抽样。介于随机和定期之间。

要检查您的随机抽样是否产生良好的结果,我建议多次重复随机抽样并比较结果(因为我假设抽样将成为另一种分析的输入?)。


1
这是正确的,但你仍然需要一个挑战来从矩阵中提取元素。如果你使用 dataset[rows, columns],它将会得到一个1000*1000的矩阵,而不是1000个元素的向量。我在两分钟后放弃了这种方法,但我很想看看你是如何解决它的。 - Andrie
1
+1 很好的使用了 mapply(虽然我认为直接在矩阵上使用 sample 更简单)。 - Andrie
是的,这将用于其他分析。我将检查多个样本以确保他如何对矩阵进行采样,最终我可能会尝试类层随机抽样这样的方法,看起来更为适合。 - Gago-Silva
更多关于抽样策略的理论问题可以在stats.stackexchange.com上得到很好的解答。 - Paul Hiemstra
@Andrie,我在获取随机行和数字的思维流程中卡住了:)。 - Paul Hiemstra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接