Tidur merupakan kebutuhan dasar manusia yang berperan penting dalam kualitas hidup, kesehatan fisik, dan kesehatan mental [1]. Penelitian sebelumnya menunjukkan bahwa kualitas tidur mahasiswa dipengaruhi oleh berbagai faktor, termasuk tingkat stres dan pola tidur [2,3].
Kualitas tidur bersifat ordinal sehingga analisis yang tepat perlu mempertimbangkan urutan kategorinya. Regresi logistik ordinal mensyaratkan asumsi proportional odds, yaitu pengaruh prediktor dianggap konstan di setiap batas kategori. Apabila asumsi ini tidak terpenuhi, Partial Proportional Odds Model (PPO) menjadi alternatif yang lebih fleksibel.
Penelitian ini bertujuan mengidentifikasi pengaruh frekuensi kesulitan tidur, durasi tidur, frekuensi terbangun malam hari, dan tingkat stres terhadap kualitas tidur mahasiswa menggunakan pendekatan PPO.
Data yang digunakan dalam penelitian ini adalah data sekunder yang berasal dari dataset publik Student Insomnia and Educational Outcomes, dataset ini dipublikasikan oleh Akik Abdullah dan Md Shohanur Rahman pada repositori Mendeley Data. Dataset diperoleh melalui survei secara daring menggunakan Google Forms pada periode waktu Oktober hingga November 2024. Dataset terdiri dari 996 responden dengan variabel respon adalah kualitas tidur dan variabel prediktor adalah frekuensi kesulitan tidur, durasi tidur, frekuensi terbangun pada malam hari, dan stres level. Seluruh variabel yang ada dalam dataset bersifat kategorik atau ordinal dan tidak terdapat nilai yang hilang (missing value).
| Variabel | Skala | Kategori / Level |
|---|---|---|
| Sleep Quality (Respon) | Ordinal | Very poor (1) < Poor (2) < Average (3) < Good (4) < Very good (5) |
| Difficulty Sleeping | Ordinal | Never (1), Rarely 1-2x/minggu (2), Sometimes 3-4x/minggu (3), Often 5-6x/minggu (4), Every night (5) |
| Hours of Sleep | Ordinal | < 4 jam (1), 4-5 jam (2), 6-7 jam (3), 7-8 jam (4), > 8 jam (5) |
| Wake up Night | Ordinal | Never (1), Rarely 1-2x/minggu (2), Sometimes 3-4x/minggu (3), Often 5-6x/minggu (4), Every night (5) |
| Stress Level | Ordinal | No stress (1), Low stress (2), High stress (3), Extremely high stress (4) |
library(tidyverse)
library(MASS)
library(brant)
library(car)
library(VGAM)
library(knitr)
library(kableExtra)
library(scales)
data_sleep <- read.csv("C:/Users/Asus/Documents/KULYEAH/SEM 4/ADK/PROJEK AKHIR/Rpubs/Book6.csv", sep = ",", header = TRUE) %>%
mutate(
Sleep_quality = ordered(
Sleep.quality,
levels = c("Very poor", "Poor", "Average", "Good", "Very good")
),
Difficulty_Sleeping = case_when(
Difficulty.Sleeping == "Never" ~ 1,
Difficulty.Sleeping == "Rarely (1-2 times a week)" ~ 2,
Difficulty.Sleeping == "Sometimes (3-4 times a week)" ~ 3,
Difficulty.Sleeping == "Often (5-6 times a week)" ~ 4,
Difficulty.Sleeping == "Every night" ~ 5
),
Hours_of_Sleep = case_when(
Hours.of.Sleep == "Less than 4 hours" ~ 1,
Hours.of.Sleep == "4-5 hours" ~ 2,
Hours.of.Sleep == "6-7 hours" ~ 3,
Hours.of.Sleep == "7-8 hours" ~ 4,
Hours.of.Sleep == "More than 8 hours" ~ 5
),
Wake_up_Night = case_when(
Wake.up.Night == "Never" ~ 1,
Wake.up.Night == "Rarely (1-2 times a week)" ~ 2,
Wake.up.Night == "Sometimes (3-4 times a week)" ~ 3,
Wake.up.Night == "Often (5-6 times a week)" ~ 4,
Wake.up.Night == "Every night" ~ 5
),
Stress_level = case_when(
Stress.level == "No stress" ~ 1,
Stress.level == "Low stress" ~ 2,
Stress.level == "High stress" ~ 3,
Stress.level == "Extremely high stress" ~ 4
)
)
data_sleep %>%
count(Sleep_quality) %>%
mutate(Proporsi = round(n / sum(n), 3)) %>%
rename(`Sleep Quality` = Sleep_quality, Frekuensi = n) %>%
kable(caption = "Tabel 1. Distribusi Kualitas Tidur Responden") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Sleep Quality | Frekuensi | Proporsi |
|---|---|---|
| Very poor | 290 | 0.291 |
| Poor | 166 | 0.167 |
| Average | 75 | 0.075 |
| Good | 214 | 0.215 |
| Very good | 251 | 0.252 |
data_sleep %>%
count(Sleep_quality) %>%
mutate(proporsi = n / sum(n)) %>%
ggplot(aes(x = Sleep_quality, y = proporsi, fill = Sleep_quality)) +
geom_col(width = 0.65, alpha = 0.9) +
geom_text(aes(label = percent(proporsi, accuracy = 0.1)),
vjust = -0.4, fontface = "bold", color = "#1a4f5a") +
scale_y_continuous(labels = percent_format(), limits = c(0, 0.35)) +
scale_fill_manual(values = c(
"Very poor" = "#2a7b8c",
"Poor" = "#3a9ab2",
"Average" = "#5bbcd6",
"Good" = "#7dcfe0",
"Very good" = "#a8e0ec"
)) +
labs(
title = "Distribusi Kualitas Tidur Responden",
subtitle = "Variabel respon ordinal: Very poor < Poor < Average < Good < Very good",
x = NULL, y = "Proporsi"
) +
theme_minimal(base_size = 13) +
theme(legend.position = "none",
plot.title = element_text(color = "#1a4f5a", face = "bold"),
plot.subtitle = element_text(color = "#2a7b8c", size = 11))
Dari 996 responden, kategori Very poor memiliki frekuensi terbesar (29,1%), diikuti Very good (25,2%), Good (21,5%), Poor (16,7%), dan Average (7,5%). Distribusi tidak seimbang, terutama pada kategori Average yang jauh lebih sedikit dibanding kategori lainnya. Meskipun demikian, seluruh kategori memiliki jumlah observasi yang memadai untuk estimasi parameter model sehingga pemodelan dapat dilanjutkan.
Hipotesis:
Keputusan: Tolak H₀ jika VIF ≥ 10.
model_lm_vif <- lm(
as.numeric(Sleep_quality) ~ Difficulty_Sleeping + Hours_of_Sleep +
Wake_up_Night + Stress_level,
data = data_sleep
)
vif_result <- vif(model_lm_vif)
data.frame(
Variabel = names(vif_result),
VIF = round(vif_result, 6)
) %>%
kable(caption = "Tabel 2. Hasil Uji Multikolinearitas (VIF)") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Variabel | VIF | |
|---|---|---|
| Difficulty_Sleeping | Difficulty_Sleeping | 1.369753 |
| Hours_of_Sleep | Hours_of_Sleep | 1.495637 |
| Wake_up_Night | Wake_up_Night | 1.551912 |
| Stress_level | Stress_level | 1.110339 |
Seluruh nilai VIF jauh di bawah ambang batas 10, sehingga tidak terdapat multikolinearitas antarvariaabel prediktor. Keempat variabel dapat digunakan secara bersamaan dalam pemodelan.
library(lmtest)
model_po <- MASS::polr(
Sleep_quality ~ Difficulty_Sleeping + Hours_of_Sleep +
Wake_up_Night + Stress_level,
data = data_sleep,
Hess = TRUE,
method = "logistic"
)
po_test <- coeftest(model_po)
po_tabel <- data.frame(
Parameter = rownames(po_test),
Estimate = round(po_test[, 1], 4),
`Std.Error` = round(po_test[, 2], 4),
`z.value` = round(po_test[, 3], 4),
`p.value` = round(po_test[, 4], 4),
check.names = FALSE
)
colnames(po_tabel) <- c("Parameter", "Estimate", "Std. Error", "z value", "p-value")
po_tabel %>%
kable(caption = "Tabel 3. Hasil Estimasi Proportional Odds Model") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE
)
| Parameter | Estimate | Std. Error | z value | p-value | |
|---|---|---|---|---|---|
| Difficulty_Sleeping | Difficulty_Sleeping | -0.1510 | 0.0819 | -1.8441 | 0.0655 |
| Hours_of_Sleep | Hours_of_Sleep | -0.0335 | 0.0871 | -0.3841 | 0.7010 |
| Wake_up_Night | Wake_up_Night | 0.3522 | 0.0812 | 4.3384 | 0.0000 |
| Stress_level | Stress_level | 0.0470 | 0.0874 | 0.5378 | 0.5909 |
Berdasarkan hasil estimasi Proportional Odds Model, hanya variabel night waking frequency yang berpengaruh signifikan terhadap kualitas tidur dengan nilai p-value kurang dari 0,05. Variabel difficulty sleeping, hours of sleep, dan stress level tidak menunjukkan pengaruh signifikan pada taraf signifikansi 5%. Nilai estimasi night waking frequency sebesar 0,3522 menunjukkan bahwa semakin sering responden terbangun saat malam hari, odds responden berada pada kategori kualitas tidur yang lebih rendah cenderung meningkat.
Hipotesis:
Keputusan: Tolak H₀ jika p-value < 0,05.
brant_result <- brant(model_po)
## ----------------------------------------------------
## Test for X2 df probability
## ----------------------------------------------------
## Omnibus 86.9 12 0
## Difficulty_Sleeping 11.49 3 0.01
## Hours_of_Sleep 6.76 3 0.08
## Wake_up_Night 14.17 3 0
## Stress_level 15.88 3 0
## ----------------------------------------------------
##
## H0: Parallel Regression Assumption holds
data.frame(
Variabel = c("Omnibus", "Difficulty Sleeping", "Hours of Sleep",
"Night Waking Frequency", "Stress Level"),
`Chi-square` = round(c(brant_result["Omnibus", "X2"],
brant_result["Difficulty_Sleeping", "X2"],
brant_result["Hours_of_Sleep", "X2"],
brant_result["Wake_up_Night", "X2"],
brant_result["Stress_level", "X2"]), 4),
`Derajat Bebas` = c(brant_result["Omnibus", "df"],
brant_result["Difficulty_Sleeping", "df"],
brant_result["Hours_of_Sleep", "df"],
brant_result["Wake_up_Night", "df"],
brant_result["Stress_level", "df"]),
`p-value` = round(c(brant_result["Omnibus", "probability"],
brant_result["Difficulty_Sleeping", "probability"],
brant_result["Hours_of_Sleep", "probability"],
brant_result["Wake_up_Night", "probability"],
brant_result["Stress_level", "probability"]), 4),
check.names = FALSE
) %>%
kable(caption = "Tabel 4. Hasil Uji Brant") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
) %>%
row_spec(1, bold = TRUE)
| Variabel | Chi-square | Derajat Bebas | p-value |
|---|---|---|---|
| Omnibus | 86.8952 | 12 | 0.0000 |
| Difficulty Sleeping | 11.4917 | 3 | 0.0093 |
| Hours of Sleep | 6.7622 | 3 | 0.0799 |
| Night Waking Frequency | 14.1681 | 3 | 0.0027 |
| Stress Level | 15.8801 | 3 | 0.0012 |
Hasil uji Brant omnibus menunjukkan χ² = 86,90 dengan p-value < 0,05, sehingga asumsi proportional odds dinyatakan tidak terpenuhi. Per variabel, hanya hours of sleep yang memenuhi asumsi (p = 0,08 > 0,05). Variabel difficulty sleeping, night waking frequency, dan stress level melanggar asumsi pada taraf signifikansi 5%.
Hipotesis:
Kriteria penolakan: Tolak H₀ jika |z| > z_{α/2} atau p-value < 0,05.
model_ppo <- VGAM::vglm(
Sleep_quality ~ Difficulty_Sleeping + Hours_of_Sleep +
Wake_up_Night + Stress_level,
family = cumulative(
parallel = FALSE ~ Difficulty_Sleeping + Wake_up_Night + Stress_level,
reverse = FALSE
),
data = data_sleep
)
ppo_coef <- coef(summary(model_ppo))
result_ppo <- as.data.frame(ppo_coef) %>%
tibble::rownames_to_column("Parameter") %>%
dplyr::rename(
Estimate = Estimate,
SE = `Std. Error`,
`z value` = `z value`,
`p-value` = `Pr(>|z|)`
) %>%
mutate(
OR = ifelse(!grepl("Intercept", Parameter), round(exp(Estimate), 4), NA),
`CI 2.5%` = ifelse(!grepl("Intercept", Parameter), round(exp(Estimate - 1.96 * SE), 4), NA),
`CI 97.5%` = ifelse(!grepl("Intercept", Parameter), round(exp(Estimate + 1.96 * SE), 4), NA),
across(c(Estimate, SE, `z value`, `p-value`), ~ round(.x, 4))
)
result_ppo %>%
kable(caption = "Tabel 5. Hasil Estimasi Partial Proportional Odds Model") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE
)
| Parameter | Estimate | SE | z value | p-value | OR | CI 2.5% | CI 97.5% |
|---|---|---|---|---|---|---|---|
| (Intercept):1 | -2.6730 | 0.5392 | -4.9570 | 0.0000 | NA | NA | NA |
| (Intercept):2 | -0.3143 | 0.4560 | -0.6892 | 0.4907 | NA | NA | NA |
| (Intercept):3 | 1.7263 | 0.4647 | 3.7150 | 0.0002 | NA | NA | NA |
| (Intercept):4 | 5.2490 | 0.6699 | 7.8353 | 0.0000 | NA | NA | NA |
| Difficulty_Sleeping:1 | 0.4642 | 0.1087 | 4.2717 | 0.0000 | 1.5908 | 1.2856 | 1.9684 |
| Difficulty_Sleeping:2 | 0.2208 | 0.0925 | 2.3866 | 0.0170 | 1.2471 | 1.0403 | 1.4950 |
| Difficulty_Sleeping:3 | 0.0767 | 0.0921 | 0.8326 | 0.4051 | 1.0797 | 0.9014 | 1.2933 |
| Difficulty_Sleeping:4 | 0.0453 | 0.1108 | 0.4087 | 0.6828 | 1.0463 | 0.8421 | 1.3000 |
| Hours_of_Sleep | 0.0274 | 0.0900 | 0.3045 | 0.7608 | 1.0278 | 0.8616 | 1.2260 |
| Wake_up_Night:1 | -0.2304 | 0.0996 | -2.3127 | 0.0207 | 0.7942 | 0.6534 | 0.9655 |
| Wake_up_Night:2 | -0.2900 | 0.0912 | -3.1811 | 0.0015 | 0.7482 | 0.6258 | 0.8946 |
| Wake_up_Night:3 | -0.4256 | 0.0927 | -4.5918 | 0.0000 | 0.6534 | 0.5448 | 0.7835 |
| Wake_up_Night:4 | -0.7724 | 0.1211 | -6.3776 | 0.0000 | 0.4619 | 0.3643 | 0.5856 |
| Stress_level:1 | 0.1832 | 0.1141 | 1.6046 | 0.1086 | 1.2010 | 0.9602 | 1.5021 |
| Stress_level:2 | 0.0872 | 0.1012 | 0.8621 | 0.3886 | 1.0911 | 0.8949 | 1.3305 |
| Stress_level:3 | -0.0733 | 0.1014 | -0.7228 | 0.4698 | 0.9293 | 0.7618 | 1.1337 |
| Stress_level:4 | -0.3278 | 0.1254 | -2.6132 | 0.0090 | 0.7205 | 0.5634 | 0.9213 |
Difficulty Sleeping
Night Waking Frequency
Stress Level
Hours of Sleep
data.frame(
Model = c("Proportional Odds Model", "Partial Proportional Odds Model"),
AIC = c(round(AIC(model_po), 3), round(AIC(model_ppo), 3))
) %>%
kable(caption = "Tabel 6. Perbandingan AIC") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Model | AIC |
|---|---|
| Proportional Odds Model | 3041.295 |
| Partial Proportional Odds Model | 2939.702 |
PPO Model memiliki AIC lebih kecil dibandingkan model awal, sehingga dipilih sebagai model terbaik.
Hipotesis:
Keputusan: Tolak H₀ jika p-value < 0,05.
model_null_vglm <- VGAM::vglm(
Sleep_quality ~ 1,
family = cumulative(parallel = TRUE, reverse = FALSE),
data = data_sleep
)
ll_null_ppo <- logLik(model_null_vglm)[1]
ll_penuh_ppo <- logLik(model_ppo)[1]
G2_ppo <- -2 * (ll_null_ppo - ll_penuh_ppo)
df_ppo <- df.residual(model_null_vglm) - df.residual(model_ppo)
p_ppo <- pchisq(G2_ppo, df = df_ppo, lower.tail = FALSE)
data.frame(
`Statistik G²` = round(G2_ppo, 4),
`Derajat Bebas` = round(df_ppo, 0),
`p-value` = round(p_ppo, 4),
check.names = FALSE
) %>%
kable(caption = "Tabel 7. Uji Rasio Likelihood — PPO Model") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Statistik G² | Derajat Bebas | p-value |
|---|---|---|
| 142.8136 | 13 | 0 |
G² = 142,81 dengan p-value < 0,05, sehingga H₀ ditolak. Model PPO secara keseluruhan signifikan dan minimal terdapat satu variabel prediktor yang berpengaruh nyata terhadap kualitas tidur.
result_ppo %>%
dplyr::select(Parameter, Estimate, OR, `CI 2.5%`, `CI 97.5%`, `p-value`) %>%
kable(caption = "Tabel 8. Ringkasan Odds Ratio dan Interval Kepercayaan PPO Model") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = TRUE
)
| Parameter | Estimate | OR | CI 2.5% | CI 97.5% | p-value |
|---|---|---|---|---|---|
| (Intercept):1 | -2.6730 | NA | NA | NA | 0.0000 |
| (Intercept):2 | -0.3143 | NA | NA | NA | 0.4907 |
| (Intercept):3 | 1.7263 | NA | NA | NA | 0.0002 |
| (Intercept):4 | 5.2490 | NA | NA | NA | 0.0000 |
| Difficulty_Sleeping:1 | 0.4642 | 1.5908 | 1.2856 | 1.9684 | 0.0000 |
| Difficulty_Sleeping:2 | 0.2208 | 1.2471 | 1.0403 | 1.4950 | 0.0170 |
| Difficulty_Sleeping:3 | 0.0767 | 1.0797 | 0.9014 | 1.2933 | 0.4051 |
| Difficulty_Sleeping:4 | 0.0453 | 1.0463 | 0.8421 | 1.3000 | 0.6828 |
| Hours_of_Sleep | 0.0274 | 1.0278 | 0.8616 | 1.2260 | 0.7608 |
| Wake_up_Night:1 | -0.2304 | 0.7942 | 0.6534 | 0.9655 | 0.0207 |
| Wake_up_Night:2 | -0.2900 | 0.7482 | 0.6258 | 0.8946 | 0.0015 |
| Wake_up_Night:3 | -0.4256 | 0.6534 | 0.5448 | 0.7835 | 0.0000 |
| Wake_up_Night:4 | -0.7724 | 0.4619 | 0.3643 | 0.5856 | 0.0000 |
| Stress_level:1 | 0.1832 | 1.2010 | 0.9602 | 1.5021 | 0.1086 |
| Stress_level:2 | 0.0872 | 1.0911 | 0.8949 | 1.3305 | 0.3886 |
| Stress_level:3 | -0.0733 | 0.9293 | 0.7618 | 1.1337 | 0.4698 |
| Stress_level:4 | -0.3278 | 0.7205 | 0.5634 | 0.9213 | 0.0090 |
Difficulty Sleeping
Nilai OR sebesar 1,5908 pada batas Very poor|Poor dan 1,2471 pada batas Poor|Average menunjukkan bahwa setiap kenaikan satu kategori frekuensi kesulitan tidur meningkatkan odds responden berada pada kategori kualitas tidur yang lebih rendah masing-masing sebesar 59,08% dan 24,71%, dengan asumsi variabel lain konstan. Pada batas Average|Good dan Good|Very good, variabel ini tidak berpengaruh signifikan.
Night Waking Frequency
Nilai OR yang kurang dari 1 pada seluruh batas kategori (0,7942; 0,7482; 0,6534; 0,4619) menunjukkan bahwa setiap kenaikan satu kategori frekuensi terbangun di malam hari menurunkan odds responden berada pada kategori kualitas tidur yang lebih rendah. Namun, arah hasil ini perlu diinterpretasikan secara hati-hati karena tidak sepenuhnya sejalan dengan teori umum.
Stress Level
Nilai OR sebesar 0,7205 pada batas Good|Very good menunjukkan bahwa setiap kenaikan satu kategori tingkat stres menurunkan odds responden berada pada kategori kualitas tidur yang lebih rendah sebesar 27,95%, dengan asumsi variabel lain konstan. Namun, hasil ini perlu diinterpretasikan secara hati-hati. Pada batas kategori lainnya, variabel ini tidak berpengaruh signifikan.
Hours of Sleep
OR = 1,0278 (p = 0,761) → tidak signifikan pada seluruh batas kategori, tidak diinterpretasikan lebih lanjut.
pred_prob <- predict(model_ppo, type = "response")
pred_class <- apply(pred_prob, 1, function(x) {
levels(data_sleep$Sleep_quality)[which.max(x)]
})
pred_class <- ordered(pred_class,
levels = c("Very poor", "Poor", "Average", "Good", "Very good"))
conf <- table(Aktual = data_sleep$Sleep_quality, Prediksi = pred_class)
conf %>%
kable(caption = "Tabel 9. Confusion Matrix Hasil Prediksi PPO Model") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE
)
| Very poor | Poor | Average | Good | Very good | |
|---|---|---|---|---|---|
| Very poor | 142 | 4 | 0 | 52 | 92 |
| Poor | 68 | 15 | 0 | 26 | 57 |
| Average | 29 | 3 | 0 | 34 | 9 |
| Good | 99 | 8 | 1 | 40 | 66 |
| Very good | 80 | 2 | 0 | 25 | 144 |
accuracy <- sum(diag(conf)) / sum(conf)
cat(sprintf("Akurasi model: %.2f%%\n", accuracy * 100))
## Akurasi model: 34.24%
Akurasi prediksi model sebesar 34,24% tergolong rendah, kemungkinan disebabkan oleh ketidakseimbangan distribusi variabel respon, terutama kategori Average yang hanya mewakili 7,5% dari total observasi.
[1] Lisiswanti, R., Rodiani, Saputra, O., Sari M., & Zafirah, N. (2019). Hubungan Antara Kualitas Tidur Terhadap Hasil Belajar Mahasiswa Program Studi Pendidikan Dokter Fakultas Kedokteran Universitas Lampung. J Agromedicine, 6(1).
[2] Tristianingsih, J., & Handayani, S. (2021). Determinan Kualitas Tidur Mahasiswa Kampus A di Universitas Muhammadiyah Prof DR Hamka. Perilaku dan Promosi Kesehatan: Indonesian Journal of Health Promotion and Behavior, 3(2). https://doi.org/10.47034/ppk.v3i2.5275
[3] The relationship between sleep quality, stress, and academic performance. Journal of Family and Community Medicine, 27(1). https://journals.lww.com/jfcm/fulltext/2020/27010/the_relationship_between_sleep_quality,_stress,.4.aspx
[4] Kasingku, J. D., & Lotulung, M. S. D. (2024). Memahami Hubungan Kualitas Tidur terhadap Keberhasilan Belajar Siswa. Jurnal Pendidikan dan Pembelajaran Indonesia (JPPI), 4(3), 1038–1050. https://doi.org/10.53299/jppi.v4i3.703