R'de, hangi testlerin t-testleri yerine kullanılması gerektiğini (eşleştirilmiş ve eşleştirilmemiş)?


56

T testleri kullanarak analiz ettiğim bir deneyden veri aldım. Bağımlı değişken aralık ölçeğindedir ve veriler eşleştirilmemiş (yani 2 grup) veya eşleştirilmiş (yani deneklerin içinde). Örneğin (konular içinde):

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

Bununla birlikte, veriler normal değildir; bu nedenle bir gözden geçiren, t-testi dışında bir şey kullanmamızı istedi. Ancak, kolayca görülebileceği gibi, veriler yalnızca normal dağılıma değil, dağılımlar da koşullar arasında eşit değildir: alt metin

Bu nedenle, normal parametrik olmayan testler, Mann-Whitney-U-Testi (eşleştirilmemiş) ve Wilcoxon Testi (eşleştirilmiş), koşullar arasında eşit dağılım gerektirdiğinden kullanılamaz. Bu nedenle, bazı yeniden örnekleme veya permütasyon testinin en iyi olacağına karar verdim.

Şimdi, t-testinin permütasyona dayalı bir eşdeğerinin R uygulamasını ya da verilerle ne yapılacağına dair başka bir tavsiye arıyorum.

Bunu benim için yapabilecek bazı R paketleri olduğunu biliyorum (örneğin, jeton, perm, exactRankTest, vs.), ama hangisini seçeceğimi bilmiyorum. Bu nedenle, bu testleri kullanma deneyimi olan biri bana tekmeleme başlatabilirse, bu ubercool olur.

GÜNCELLEME: Bu testten sonuçların nasıl rapor edileceğine dair bir örnek verebilirseniz ideal olacaktır.

Yanıtlar:


43

Test istatistiğinin her zaman ortalama (veya eşdeğeri bir şey) farkı olacağı için bu kadar önemli olmamalıdır. Monte-Carlo yöntemlerinin uygulanmasından küçük farklılıklar ortaya çıkabilir. İki bağımsız değişken için tek taraflı bir testle verilerinizle üç paketi deneyin:

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
library(coin)                    # for oneway_test(), pvalue()
pvalue(oneway_test(DV ~ IV, alternative="greater", 
                   distribution=approximate(B=9999)))
[1] 0.00330033

library(perm)                    # for permTS()
permTS(DV ~ IV, alternative="greater", method="exact.mc", 
       control=permControl(nmc=10^4-1))$p.value
[1] 0.003

library(exactRankTests)          # for perm.test()
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.003171822

Kesin p değerini tüm permütasyonların manuel hesaplanmasıyla kontrol etmek için verileri ilk 9 değerle sınırlayacağım.

x1 <- x1[1:9]
y1 <- y1[1:9]
DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
pvalue(oneway_test(DV ~ IV, alternative="greater", distribution="exact"))
[1] 0.0945907

permTS(DV ~ IV, alternative="greater", exact=TRUE)$p.value
[1] 0.0945907

# perm.test() gives different result due to rounding of input values
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.1029412

# manual exact permutation test
idx  <- seq(along=DV)                 # indices to permute
idxA <- combn(idx, length(x1))        # all possibilities for different groups

# function to calculate difference in group means given index vector for group A
getDiffM <- function(x) { mean(DV[x]) - mean(DV[!(idx %in% x)]) }
resDM    <- apply(idxA, 2, getDiffM)  # difference in means for all permutations
diffM    <- mean(x1) - mean(y1)       # empirical differencen in group means

# p-value: proportion of group means at least as extreme as observed one
(pVal <- sum(resDM >= diffM) / length(resDM))
[1] 0.0945907

coinve exactRankTestsher ikisi de aynı yazarın, fakat coindaha genel ve kapsamlı olarak görünüyor - Ayrıca belgelerde açısından. exactRankTestsartık aktif olarak geliştirilmemiştir. Bu nedenle , S4 nesnelerle uğraşmaktan hoşlanmadığınız sürece coin(ayrıca support(), gibi bilgilendirici işlevler nedeniyle) seçerdim .

