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)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.
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).
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)library(ggplot2)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.library(kableExtra)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.library(rstatix)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.library(ggpubr)ggplot2.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.library(car)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.library(tidyr)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.library(emmeans)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:
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.
Kolom statistic:
Nilai-nilai ini mendekati 1, yang menunjukkan bahwa data untuk berat badan pada ketiga waktu tersebut mendekati distribusi normal.
Kolom p:
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:
Df (Degree of Freedom):
F value:
Pr(>F):
# 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 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 ini menampilkan hasil perbandingan pasangan antara waktu pengukuran untuk melihat apakah perbedaan antar waktu signifikan:
P-value telah disesuaikan menggunakan koreksi bonferroni.
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.