Skip to content

Iterative sampling with restrictions

5 messages · David A. Kim, PIKAL Petr, Daniel Nordlund +1 more

#
Hi all,

I'm working on a seemingly trivial problem that I can't figure out how
to implement in R.  I'd be most grateful for any help here.

I want to do the following: first, randomly assign each of n units to
one of g groups of size n/g. Then, randomly re-assign each of the n
units to a different group (i.e., same as the first step, but the unit
can't be assigned to a group to which it's already belonged).  Then
repeat this step until each unit has at some point been assigned to
every group.

More concretely, say I have 60 units and 3 groups into which to divide
the units.  I could first do something like:

group1<-sample(1:60,20)
group2<-sample(setdiff(1:60,group1),20)
group3<-sample(setdiff(1:60,c(group1,group2)),20)

But then how to randomly re-assign group membership such that all
units are assured a different group assignment in the second "wave" of
grouping?  Just narrowing the sampling pool to those units that
weren't previously assigned to a given group won't work (consider the
case where groups 1 and 2 swap units: in the second wave, there would
be no units to assign to group 3 as all the remaining units had
already been in group 3 in the first wave).

Most grateful for any assistance,

David
#
Hi

why not shuffle your values by

x <- 1:60
x <- sample(x, 60)

and then add groups
groups <- rep(paste("g",1:3, sep=""), each=20)

If you want you can suffle also groups.

Regards
Petr
#
David,

I would collect the sample waves into a data.frame.  I am sure someone will be able to help you with a more general and/or efficient solution, but to get you started I have provided one possible solution to your 60 unit 3 wave example
 
#create data.frame with IDs
df <- data.frame(id=1:60)

#create first sample wave
df$wave1 <- sample(rep(1:3,20))

#reorder df and create second wave sample
df <- df[order(df$wave1),]
df$wave2 <-  c(sample(rep(c(2,3),10)),
               sample(rep(c(1,3),10)),sample(rep(c(1,2),10)))

#now use set diff to create 3rd wave
for(i in 1:60) df[i,'wave3'] <- unlist(setdiff(1:3,df[i,2:3]))

df


Hope this is helpful,

Dan

Daniel Nordlund
Bothell, WA USA
1 day later
#
If I understand you, this is just random assignment over 6 groups: 1/2, 1/3,
2/1, 2/3, 3/1, 3/2.
assign
1/2 1/3 2/1 2/3 3/1 3/2 
 10  10  10  10  10  10

----------------------------------------------
David L Carlson
Associate Professor of Anthropology
Texas A&M University
College Station, TX 77843-4352
#
The third phase is determined since there are only three groups, but I
should have added them to group specifications to make things clearer:
assign
1/2/3 1/3/2 2/1/3 2/3/1 3/1/2 3/2/1 
   10    10    10    10    10    10 

-------
David