2011-11-11 63 views
1

我使用下面的函數來計算的t統計在數據幀數據(X):For循環使用t-統計函數來創建列表

wilcox.test.all.genes<-function(x,s1,s2) { 
    x1<-x[s1] 
    x2<-x[s2] 
    x1<-as.numeric(x1) 
    x2<-as.numeric(x2) 
    wilcox.out<-wilcox.test(x1,x2,exact=F,alternative="two.sided",correct=T) 
    out<-as.numeric(wilcox.out$statistic) 
    return(out) 
    } 

我需要編寫一個for循環這將迭代特定次數。對於每次迭代,需要對列進行混洗,執行上述功能並將最大t-stat值保存到列表中。

我知道我可以使用sample()函數來混洗數據框的列,並使用max()函數來確定最大t-stat值,但我無法弄清楚如何將它們放在一起以實現可行的代碼。

+0

以下作品的答案,但我仍然對你實際上試圖做一個有點不清楚。將你的真實測試統計量與這些排列的分佈輸出進行比較,將會給你一個經驗性的p值。但是,您提到了採用最大值,如果您正在進行許多類似的測試,通常會進行這些校正以進行多重比較。我的困惑是,你的x是一個向量,而你只是在進行單個測試。無論如何,如果你澄清一點,我很樂意相應地編輯我的答案。 –

+0

我正在使用的數據框架中有來自兩類個人的數據,我正在根據班級拆分數據。該函數是對兩個類的數據進行Wilcox測試。初始測試完成後,我想對數據幀的列進行混洗,再次執行該功能,從新數據中獲取最大測試統計量並將該數字保存到列表中。我想執行500次混洗,從混洗數據中得到500個最大測試統計數據列表。我將使用這個測試統計列表來確定與原始數據集進行比較的95%測試統計。謝謝 –

+0

我明白了。我也這麼想。如果你提供了示例數據,這將會有所幫助,因爲我們無法知道你有數據框。此外,還有一點混亂,因爲對於這樣的排列測試,您可以對類標籤進行排列(即*行*),而不是列。請參閱我編輯的答案以獲取解決方案。祝你好運! –

回答

1

您正在嘗試生成經驗性p值,該值是針對您因數據中的多列進行的多重比較而更正的。首先,讓我們模擬的示例數據集:

# Simulate data 
n.row = 100 
n.col = 10 

set.seed(12345) 
group = factor(sample(2, n.row, replace=T)) 
data = data.frame(matrix(rnorm(n.row*n.col), nrow=n.row)) 

計算Wilcoxon檢驗爲每列,但同時置換的觀察類的全體成員,我們將複製了很多次。這給了我們這個測試統計量的經驗空分佈。

# Re-calculate columnwise test statisitics many times while permuting class labels 
perms = replicate(500, apply(data[sample(nrow(data)), ], 2, function(x) wilcox.test(x[group==1], x[group==2], exact=F, alternative="two.sided", correct=T)$stat)) 

通過跨越多重比較塌陷計算最大檢驗統計量的零分佈。

# For each permuted replication, calculate the max test statistic across the multiple comparisons 
perms.max = apply(perms, 2, max) 

通過對結果進行簡單排序,我們現在可以確定p = 0.05臨界值。

# Identify critical value 
crit = sort(perms.max)[round((1-0.05)*length(perms.max))] 

我們也可以繪製我們的分佈和臨界值。

# Plot 
dev.new(width=4, height=4) 
hist(perms.max) 
abline(v=crit, col='red') 

enter image description here

最後,真正的檢驗統計量比較這種分配會給你一個經驗p值,多重比較修正通過控制家庭明智的錯誤爲P < 0.05。例如,讓我們假設一個真正的考驗是統計1600然後我們就可以計算出p值,如:

> length(which(perms.max>1600))/length(perms.max) 
[1] 0.074