EDIT: iki bağımlı değişken için, sözdizimi

id <- factor(rep(1:length(x1), 2))    # factor for participant
pvalue(oneway_test(DV ~ IV | id, alternative="greater",
                   distribution=approximate(B=9999)))
[1] 0.00810081

Cevabınız için teşekkürler! 2 soru daha: İkinci örneğiniz, o madalyonun aslında tüm olası permütasyonları sağladığı ve kesin bir test olduğu anlamına mı geliyor? Benim durumumda kesin bir test yapmamanın bir faydası var mı?
Henrik

10
(+1) (Eşleştirilmemiş) t testinin aslında aynı p değerini, 0.000349 vermesi şaşırtıcı değildir. Gözden geçirenin söylediklerine rağmen, t-testi bu veriler için geçerlidir. Bunun nedeni, verilerin dağılımı olmasa da, araçların örnekleme dağılımlarının yaklaşık olarak normal olmasıdır. Ayrıca, sonuçlardan da görebileceğiniz gibi, t-testi aslında permütasyon testinden daha tutucudur. (Bu, t testi ile yapılan anlamlı bir sonucun, permütasyon testinin de önemli olacağını gösterdiği anlamına gelir.)
whuber

2
@Henrik Bazı durumlar için (seçilen test ve sayısal karmaşıklık), coinkesin permütasyon dağılımını hesaplayabilir (aslında tüm permütasyonlardan geçmeden, bundan daha zarif algoritmalar vardır). Seçim göz önüne alındığında, kesin dağılım tercih edilir gibi görünmektedir, ancak çok sayıda tekrarlı bir Monte-Carlo yaklaşımına olan fark küçük olmalıdır.
caracal

1
@Caracal Açıklama için teşekkürler. Bir soru kaldı: Verdiğim veriler eşleştirildi. Bu nedenle, eşleştirilmiş t-testine eşdeğerliğe ihtiyacım var. Mı oneway_testdoğru işlev? Ve eğer öyleyse, eşleştirilmemiş veri için hangisi doğru?
Henrik

2
@Henrik coinYazar bana oneway_test()bağımlı durumun tam dağılımını hesaplayamadığını yazdı , MC yaklaşımını kullanmanız gerektiğini söyledi (sadece wilcoxsign_test()tam test için uygundur). Bunu bilmiyordum ve bu durumda bir hatayı tercih ederdim, ancak MC çok sayıda kopya ile yeterince doğru olmalıdır.
caracal

29

Birkaç yorum, sırayla inanıyorum.

1) Verilerinizin birden fazla görsel görüntüsünü denemenizi tavsiye ederim, çünkü bunlar histogramlar tarafından kaybolan şeyleri (grafikler gibi) yakalayabilirler ve ayrıca yan yana eksenlere çizmenizi şiddetle tavsiye ederim. Bu durumda, histogramların verilerinizin göze çarpan özelliklerini bildirmek için çok iyi bir iş çıkardığına inanmıyorum. Örneğin, yan yana kutulara bir göz atın:

boxplot(x1, y1, names = c("x1", "y1"))

alt metin

Hatta yan yana striptiz çizelgeleri:

stripchart(c(x1,y1) ~ rep(1:2, each = 20), method = "jitter", group.names = c("x1","y1"), xlab = "")

alt metin

x1y1x1y1x1y1y1

2) Verilerinizin nereden geldiğini ve nasıl ölçüldüklerini ayrıntılı bir şekilde açıklamamışsınız, ancak istatistiksel bir prosedür seçme zamanı geldiğinde bu bilgiler çok önemlidir. Yukarıdaki iki örnek bağımsız mı? İki örneğin marjinal dağılımının aynı olması gerektiğine inanmak için herhangi bir sebep var mı (örneğin, konumdaki bir fark hariç)? İki grup arasındaki farkın kanıtını aramanıza yol açan çalışmadan önceki düşünceler nelerdi ?

zpp

p

