Uji pengacakan / permutasi untuk vektor berpasangan di R

9

Saya bukan ahli, jadi maafkan saya jika beberapa terminologi sedikit canggung. Senang memberikan informasi lebih lanjut di mana diperlukan.

Saya memiliki dua vektor dari 50 nilai numerik berpasangan di R. Saya ingin melakukan uji pengacakan atau permutasi dua sisi untuk menentukan apakah perbedaannya disebabkan oleh kebetulan atau tidak.

Tes permutasi (juga disebut uji pengacakan, uji pengacakan ulang, atau tes eksak) adalah jenis uji signifikansi statistik di mana distribusi statistik uji di bawah hipotesis nol diperoleh dengan menghitung semua nilai yang mungkin dari statistik uji di bawah pengaturan ulang label pada titik data yang diamati.

Saya ingin melakukan jenis tes ini karena saya percaya distribusi nilai dalam vektor melanggar asumsi tes lain seperti uji-t (misalnya, banyak nilai numerik dalam vektor adalah 0).

The permtestfungsi dalam perpustakaan BHH2 , hampir tidak apa yang saya inginkan, tetapi beroperasi pada semua permutasi, yang akan memakan waktu terlalu lama. Sebagai gantinya, saya ingin memperkirakan nilai-p, dengan mengambil sampel sejumlah besar kemungkinan permutasi. Saya telah melihat dalam paket koin , tetapi tidak ada di sana tampaknya melakukan tes permutasi dengan pengambilan sampel dari vektor numerik berpasangan.250

Beberapa googling menuntun saya ke email ini , yang menunjukkan bahwa alasan saya tidak dapat menemukan paket untuk melakukannya adalah karena itu adalah satu-baris di R. Sayangnya, saya tidak cukup berpengalaman dengan R untuk dapat menghasilkan satu itu -liner.

Apakah ada paket atau metode yang akan melakukan uji permutasi berpasangan dua sisi hanya menggunakan sampel ruang permutasi?

Jika tidak, akankah seseorang dapat membagikan sedikit kode R untuk melakukannya?

Timothy Jones
sumber
3
Sepertinya saya seperti paket coin(di antara beberapa lainnya) melakukan tes pengacakan. mis. lihat jawaban untuk pertanyaan ini (baca semuanya) . Jika saya mengerti benar, contoh-contoh mencakup kasus perkiraan dan tepat dan mencakup sampel independen dan dependen.
Glen_b -Reinstate Monica
1
Maaf, untuk menjadi jelas - dengan 'membaca semuanya' Maksud saya 'membaca jawaban teratas sepanjang jalan' - meskipun Anda mungkin juga ingin melihat jawaban bawah.
Glen_b -Reinstate Monica
Cukup banyak satu-satunya yang menarik dari jawaban untuk permutasi berpasangan oneway_test(y ~ x | pairs, distribution=approximate(B=9999))dengan library(coin).
Nakx

Jawaban:

12

Meskipun saya menunjukkan komentar pada penggunaan coinpaket, saya pikir itu layak menggambarkan bahwa tes permutasi / pengacakan benar-benar sangat sederhana, jadi saya telah melakukannya.

Di sini saya menulis beberapa kode R untuk melakukan uji pengacakan untuk uji satu sampel lokasi. Tes secara acak membalik tanda pada perbedaan dan menghitung rata-rata; ini sama dengan menetapkan secara acak setiap pasangan nilai ke grup x dan y. Kode di bawah ini dapat dibuat secara signifikan lebih pendek (saya bisa melakukannya dalam dua baris cukup mudah, atau bahkan satu jika Anda tidak keberatan kode lebih lambat).

Kode ini membutuhkan beberapa detik di mesin saya:

# assumes the two samples are in 'x' and 'y' and x[i] and y[i] are paired
# set up:
B <- 99999
d <- x-y
m0 <- mean(d)

# perform a one-sample randomization test on d
# for the null hypothesis H0: mu_d = 0   vs H1 mu_d != 0  (i.e. two tailed)
# here the test statistic is the mean
rndmdist <- replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d))

