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 个相邻点,我希望它们分布在“矩阵空间”中。

知道我取出随机点的矩阵中的位置(行,列)也很重要。

4

2 回答 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

为了演示它是如何工作的,让我们将其分解为两个步骤。第 1 步是生成采样位置的索引,第 2 步是在矩阵中找到这些位置:

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

而且,嘿,这两种方法的结果是相同的。

于 2012-02-02T09:45:20.820 回答
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)

抽样策略

在评论中你说你的样本需要传播。由于其随机性,随机样本不保证不会出现聚类。还有更多的抽样方案可能值得探索:

  • 定期抽样,跳过随机性,只定期抽样。均匀采样整个矩阵空间,但没有随机性。
  • 分层随机抽样,您将矩阵空间划分为常规子集,然后在这些子集中随机抽样。呈现随机和常规之间的混合。

为了检查您的随机抽样是否产生良好的结果,我会重复随机抽样几次并比较结果(因为我假设抽样将被输入进行另一次分析?)。

于 2012-02-02T09:48:25.340 回答