1 Pendahuluan

1.1 Latar Belakang

1.1.1 Definisi Tabel Kontingensi

2 Data dan Variabel Penelitian

2.1 Deskripsi Data

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

2.2 Pengolahan Awal Data

2.2.1 Import dan Cleaning Data

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.

2.2.2 Pengkodean Ulang Variabel

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…

2.3 Pengolahan Awal Data

3 Hasil dan Pembahasan

3.1 Distribusi Variabel Respons

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.

3.2 Estimasi Model Regresi Logistik Ordinal (Proportional Odds)

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"
)
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
table(data$spanking)
## 
## STRONGLY DISAGREE          DISAGREE             AGREE    STRONGLY AGREE 
##               331               558               740               336
table(data$childs)
## 
##   0   1   2   3   4   5   6   7   8 
## 625 281 517 279 153  57  29   9  15
summary(data$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    36.0    50.0    50.4    65.0    89.0
summary(data$degree)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.000   1.000   1.898   3.000   4.000
summary(data$polviews)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.000   4.000   4.097   5.000   7.000
summary(data$attend)
##    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.

3.3 Pemeriksaan Asumsi Proportional Odds

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.

3.3.1 Uji Brant

Pemeriksaan asumsi ini dilakukan menggunakan Brant test. Hipotesis yang digunakan adalah sebagai berikut.

  • H0: Asumsi proportional odds terpenuhi.
  • H1: Asumsi proportional odds tidak terpenuhi.

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.

brant_result <- brant::brant(model_ordinal)
## -------------------------------------------- 
## 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"
)
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.

3.3.2 Pemeriksaan dengan Paket Ordinal

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"
)
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.

3.4 Estimasi Model Partial Proportional Odds

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"
)
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.

3.5 Perbandingan Model

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"
)
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"
)
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.

3.6 Pemeriksaan Multikolinearitas dan Kesesuaian Model

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"
)
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"
)
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"
)
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.