Saya memiliki kumpulan data sampel yang terlihat seperti ini:

Day<-c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
Group<-c("A","A","A","B","B","B","C","C","C","A","A","A","A","B","B","B","C","C","C")
Value<-c(4,4,6,5,3,4,5,5,3,6,6,6,5,3,3,3,2,5,2)

d<-data.frame(Day,Group,Value)

Saya ingin melakukan tes Kruskal Wallis antara A, B dan C dalam variabel "Grup" untuk setiap "Hari", lalu untuk mencetak hasilnya? Bantuan apa pun sangat dihargai. Terima kasih.

0
Sue 26 Desember 2020, 05:01

3 jawaban

Jawaban Terbaik

Brute-force, Anda dapat menggunakan argumen subset= dari kruskal.test:

kruskal.test(Value ~ Group, data = d, subset = Day == 1)
#   Kruskal-Wallis rank sum test
# data:  Value by Group
# Kruskal-Wallis chi-squared = 0.5045, df = 2, p-value = 0.777

(dan lagi untuk hari ke-2).

Tetapi ini tidak memuaskan ketika ada banyak hari, atau jumlah hari yang berbeda yang tidak diketahui secara apriori.

Inilah opsi lain, yang melakukannya setiap hari secara mandiri dan mengembalikan semua dalam satu daftar:

ret <- by(d, d$Day, function(z) kruskal.test(Value ~ Group, data = z))
names(ret)
# [1] "1" "2"
ret
# d$Day: 1
#   Kruskal-Wallis rank sum test
# data:  Value by Group
# Kruskal-Wallis chi-squared = 0.5045, df = 2, p-value = 0.777
# --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
# d$Day: 2
#   Kruskal-Wallis rank sum test
# data:  Value by Group
# Kruskal-Wallis chi-squared = 6.5202, df = 2, p-value = 0.03839

Dan Anda bisa mendapatkan hasil dari salah satu dari beberapa pengujian dengan ret[["1"]]. (Perhatikan bahwa meskipun dalam hal ini ret[[1]] dan ret[["1"]] akan merujuk ke elemen daftar yang sama, mereka sering kali merupakan hal yang berbeda. Jika data Anda membentang dari Day 2 ke 3 bukannya 1 ke 2, misalnya, maka ret[[2]] sebenarnya akan merujuk ke ret[["3"]]. Inilah alasan mengapa saya menunjukkan output dari names(ret) di atas, untuk menunjukkan bahwa nama indeks selalu berupa string, terlepas dari apakah nilai Day yang sebenarnya adalah bilangan bulat atau numerik.)

1
r2evans 26 Desember 2020, 03:06

Anda dapat menggunakan paket rstatix yang menyediakan kerangka kerja yang mudah digunakan untuk melakukan uji jumlah peringkat Kruskal-Wallis. Bungkus di sekitar fungsi kruskal.test().

library(rstatix)
library(tidyverse)

Day<-c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
Group<-c("A","A","A","B","B","B","C","C","C","A","A","A","A","B","B","B","C","C","C")
Value<-c(4,4,6,5,3,4,5,5,3,6,6,6,5,3,3,3,2,5,2)

d<-data.frame(Day,Group,Value)

d %>% 
  group_by(Day) %>% 
  kruskal_test(Value ~ Group)

Keluaran

# A tibble: 2 x 7
    Day .y.       n statistic    df      p method        
* <dbl> <chr> <int>     <dbl> <int>  <dbl> <chr>         
1     1 Value     9     0.505     2 0.777  Kruskal-Wallis
2     2 Value    10     6.52      2 0.0384 Kruskal-Wallis

Yang sama seperti yang disediakan oleh @andrew_reece tetapi dengan pengkodean yang jauh lebih mudah.

1
Bappa Das 26 Desember 2020, 07:24

Inilah solusi yang rapi. Kelompokkan menurut Day, sesuaikan uji K-W sebagai kolom daftar, lalu unnest_wider:

library(tidyverse)
library(broom)

d %>% 
  group_by(Day) %>% 
  summarise(fit = list(kruskal.test(Value ~ Group) %>% tidy)) %>% 
  unnest_wider(fit)

Keluaran:

# A tibble: 2 x 5
    Day statistic p.value parameter method                      
  <dbl>     <dbl>   <dbl>     <int> <chr>                       
1     1     0.505  0.777          2 Kruskal-Wallis rank sum test
2     2     6.52   0.0384         2 Kruskal-Wallis rank sum test
0
andrew_reece 26 Desember 2020, 03:49