2014-02-27 29 views
0

我有,我已經寫了一些代碼,做測試的置換置換測試

df <- read.table(text="Group var1 var2 var3 var4 var5 
1   3 5 7 3 7 
1   3 7 5 9 6 
1   5 2 6 7 6 
1   9 5 7 0 8 
1   2 4 5 7 8 
1   2 3 1 6 4 
2   4 2 7 6 5 
2   0 8 3 7 5 
2   1 2 3 5 9 
2   1 5 3 8 0 
2   2 6 9 0 7 
2   3 6 7 8 8 
2   10 6 3 8 0", header = TRUE) 

這是我的代碼下面的數據集。然而,由於某種原因,它似乎並不奏效 - 我在最後得到的所有p值大約爲0.5。任何人都可以看到我在做什麼錯?

data = df[,2:6] 
t.test.pvals = matrix(NA,nrow=1000,ncol=5) 
ids.group1 = c(1,2,3,4,5,6) 
ids.group2 = c(7,8,9,10,11,12,13) 

#Define binary vector type for the t test 
group1.binary <- rep(0,times=6) 
group2.binary <- rep(1,times=7) 
type <- c(group1.binary,group2.binary) 

#Permutation testing 
for (i in 1:1000) { 
index = sample(1:13, size=13, replace=F) 
group1 = data[which(index %in% ids.group1),] 
group2 = data[which(index %in% ids.group2),] 
group.total = rbind(group1,group2) 
temp = t(sapply(group.total, function(x) 
unlist(t.test(x~type)[c("p.value")]))) 
temp = as.vector(temp) 
t.test.pvals[i,] = temp 
} 

回答

3

您可以進行t檢驗或進行排列檢驗。在排列測試中,您不使用t檢驗。有關排列測試的教程,請參閱here。下面您找到適合您具體的例子代碼(例如VAR5):

# t-test 
with(df, t.test(var5~Group))$p.value 
# Permutation testing 
# mean difference 
mean.diff <- with(df, abs(mean(var5[Group==1])-mean(var5[Group==2]))) 
# function that calculates resampled mean 
one.test <- function(x,y) { 
    xstar<-sample(x) 
    abs(mean(y[xstar==1])-mean(y[xstar==2])) 
} 
# calculating the resampled means 
many.diff <- c(mean.diff, with(df, replicate(1000, one.test(Group, var5)))) 
# pvalue 
p5 <- mean(abs(many.diff) >= abs(mean.diff)) 
p5 

你做它的方式,你重新採樣,然後通過T檢驗計算p值。重新採樣後,p值均勻分佈在0和1之間。因此,當您查看summary(t.test.pvals)時,您會看到均勻分佈的p值(如預期的那樣)。

1

@shadow很好地解釋了你的代碼的問題。如果我是你,我通常不會從頭開始編寫這種類型的東西。 coin包實現了您可能想要使用的所有排列測試。不需要重新發明輪子。

此代碼

library(coin) 
sapply(df[,-1], function(x) pvalue(oneway_test(x ~ as.factor(df$Group)))) 
## var1 var2 var3 var4 var5 
## 0.548 0.544 0.898 0.685 0.304 

做你彷彿想要做(即檢驗是否存在的varX分佈在Group 1的轉變與Group 2)。