5) Bence bu veriler mükemmel seçilmiş (?) Bir örnek, iyi seçilmiş bir resmin 1000 hipotez testine değer olduğunu gösteriyor. Bir kalem ve bir ahır arasındaki farkı söylemek için istatistiklere ihtiyacımız yok. Benim görüşüme göre bu veriler için uygun ifade "Bu veriler konum, ölçek ve şekil bakımından belirgin farklılıklar göstermektedir." Farklılıkları ölçmek için her birinin (güçlü) tanımlayıcı istatistiklerini takip edebilir ve farkların asıl çalışmanızın bağlamında ne anlama geldiğini açıklayabilirsiniz.

pp

Bu cevap, aslında tasarladığımdan çok daha uzun. Bunun için üzgünüm.


Aşağıdaki yarı-görselleştirilmiş bir yaklaşımı göz önünde bulundurursanız merak ediyorum: iki grubun anları için önyükleme tahminleri (ortalamalar, varyanslar ve eğer istersen daha yüksek anlar) sonra bu tahminleri ve güven aralıklarını, Her andaki gruplar arasındaki çakışma derecesi için. Bu, çeşitli dağıtım özellikleri arasındaki potansiyel farklılıklar hakkında konuşmanıza izin verir. Veriler eşleştirilirse, fark puanlarını hesaplayın ve bu tek dağıtımın anlarını yeniden başlatın. Düşünceler?
Mike Lawrence

2
(+1) İyi analiz. Sonuçların bariz olduğu ve bir p-değeri olan noktaya basması gerekmediği konusunda haklısın. (3) ifadenizde biraz aşırı olabilirsiniz, çünkü t-testi normal olarak dağıtılmış veri gerektirmez. Endişeleniyorsanız, eğriltme için ayarlamalar var (örneğin, Chen'in değişkeni): Düzeltilmiş test için p değerinin cevabı değiştirip değiştirmeyeceğini görebilirsiniz. Değilse, muhtemelen iyi. Bu özel durumda, bu (çok eğri) verilerle, t testi iyi sonuç verir.
whuber

(+1) Güzel yakalayış! Ve çok iyi yorumlar.
chl

Temel dağılımın rastgele örneklemeyle "benzer" olduğu fikrini kabul ediyor gibiyiz. Bu yüzden kimse şu soruyu soramadı: bunlar hem beta (0.25, 0.25) 'den mi geliyorlar ve sonra test aynı (merkeziyetçilik dışı) merkezileşme parametresine sahip olup olmadıkları olacaktır. Ve bu bir permütasyon testi veya Wilcoxon kullanarak haklı olmaz mıydı?
DW

4

5

Yorumlarım, permütasyon testinin uygulanması ile ilgili değil, bu veriler tarafından ortaya atılan daha genel konular ve bunun tartışılması, özellikle de G. Jay Kerns tarafından yapılan yazı hakkında.

Bu iki dağılım aslında Y1'deki 0'lar grubu için EXCEPT'e oldukça benziyor; bu örnekteki X1'deki tüm gözlemcilerden (0-100 ölçeğindeki en küçüğü 50). İlk önce bu gözlemlerde farklı bir şey olup olmadığını araştırırdım.

İkincisi, bu 0'ların var olduğunu varsaymak, dağılımların farklı olduğu ortaya çıktığı için permütasyon testinin geçerli olmadığını söyleyerek analize ait olduğunu varsayıyor. Eğer boş (doğru) dağılımlar aynıysa, (makul olasılıkla) bu ikisi kadar farklı görünen dağıtımlar alabilir misiniz? Testin bütün bu noktasını cevaplamak değil mi? Belki bu durumda, bazıları testi yapmadan cevabı açıkça göreceklerdir, ancak bu ufacık, tuhaf dağılımlarla yapacağımı sanmıyorum.


Görünüşe göre bu bir cevap değil, bir veya daha fazla yorum olmalı. Küçük gri "yorum ekle" yi tıklarsanız, düşüncelerinizi sorunun altındaki sohbete veya ait oldukları belirli bir cevaba yerleştirebilirsiniz. Burada somut puanlar veriyorsunuz, ancak bunun onlar için uygun bir yer olmadığı açık değil.
gung - Reinstate Monica

1
@gung Bir yorum gönderebilmek biraz ün kazandı ;-);
whuber

