Data yang digunakan dalam penelitian ini merupakan data sekunder yang diperoleh dari General Social Survey (GSS) tahun 2024. GSS merupakan survei sosial yang memuat informasi mengenai karakteristik demografis, sosial, politik, keagamaan, serta sikap responden terhadap berbagai isu sosial.
Variabel respons dalam penelitian ini adalah spanking,
yaitu sikap responden terhadap penggunaan hukuman fisik terhadap anak
sebagai bentuk disiplin.
Variabel prediktor yang digunakan meliputi sex,
age, degree, childs,
polviews, dan attend. Pemilihan variabel
tersebut didasarkan pada latar belakang yang telah dijelaskan
sebelumnya, yaitu bahwa sikap terhadap spanking dapat
berkaitan dengan karakteristik demografis, pendidikan, pengalaman
memiliki anak, pandangan politik, dan aspek keagamaan responden.
| Variabel | Peran | Keterangan | Skala Data | Kategori/Kode |
|---|---|---|---|---|
spanking |
Respons | Sikap responden terhadap penggunaan hukuman fisik terhadap anak | Ordinal | 1 = Strongly agree 2 = Agree 3 = Disagree 4 = Strongly disagree |
sex |
Prediktor | Jenis kelamin responden | Nominal | 1 = Male 2 = Female |
age |
Prediktor | Usia responden | Rasio | Usia responden dalam tahun |
degree |
Prediktor | Tingkat pendidikan terakhir responden | Ordinal | 0 = Less than high school 1 = High school 2 = Junior college 3 = Bachelor 4 = Graduate |
childs |
Prediktor | Jumlah anak yang pernah dimiliki responden | Rasio/Diskrit | 0 = No children 1 = One child 2 = Two children 3 = Three children 4 = Four children 5 = Five children 6 = Six children 7 = Seven children 8 = Eight or more children |
polviews |
Prediktor | Pandangan politik responden | Ordinal | 1 = Extremely liberal 2 = Liberal 3 = Slightly liberal 4 = Moderate 5 = Slightly conservative 6 = Conservative 7 = Extremely conservative |
attend |
Prediktor | Frekuensi kehadiran responden dalam kegiatan keagamaan | Ordinal | 0 = Never 1 = Less than once a year 2 = Once a year 3 = Several times a year 4 = Once a month 5 = 2–3 times a month 6 = Nearly every week 7 = Every week 8 = Several times a week |
Pengolahan awal data dilakukan dengan mengimpor data, memilih
variabel yang digunakan dalam analisis, serta menghapus observasi yang
tidak memuat jawaban substantif. Observasi tersebut mencakup sel kosong
yang terbaca sebagai NA pada proses impor data serta kode
cadangan GSS yang diawali tanda titik, seperti .d=don’t
know, .i=inapplicable, .n=no
answer, dan .s=skipped on web.
data_clean <- readxl::read_excel(
"data spanking.xlsx",
sheet = "Data"
) %>%
dplyr::select(
spanking, childs, sex, polviews, attend, age, degree
) %>%
dplyr::filter(
dplyr::if_all(
dplyr::everything(),
~ !is.na(.x) & !grepl("^\\.", as.character(.x))
)
)
glimpse(data_clean)## Rows: 1,965
## Columns: 7
## $ spanking <chr> "AGREE", "DISAGREE", "STRONGLY DISAGREE", "AGREE", "AGREE", "…
## $ childs <chr> "2", "0", "6", "0", "0", "1", "1", "3", "1", "1", "2", "2", "…
## $ sex <chr> "MALE", "MALE", "FEMALE", "MALE", "FEMALE", "FEMALE", "FEMALE…
## $ polviews <chr> "Moderate, middle of the road", "Slightly liberal", "Liberal"…
## $ attend <chr> "Every week", "Never", "Never", "Less than once a year", "Nev…
## $ age <chr> "33", "64", "48", "25", "23", "68", "37", "63", "31", "63", "…
## $ degree <chr> "Bachelor's", "Graduate", "High school", "High school", "Bach…
Setelah dilakukan pemilihan variabel dan penghapusan observasi yang tidak memuat jawaban substantif, diperoleh sebanyak 1.965 observasi yang siap digunakan dalam analisis.
Selanjutnya, dilakukan penyesuaian tipe data dan pengkodean ulang
variabel. Variabel spanking dibentuk sebagai variabel
ordinal dengan urutan kategori dari tingkat ketidaksetujuan paling
tinggi hingga tingkat persetujuan paling tinggi. Dengan demikian,
kategori yang lebih tinggi menunjukkan sikap yang semakin setuju
terhadap penggunaan spanking.
Variabel sex diperlakukan sebagai variabel nominal,
sedangkan age dan childs diperlakukan sebagai
variabel numerik. Variabel degree, polviews,
dan attend dikodekan sebagai skor ordinal karena
masing-masing memiliki urutan kategori yang jelas.
data <- data_clean %>%
dplyr::mutate(
# Variabel respons ordinal
# Semakin tinggi kategori = semakin setuju terhadap spanking
spanking = ordered(
spanking,
levels = c(
"STRONGLY DISAGREE",
"DISAGREE",
"AGREE",
"STRONGLY AGREE"
)
),
# Variabel jumlah anak
childs = readr::parse_number(as.character(childs)),
# Variabel jenis kelamin
sex = factor(
sex,
levels = c("MALE", "FEMALE")
),
# Variabel usia
# Kategori "89 or older" dibaca sebagai 89
age = readr::parse_number(as.character(age)),
# Variabel tingkat pendidikan
# Semakin tinggi skor = semakin tinggi pendidikan
degree = ordered(
degree,
levels = c(
"Less than high school",
"High school",
"Associate/junior college",
"Bachelor's",
"Graduate"
)
),
degree = as.numeric(degree) - 1,
# Variabel pandangan politik
# Semakin tinggi skor = semakin konservatif
polviews = dplyr::case_when(
polviews == "Extremely liberal" ~ 1,
polviews == "Liberal" ~ 2,
polviews == "Slightly liberal" ~ 3,
polviews == "Moderate, middle of the road" ~ 4,
polviews == "Slightly conservative" ~ 5,
polviews == "Conservative" ~ 6,
polviews == "Extremely conservative" ~ 7,
TRUE ~ NA_real_
),
# Variabel kehadiran dalam kegiatan keagamaan
# Semakin tinggi skor = semakin sering hadir
attend = dplyr::case_when(
attend == "Never" ~ 0,
attend == "Less than once a year" ~ 1,
attend == "About once or twice a year" ~ 2,
attend == "Several times a year" ~ 3,
attend == "About once a month" ~ 4,
attend == "2-3 times a month" ~ 5,
attend == "Nearly every week" ~ 6,
attend == "Every week" ~ 7,
attend == "Several times a week" ~ 8,
TRUE ~ NA_real_
)
) %>%
tidyr::drop_na(
spanking,
childs,
sex,
age,
degree,
polviews,
attend
)
glimpse(data)## Rows: 1,965
## Columns: 7
## $ spanking <ord> AGREE, DISAGREE, STRONGLY DISAGREE, AGREE, AGREE, STRONGLY DI…
## $ childs <dbl> 2, 0, 6, 0, 0, 1, 1, 3, 1, 1, 2, 2, 2, 1, 2, 2, 0, 1, 3, 0, 2…
## $ sex <fct> MALE, MALE, FEMALE, MALE, FEMALE, FEMALE, FEMALE, FEMALE, FEM…
## $ polviews <dbl> 4, 3, 2, 4, 2, 1, 1, 4, 3, 5, 4, 4, 2, 6, 4, 4, 1, 6, 7, 5, 4…
## $ attend <dbl> 7, 0, 0, 1, 0, 0, 0, 7, 2, 2, 1, 8, 5, 3, 5, 5, 0, 7, 3, 0, 5…
## $ age <dbl> 33, 64, 48, 25, 23, 68, 37, 63, 31, 63, 41, 75, 51, 48, 58, 5…
## $ degree <dbl> 3, 4, 1, 1, 3, 0, 1, 1, 4, 0, 0, 1, 3, 0, 1, 4, 1, 3, 3, 1, 4…
Analisis awal dilakukan dengan melihat distribusi variabel respons,
yaitu spanking. Pemeriksaan ini dilakukan untuk mengetahui
sebaran responden pada setiap kategori sikap terhadap penggunaan hukuman
fisik terhadap anak.
distribusi_spanking <- data %>%
dplyr::count(spanking, name = "Frekuensi") %>%
dplyr::mutate(
Proporsi = round(Frekuensi / sum(Frekuensi), 3)
) %>%
dplyr::rename(
`Kategori Spanking` = spanking
)
knitr::kable(distribusi_spanking)| Kategori Spanking | Frekuensi | Proporsi |
|---|---|---|
| STRONGLY DISAGREE | 331 | 0.168 |
| DISAGREE | 558 | 0.284 |
| AGREE | 740 | 0.377 |
| STRONGLY AGREE | 336 | 0.171 |
distribusi_spanking <- data %>%
dplyr::count(spanking, name = "Frekuensi") %>%
dplyr::mutate(
Proporsi = round(Frekuensi / sum(Frekuensi), 3),
Persentase = round(Frekuensi / sum(Frekuensi) * 100, 2)
) %>%
dplyr::rename(
`Kategori Spanking` = spanking
)
distribusi_spanking %>%
dplyr::select(`Kategori Spanking`, Frekuensi, Proporsi) %>%
knitr::kable()| Kategori Spanking | Frekuensi | Proporsi |
|---|---|---|
| STRONGLY DISAGREE | 331 | 0.168 |
| DISAGREE | 558 | 0.284 |
| AGREE | 740 | 0.377 |
| STRONGLY AGREE | 336 | 0.171 |
distribusi_spanking %>%
ggplot2::ggplot(
ggplot2::aes(
x = `Kategori Spanking`,
y = Persentase,
fill = `Kategori Spanking`
)
) +
ggplot2::geom_col(width = 0.7) +
ggplot2::geom_text(
ggplot2::aes(label = paste0(Persentase, "%")),
vjust = -0.4,
size = 4
) +
ggplot2::scale_fill_manual(
values = c(
"STRONGLY DISAGREE" = "#FFF4E0",
"DISAGREE" = "#E6C8A8",
"AGREE" = "#C18553",
"STRONGLY AGREE" = "#8B5E34"
)
) +
ggplot2::labs(
title = "Distribusi Variabel Respons Spanking",
x = "Kategori Spanking",
y = "Persentase (%)",
fill = "Kategori"
) +
ggplot2::theme_minimal() +
ggplot2::theme(
plot.title = ggplot2::element_text(face = "bold"),
axis.text.x = ggplot2::element_text(angle = 20, hjust = 1),
legend.position = "none"
)Berdasarkan tabel dan barplot, respons pada variabel
spanking tersebar pada seluruh kategori. Hal ini
menunjukkan bahwa setiap tingkat sikap masih terwakili, sehingga
variabel spanking layak digunakan sebagai respons ordinal
dalam pemodelan analisis regresi logistik ordinal.
Model awal yang digunakan dalam analisis ini adalah regresi logistik
ordinal dengan pendekatan proportional odds. Model ini
digunakan karena variabel respons spanking memiliki
kategori yang berurutan. Prediktor yang digunakan dalam model meliputi
sex, age, degree,
childs, polviews, dan attend.
model_ordinal <- MASS::polr(
spanking ~ sex + age + degree + childs + polviews + attend,
data = data,
method = "logistic",
Hess = TRUE
)
summary(model_ordinal)## Call:
## MASS::polr(formula = spanking ~ sex + age + degree + childs +
## polviews + attend, data = data, Hess = TRUE, method = "logistic")
##
## Coefficients:
## Value Std. Error t value
## sexFEMALE -0.469266 0.08478 -5.5352
## age -0.006149 0.00246 -2.4996
## degree -0.260085 0.03405 -7.6391
## childs 0.020701 0.02727 0.7591
## polviews 0.403869 0.03022 13.3630
## attend 0.040525 0.01614 2.5104
##
## Intercepts:
## Value Std. Error t value
## STRONGLY DISAGREE|DISAGREE -1.0508 0.1827 -5.7504
## DISAGREE|AGREE 0.5529 0.1815 3.0463
## AGREE|STRONGLY AGREE 2.5326 0.1902 13.3191
##
## Residual Deviance: 4868.27
## AIC: 4886.27
tabel_model_ordinal <- coef(summary(model_ordinal)) %>%
as.data.frame() %>%
tibble::rownames_to_column("Parameter") %>%
dplyr::mutate(
`p-value` = 2 * pnorm(abs(`t value`), lower.tail = FALSE)
)
knitr::kable(
tabel_model_ordinal,
digits = 4,
caption = "Hasil Estimasi Model Regresi Logistik Ordinal Proportional Odds"
)| Parameter | Value | Std. Error | t value | p-value |
|---|---|---|---|---|
| sexFEMALE | -0.4693 | 0.0848 | -5.5352 | 0.0000 |
| age | -0.0061 | 0.0025 | -2.4996 | 0.0124 |
| degree | -0.2601 | 0.0340 | -7.6391 | 0.0000 |
| childs | 0.0207 | 0.0273 | 0.7591 | 0.4478 |
| polviews | 0.4039 | 0.0302 | 13.3630 | 0.0000 |
| attend | 0.0405 | 0.0161 | 2.5104 | 0.0121 |
| STRONGLY DISAGREE|DISAGREE | -1.0508 | 0.1827 | -5.7504 | 0.0000 |
| DISAGREE|AGREE | 0.5529 | 0.1815 | 3.0463 | 0.0023 |
| AGREE|STRONGLY AGREE | 2.5326 | 0.1902 | 13.3191 | 0.0000 |
##
## STRONGLY DISAGREE DISAGREE AGREE STRONGLY AGREE
## 331 558 740 336
##
## 0 1 2 3 4 5 6 7 8
## 625 281 517 279 153 57 29 9 15
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.0 36.0 50.0 50.4 65.0 89.0
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.000 1.000 1.898 3.000 4.000
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 4.000 4.097 5.000 7.000
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 2.000 2.873 6.000 8.000
Model tersebut menjadi model awal sebelum dilakukan pemeriksaan asumsi proportional odds. Pemeriksaan asumsi diperlukan untuk memastikan apakah pengaruh setiap variabel prediktor dapat dianggap sama pada seluruh batas kategori respons.
Asumsi utama pada model regresi logistik ordinal dengan pendekatan
proportional odds adalah bahwa pengaruh setiap variabel
prediktor bersifat konstan pada seluruh batas kategori respons. Dengan
kata lain, koefisien prediktor diasumsikan sama untuk setiap pemisahan
kategori ordinal pada variabel spanking.
Pemeriksaan asumsi ini dilakukan menggunakan Brant test. Hipotesis yang digunakan adalah sebagai berikut.
Kriteria pengambilan keputusan didasarkan pada nilai p-value. Jika p-value lebih kecil dari 0,05, maka asumsi proportional odds tidak terpenuhi. Sebaliknya, jika p-value lebih besar dari 0,05, maka asumsi proportional odds dapat dianggap terpenuhi.
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 22.56 12 0.03
## sexFEMALE 1.43 2 0.49
## age 3.93 2 0.14
## degree 2.91 2 0.23
## childs 0.38 2 0.83
## polviews 4.4 2 0.11
## attend 2.24 2 0.33
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
brant_table <- brant_result %>%
as.data.frame() %>%
tibble::rownames_to_column("Variabel")
names(brant_table) <- c("Variabel", "Chi-square", "Derajat Bebas", "p-value")
knitr::kable(
brant_table,
digits = 3,
caption = "Hasil Brant Test untuk Pemeriksaan Asumsi Proportional Odds"
)| Variabel | Chi-square | Derajat Bebas | p-value |
|---|---|---|---|
| Omnibus | 22.564 | 12 | 0.032 |
| sexFEMALE | 1.433 | 2 | 0.488 |
| age | 3.926 | 2 | 0.140 |
| degree | 2.913 | 2 | 0.233 |
| childs | 0.376 | 2 | 0.829 |
| polviews | 4.398 | 2 | 0.111 |
| attend | 2.236 | 2 | 0.327 |
Berdasarkan hasil Brant test, nilai p-value pada uji omnibus sebesar 0,032 < 0,05. Hal ini menunjukkan bahwa asumsi proportional odds tidak terpenuhi secara keseluruhan pada model awal. Namun, jika dilihat secara parsial, seluruh variabel prediktor memiliki p-value > 0,05, sehingga tidak terdapat satu variabel tertentu yang secara jelas menjadi sumber pelanggaran asumsi. Oleh karena itu, model proportional odds belum langsung digunakan sebagai model akhir dan analisis dilanjutkan dengan model yang lebih fleksibel, yaitu partial proportional odds model.
Selain menggunakan Brant test, pemeriksaan asumsi proportional odds
juga dilakukan dengan pendekatan cumulative link model melalui paket
ordinal. Pemeriksaan ini bertujuan untuk melihat apakah
terdapat prediktor yang menunjukkan indikasi efek tidak paralel terhadap
batas kategori respons. Hasil pemeriksaan ini digunakan sebagai
pertimbangan sebelum membentuk model alternatif, yaitu partial
proportional odds model.
model_clm <- ordinal::clm(
spanking ~ sex + age + degree + childs + polviews + attend,
data = data,
link = "logit"
)
nominal_result <- ordinal::nominal_test(model_clm)
nominal_table <- nominal_result %>%
as.data.frame() %>%
tibble::rownames_to_column("Prediktor") %>%
dplyr::rename(
`Derajat Bebas` = Df,
`Log-Likelihood` = logLik,
`AIC` = AIC,
`Likelihood Ratio` = LRT,
`p-value` = `Pr(>Chi)`
)
knitr::kable(
nominal_table,
digits = 3,
caption = "Hasil Pemeriksaan Efek Nominal dengan Paket ordinal"
)| Prediktor | Derajat Bebas | Log-Likelihood | AIC | Likelihood Ratio | p-value |
|---|---|---|---|---|---|
| NA | -2434.135 | 4886.270 | NA | NA | |
| sex | 2 | -2433.126 | 4888.252 | 2.018 | 0.365 |
| age | 2 | -2430.158 | 4882.317 | 7.953 | 0.019 |
| degree | 2 | -2433.307 | 4888.614 | 1.656 | 0.437 |
| childs | 2 | -2432.748 | 4887.497 | 2.773 | 0.250 |
| polviews | 2 | -2429.685 | 4881.370 | 8.900 | 0.012 |
| attend | 2 | -2432.056 | 4886.113 | 4.157 | 0.125 |
Berdasarkan hasil pemeriksaan efek nominal dengan paket
ordinal, variabel age dan
polviews memiliki nilai p-value < 0,05, yaitu
masing-masing sebesar 0,019 dan 0,012. Hal ini menunjukkan bahwa kedua
variabel tersebut mengindikasikan efek yang tidak sepenuhnya paralel
terhadap batas kategori respons. Sementara itu, variabel
sex, degree, childs, dan
attend memiliki nilai p-value > 0,05, sehingga
tidak menunjukkan indikasi pelanggaran asumsi proportional odds secara
parsial. Dengan demikian, model yang lebih fleksibel, yaitu
partial proportional odds model, dipertimbangkan dengan
memberi perlakuan non-paralel pada variabel age dan
polviews.
Berdasarkan pemeriksaan asumsi sebelumnya, variabel age
dan polviews menunjukkan indikasi efek yang tidak
sepenuhnya paralel. Oleh karena itu, dibentuk model partial
proportional odds dengan memberikan efek tidak paralel pada
variabel age dan polviews, sedangkan variabel
lainnya tetap diperlakukan sebagai efek proportional odds.
model_ppo <- ordinal::clm(
spanking ~ sex + age + degree + childs + polviews + attend,
nominal = ~ age + polviews,
data = data,
link = "logit"
)
summary(model_ppo)## formula: spanking ~ sex + age + degree + childs + polviews + attend
## nominal: ~age + polviews
## data: data
##
## link threshold nobs logLik AIC niter max.grad cond.H
## logit flexible 1965 -2426.83 4879.65 5(0) 2.67e-07 2.0e+05
##
## Coefficients: (2 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## sexFEMALE -0.47358 0.08505 -5.568 2.57e-08 ***
## age NA NA NA NA
## degree -0.25708 0.03417 -7.523 5.33e-14 ***
## childs 0.01950 0.02738 0.712 0.4764
## polviews NA NA NA NA
## attend 0.04070 0.01621 2.510 0.0121 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Threshold coefficients:
## Estimate Std. Error z value
## STRONGLY DISAGREE|DISAGREE.(Intercept) -0.586689 0.244433 -2.400
## DISAGREE|AGREE.(Intercept) 0.655672 0.201564 3.253
## AGREE|STRONGLY AGREE.(Intercept) 1.858636 0.259806 7.154
## STRONGLY DISAGREE|DISAGREE.age 0.001269 0.003636 0.349
## DISAGREE|AGREE.age 0.004922 0.002801 1.757
## AGREE|STRONGLY AGREE.age 0.011976 0.003608 3.319
## STRONGLY DISAGREE|DISAGREE.polviews -0.469711 0.045233 -10.384
## DISAGREE|AGREE.polviews -0.417720 0.034998 -11.936
## AGREE|STRONGLY AGREE.polviews -0.322926 0.044392 -7.274
tabel_ppo <- coef(summary(model_ppo)) %>%
as.data.frame() %>%
tibble::rownames_to_column("Parameter")
knitr::kable(
tabel_ppo,
digits = 4,
caption = "Hasil Estimasi Model Partial Proportional Odds"
)| Parameter | Estimate | Std. Error | z value | Pr(>|z|) |
|---|---|---|---|---|
| STRONGLY DISAGREE|DISAGREE.(Intercept) | -0.5867 | 0.2444 | -2.4002 | 0.0164 |
| DISAGREE|AGREE.(Intercept) | 0.6557 | 0.2016 | 3.2529 | 0.0011 |
| AGREE|STRONGLY AGREE.(Intercept) | 1.8586 | 0.2598 | 7.1539 | 0.0000 |
| STRONGLY DISAGREE|DISAGREE.age | 0.0013 | 0.0036 | 0.3488 | 0.7272 |
| DISAGREE|AGREE.age | 0.0049 | 0.0028 | 1.7572 | 0.0789 |
| AGREE|STRONGLY AGREE.age | 0.0120 | 0.0036 | 3.3194 | 0.0009 |
| STRONGLY DISAGREE|DISAGREE.polviews | -0.4697 | 0.0452 | -10.3841 | 0.0000 |
| DISAGREE|AGREE.polviews | -0.4177 | 0.0350 | -11.9355 | 0.0000 |
| AGREE|STRONGLY AGREE.polviews | -0.3229 | 0.0444 | -7.2744 | 0.0000 |
| sexFEMALE | -0.4736 | 0.0850 | -5.5683 | 0.0000 |
| age | NA | NA | NA | NA |
| degree | -0.2571 | 0.0342 | -7.5235 | 0.0000 |
| childs | 0.0195 | 0.0274 | 0.7122 | 0.4764 |
| polviews | NA | NA | NA | NA |
| attend | 0.0407 | 0.0162 | 2.5102 | 0.0121 |
Model partial proportional odds memungkinkan variabel
age dan polviews memiliki pengaruh yang
berbeda pada setiap batas kategori respons. Dengan demikian, model ini
lebih fleksibel dibandingkan model proportional odds penuh.
Perbandingan model dilakukan untuk melihat apakah model
partial proportional odds memberikan kecocokan yang
lebih baik dibandingkan model proportional odds. Agar
perbandingan konsisten, kedua model yang dibandingkan dibentuk
menggunakan fungsi clm() dari package
ordinal.
Model dibandingkan berdasarkan nilai log-likelihood, jumlah parameter, dan AIC. Model dengan nilai AIC yang lebih kecil menunjukkan kecocokan yang lebih baik terhadap data.
perbandingan_model <- tibble::tibble(
Model = c(
"Proportional Odds",
"Partial Proportional Odds"
),
`Log-Likelihood` = c(
as.numeric(logLik(model_clm)),
as.numeric(logLik(model_ppo))
),
`Jumlah Parameter` = c(
attr(logLik(model_clm), "df"),
attr(logLik(model_ppo), "df")
),
AIC = c(
AIC(model_clm),
AIC(model_ppo)
)
)
knitr::kable(
perbandingan_model,
digits = 3,
caption = "Perbandingan Model Berdasarkan Log-Likelihood dan AIC"
)| Model | Log-Likelihood | Jumlah Parameter | AIC |
|---|---|---|---|
| Proportional Odds | -2434.135 | 9 | 4886.270 |
| Partial Proportional Odds | -2426.827 | 13 | 4879.655 |
Selain AIC, perbandingan juga dilakukan menggunakan likelihood ratio test karena model partial proportional odds merupakan perluasan dari model proportional odds.
uji_perbandingan <- anova(model_clm, model_ppo)
uji_perbandingan_tabel <- as.data.frame(uji_perbandingan) %>%
tibble::rownames_to_column("Model")
knitr::kable(
uji_perbandingan_tabel,
digits = 3,
caption = "Uji Likelihood Ratio antara Model Proportional Odds dan Partial Proportional Odds"
)| Model | no.par | AIC | logLik | LR.stat | df | Pr(>Chisq) |
|---|---|---|---|---|---|---|
| model_clm | 9 | 4886.270 | -2434.135 | NA | NA | NA |
| model_ppo | 13 | 4879.655 | -2426.827 | 14.615 | 4 | 0.006 |
Berdasarkan hasil perbandingan model, model partial proportional odds memiliki nilai AIC sebesar 4879,655, lebih kecil dibandingkan model proportional odds dengan AIC sebesar 4886,270. Selain itu, hasil uji likelihood ratio menunjukkan nilai p-value sebesar 0,006 < 0,05, sehingga terdapat peningkatan kecocokan model yang signifikan setelah memasukkan efek non-paralel pada variabel tertentu. Dengan demikian, model partial proportional odds dipilih sebagai model yang lebih sesuai untuk data ini.
Pemeriksaan multikolinearitas dilakukan untuk melihat apakah terdapat hubungan yang terlalu kuat antarvariabel prediktor. Pemeriksaan dilakukan menggunakan nilai VIF. Nilai VIF yang relatif kecil menunjukkan bahwa tidak terdapat indikasi multikolinearitas yang serius.
model_vif <- lm(
as.numeric(spanking) ~ sex + age + degree + childs + polviews + attend,
data = data
)
vif_result <- car::vif(model_vif)
vif_table <- data.frame(
Variabel = names(vif_result),
VIF = as.numeric(vif_result)
)
knitr::kable(
vif_table,
digits = 3,
caption = "Hasil Pemeriksaan Multikolinearitas"
)| Variabel | VIF |
|---|---|
| sex | 1.026 |
| age | 1.123 |
| degree | 1.047 |
| childs | 1.182 |
| polviews | 1.150 |
| attend | 1.156 |
Selanjutnya, pemeriksaan kesesuaian model dilakukan pada model akhir, yaitu model partial proportional odds. Pemeriksaan ini dilakukan menggunakan beberapa uji goodness of fit untuk model ordinal.
gof_lipsitz <- gofcat::lipsitz(model_ppo)
gof_hl <- gofcat::hosmerlem(model_ppo, group = 10)
gof_pr_chisq <- gofcat::pulkroben(model_ppo, test = "chisq")
gof_pr_deviance <- gofcat::pulkroben(model_ppo, test = "deviance")
gof_table <- tibble::tibble(
`Uji Goodness of Fit` = c(
"Lipsitz",
"Hosmer-Lemeshow Ordinal",
"Pulkstenis-Robinson Chi-square",
"Pulkstenis-Robinson Deviance"
),
Statistik = c(
gof_lipsitz$LR,
gof_hl$chi.sq,
gof_pr_chisq$stat,
gof_pr_deviance$stat
),
`Derajat Bebas` = c(
gof_lipsitz$df,
gof_hl$df,
gof_pr_chisq$df,
gof_pr_deviance$df
),
`p-value` = c(
gof_lipsitz$p.value,
gof_hl$p.value,
gof_pr_chisq$p.value,
gof_pr_deviance$p.value
)
)
knitr::kable(
gof_table,
digits = 3,
caption = "Hasil Uji Goodness of Fit Model Akhir"
)| Uji Goodness of Fit | Statistik | Derajat Bebas | p-value |
|---|---|---|---|
| Lipsitz | 11.423 | 9 | 0.248 |
| Hosmer-Lemeshow Ordinal | 31.636 | 26 | 0.205 |
| Pulkstenis-Robinson Chi-square | 17.038 | 7 | 0.017 |
| Pulkstenis-Robinson Deviance | 16.901 | 7 | 0.018 |
tabel_or <- coef(summary(model_ppo)) %>%
as.data.frame() %>%
tibble::rownames_to_column("Parameter") %>%
dplyr::mutate(
`Odds Ratio` = exp(Estimate)
)
knitr::kable(
tabel_or,
digits = 4,
caption = "Koefisien dan Odds Ratio Model Partial Proportional Odds"
)| Parameter | Estimate | Std. Error | z value | Pr(>|z|) | Odds Ratio |
|---|---|---|---|---|---|
| STRONGLY DISAGREE|DISAGREE.(Intercept) | -0.5867 | 0.2444 | -2.4002 | 0.0164 | 0.5562 |
| DISAGREE|AGREE.(Intercept) | 0.6557 | 0.2016 | 3.2529 | 0.0011 | 1.9264 |
| AGREE|STRONGLY AGREE.(Intercept) | 1.8586 | 0.2598 | 7.1539 | 0.0000 | 6.4150 |
| STRONGLY DISAGREE|DISAGREE.age | 0.0013 | 0.0036 | 0.3488 | 0.7272 | 1.0013 |
| DISAGREE|AGREE.age | 0.0049 | 0.0028 | 1.7572 | 0.0789 | 1.0049 |
| AGREE|STRONGLY AGREE.age | 0.0120 | 0.0036 | 3.3194 | 0.0009 | 1.0120 |
| STRONGLY DISAGREE|DISAGREE.polviews | -0.4697 | 0.0452 | -10.3841 | 0.0000 | 0.6252 |
| DISAGREE|AGREE.polviews | -0.4177 | 0.0350 | -11.9355 | 0.0000 | 0.6585 |
| AGREE|STRONGLY AGREE.polviews | -0.3229 | 0.0444 | -7.2744 | 0.0000 | 0.7240 |
| sexFEMALE | -0.4736 | 0.0850 | -5.5683 | 0.0000 | 0.6228 |
| age | NA | NA | NA | NA | NA |
| degree | -0.2571 | 0.0342 | -7.5235 | 0.0000 | 0.7733 |
| childs | 0.0195 | 0.0274 | 0.7122 | 0.4764 | 1.0197 |
| polviews | NA | NA | NA | NA | NA |
| attend | 0.0407 | 0.0162 | 2.5102 | 0.0121 | 1.0415 |
Interpretasi model dilakukan dengan memperhatikan bahwa kategori
respons spanking telah diurutkan dari
STRONGLY DISAGREE hingga STRONGLY AGREE,
sehingga kategori respons yang lebih tinggi menunjukkan sikap yang
semakin setuju terhadap spanking. Parameter intercept tidak
diinterpretasikan sebagai pengaruh variabel, karena hanya berperan
sebagai batas antar kategori respons.
Variabel sexFEMALE memiliki koefisien sebesar -0,4736
dengan OR sebesar 0,6228 dan p-value < 0,05. Hal ini
menunjukkan bahwa responden perempuan memiliki odds berada pada kategori
respons yang lebih tinggi sebesar 0,6228 kali dibandingkan responden
laki-laki, atau menurun sebesar 37,72%, dengan asumsi variabel lain
konstan.
Variabel degree memiliki koefisien sebesar -0,2571
dengan OR sebesar 0,7733 dan p-value < 0,05. Hal ini
menunjukkan bahwa setiap kenaikan satu tingkat pendidikan menurunkan
odds berada pada kategori respons yang lebih tinggi sebesar 22,67%,
dengan asumsi variabel lain konstan.
Variabel childs memiliki koefisien sebesar 0,0195 dengan
OR sebesar 1,0197, tetapi p-value sebesar 0,4764 > 0,05.
Dengan demikian, jumlah anak tidak menunjukkan pengaruh yang signifikan
terhadap odds berada pada kategori respons yang lebih tinggi.
Variabel attend memiliki koefisien sebesar 0,0407 dengan
OR sebesar 1,0415 dan p-value < 0,05. Hal ini menunjukkan
bahwa setiap kenaikan satu unit frekuensi kehadiran dalam kegiatan
keagamaan meningkatkan odds berada pada kategori respons yang lebih
tinggi sebesar 4,15%, dengan asumsi variabel lain konstan.
Pada model partial proportional odds, variabel age dan
polviews memiliki efek non-paralel, sehingga
interpretasinya dilakukan pada setiap batas kategori respons. Untuk
variabel age, pengaruh yang signifikan hanya muncul pada
batas AGREE|STRONGLY AGREE dengan p-value sebesar
0,0009. Hal ini menunjukkan bahwa pengaruh usia terutama terlihat pada
kecenderungan responden untuk berada pada kategori
STRONGLY AGREE dibandingkan kategori di bawahnya.
Variabel polviews signifikan pada seluruh batas kategori
respons dengan p-value < 0,05. Hal ini menunjukkan bahwa
pandangan politik memiliki pengaruh yang berbeda pada setiap batas
kategori respons. Karena skor polviews yang lebih tinggi
menunjukkan pandangan yang semakin konservatif, maka perubahan pandangan
politik berkaitan dengan perubahan odds responden untuk berada pada
tingkat persetujuan yang lebih tinggi terhadap
spanking.