#r #testing #random #p-value #balance
Вопрос:
Я думал, что рандомизация » выравнивает все факторы (независимо от того, наблюдаются они или нет)» между группой лечения и контрольной группой.
Чтобы проверить это, я выполнил приведенный ниже код и обнаружил, что более чем в половине случаев рандомизация работала не очень хорошо — это означало, что по крайней мере одна переменная статистически отличалась между случайно разделенной группой лечения и контрольной группой.
set.seed(1234) for (i in 1:1000){ indlt;-sample(2, 10000, replace=TRUE, prob=c(0.5, 0.5)) alt;-as.matrix(rnorm(10000, mean=0, sd=1)) blt;-as.matrix(rnorm(10000, mean=0.5, sd=1)) clt;-as.matrix(rnorm(10000, mean=1, sd=2)) dtlt;-data.frame(cbind(a,b,c)) dt$X4 lt;- dt$X1 dt$X2 dt$X5 lt;- dt$X1 * dt$X3 dt1lt;-dt[ind==1,] dt2lt;-dt[ind==2,] a_pval[i]lt;-t.test(dt1[1,], dt2[1,])$p.value b_pval[i]lt;-t.test(dt1[2,], dt2[2,])$p.value c_pval[i]lt;-t.test(dt1[3,], dt2[3,])$p.value d_pval[i]lt;-t.test(dt1[4,], dt2[4,])$p.value e_pval[i]lt;-t.test(dt1[5,], dt2[5,])$p.value } pvallt;-data.frame(cbind(a_pval,b_pval,c_pval,d_pval,e_pval)) pvallt;-mutate(pval, adiff = ifelse(a_pvallt;0.05, 1,0)) pvallt;-mutate(pval, bdiff = ifelse(b_pvallt;0.05, 1,0)) pvallt;-mutate(pval, cdiff = ifelse(c_pvallt;0.05, 1,0)) pvallt;-mutate(pval, ddiff = ifelse(d_pvallt;0.05, 1,0)) pvallt;-mutate(pval, ediff = ifelse(e_pvallt;0.05, 1,0)) pval$difflt;-pval$adiff pval$bdiff pval$cdiff pval$ddiff pval$ediff table(pval$diff) length(which(a_pvallt;0.05)) length(which(b_pvallt;0.05)) length(which(c_pvallt;0.05)) length(which(d_pvallt;0.05)) length(which(e_pvallt;0.05))
Это потому, что с моим кодом что-то не так?
Комментарии:
1. почему
set.seed()
это ? Это создаст воспроизводимые результаты (т. е.: не случайные).2. @Wimpel, результаты являются псевдослучайными, как это почти всегда бывает в R. Есть способы получить истинные случайные значения (см.
random
Пакет), но почти никто их не использует, потому что они очень медленные.
Ответ №1:
Я не думаю, что тесты делают то, что вы думаете, что они делают. Ваши t-тесты работают со строками ваших матриц, а не со столбцами, поэтому распределение не является нормальным, это вырожденная смесь нормалей. Измените тестовые строки t на
a_pval[i]lt;-t.test(dt1[,1], dt2[,1])$p.value b_pval[i]lt;-t.test(dt1[,2], dt2[,2])$p.value c_pval[i]lt;-t.test(dt1[,3], dt2[,3])$p.value d_pval[i]lt;-t.test(dt1[,4], dt2[,4])$p.value e_pval[i]lt;-t.test(dt1[,5], dt2[,5])$p.value
и это будет исправлено, и вы увидите, что около 5% ваших значений p меньше 0,05, как и ожидалось.
Я, честно говоря, не понимаю, что вы ожидали увидеть в pval$diff
таблице. Поскольку столбцы 4 и 5 основаны на первых 3 столбцах, столбцы зависят друг от друга, и вы не должны ожидать, что увидите стандартное распределение подсчетов.
Комментарии:
1. Спасибо за ваш комментарий! Измененные строки сработали, и это дало результаты, которых я ожидал.
pval$diff
таблица должна была показать вероятность получения » хорошо сбалансированного случайного разделения(то есть ожидается, что значения p будут достаточно большими во всех 5 переменных)».