4
2(1/2)7.01

4

Bu soru tekrar belirdiğinde, Quick-R ve R'nin paketini kullanan R - Blog'cuların yazarı olan Robert Kabacoff'tan yakın tarihli bir blog yazısından ilham alan başka bir cevap daha ekleyebilirim .lmPerm

Bununla birlikte, bu yöntemler, coinpaketin caracakl cevabında ürettiği sonuçlara keskin zıtlıkta (ve çok dengesiz) sonuçlar üretmektedir (deneklerin analizinin p değeridir 0.008). Analiz, veri hazırlığını @ caracal'ın yanıtından alıyor:

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
id <- factor(rep(1:length(x1), 2)) 

library(lmPerm)

summary(aovp( DV ~ IV + Error(id)))

üretir:

> summary(aovp( DV ~ IV + Error(id)))
[1] "Settings:  unique SS "

Error: id
Component 1 :
          Df R Sum Sq R Mean Sq
Residuals 19    15946       839


Error: Within
Component 1 :
          Df R Sum Sq R Mean Sq Iter Pr(Prob)  
IV         1     7924      7924 1004    0.091 .
Residuals 19    21124      1112                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Bunu birden çok kez çalıştırırsanız, p değerleri ~ .05 ve ~ .1 arasında atlar.

Sorunun cevabı olmasına rağmen sonunda bir soru sormama izin verin (İsterseniz bunu yeni bir soruya taşıyabilirim):
Bu analizin neden bu kadar dengesiz olduğu ve böylesine farklı p değerleri ürettiği konusunda herhangi bir fikir para analizi? Ben yanlış bir şey mi yaptım?


2
Gerisini cevaplamak istediğiniz başka bir çözümden ziyade, gerçekten cevaplamak istediğiniz bir soru ise, ayrı bir soru olarak sormanız daha iyi olabilir. Bir hata katmanını belirttiğinize dikkat ediyorum, ancak @caracal belirtmiyor; Bu çıktı b / t farkı bu benim ilk tahminim olurdu. Ayrıca, benzetim yaparken, değerler tipik olarak etrafta zıplar; Tekrar üretilebilirlik için, tohumu belirtirsiniz set.seed(1); MC tahmininde daha fazla hassasiyet için, yineleme sayısını artırırsınız; Bunlardan herhangi birinin sorunuza 'doğru' cevap olup olmadığından emin değilim, ama muhtemelen alakalı.
gung - Monica'yı yeniden kurun

2
Yine, MC sonuçlarını tam permütasyon (yeniden randomizasyon) testini kullanarak manuel hesaplamalarla karşılaştırmanızı öneririm. Karşılaştırma için örneğinizin koduna bakın oneway_anova()(her zaman doğru sonuca yakın) ve aovp()(genellikle doğru sonuçtan uzakta). Neden aovp()çılgınca değişken sonuçlar verdiğini bilmiyorum , ama en azından bu durumda buradakiler mantıksız. Asıl cevabımdaki son çağrıya oneway_test(DV ~ IV | id, ...)bağımlı durum için hata tabakaları belirtildi (tarafından kullanılandan farklı sözdizimi aov()).
caracal

@caracal, haklısın. Düzenlemeden sonra son kod bloğuna bakmadım. Ben üst kod bloğuna bakıyordum - benim tarafımdan özensiz.
gung - Monica'yı yeniden kurun

Cevaba gerçekten ihtiyacım yok. Burada bahsetmeye değer başka bir olasılık. Ne yazık ki, fark etmeye değer olduğum diğer sonuçlardan da uzak.
Henrik