# two tailed p-value:
sum( abs(rndmdist) >= abs(m0))/length(rndmdist)

Itu semuanya.

Catatan yang rbinom(length(d),1,.5)*2-1)memberikan tanda acak -1atau 1... yaitu tanda acak, jadi ketika kita mengalikannya dengan set tanda yang ditandatangani d, itu setara dengan pemberian secara acak +atau -tanda pada perbedaan absolut. [Tidak masalah apa distribusi tanda pada dAnda mulai dengan, sekarang dakan memiliki tanda-tanda acak.]

Di sini, saya membandingkannya dengan uji-t pada beberapa data yang dibuat:

 set.seed(seed=438978)
 z=rnorm(50,10,2)
 x=z-rnorm(50,0,.5)
 y=z+.4+rnorm(50,0,.5)
 t.test(y-x) # gives p = 0.003156

 B <- 99999
 d <- x-y
 m0 <- mean(d)
 rndmdist <- replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d))
 sum( abs(rndmdist) >= abs(m0))/length(rndmdist) 

Ketika uji-t valid, biasanya memberikan nilai-p yang sangat mirip dengan uji permutasi yang disebutkan secara lengkap, dan nilai-p yang disimulasikan seperti di atas (ketika jumlah simulasi cukup besar) akan menyatu dengan nilai-p kedua.

Pada jumlah replikasi yang digunakan di atas, nilai p permutasi benar (yaitu dari penghitungan lengkap) 0,05 akan diperkirakan dalam 0,001 (yaitu, akan memberikan nilai p pengacakan antara 0,049 dan 0,051) sekitar 85% dari waktu. dan dalam 0,002 lebih dari 99,5% dari waktu.

Glen_b -Reinstate Monica
sumber
Sangat kami hargai, terima kasih. Bagaimana Anda menghitung keakuratan nilai-p?
Timothy Jones
1
Itu hanya perkiraan normal untuk proporsi binomial , menggunakan standar kesalahan proporsi ; . s.e.(p^)=p(1p)/n
Glen_b -Reinstate Monica
Mengapa Anda mengalikan fungsi rbinom dengan 2-1? Lalu d?
Untuk mendapatkan tanda acak d, karena begitulah tes permutasi perbedaan rata-rata untuk data pasangan bekerja. Lihat komentar tambahan baru setelah potongan kode itu.
Glen_b -Reinstate Monica
1
@Joe ketika kita menambahkan sampel yang diamati itu akan membuat angka bulat
Glen_b -Reinstate Monica
0

Berikut ini adalah kode untuk melakukan tes permutasi. Saya punya data di sana misalnya. x adalah perbedaan antara kedua vektor.

x <- c(5.1, 9.4, 7.2, 8.1, 8.8, 2.5, 4.2, 6.9, 5.5, 5.3)
m = 5
n = 5
xsum = sum(x)
asum = sum(x[1:m])
bsum = xsum - asum
truediff = asum/m - bsum/n
truediff
abstruediff = abs(truediff)
iter = 100000
difflist <- 1:iter
for(i in 1:iter) {
  s <- sample(x,m) # select a sample of size m
  pasum = sum(s)
  pbsum = sum(x) - sum(s)
  diff  = pasum/m - pbsum/n
  difflist[i] <- diff # add permutation difference to list
}
difflist  <- sort(difflist)
xquantile <- quantile(difflist,probs=c(.005, .01, .025, .05, .95, .975, .99, .995))
xquantile
pdist  <- quantile(difflist, probs=seq(0,1,1/iter))
ntail1 <- length(pdist[difflist <= -abstruediff])
tail1  <- ntail1/iter
tail1  # left-tail probability
ntail2 <- length(pdist[difflist >= abstruediff])
tail2  <- ntail2/iter
tail2  # right-tail probability
twotail = tail1 + tail2
twotail 
Lauren Goodwin
sumber