Kruskal-Wallis yerleşik R işlevi ve manuel hesaplama arasında hafif tutarsızlık


9

Aşağıdakiler yüzünden kafam karıştı ve başka bir yerde cevabı bulamadım.

Bazı istatistikleri yaparken R'yi öğrenmeye çalışıyorum ve bir egzersiz olarak, R'deki gibi 'elle' de yaparak yerleşik R işlevlerinin sonuçlarını iki kez kontrol etmeye çalışıyorum. , Kruskal-Wallis testi için farklı sonuçlar almaya devam ediyorum ve nedenini anlayamıyorum.

Örneğin, bir alıştırmada verilen aşağıdaki verilere bakıyorum

activity <- c(2, 4, 3, 2, 3, 3, 4, 0, 4, 3, 4, 0, 0, 1, 3, 1, 2, 0, 3, 1, 0, 3, 4, 0, 1, 2, 2, 2, 3, 2) 
group <- c(rep("A", 11), rep("B", 10), rep("C", 9))
group <- factor(group)
data.raw <- data.frame(activity, group)

Etkinliği grup bazında analiz etmek istiyorum. Önce yerleşik R işlevini kullanarak bir Kruskal-Wallis testi yapıyorum

kruskal.test(activity ~ group, data = data.raw)

Hangi döndürür .'H=8,9056

Tekrar kontrol etmek için, R'de aynı 'elle' yapmaya çalışıyorum, aşağıdaki (şüphesiz çaresiz) kodla

rank <- rank(activity)
data.rank <- data.frame(rank, group)
rank.sum <- aggregate(rank ~ group, data = data.rank, sum)

x <- rank.sum[1,2]^2 / 11 + rank.sum[2,2]^2 / 10 + rank.sum[3,2]^2 / 9
H <- (12 / (length(activity) * (length(activity) + 1))) * x - 3 * (length(activity) + 1)
H

Bu, aşağıdaki formülü yansıtmak içindir:

'H=12N-(N-+1)Σben=1g(R,ben2nben)-3(N-+1)

Burada toplam gözlem sayısı, gruplarının sayısı, gözlem sayısı i inci grubu ve r_i saflarına toplamıdır i inci grup.N-gnbenbenR,benben

Ve şimdi elde , ki bu da benim karışıklığımı ekleyerek, söz konusu egzersiz için verilen cevaptır. Bunu birkaç farklı veri kümesi için denedim ve yerleşik işlevi kullanarak için biraz daha yüksek bir değer elde etme eğilimindeyim .'H=8,499'H

Neyi yanlış yaptığımı veya anlayamadığımı anlamaya çalıştım, ama boşuna. Herkes dahili kruskal.testfonksiyonun neden bir şeyleri heceleyerek elde ettiğim değerden farklı bir değer döndürdüğünü anlamama yardımcı olabilir mi?

Yanıtlar:


12

kruskal.testbu Wikipedia makalesinde (nokta 4) açıklanan bağlar için bir düzeltme uygular :

Önceki noktada açıklanan kısa yol formülünü kullanarak bağlar için düzeltme, H'yi , ...1-Σben=1G,(tben3-tben)N-3-N-

Kodunuz devam ediyor:

TIES <- table(activity)
H / (1 - sum(TIES^3 - TIES)/(length(activity)^3 - length(activity)))
#[1] 8.9056

Kullanarak görebileceğiniz kodu dikkatlice inceleyerek R işlevinin ne yaptığını öğrenebilirsiniz getAnywhere(kruskal.test.default).


4
@MichaelChernick Hayır, değil. Mesele şu ki, OP'ye sadece bir bağ yoksa kullanılması gereken testin basitleştirilmesi öğretildi.
Roland

4
@MichaelChernick Stack Overflow'a uymayacağını söylemiyorum. Ama CV'ye eşit derecede uyduğunu iddia ediyorum. Açıkçası, OP sadece kodlarını değil, aynı zamanda kullandıkları formülleri de paylaşsaydı faydalı olurdu.
Roland

3
@Michael Bu iş parçacığının durumu kolay bir çağrıdır: istatistiksel olarak anlamaya çalıştığı için dürüstçe düşünüyoruz.
whuber

2
Kodda yansıtılan formülü içerecek şekilde düzenlendi. Bunu ilk kez yapmayı düşünmeliydim. Özür.
MSR

3
Ayrıca bağlar için orta sarımları kullanan R Hmiscpaketi spearman2fonksiyonuna ve FKruskal-Wallis'i almak için bir sınamaya bakın. Bunun bazı yöntemlerden daha doğru olduğunu düşünüyorum.
Frank Harrell
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.