1
@Henrik aovp komutunu maxExact = 1000 ile çalıştırın. Çok uzun sürerse, iter = 1000000 ve Ca = 0.001 olarak ayarlayın. Hesaplama, p'nin tahmini standart hatası Ca * p'den küçük olduğunda sona erer. (Düşük değerler daha istikrarlı sonuçlar verir.)
xmjx

1

Bu puanlar oranlar mı? Öyleyse, kesinlikle bir gauss parametrik testi kullanmamalısınız ve araçların permütasyon testi veya önyükleme gibi parametrik olmayan bir yaklaşıma devam ederken, daha fazla istatistiksel güç elde etmenizi öneririm. Gauss olmayan uygun bir parametrik yaklaşım kullanmak. Spesifik olarak, bir ilgi birimi içindeki bir orantı ölçüsünü ne zaman hesaplayabiliyorsanız (örneğin bir deneyde katılımcı), binom olarak dağılmış hatayı içeren gözlemleri belirten karışık efekt modelini kullanabilirsiniz ve kullanmalısınız. Dixon 2004’e bakınız .


Skorlar oranlar değil, katılımcılar tarafından 0 ile 100 arasında bir tahmindir (sunulan veriler, bu ölçekle ilgili birkaç maddeye ilişkin tahminler anlamına gelir).
Henrik

O zaman parametrik olmayanlar, geleneksel yoldan görünecektir. Bununla birlikte, bu ölçek verilerinin binom bir süreçten türetilmesi için faydalı bir çıkarım olup olmadığını merak ettim ve bu şekilde analiz edildi. Yani, her puanın birkaç maddenin ortalaması olduğunu söylüyorsunuz ve her maddenin 10 puanlık bir ölçek olduğunu varsayalım; bu durumda, denemelerin bir dizisi olarak "8" in yanıtını, 8 1 ve ikisi 0 değerine sahip, hepsi bir "item" değişkeninde aynı etiketle etiketlenmiş. Bu genişletilmiş / binomize veri ile, binom karma efekt modelini hesaplayabilirsiniz.
Mike Lawrence

Önceki yorumumdan sonra, genişletilmiş / binomiye dayalı verilerde "item" değişkenini sabit veya rastgele bir etki olarak modelleyebileceğinizi not etmeliyim. Sanırım bunu sabit bir etki olarak modellemeye meyilliyim çünkü muhtemelen sadece muhasebe farklılıklarını ve aynı zamanda madde ve diğer öngörücü değişkenler arasındaki olası etkileşimi de hesaba katmakla ilgileniyor olabilirsiniz.
Mike Lawrence,

0

Sadece başka bir yaklaşım ekleyerek ezPermbir ezpakette:

> # preparing the data
> DV <- c(x1, y1)
> IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
> id <- factor(rep(1:length(x1), 2))
> df <- data.frame(id=id,DV=DV,IV=IV)
>
> library(ez)
> ezPerm( data = df, dv = DV, wid = id, within = IV, perms = 1000)
|=========================|100%              Completed after 17 s 
  Effect     p p<.05
1     IV 0.016     *

Bu tutarlı görünmektedir oneway_testarasında coinpaketinin:

> library(coin)
> pvalue(oneway_test(DV ~ IV | id,  distribution=approximate(B=999999)))
[1] 0.01608002
99 percent confidence interval:
 0.01575782 0.01640682

Bununla birlikte, bunun caracal tarafından sağlanan aynı örnek olmadığını unutmayın . Örneğinde alternative="greater", p-değerleri arasındaki farkı ~0.008vs içerir ~0.016.

aovpPaket cevapları biri şüpheyle alt p-değer üretir önerildiği ve şüpheyle hızlı ben yüksek değerlerini denemek bile çalışır Iter, Cave maxIterargümanlar:

library(lmPerm)
summary(aovp(DV ~ IV + Error(id/IV), data=df,  maxIter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Iter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Ca = 0.00000000001))

Bununla birlikte, argümanlar p-değerlerinin varyasyonlarını biraz azaltıyor gibi görünüyor ~.03ve ~.1(@Henrik tarafından rapor edilene göre daha geniş bir menzile sahibim), 0.03ve 0.07.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.