您正在嘗試生成經驗性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')
最後,真正的檢驗統計量比較這種分配會給你一個經驗p值,多重比較修正通過控制家庭明智的錯誤爲P < 0.05。例如,讓我們假設一個真正的考驗是統計1600然後我們就可以計算出p值,如:
> length(which(perms.max>1600))/length(perms.max)
[1] 0.074
以下作品的答案,但我仍然對你實際上試圖做一個有點不清楚。將你的真實測試統計量與這些排列的分佈輸出進行比較,將會給你一個經驗性的p值。但是,您提到了採用最大值,如果您正在進行許多類似的測試,通常會進行這些校正以進行多重比較。我的困惑是,你的x是一個向量,而你只是在進行單個測試。無論如何,如果你澄清一點,我很樂意相應地編輯我的答案。 –
我正在使用的數據框架中有來自兩類個人的數據,我正在根據班級拆分數據。該函數是對兩個類的數據進行Wilcox測試。初始測試完成後,我想對數據幀的列進行混洗,再次執行該功能,從新數據中獲取最大測試統計量並將該數字保存到列表中。我想執行500次混洗,從混洗數據中得到500個最大測試統計數據列表。我將使用這個測試統計列表來確定與原始數據集進行比較的95%測試統計。謝謝 –
我明白了。我也這麼想。如果你提供了示例數據,這將會有所幫助,因爲我們無法知道你有數據框。此外,還有一點混亂,因爲對於這樣的排列測試,您可以對類標籤進行排列(即*行*),而不是列。請參閱我編輯的答案以獲取解決方案。祝你好運! –