user72716
user72716

Reputation: 273

How to repeatedly sample without replacement when sample size is greater than the population size

This seems like it must be a duplicate but I can't find a solution, probably because I don't know exactly what to search for.

Say I have a bucket of 8 numbered marbles and 10 people who will each sample 1 marble from the bucket.

How can I write a sampling procedure where each person draws a marble from the bucket without replacement until the bucket is empty, at which point all the marbles are put back into the bucket, and sampling continues without replacement? Is there a name for this kind of sampling?

For instance, a hypothetical result from this sampling with our 10 people and bucket of 8 marbles would be:

   person marble
1       1      1
2       2      2
3       3      3
4       4      4
5       5      5
6       6      6
7       7      7
8       8      8
9       9      1
10     10      2

Note that the marbles are drawn randomly, so not necessarily in numerical order. This is just an example output to get my point across.

Upvotes: 0

Views: 250

Answers (3)

Ben Norris
Ben Norris

Reputation: 5747

Building on the answer from MånsT, here is a function to do this programmatically. I put in functionality to smoothly handle cases where the number of samples take is less than the population size (and return the expected behavior).

sample_more <- function(pop, n, seed = NULL) {
  set.seed(seed) # For reproducibility, if desired. Defaults to NULL, which is no seed
  m <- length(pop)
  if(n <= m) {  # handles case when n is smaller than the population size 
    sample(pop, n, replace = FALSE) 
  } else { # handle case when n is greater than population size
    c(sample(pop, m, replace = FALSE), sample(pop, n-m, replace = FALSE))
  }
}

marbles <- 1:8
sample_more(marbles, 10, seed = 1)
[1] 1 4 8 2 6 3 7 5 2 3
sample_more(marbles, 3, seed = 1)
[1] 1 4 8

Upvotes: 2

jomcgi
jomcgi

Reputation: 106

You can dynamically use sample in a for loop to generate the list.

For marbles 1:8 and over n people

Example:

bucket <- 1:8

n <- 100

marbleList <- c()

for(i in 1:ceiling(n / length(bucket))){
    
    marbleList <- c(marbleList, sample(bucket))
    
}

marbleList <- marbleList[1:n]

Upvotes: 0

M&#229;nsT
M&#229;nsT

Reputation: 974

Not sure if there is a name for this, but a simple solution would be to just use sample several times:

# Create a bucket with 8 marbles:
bucket <- 1:8

# First draw 8 marbles without replacement, then refill the bucket at draw 2 more:
marbles <- c(sample(bucket, 8, replace = FALSE), sample(bucket, 2, replace = FALSE))
marbles

Upvotes: 1

Related Questions