Repeated Measures ANOVA

Repeated Measure ANOVA (Analysis of Variance) adalah suatu teknik statistik yang digunakan untuk menganalisis data yang melibatkan pengukuran yang berulang pada unit yang sama. Ini biasanya diterapkan ketika satu atau lebih variabel independen (faktor) diuji untuk melihat pengaruhnya terhadap variabel dependen, dengan pengukuran yang dilakukan beberapa kali pada subjek yang sama.

Data

Seorang peneliti ingin mengetahui apakah obat herbal merek SLIMJOS benar-benar mampu menurunkan berat badan seseorang dalam kurun waktu tertentu? Untuk keperluan penelitian ini, maka 17 orang yang akan melakukan program diet ditimbang untuk diketahui berat badan awal. Setelah itu 17 orang tersebut diberi minum obat herbal merek SLIMJOS, kemudian ditimbang kembali berat badannya seminggu dan sebulan kemudian setelah sebelumnya rutin mengkonsumsi obat herbal ini. Berikut data berat badan tujuh belas orang responden tersebut (https://www.spssindonesia.com/2019/01/uji-repeated-measures-anova-dengan-spss.html).

Sintaks In R for Repeated Measures Anova

library(ggplot2)
library(kableExtra)
library(rstatix)

Attaching package: 'rstatix'
The following object is masked from 'package:stats':

    filter
library(ggpubr)
library(car)
Loading required package: carData
library(tidyr)

1. library(ggplot2)

  • Paket ini digunakan untuk membuat visualisasi data dalam format grafik yang menarik dan mudah disesuaikan.
  • Fungsi Utama:
    • ggplot(): Fungsi dasar untuk membuat grafik, yang kemudian ditambahkan dengan komponen lain.
    • geom_bar(), geom_line(), geom_point(), dll.: Fungsi untuk menambahkan elemen grafik tertentu, seperti bar chart, line chart, atau scatter plot.
    • aes(): Menentukan estetika seperti warna, bentuk, ukuran, dsb.

2. library(kableExtra)

  • Paket ini digunakan untuk meningkatkan tampilan tabel di R, terutama di RMarkdown.
  • Fungsi Utama:
    • kable(): Fungsi dari knitr yang berfungsi untuk membuat tabel sederhana.
    • kable_styling(): Digunakan untuk mengatur tampilan tabel, seperti mengatur gaya, warna, dan lebar.
    • add_header_above(): Menambahkan header di atas tabel untuk grup kolom tertentu.

3. library(rstatix)

  • Paket ini berisi fungsi-fungsi statistik yang mudah digunakan, termasuk uji statistik, pemrosesan data, dan transformasi data.
  • Fungsi Utama:
    • t_test(), anova_test(): Untuk melakukan uji T atau ANOVA pada data.
    • get_summary_stats(): Menghasilkan ringkasan statistik untuk variabel dalam data.
    • add_significance(): Menambahkan simbol signifikan pada hasil uji statistik.

4. library(ggpubr)

  • Paket ini menyediakan fungsi-fungsi untuk membuat publikasi visualisasi grafik dan meningkatkan fungsionalitas ggplot2.
  • Fungsi Utama:
    • ggboxplot(), ggline(), ggscatter(): Untuk membuat berbagai jenis grafik yang terintegrasi dengan ggplot2.
    • stat_compare_means(): Menambahkan hasil perbandingan statistik ke grafik, seperti hasil uji T atau ANOVA.
    • ggarrange(): Menggabungkan beberapa grafik ke dalam satu bingkai.

5. library(car)

  • Paket ini berisi alat-alat untuk analisis regresi dan diagnostik regresi.
  • Fungsi Utama:
    • Anova(): Untuk melakukan uji ANOVA pada model regresi.
    • vif(): Untuk menghitung Variance Inflation Factor (VIF), yang digunakan untuk mendeteksi multikolinearitas.
    • scatterplotMatrix(): Membuat scatter plot matrix, cocok untuk melihat hubungan antar variabel.

6. library(tidyr)

  • Paket ini digunakan untuk pemrosesan data, terutama untuk merapikan data dan mengubah format data.
  • Fungsi Utama:
    • gather(): Mengubah data dari format lebar (wide) ke format panjang (long).
    • spread(): Mengubah data dari format panjang (long) ke format lebar (wide).
    • separate(), unite(): Untuk memisahkan atau menggabungkan kolom data.

7. library(emmeans)

  • Paket ini digunakan untuk menghitung dan membandingkan rata-rata marginal (estimated marginal means) pada model linear.
  • Fungsi Utama:
    • emmeans(): Menghitung rata-rata marginal dari model yang sudah dibuat.
    • contrast(): Membandingkan rata-rata marginal, seperti perbedaan pasangan rata-rata.
    • pairs(): Melakukan perbandingan berpasangan pada hasil emmeans untuk melihat perbedaan yang signifikan.

Paket-paket ini bekerja sama untuk menyediakan alur kerja lengkap untuk analisis data yang mencakup visualisasi, pengujian statistik, pemrosesan data, serta pembuatan tabel dan pelaporan.

# Data
respondents <- 1:17
bb_awal <- c(90.4, 86.5, 85.4, 95.3, 70.6, 75.2, 90.9, 64.7, 71.5, 95.3, 85.5, 85.3, 97.2, 84.5, 77.7, 63.5, 81.3)
bb_seminggu <- c(90.3, 84.0, 84.2, 93.5, 70.6, 74.5, 90.4, 63.7, 70.2, 94.0, 85.4, 84.8, 97.1, 83.6, 77.5, 62.9, 81.0)
bb_sebulan <- c(86.3, 81.4, 80.8, 92.5, 67.5, 74.0, 84.3, 62.2, 65.6, 88.2, 82.7, 80.8, 94.3, 80.7, 76.1, 60.2, 78.3)

# Membuat data frame
data <- data.frame(
  Respondent = factor(respondents),
  BB_Awal = bb_awal,
  BB_Seminggu = bb_seminggu,
  BB_Sebulan = bb_sebulan
)
head(data)
  Respondent BB_Awal BB_Seminggu BB_Sebulan
1          1    90.4        90.3       86.3
2          2    86.5        84.0       81.4
3          3    85.4        84.2       80.8
4          4    95.3        93.5       92.5
5          5    70.6        70.6       67.5
6          6    75.2        74.5       74.0

Lalu data diinput dengan mendefinisikan kolom “respondents” sebagai faktor.

# Ubah data ke format long
data_long <- data %>%
  pivot_longer(cols = starts_with("BB"), names_to = "Waktu", values_to = "Berat_Badan")

# Konversi variabel waktu menjadi faktor
data_long$Waktu <- factor(data_long$Waktu, levels = c("BB_Awal", "BB_Seminggu", "BB_Sebulan"))
head(data_long)
# A tibble: 6 × 3
  Respondent Waktu       Berat_Badan
  <fct>      <fct>             <dbl>
1 1          BB_Awal            90.4
2 1          BB_Seminggu        90.3
3 1          BB_Sebulan         86.3
4 2          BB_Awal            86.5
5 2          BB_Seminggu        84  
6 2          BB_Sebulan         81.4

Kemudian, data di ubah ke dalam bentuk long untuk mempermudah analisis. Kolom waktu juga didefinisikan ke dalam faktor dengan tiga level berbeda yaitu “BB_Awal”, “BB_Seminggu”, “BB_Sebulan”.

#Statistik Deskriptif
ggplot(aes(x = Berat_Badan, y = Waktu, color = Waktu), data = data_long) + geom_boxplot() + 
  xlab("Berat Badan") + ylab("Waktu") + 
  ggtitle("Distribusi Penurunan Berat Badan dalam Tiga Waktu") + 
  theme(legend.position = 'none')

summary(data_long)
   Respondent         Waktu     Berat_Badan   
 1      : 3   BB_Awal    :17   Min.   :60.20  
 2      : 3   BB_Seminggu:17   1st Qu.:74.25  
 3      : 3   BB_Sebulan :17   Median :82.70  
 4      : 3                    Mean   :80.87  
 5      : 3                    3rd Qu.:87.35  
 6      : 3                    Max.   :97.20  
 (Other):33                                   

Boxplot ini menunjukkan distribusi penurunan berat badan pada tiga waktu yang berbeda: “BB_Awal” (berat badan awal), “BB_Seminggu” (berat badan setelah satu minggu), dan “BB_Sebulan” (berat badan setelah satu bulan). Berikut adalah penjelasan lebih lanjut:

  1. Sumbu X (Berat Badan):
    • Sumbu X menampilkan nilai berat badan dari setiap responden pada tiga waktu yang berbeda.
    • Nilai yang lebih tinggi menunjukkan berat badan yang lebih besar.
  2. Sumbu Y (Waktu):
    • Sumbu Y menunjukkan tiga kategori waktu pengukuran berat badan: “BB_Awal”, “BB_Seminggu”, dan “BB_Sebulan”.
    • Ini berarti berat badan diukur pada tiga waktu yang berbeda: awal, setelah satu minggu, dan setelah satu bulan.
  3. Boxplot untuk Setiap Waktu:
    • BB_Awal (Kotak Merah): Distribusi berat badan awal responden. Kotak merah lebih panjang ke arah nilai berat badan yang tinggi, menunjukkan bahwa pada awalnya berat badan responden lebih tinggi dibandingkan setelah satu minggu atau satu bulan.
    • BB_Seminggu (Kotak Hijau): Distribusi berat badan setelah satu minggu. Distribusi ini lebih rendah dibandingkan berat badan awal, yang menunjukkan adanya penurunan berat badan pada sebagian responden setelah satu minggu.
    • BB_Sebulan (Kotak Biru): Distribusi berat badan setelah satu bulan. Distribusi ini lebih rendah dari dua kotak sebelumnya, yang berarti terdapat penurunan berat badan lebih lanjut setelah satu bulan.
  4. Interpretasi Penurunan Berat Badan:
    • Berdasarkan distribusi kotak, terlihat bahwa rata-rata berat badan responden menurun dari awal ke satu minggu dan terus menurun setelah satu bulan.
    • Distribusi kotak (lebar kotak) menunjukkan variasi berat badan di antara responden pada setiap waktu. Kotak yang lebih pendek (misalnya, pada “BB_Sebulan”) menunjukkan bahwa variasi berat badan antar-responden pada waktu tersebut lebih kecil.

Secara keseluruhan, boxplot ini menggambarkan adanya tren penurunan berat badan dari awal, setelah satu minggu, hingga setelah satu bulan.

#Normality
kbl(mshapiro_test(data_long$Berat_Badan))
statistic p.value
0.9554364 0.0533536
x <- data_long %>%
  group_by(Waktu) %>%
  shapiro_test(Berat_Badan)
kbl(x)
Waktu variable statistic p
BB_Awal Berat_Badan 0.9432879 0.3592758
BB_Seminggu Berat_Badan 0.9469132 0.4095649
BB_Sebulan Berat_Badan 0.9501148 0.4583392
ggqqplot(data_long, 'Berat_Badan', facet.by = 'Waktu') + ggtitle("QQ plot grouped by Times") 

Hasil tes asumsi normalitas berikut menunjukkan hasil uji normalitas untuk berat badan pada tiga waktu berbeda: BB_Awal (berat badan awal), BB_Seminggu (berat badan setelah satu minggu), dan BB_Sebulan (berat badan setelah satu bulan). Uji ini biasanya dilakukan untuk memastikan bahwa data distribusi berat badan pada setiap waktu mengikuti distribusi normal.

  1. Kolom statistic:

    • Nilai ini merupakan nilai statistik dari uji normalitas (misalnya, statistik Shapiro-Wilk atau tes normalitas lainnya). Nilai mendekati 1 menunjukkan bahwa data semakin mendekati distribusi normal.
    • BB_Awal: Statistik normalitas = 0.9433.
    • BB_Seminggu: Statistik normalitas = 0.9469.
    • BB_Sebulan: Statistik normalitas = 0.9501.

    Nilai-nilai ini mendekati 1, yang menunjukkan bahwa data untuk berat badan pada ketiga waktu tersebut mendekati distribusi normal.

  2. Kolom p:

    • Nilai p > 0.05, maka kita gagal menolak hipotesis nol dan mengasumsikan bahwa data mengikuti distribusi normal.
    • BB_Awal: p = 0.3593.
    • BB_Seminggu: p = 0.4096.
    • BB_Sebulan: p = 0.4583.

    Semua nilai p lebih besar dari 0.05, yang menunjukkan bahwa kita gagal menolak hipotesis nol. Artinya, data berat badan pada ketiga waktu (awal, seminggu, dan sebulan) dapat dianggap mengikuti distribusi normal. Hal ini didukung dengan qq-plot dimana data tersebar di sekitar area kurva menunjukkan data berdistribusi normal.

#Homogenity Variance - Levene's Test
kbl(leveneTest(Berat_Badan ~ Waktu, data = data_long))
Df F value Pr(>F)
group 2 0.0490693 0.9521629
48 NA NA

Hasil uji Levene yang diberikan digunakan untuk menguji asumsi homogenitas varians atau kesamaan varians antar kelompok, yang merupakan asumsi penting dalam analisis varians (ANOVA). Uji ini memeriksa apakah varians antar kelompok seragam. Jika varians antar kelompok tidak signifikan berbeda, maka asumsi homogenitas varians terpenuhi.

Berikut adalah penjelasan untuk output uji Levene di atas:

  1. Df (Degree of Freedom):

    • group: Derajat bebas untuk kelompok atau faktor dalam data, yaitu 2.
    • residual: Derajat bebas residual atau error, yaitu 48.
  2. F value:

    • Nilai statistik F adalah 0.0491. Statistik F ini digunakan untuk menguji hipotesis bahwa varians antar kelompok sama.
    • Nilai F yang sangat kecil ini menunjukkan bahwa perbedaan varians antar kelompok sangat kecil.
  3. Pr(>F):

    • Nilai p-value untuk uji Levene adalah 0.9522.
    • Biasanya, kita membandingkan nilai ini dengan tingkat signifikansi (misalnya, 0.05). Jika nilai p > 0.05, maka kita tidak menolak hipotesis nol, yang menyatakan bahwa varians antar kelompok adalah sama (homogen).
    • Dalam hasil ini, p-value 0.9522 jauh lebih besar dari 0.05, yang berarti kita gagal menolak hipotesis nol dan menyimpulkan bahwa varians antar kelompok tidak berbeda secara signifikan. Artinya, varians antar kelompok dalam data ini dapat dianggap sama, sehingga data memenuhi asumsi homogenitas varians untuk analisis statistik seperti ANOVA.
    # Repeated Measures ANOVA
    model <- aov(Berat_Badan ~ Waktu + Error(Respondent/Waktu), data = data_long)
    
    # Menampilkan hasil
    summary(model)
    
    Error: Respondent
              Df Sum Sq Mean Sq F value Pr(>F)
    Residuals 16   5019   313.7               
    
    Error: Respondent:Waktu
              Df Sum Sq Mean Sq F value   Pr(>F)    
    Waktu      2 138.57   69.28   74.95 8.42e-13 ***
    Residuals 32  29.58    0.92                     
    ---
    Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Terdapat perbedaan yang signifikan dalam berat badan antar tiga waktu pengukuran (BB_Awal, BB_Seminggu, BB_Sebulan), dengan nilai p < 0.001 untuk faktor Waktu. Aspek perbedaan antar responden sendiri tidak diuji dalam model ini, tetapi analisis ANOVA repeated measures ini menunjukkan bahwa faktor Waktu memiliki pengaruh signifikan terhadap perubahan berat badan.

# Tukey HSD tidak bisa digunakan langsung pada model repeated measures dengan Error term
# Sebagai alternatif, gunakan library "emmeans" untuk post-hoc test

# Install library jika belum terpasang
# install.packages("emmeans")

# Load library
library(emmeans)
Welcome to emmeans.
Caution: You lose important information if you filter this package's results.
See '? untidy'
# Analisis post-hoc menggunakan emmeans
posthoc <- emmeans(model, pairwise ~ Waktu, adjust = "bonferroni")
Note: re-fitting model with sum-to-zero contrasts
posthoc
$emmeans
 Waktu       emmean   SE   df lower.CL upper.CL
 BB_Awal       82.4 2.49 16.2     77.1     87.7
 BB_Seminggu   81.6 2.49 16.2     76.4     86.9
 BB_Sebulan    78.6 2.49 16.2     73.3     83.9

Warning: EMMs are biased unless design is perfectly balanced 
Confidence level used: 0.95 

$contrasts
 contrast                 estimate   SE df t.ratio p.value
 BB_Awal - BB_Seminggu       0.771 0.33 32   2.337  0.0776
 BB_Awal - BB_Sebulan        3.818 0.33 32  11.576  <.0001
 BB_Seminggu - BB_Sebulan    3.047 0.33 32   9.240  <.0001

P value adjustment: bonferroni method for 3 tests 

Berikut adalah interpretasi hasil post-hoc test dari uji ANOVA repeated measures di atas:

Bagian 1: Rata-rata Terkondisi (emmeans)

Bagian ini menunjukkan estimated marginal means (rata-rata terkondisi) dari berat badan pada setiap waktu pengukuran: - BB_Awal: rata-rata berat badan adalah 82.4 dengan standard error (SE) sebesar 2.49. - BB_Seminggu: rata-rata berat badan adalah 81.6 dengan SE sebesar 2.49. - BB_Sebulan: rata-rata berat badan adalah 78.6 dengan SE sebesar 2.49.

Confidence interval 95% (CL) untuk masing-masing waktu juga diberikan. Ini menunjukkan rentang di mana rata-rata berat badan diperkirakan berada untuk setiap waktu: - BB_Awal: 77.1 hingga 87.7 - BB_Seminggu: 76.4 hingga 86.9 - BB_Sebulan: 73.3 hingga 83.9

Catatan: Peringatan “EMMs are biased unless design is perfectly balanced” menunjukkan bahwa hasil ini dapat sedikit bias jika desain percobaan tidak seimbang.

Bagian 2: Kontras (contrasts)

Bagian ini menampilkan hasil perbandingan pasangan antara waktu pengukuran untuk melihat apakah perbedaan antar waktu signifikan:

  1. BB_Awal - BB_Seminggu:
    • Estimasi perbedaan rata-rata = 0.771
    • SE = 0.33
    • t.ratio = 2.337
    • p.value = 0.776, yang lebih besar dari 0.05. Ini menunjukkan bahwa perbedaan antara BB_Awal dan BB_Seminggu tidak signifikan secara statistik pada level signifikansi 5% (α = 0.05).
  2. BB_Awal - BB_Sebulan:
    • Estimasi perbedaan rata-rata = 3.818
    • SE = 0.33
    • t.ratio = 11.576
    • p.value < 0.0001, yang jauh lebih kecil dari 0.05. Ini menunjukkan bahwa perbedaan antara BB_Awal dan BB_Sebulan signifikan secara statistik.
  3. BB_Seminggu - BB_Sebulan:
    • Estimasi perbedaan rata-rata = 3.047
    • SE = 0.33
    • t.ratio = 9.240
    • p.value < 0.0001, yang juga jauh lebih kecil dari 0.05. Ini menunjukkan bahwa perbedaan antara BB_Seminggu dan BB_Sebulan signifikan secara statistik.

P-value telah disesuaikan menggunakan koreksi bonferroni.

Kesimpulan

  • Tidak ada perbedaan yang signifikan antara BB_Awal dan BB_Seminggu (p = 0.0776).
  • Terdapat perbedaan yang signifikan antara BB_Awal dan BB_Sebulan (p < 0.0001), serta antara BB_Seminggu dan BB_Sebulan (p < 0.0001).

Ini menunjukkan bahwa berat badan pada BB_Sebulan lebih rendah secara signifikan (menurun signifikan) setelah menggunakan obat herbal merek SLIMJOS dibandingkan dengan BB_Awal dan BB_Seminggu, tetapi tidak ada perbedaan signifikan antara BB_Awal dan BB_Seminggu.