Anggota Kelompok:
Santi Laelatul Mu’azaroh (24031554004)
Christine Aprilia Putri (24031554046)
Nadia Kaila (24031554109)
Fridania Nisa Calita (24031554208)
Tautan Dataset: Human Age Prediction Synthetic Dataset
# install.packages(c("car", "heplots", "pingouin", "visreg"))
library(readr)
## Warning: package 'readr' was built under R version 4.5.3
library(car)
## Loading required package: carData
library(heplots)
## Warning: package 'heplots' was built under R version 4.5.3
## Loading required package: broom
library(psych)
##
## Attaching package: 'psych'
## The following object is masked from 'package:car':
##
## logit
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
library(MVN)
## Warning: package 'MVN' was built under R version 4.5.3
##
## Attaching package: 'MVN'
## The following object is masked from 'package:psych':
##
## mardia
df <- read_csv("Train (1).csv")
## Rows: 3000 Columns: 26
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (13): Gender, Blood Pressure (s/d), Physical Activity Level, Smoking Sta...
## dbl (13): Height (cm), Weight (kg), Cholesterol Level (mg/dL), BMI, Blood Gl...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
names(df) <- make.names(names(df))
df$Smoking_Status_Num <- as.numeric(as.factor(df$Smoking.Status))
df$Smoking_Status <- as.factor(df$Smoking.Status)
df_clean <- df %>%
select(
Smoking_Status,
Smoking_Status_Num,
Age = Age..years.,
Cholesterol = Cholesterol.Level..mg.dL.,
Glucose = Blood.Glucose.Level..mg.dL.
) %>%
na.omit()
Pada tahap awal, data Train.csv berhasil dimuat dengan jumlah 3.000 baris. Nama kolom kemudian dirapikan menggunakan make.names agar tidak ada spasi atau tanda khusus, sehingga lebih mudah digunakan dalam pemanggilan variabel. Variabel Smoking Status diubah menjadi tipe factor untuk menunjukkan kelompok data. Hasil akhirnya adalah dataset df_clean yang berisi variabel utama, yaitu 1 faktor (Smoking Status), 1 kovariat (Age), dan 2 variabel dependen (Cholesterol dan Glucose).
df_clean
## # A tibble: 3,000 × 5
## Smoking_Status Smoking_Status_Num Age Cholesterol Glucose
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Former 2 89 259. 158.
## 2 Current 1 77 264. 119.
## 3 Never 3 70 208. 144.
## 4 Never 3 52 253. 137.
## 5 Former 2 79 236. 145.
## 6 Current 1 29 199. 101.
## 7 Current 1 76 246. 130.
## 8 Never 3 26 222. 117.
## 9 Former 2 50 204. 137.
## 10 Former 2 77 269. 130.
## # ℹ 2,990 more rows
print(describeBy(df_clean[, c("Cholesterol", "Glucose", "Age")],
group = df_clean$Smoking_Status, mat = TRUE))
## item group1 vars n mean sd median trimmed
## Cholesterol1 1 Current 1 793 235.01772 23.56893 235.1830 234.71797
## Cholesterol2 2 Former 1 1181 235.71566 24.67547 236.1199 235.79398
## Cholesterol3 3 Never 1 1026 231.32567 24.85547 231.5397 231.14248
## Glucose1 4 Current 2 793 127.48342 18.21799 126.9917 127.29043
## Glucose2 5 Former 2 1181 128.00814 17.94511 128.3495 128.03424
## Glucose3 6 Never 2 1026 124.45395 18.36520 124.6619 124.54039
## Age1 7 Current 3 793 57.07945 18.86843 57.0000 57.26142
## Age2 8 Former 3 1181 55.80864 19.73332 56.0000 56.00212
## Age3 9 Never 3 1026 48.03411 21.64782 46.0000 47.02311
## mad min max range skew kurtosis
## Cholesterol1 24.34295 162.79104 331.3006 168.5095 0.181177210 0.20284480
## Cholesterol2 24.74826 164.07831 307.9204 143.8421 -0.025313498 -0.04334136
## Cholesterol3 25.62080 148.81151 303.1247 154.3131 0.050436506 -0.18210934
## Glucose1 18.67773 78.75352 184.9938 106.2402 0.124310053 -0.16523758
## Glucose2 18.34126 73.93323 185.7361 111.8029 0.001358811 -0.21565543
## Glucose3 18.02917 69.86688 180.9044 111.0375 -0.032548816 -0.17330628
## Age1 23.72160 18.00000 89.0000 71.0000 -0.057112336 -1.09671133
## Age2 25.20420 18.00000 89.0000 71.0000 -0.042531114 -1.14310053
## Age3 28.16940 18.00000 89.0000 71.0000 0.294195602 -1.22160087
## se
## Cholesterol1 0.8369571
## Cholesterol2 0.7180266
## Cholesterol3 0.7759761
## Glucose1 0.6469397
## Glucose2 0.5221812
## Glucose3 0.5733529
## Age1 0.6700376
## Age2 0.5742160
## Age3 0.6758347
Hasil menunjukkan bahwa rata-rata kadar kolesterol berada di sekitar 231–235 mg/dL dan gula darah di sekitar 124–128 mg/dL untuk semua kelompok. Nilai skewness dan kurtosis yang mendekati nol menunjukkan bahwa data cenderung simetris, sehingga menjadi tanda awal bahwa data berdistribusi normal.
par(mfrow=c(1,2))
boxplot(Cholesterol ~ Smoking_Status, data = df_clean, col = "skyblue",
main = "Boxplot Kolesterol", xlab = "Status Merokok")
boxplot(Glucose ~ Smoking_Status, data = df_clean, col = "salmon",
main = "Boxplot Gula Darah", xlab = "Status Merokok")
par(mfrow=c(1,1))
Visualisasi boxplot menunjukkan bahwa distribusi kadar kolesterol dan gula darah pada ketiga kelompok status merokok terlihat cukup mirip, namun tetap ada beberapa hal penting yang perlu diperhatikan. Pada variabel kolesterol (warna biru), garis median dari ketiga kelompok berada pada posisi yang hampir sama, yaitu di sekitar 231 hingga 235 mg/dL. Hal ini menunjukkan bahwa tidak ada perbedaan nilai tengah yang mencolok antar kelompok. Selain itu, ukuran kotak atau Rentang Interkuartil (IQR) yang hampir sama pada kelompok Current, Former, dan Never juga menunjukkan bahwa variasi data antar kelompok cenderung seragam, sehingga asumsi homogenitas varians kemungkinan besar terpenuhi.
Pada variabel gula darah (warna salmon), pola distribusinya terlihat cukup simetris karena garis median berada di tengah kotak. Hal ini mendukung hasil uji normalitas Shapiro-Wilk sebelumnya. Meskipun nilai median antar kelompok hampir sama, terlihat bahwa kelompok perokok (Current) dan mantan perokok (Former) sedikit lebih tinggi dibandingkan kelompok yang tidak pernah merokok. Ini bisa menjadi tanda awal bahwa status merokok mungkin berpengaruh terhadap kadar gula darah, sehingga perlu diuji lebih lanjut pada analisis berikutnya.
Selain itu, adanya beberapa titik di luar garis whisker pada kedua variabel menunjukkan adanya data pencilan (outlier). Hal ini mendukung langkah pembersihan data menggunakan metode Mahalanobis Distance yang telah dilakukan sebelumnya. Outlier tersebut perlu ditangani agar tidak memengaruhi hasil analisis. Secara keseluruhan, boxplot ini menunjukkan bahwa data sudah cukup siap untuk dianalisis lebih lanjut karena distribusinya cenderung simetris, variansnya seragam, dan outlier sudah teridentifikasi dengan baik.
print(cor(df_clean[, c("Cholesterol", "Glucose")]))
## Cholesterol Glucose
## Cholesterol 1.0000000 0.1895891
## Glucose 0.1895891 1.0000000
Nilai korelasi sebesar 0.189 menunjukkan adanya hubungan positif yang lemah antara kolesterol dan gula darah. Dalam analisis MANOVA, variabel dependen memang sebaiknya memiliki hubungan, tidak boleh nol tetapi juga tidak boleh terlalu tinggi agar tidak terjadi multikolinearitas dan analisis tetap efektif.
print(shapiro.test(df_clean$Cholesterol))
##
## Shapiro-Wilk normality test
##
## data: df_clean$Cholesterol
## W = 0.9995, p-value = 0.6622
print(shapiro.test(df_clean$Glucose))
##
## Shapiro-Wilk normality test
##
## data: df_clean$Glucose
## W = 0.99917, p-value = 0.1804
Kolesterol (p = 0.6622) dan gula darah (p = 0.1804) sama-sama memiliki nilai p lebih dari 0.05. Artinya, secara masing-masing, kedua variabel dependen sudah memenuhi asumsi normalitas.
mardia(df_clean[, c("Cholesterol", "Glucose")])
## Test Statistic p.value Method
## 1 Mardia Skewness 1.947703 0.7453773 asymptotic
## 2 Mardia Kurtosis -1.157075 0.2472418 asymptotic
Hasil uji menunjukkan bahwa nilai p untuk skewness (0.745) dan kurtosis (0.247) lebih dari 0.05. Hal ini menunjukkan bahwa data sudah memenuhi asumsi normalitas multivariat, sehingga analisis MANOVA/MANCOVA dapat dilanjutkan.
m_dist <- mahalanobis(df_clean[, c("Cholesterol", "Glucose")],
colMeans(df_clean[, c("Cholesterol", "Glucose")]),
cov(df_clean[, c("Cholesterol", "Glucose")]))
cutoff <- qchisq(1-0.001, df=2)
outliers <- which(m_dist > cutoff)
cat("Ditemukan", length(outliers), "baris outlier.\n")
## Ditemukan 2 baris outlier.
Menghapus outlier
if(length(outliers) > 0) {
df_final <- df_clean[-outliers, ]
} else {
df_final <- df_clean
}
Berdasarkan batas nilai Chi-Square, ditemukan 2 data yang termasuk outlier multivariat. Data tersebut kemudian dihapus untuk membentuk df_final, agar hasil analisis selanjutnya tidak dipengaruhi oleh nilai yang terlalu ekstrem.
print(leveneTest(Cholesterol ~ Smoking_Status, data = df_final))
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 1.9153 0.1475
## 2995
print(leveneTest(Glucose ~ Smoking_Status, data = df_final))
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.0944 0.9099
## 2995
Variabel kolesterol (p = 0.1475) dan gula darah (p = 0.9099) sama-sama memiliki nilai p lebih dari 0.05. Artinya, varians antar kelompok pada masing-masing variabel adalah sama atau homogen.
res_boxm <- boxM(cbind(df_final$Cholesterol, df_final$Glucose), df_final$Smoking_Status)
print(res_boxm)
##
## Box's M-test for Homogeneity of Covariance Matrices
##
## data: cbind(df_final$Cholesterol, df_final$Glucose) by df_final$Smoking_Status
## Chi-Sq (approx.) = 5.1235, df = 6, p-value = 0.5281
Nilai p = 0.5281 (lebih dari 0.05) menunjukkan bahwa matriks kovarians antar kelompok adalah sama atau homogen. Hal ini menunjukkan bahwa salah satu asumsi dalam MANCOVA sudah terpenuhi, sehingga penggunaan statistik Wilks’ Lambda nantinya dapat dianggap valid.
# Cholesterol
model_slope_chol <- lm(Cholesterol ~ Smoking_Status * Age, data = df_final)
anova(model_slope_chol)
## Analysis of Variance Table
##
## Response: Cholesterol
## Df Sum Sq Mean Sq F value Pr(>F)
## Smoking_Status 2 11518 5759 11.8527 7.459e-06 ***
## Age 1 326866 326866 672.7066 < 2.2e-16 ***
## Smoking_Status:Age 2 302 151 0.3108 0.7329
## Residuals 2992 1453803 486
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil uji untuk variabel kolesterol, diperoleh nilai p-value antara Smoking_Status:Age adalah 0,7329 (> 0,05) menunjukkan bahwa tidak terdapat interaksi yang signifikan antara kedua variabel tersebut. Pengaruh usia terhadap kadar kolesterol bersifat konsisten di seluruh kelompok status merokok. Artinya, kemiringan garis regresi (slope) antar kelompok dapat dianggap sejajar. Oleh karena itu, asumsi homogenitas slope pada analisis ANCOVA untuk variabel kolesterol terpenuhi, sehingga model dapat digunakan secara valid.
#Glucose
model_slope_gluc <- lm(Glucose ~ Smoking_Status * Age, data = df_final)
anova(model_slope_gluc)
## Analysis of Variance Table
##
## Response: Glucose
## Df Sum Sq Mean Sq F value Pr(>F)
## Smoking_Status 2 7599 3799 14.0325 8.594e-07 ***
## Age 1 174968 174968 646.2178 < 2.2e-16 ***
## Smoking_Status:Age 2 88 44 0.1628 0.8498
## Residuals 2992 810103 271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil uji untuk variabel gula darah menunjukkan bahwa nilai p-value sebesar 0,8498 (> 0,05) yang mengindikasikan bahwa tidak terdapat interaksi signifikan antara kovariat usia dan faktor status merokok dalam memengaruhi kadar gula darah. Hubungan antara usia dan kadar gula darah bersifat seragam di semua kelompok, menunjukkan bahwa kemiringan garis regresi antar kelompok adalah homogen. Oleh karena itu, asumsi homogenitas slope untuk variabel gula darah terpenuhi dan analisis ANCOVA dapat dilakukan secara sah.
Multivariat (MANCOVA)
model_mancova_interaksi <- manova(
cbind(Cholesterol, Glucose) ~ Smoking_Status * Age,
data = df_final
)
summary(model_mancova_interaksi, test = "Wilks")
## Df Wilks approx F num Df den Df Pr(>F)
## Smoking_Status 2 0.98312 12.78 4 5982 2.315e-10 ***
## Age 1 0.69571 654.11 2 2991 < 2.2e-16 ***
## Smoking_Status:Age 2 0.99969 0.24 4 5982 0.9185
## Residuals 2992
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil uji menghasilkan nilai p-value sebesar 0,9185 (> 0,05) berdasarkan statistik Wilks’ Lambda, yang menunjukkan bahwa tidak terdapat interaksi signifikan secara simultan antara kovariat dan faktor terhadap kombinasi variabel dependen (kolesterol dan gula darah). Hal ini berarti pengaruh usia terhadap kedua variabel dependen bersifat konsisten di seluruh kelompok status merokok. Dengan demikian, asumsi homogenitas slope dalam kerangka multivariat terpenuhi, sehingga model MANCOVA dapat digunakan secara valid untuk analisis lanjutan.
print(ggplot(df_final, aes(x = Age, y = Cholesterol, color = Smoking_Status)) +
geom_point(alpha = 0.2) + geom_smooth(method = "lm", se = FALSE) +
labs(title = "Uji Linieritas: Age vs Cholesterol", x = "Usia", y = "Kolesterol") +
theme_minimal())
## `geom_smooth()` using formula = 'y ~ x'
Visualisasi uji linearitas ini digunakan untuk melihat hubungan antara variabel kontrol (usia) dan variabel dependen (kolesterol) pada setiap kelompok status merokok. Dari grafik scatter plot, terlihat bahwa data tersebar cukup luas tetapi tetap mengikuti pola tertentu yang ditunjukkan oleh garis regresi pada masing-masing kelompok (Current, Former, dan Never). Ketiga garis tersebut menunjukkan tren linear positif, artinya kadar kolesterol cenderung meningkat seiring bertambahnya usia, tanpa dipengaruhi oleh status merokok.
Hal penting dalam asumsi MANCOVA adalah adanya hubungan linear dan arah hubungan yang serupa antar kelompok. Pada grafik ini, terlihat bahwa ketiga garis regresi memiliki kemiringan yang hampir sama (sejajar) dan tidak saling berpotongan secara mencolok. Ini menunjukkan bahwa tidak ada interaksi yang signifikan antara usia dan status merokok terhadap kadar kolesterol. Dengan kata lain, pengaruh usia terhadap kolesterol konsisten di semua kelompok.
Secara keseluruhan, grafik ini menunjukkan bahwa variabel usia layak digunakan sebagai kovariat dalam model MANCOVA. Hubungan linear yang stabil ini memastikan bahwa pengaruh usia dapat dikontrol dengan baik, sehingga perbedaan kadar kolesterol akibat status merokok dapat terlihat lebih jelas tanpa dipengaruhi oleh perbedaan usia.
Kita telah mengetahui bahwa usia memengaruhi kolesterol, jadi kita ingin “menyamakan” usia semua orang secara statistik agar perbandingan status merokok menjadi lebih adil.
Uji untuk melihat apakah ada perbedaan rata-rata kadar (Kolesterol/Gula Darah) yang signifikan di antara kelompok status merokok tanpa memperhitungkan faktor lain.
Menguji apakah ada perbedaan rata-rata kadar kolesterol antar kelompok perokok tanpa mempertimbangkan faktor usia.
# Membuat model ANOVA untuk Kolesterol
anova_chol <- aov(Cholesterol ~ Smoking_Status, data = df_final)
# Menampilkan hasil utama (P-value)
summary(anova_chol)
## Df Sum Sq Mean Sq F value Pr(>F)
## Smoking_Status 2 11518 5759 9.685 6.42e-05 ***
## Residuals 2995 1780971 595
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai baseline R-Squared
summary.lm(anova_chol)$r.squared
## [1] 0.006425932
Berdasarkan hasil pengujian ANOVA, diperoleh nilai signifikansi statistik (\(P\)-value) sebesar \(6,42 \times 10^{-5}\) atau \(0,0000642\). Nilai tersebut jauh berada di bawah ambang batas signifikansi \(0,05\), yang mengindikasikan bahwa hasil pengujian ini bersifat sangat signifikan. Hal ini menunjukkan bahwa secara statistik, terdapat perbedaan rata-rata kadar kolesterol yang nyata di antara kelompok status merokok, bahkan sebelum variabel kontrol seperti usia diperhitungkan dalam model.
Selain itu, hasil pengujian menunjukkan nilai \(F\)-hitung sebesar \(9,685\). Besarnya nilai \(F\) ini mencerminkan bahwa variabilitas atau perbedaan kadar kolesterol antar kelompok status merokok (Current, Former, Never) jauh lebih dominan dibandingkan dengan variabilitas yang terjadi di dalam masing-masing kelompok itu sendiri. Dengan kata lain, pengelompokan berdasarkan status merokok merupakan faktor yang cukup kuat dalam membedakan distribusi data kolesterol pada dataset ini.
Dilihat dari sisi kemampuan model dalam menjelaskan data, nilai \(R\)-Squared yang diperoleh adalah \(0,006425\) atau sekitar \(0,64\%\). Angka ini berperan sebagai nilai baseline yang menunjukkan bahwa variabel status merokok secara mandiri hanya mampu menjelaskan \(0,64\%\) dari total variasi kadar kolesterol subjek. Nilai yang relatif kecil ini memberikan indikasi kuat bahwa terdapat variabel lain yang belum masuk ke dalam model, seperti usia, yang diprediksi memiliki pengaruh lebih besar terhadap perubahan kolesterol. Oleh karena itu, analisis perlu dilanjutkan ke tahap ANCOVA untuk melihat peningkatan daya jelaskan model setelah variabel usia dikontrol.
Menguji apakah status merokok secara mandiri memengaruhi kadar gula darah.
# Membuat model ANOVA untuk Gula Darah
anova_gluc <- aov(Glucose ~ Smoking_Status, data = df_final)
# Menampilkan hasil utama (P-value)
summary(anova_gluc)
## Df Sum Sq Mean Sq F value Pr(>F)
## Smoking_Status 2 7599 3799 11.55 1.01e-05 ***
## Residuals 2995 985159 329
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai baseline R-Squared
summary.lm(anova_gluc)$r.squared
## [1] 0.007654191
Hasil uji ANOVA pada variabel gula darah menunjukkan nilai signifikansi (\(P\)-value) sebesar \(1,01 \times 10^{-5}\) atau \(0,0000101\). Nilai ini berada jauh di bawah kriteria signifikansi \(0,05\), sehingga dapat disimpulkan bahwa terdapat perbedaan kadar gula darah yang signifikan secara statistik di antara kelompok status merokok. Temuan ini menegaskan bahwa pada tahap awal analisis, status merokok diidentifikasi sebagai faktor yang membedakan profil gula darah subjek penelitian.
Kemudian, diperoleh nilai \(F\)-hitung sebesar \(11,55\), yang menunjukkan rasio variabilitas antar kelompok yang cukup tinggi. Besarnya nilai \(F\) ini mengindikasikan bahwa perbedaan rata-rata kadar gula darah antara kelompok Current, Former, dan Never sangat nyata. Konsistensi nilai \(F\) yang tinggi pada variabel gula darah ini memberikan dasar yang kuat untuk pengujian lebih lanjut guna melihat apakah signifikansi ini tetap bertahan setelah variabel usia dikontrol.
Model ANOVA awal untuk variabel gula darah menghasilkan nilai \(R\)-Squared sebesar \(0,007654\) atau \(0,77\%\). Hal ini berarti variabel status merokok hanya mampu menjelaskan sebagian kecil dari variabilitas kadar gula darah. Rendahnya nilai \(R\)-Squared baseline ini menunjukkan bahwa model univariat sederhana belum cukup kuat untuk merepresentasikan faktor-faktor yang memengaruhi gula darah secara menyeluruh. Oleh karena itu, penggunaan analisis ANCOVA dengan menyertakan variabel usia (Age) sebagai kovariat menjadi sangat krusial untuk meningkatkan kekuatan prediksi model.
Tujuannya adalah untuk “menghilangkan” pengaruh usia, sehingga kamu bisa melihat apakah status merokok benar-benar berpengaruh murni terhadap kesehatan seseorang.
Menguji apakah terdapat perbedaan rata-rata kadar kolesterol yang signifikan di antara kelompok status merokok, setelah melakukan kontrol statistik terhadap variabel usia (Age) sebagai kovariat.
# Menghitung pengaruh Smoking_Status setelah dikontrol oleh Age
ancova_chol <- aov(Cholesterol ~ Age + Smoking_Status, data = df_final)
summary(ancova_chol)
## Df Sum Sq Mean Sq F value Pr(>F)
## Age 1 337416 337416 694.740 <2e-16 ***
## Smoking_Status 2 968 484 0.996 0.369
## Residuals 2994 1454105 486
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai R-Squared ANCOVA Kolesterol
cat("R-Squared ANCOVA Kolesterol:", summary.lm(ancova_chol)$r.squared, "\n")
## R-Squared ANCOVA Kolesterol: 0.188779
Dari hasil tersebut, ditemukan bahwa usia memiliki pengaruh yang sangat signifikan terhadap kadar kolesterol (\(F=694,74, p < 0,001\)). Namun, temuan terpenting adalah pada variabel utama, yakni status merokok. Hasil uji ANCOVA menunjukkan bahwa pengaruh status merokok terhadap kadar kolesterol menjadi tidak signifikan (\(F=0,996, p=0,369\)).Hal ini memberikan temuan kritis bahwa perbedaan kadar kolesterol yang sebelumnya terdeteksi pada uji ANOVA awal sebenarnya lebih banyak dipengaruhi oleh distribusi usia subjek, bukan oleh perilaku merokok itu sendiri. Meskipun signifikansi variabel utama menurun, model ANCOVA ini memberikan gambaran yang jauh lebih akurat dengan kenaikan nilai \(R\)-Squared yang signifikan, yaitu dari \(0,64\%\) menjadi \(18,87\%\). Hal ini membuktikan bahwa faktor usia merupakan kontributor yang lebih dominan dalam menentukan kadar kolesterol dibandingkan status merokok dalam studi kasus ini.
Menguji apakah status merokok memberikan pengaruh yang signifikan terhadap kadar gula darah secara mandiri, dengan mengeliminasi pengaruh gangguan yang mungkin ditimbulkan oleh variabel usia (Age).
# Menghitung pengaruh Smoking_Status setelah dikontrol oleh Age
ancova_gluc <- aov(Glucose ~ Age + Smoking_Status, data = df_final)
summary(ancova_gluc)
## Df Sum Sq Mean Sq F value Pr(>F)
## Age 1 182017 182017 672.630 <2e-16 ***
## Smoking_Status 2 549 275 1.015 0.362
## Residuals 2994 810191 271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Mendapatkan nilai R-Squared ANCOVA Gula Darah
cat("R-Squared ANCOVA Gula Darah:", summary.lm(ancova_gluc)$r.squared, "\n")
## R-Squared ANCOVA Gula Darah: 0.1838982
Sama halnya dengan variabel kolesterol, hasil pengujian ANCOVA pada kadar gula darah menunjukkan bahwa variabel usia (Age) memegang peranan yang sangat signifikan sebagai kovariat (\(F=672,63, p < 0,001\)). Setelah pengaruh usia dikontrol, variabel status merokok menunjukkan hasil yang tidak signifikan secara statistik (\(F=1,015, p=0,362\)). Temuan ini mengindikasikan bahwa signifikansi yang ditemukan pada uji univariat awal (ANOVA) lebih disebabkan oleh kontribusi usia subjek daripada perilaku merokok itu sendiri. Penambahan variabel kontrol ini terbukti meningkatkan kualitas model secara signifikan, terlihat dari lonjakan nilai \(R\)-Squared yang semula hanya sebesar \(0,77\%\) menjadi \(18,38\%\). Hal ini menegaskan bahwa dalam konteks penelitian ini, usia merupakan faktor pengganggu (confounding factor) yang harus diperhitungkan untuk mendapatkan simpulan yang akurat mengenai pengaruh status merokok terhadap kesehatan metabolisme.
# 1. Membuat fungsi kecil untuk mengambil P-value dari model ANOVA/ANCOVA
get_p <- function(model, row_index) {
summary_mod <- summary(model)
return(summary_mod[[1]][["Pr(>F)"]][row_index])
}
# 2. Menyusun Data ke dalam Tabel (Data Frame)
tabel_banding <- data.frame(
Variabel = c("Kolesterol", "Kolesterol", "Gula Darah", "Gula Darah"),
Metode = c("ANOVA (Tanpa Age)", "ANCOVA (Dengan Age)", "ANOVA (Tanpa Age)", "ANCOVA (Dengan Age)"),
P_Value_Smoking = c(
get_p(anova_chol, 1),
get_p(ancova_chol, 2),
get_p(anova_gluc, 1),
get_p(ancova_gluc, 2)
),
R_Squared = c(
summary.lm(anova_chol)$r.squared,
summary.lm(ancova_chol)$r.squared,
summary.lm(anova_gluc)$r.squared,
summary.lm(ancova_gluc)$r.squared
)
)
# 3. Menampilkan Tabel
print(tabel_banding)
## Variabel Metode P_Value_Smoking R_Squared
## 1 Kolesterol ANOVA (Tanpa Age) 6.417582e-05 0.006425932
## 2 Kolesterol ANCOVA (Dengan Age) 3.693121e-01 0.188779007
## 3 Gula Darah ANOVA (Tanpa Age) 1.006705e-05 0.007654191
## 4 Gula Darah ANCOVA (Dengan Age) 3.624776e-01 0.183898225
Kita telah mengetahui dari analisis univariat bahwa usia (Age) memiliki pengaruh yang signifikan terhadap kadar kolesterol dan gula darah. Oleh karena itu, untuk mendapatkan perbandingan yang lebih adil terkait pengaruh status merokok, kita perlu mengontrol variabel usia.
Selain itu, karena variabel dependen yang dianalisis lebih dari satu (Cholesterol dan Glucose), maka digunakan pendekatan multivariat agar pengaruh status merokok dapat dilihat secara bersamaan terhadap kedua indikator kesehatan tersebut.
Uji ini digunakan untuk melihat apakah terdapat perbedaan rata-rata secara simultan pada variabel Cholesterol dan Glucose antar kelompok status merokok tanpa mempertimbangkan faktor usia.
# Membuat model MANOVA
manova_model <- manova(cbind(Cholesterol, Glucose) ~ Smoking_Status, data = df_final)
# Menampilkan hasil utama (multivariate test)
summary(manova_model, test = "Wilks")
## Df Wilks approx F num Df den Df Pr(>F)
## Smoking_Status 2 0.98818 8.9231 4 5988 3.51e-07 ***
## Residuals 2995
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(manova_model, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Smoking_Status 2 0.011816 8.8995 4 5990 3.669e-07 ***
## Residuals 2995
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(manova_model, test = "Hotelling-Lawley")
## Df Hotelling-Lawley approx F num Df den Df Pr(>F)
## Smoking_Status 2 0.011957 8.9467 4 5986 3.357e-07 ***
## Residuals 2995
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Berdasarkan hasil uji MANOVA, diperoleh nilai signifikansi dari berbagai statistik multivariat sebagai berikut:
Wilks’ Lambda = 0,98818, dengan \(p\)-value = \(3,51 \times 10^{-7}\) Pillai’s Trace = 0,011816, dengan \(p\)-value = \(3,669 \times 10^{-7}\) Hotelling’s Trace = 0,011957, dengan \(p\)-value = \(3,357 \times 10^{-7}\)
Seluruh nilai \(p\)-value berada jauh di bawah batas signifikansi \(0,05\), sehingga dapat disimpulkan bahwa hasil pengujian ini sangat signifikan secara statistik.
Hal ini menunjukkan bahwa secara simultan terdapat perbedaan yang nyata pada kombinasi variabel Cholesterol dan Glucose antar kelompok status merokok. Dengan kata lain, jika kedua indikator kesehatan dianalisis secara bersamaan, maka status merokok tampak memiliki pengaruh terhadap kondisi kesehatan responden.
Namun, nilai Wilks’ Lambda yang mendekati 1 (0,98818) mengindikasikan bahwa meskipun perbedaan tersebut signifikan, besar efeknya relatif kecil. Artinya, kontribusi status merokok dalam menjelaskan variasi data secara keseluruhan masih terbatas.
Temuan ini konsisten dengan hasil analisis univariat (ANOVA) sebelumnya, di mana status merokok menunjukkan pengaruh signifikan sebelum variabel usia dikontrol
Bertujuan untuk “menghilangkan” pengaruh usia (Age), sehingga dapat diketahui apakah status merokok benar-benar berpengaruh terhadap kondisi kesehatan secara keseluruhan.
# Membuat model MANCOVA
mancova_model <- manova(cbind(Cholesterol, Glucose) ~ Age + Smoking_Status, data = df_final)
# Menampilkan hasil utama
summary(mancova_model, test = "Wilks")
## Df Wilks approx F num Df den Df Pr(>F)
## Age 1 0.68818 678.07 2 2993 <2e-16 ***
## Smoking_Status 2 0.99867 1.00 4 5986 0.4073
## Residuals 2994
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(mancova_model, test = "Pillai")
## Df Pillai approx F num Df den Df Pr(>F)
## Age 1 0.311817 678.07 2 2993 <2e-16 ***
## Smoking_Status 2 0.001332 1.00 4 5988 0.4073
## Residuals 2994
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(mancova_model, test = "Hotelling-Lawley")
## Df Hotelling-Lawley approx F num Df den Df Pr(>F)
## Age 1 0.45310 678.07 2 2993 <2e-16 ***
## Smoking_Status 2 0.00133 1.00 4 5984 0.4073
## Residuals 2994
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Pada analisis MANCOVA, variabel usia (Age) dimasukkan sebagai kovariat untuk mengontrol pengaruhnya terhadap variabel dependen. Hasil uji menunjukkan bahwa:
Menunjukkan bahwa usia memiliki pengaruh yang sangat signifikan terhadap kombinasi variabel Cholesterol dan Glucose.
Nilai \(p\)-value berada di atas \(0,05\), sehingga tidak signifikan secara statistik.
Hasil ini menunjukkan bahwa setelah pengaruh usia dikontrol, status merokok tidak lagi memiliki pengaruh yang signifikan terhadap kombinasi variabel dependen. Dengan demikian, perbedaan yang sebelumnya terdeteksi pada analisis MANOVA sebenarnya lebih banyak disebabkan oleh faktor usia, bukan oleh status merokok itu sendiri. Usia dalam hal ini berperan sebagai variabel pengganggu (confounding variable) yang kuat.
Digunakan untuk melihat variabel dependen mana yang paling dipengaruhi oleh status merokok dalam analisis multivariat.
# Efek antar-subjek dari MANOVA
summary.aov(manova_model)
## Response Cholesterol :
## Df Sum Sq Mean Sq F value Pr(>F)
## Smoking_Status 2 11518 5759.2 9.6851 6.418e-05 ***
## Residuals 2995 1780971 594.6
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response Glucose :
## Df Sum Sq Mean Sq F value Pr(>F)
## Smoking_Status 2 7599 3799.4 11.551 1.007e-05 ***
## Residuals 2995 985159 328.9
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Efek antar-subjek dari MANCOVA
summary.aov(mancova_model)
## Response Cholesterol :
## Df Sum Sq Mean Sq F value Pr(>F)
## Age 1 337416 337416 694.7400 <2e-16 ***
## Smoking_Status 2 968 484 0.9964 0.3693
## Residuals 2994 1454105 486
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Response Glucose :
## Df Sum Sq Mean Sq F value Pr(>F)
## Age 1 182017 182017 672.6298 <2e-16 ***
## Smoking_Status 2 549 275 1.0151 0.3625
## Residuals 2994 810191 271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Menunjukkan bahwa secara terpisah, kedua variabel dependen dipengaruhi oleh status merokok.
Hasil uji efek antar-subjek menunjukkan bahwa pada awalnya (tanpa kontrol usia), status merokok berpengaruh signifikan terhadap kedua variabel dependen.
Namun, setelah variabel usia dikontrol, pengaruh tersebut menjadi tidak signifikan. Sebaliknya, usia menunjukkan pengaruh yang sangat kuat terhadap baik Cholesterol maupun Glucose. Hal ini memperkuat bahwa usia merupakan faktor dominan dalam menjelaskan variasi kedua indikator kesehatan tersebut.
# Fungsi ambil p-value Wilks
get_p_multi <- function(model) {
summary(model, test = "Wilks")$stats[1, "Pr(>F)"]
}
# Tabel perbandingan
tabel_multi <- data.frame(
Model = c("MANOVA (Tanpa Age)", "MANCOVA (Dengan Age)"),
P_Value = c(
get_p_multi(manova_model),
get_p_multi(mancova_model)
)
)
print(tabel_multi)
## Model P_Value
## 1 MANOVA (Tanpa Age) 3.509569e-07
## 2 MANCOVA (Dengan Age) 1.331197e-243
MANOVA (Tanpa Age): \(p = 3,51 \times 10^{-7}\) (signifikan)
MANCOVA (Dengan Age): \(p \approx 1,33 \times 10^{-243}\) (model signifikan karena Age, tapi Smoking tidak)
Perbandingan kedua model menunjukkan bahwa pada MANOVA, status merokok tampak berpengaruh signifikan terhadap kombinasi variabel dependen. Namun, pada MANCOVA, signifikansi tersebut hilang setelah variabel usia dimasukkan ke dalam model.
Walaupun model MANCOVA tetap signifikan secara keseluruhan, hal ini disebabkan oleh kontribusi variabel usia, bukan oleh status merokok.
Secara keseluruhan, hasil analisis multivariat menunjukkan bahwa status merokok tampak berpengaruh terhadap kondisi kesehatan jika dilihat tanpa kontrol variabel. Namun, setelah usia dikontrol, pengaruh tersebut menjadi tidak signifikan baik secara simultan (MANOVA vs MANCOVA) maupun secara parsial (uji antar-subjek). Hasil ini konsisten dengan analisis univariat sebelumnya, dan menegaskan bahwa usia merupakan faktor utama (confounding variable) yang memengaruhi kadar kolesterol dan gula darah dalam penelitian ini.