I am wondering if it is possible to shuffle a 4x4 data set while maintaining constant row and column sums. Admittedly I am a beginner at programming so the code I have included below may not be easy on the eyes.
Any help would be appreciated, thanks.
PS: If you must know, the data set is a survey of car preference based on ethnicity.
CarPreference <- read.table ( text = "
African 3 0 1 1
Asian 2 1 0 1
Hispanic 0 1 3 1
White 0 1 4 1
" )
row.names(CarPreference) <- CarPreference[,1]
colnames(CarPreference) <-c("Car Type","Car","Truck","SUV","Motorcycle")
CarPreference <- CarPreference[,-1]
as.matrix(CarPreference)
observed <- rbind(c(3,0,1,1),c(2,1,0,1),c(0,1,3,1),c(0,1,4,1))
deals=10000
observed.boot = array(NA,c(4,4,deals))
H0 <- c(rep(1,colSums(observed)[1]),rep(0,colSums(observed)[2]),rep(1,colSums(observed)[3]),rep(0,colSums(observed)[4]))
for (i in 1:deals)
{
data.boot <- sample(H0,sum(observed),replace=FALSE)
row1.boot <- data.boot[1:rowSums(observed)[1]]
row2.boot <- data.boot[(rowSums(observed)[1]+1):(rowSums(observed)[1]+rowSums(observed)[2])]
row3.boot <- data.boot[(rowSums(observed)[1]+rowSums(observed)[2]+1):(rowSums(observed)[1]+rowSums(observed)[2]+rowSums(observed)[3])]
row4.boot <- data.boot[(rowSums(observed)[1]+rowSums(observed)[2]+rowSums(observed)[3]+1):sum(observed)]
col1.boot <- data.boot[1:colSums(observed)[1]]
col2.boot <- data.boot[(colSums(observed)[1]+1):(colSums(observed)[1]+colSums(observed)[2])]
col3.boot <- data.boot[(colSums(observed)[1]+colSums(observed)[2]+1):(colSums(observed)[1]+colSums(observed)[2]+colSums(observed)[3])]
col4.boot <- data.boot[(colSums(observed)[1]+colSums(observed)[2]+colSums(observed)[3]+1):sum(observed)]
observed.boot[,,i] <- rbind(
c(sum(row1.boot),length(row1.boot)-sum(row1.boot), , ),
c(sum(row2.boot),length(row2.boot)-sum(row2.boot), , ),
c(sum(row3.boot),length(row3.boot)-sum(row3.boot), , ),
c(sum(row4.boot),length(row4.boot)-sum(row4.boot), , ))
}