Penyakit Leptospirosis merupakan zoonosis yang menjadi permasalahan kesehatan masyarakat persisten di Provinsi Jawa Tengah, terutama dipengaruhi oleh interaksi faktor demografi dan akses fasilitas kesehatan. Penelitian ini secara strategis mendukung pencapaian Sustainable Development Goals (SDGs), khususnya Tujuan 3 mengenai kehidupan sehat dan sejahtera melalui pengendalian penyakit menular, serta Tujuan 6 terkait akses air bersih dan sanitasi layak yang menjadi faktor risiko utama penularan bakteri Leptospira. Penelitian ini bertujuan untuk menganalisis pola persebaran spasial kasus Leptospirosis di 35 kabupaten/kota di Provinsi Jawa Tengah pada periode 2022-2025 serta menentukan model estimasi terbaik dengan mempertimbangkan aspek dependensi spasial. Metodologi yang digunakan mencakup uji autokorelasi spasial melalui statistik Geary’s C dan perbandingan model ekonometrika spasial yang meliputi Ordinary Least Square (OLS), Spatial Autoregressive (SAR), Spatial Error Model (SEM), dan Spatial Durbin Model (SDM).
Hasil analisis menunjukkan bahwa distribusi kasus Leptospirosis cenderung bersifat acak secara lokal dengan nilai Geary’s C sebesar 0,9194 (\(p\text{-value} = 0,2409\)), yang mengindikasikan tidak adanya pola klasterisasi yang signifikan secara statistik pada taraf kepercayaan 95%. Berdasarkan kriteria Akaike Information Criterion (AIC), model OLS terpilih sebagai model paling efisien dengan nilai AIC terendah sebesar 305,9 dibandingkan model spasial lainnya. Uji diagnostik sisaan menunjukkan nilai Moran’s I Residual sebesar 0,0587 (\(p\text{-value} = 0,1925\)), membuktikan bahwa model OLS telah berhasil mengekstrak seluruh informasi tanpa menyisakan autokorelasi spasial pada residual. Temuan ini diharapkan dapat menjadi rujukan dalam perancangan intervensi kesehatan dan perbaikan infrastruktur sanitasi yang lebih tepat sasaran guna mengakselerasi target SDGs di Jawa Tengah.
Kata Kunci: Leptospirosis, Analisis Statistik Spasial, OLS, SDGs, Jawa Tengah
Leptospirosis merupakan salah satu penyakit zoonosis yang masih menjadi permasalahan kesehatan masyarakat di Indonesia, khususnya di wilayah dengan kondisi lingkungan yang mendukung perkembangan bakteri Leptospira, seperti daerah dengan curah hujan tinggi, sanitasi yang kurang memadai, serta kepadatan penduduk yang relatif tinggi. Provinsi Jawa Tengah sebagai salah satu wilayah dengan karakteristik geografis dan demografis yang beragam menunjukkan variasi jumlah kasus leptospirosis antar kabupaten/kota, sehingga memerlukan analisis yang mampu menangkap perbedaan tersebut secara komprehensif.
Perbedaan kondisi sosial, lingkungan, dan infrastruktur kesehatan antar wilayah menyebabkan risiko leptospirosis tidak bersifat homogen. Kabupaten/kota yang memiliki masalah sanitasi, pengelolaan limbah, atau akses layanan kesehatan yang terbatas cenderung memiliki kerentanan lebih tinggi terhadap penyebaran penyakit ini. Oleh karena itu, analisis berbasis wilayah menjadi penting agar kebijakan penanggulangan dapat disusun secara lebih tepat sasaran sesuai karakteristik masing-masing daerah.
Selain faktor lokal, aspek keterkaitan antar wilayah juga perlu
diperhatikan. Secara geografis, kabupaten/kota di Jawa Tengah saling
berdekatan dan memungkinkan adanya pola spasial dalam distribusi kasus
leptospirosis. Hal ini mendorong penggunaan pendekatan statistik
spasial, tidak hanya untuk mengidentifikasi hubungan antara kasus
leptospirosis dengan faktor-faktor penjelas, tetapi juga untuk menguji
apakah terdapat pengaruh ketergantungan spasial antar wilayah. Dengan
demikian, model regresi spasial digunakan sebagai pengembangan dari
regresi linier klasik agar potensi autokorelasi spasial dapat
diakomodasi.
Kajian ini menjadi penting dalam konteks pencapaian Sustainable
Development Goals (SDGs), khususnya Tujuan 3: Good
Health and Well-being, yang menekankan upaya menjamin kehidupan
yang sehat dan meningkatkan kesejahteraan bagi seluruh masyarakat.
Pengendalian penyakit menular seperti leptospirosis merupakan bagian
dari target SDGs untuk menurunkan angka kesakitan dan kematian akibat
penyakit. Selain itu, penelitian ini juga berkaitan dengan SDGs
Tujuan 6: Clean Water and Sanitation, karena leptospirosis
sangat erat hubungannya dengan kualitas sanitasi lingkungan dan akses
terhadap air bersih. Melalui pemahaman pola spasial dan faktor-faktor
yang memengaruhi kasus leptospirosis, hasil penelitian ini diharapkan
dapat menjadi dasar bagi pemerintah daerah dalam merancang intervensi
kesehatan dan perbaikan sanitasi yang lebih terarah.
Berdasarkan latar belakang di atas, masalah penelitian dapat dirumuskan sebagai berikut:
Penelitian ini bertujuan untuk:
Hukum pertama geografi Tobler menyatakan bahwa “segala sesuatu berhubungan dengan yang lain, tetapi hal-hal yang dekat lebih berhubungan daripada hal-hal yang jauh” (Tobler, 1970). Prinsip ini menjadi dasar spatial dependence, yaitu nilai variabel di suatu lokasi dipengaruhi oleh nilai variabel di lokasi tetangganya.
Matriks pembobot spasial (W) mendefinisikan struktur ketetanggaan antar wilayah. Penelitian ini menggunakan:
Moran’s I mengukur korelasi spasial global dengan rumus:
\[I = \frac{n}{\sum_i \sum_j w_{ij}} \frac{\sum_i \sum_j w_{ij}(x_i - \bar{x})(x_j - \bar{x})}{\sum_i (x_i - \bar{x})^2}\]
Nilai I > 0 menunjukkan autokorelasi positif, I < 0 autokorelasi negatif, dan I ≈ 0 tidak ada autokorelasi.
Geary’s C fokus pada perbedaan nilai antar tetangga:
\[C = \frac{(n-1)}{2\sum_i \sum_j w_{ij}} \frac{\sum_i \sum_j w_{ij}(x_i - x_j)^2}{\sum_i (x_i - \bar{x})^2}\]
Nilai C < 1 menunjukkan autokorelasi positif, C > 1 autokorelasi negatif.
LISA mengidentifikasi hotspot dan coldspot lokal:
\[I_i = \frac{(x_i - \bar{x})}{\sigma^2} \sum_j w_{ij}(x_j - \bar{x})\]
Klasifikasi pola: High-High, Low-Low, High-Low, Low-High.
Model SAR mengasumsikan spatial dependence pada variabel dependen:
\[y = \rho Wy + X\beta + \epsilon\]
Model SEM mengasumsikan spatial dependence pada error term:
\[y = X\beta + u, \quad u = \lambda Wu + \epsilon\]
Model SDM memasukkan spatial lag pada variabel independen dan dependen:
\[y = \rho Wy + X\beta + WX\theta + \epsilon\]
Kriteria pemilihan model meliputi:
Data yang digunakan dalam penelitian ini meliputi:
Variabel Penelitian:
# Instalasi packages jika belum terinstal
packages <- c(
"readxl", "sf", "spdep", "spatialreg", "tmap", "ggplot2",
"dplyr", "tidyr", "knitr", "kableExtra", "viridis",
"RColorBrewer", "leaflet", "plotly", "corrplot",
"scales", "gridExtra", "GWmodel", "stringr", "gstat"
)
# Install jika belum ada
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)
# Load semua packages
invisible(lapply(packages, library, character.only = TRUE))Analisis dilakukan melalui tahapan berikut:
# Load data Excel
data <- read_excel("D:/Semester 5/Spasial/DATA UAS/Dashboard/Data UAS Statistik Spasial.xlsx")
# Load GeoJSON
indo_sf <- st_read("D:/Semester 5/Spasial/DATA UAS/Dashboard/gadm41_IDN_2.json",
quiet = TRUE)
# Cek struktur data
cat("Struktur Data:\n")## Struktur Data:
## tibble [140 × 5] (S3: tbl_df/tbl/data.frame)
## $ Kabupaten/Kota : chr [1:140] "Kab.Cilacap" "Kab.Cilacap" "Kab.Cilacap" "Kab.Cilacap" ...
## $ Tahun : num [1:140] 2022 2023 2024 2025 2022 ...
## $ Jumlah Penduduk (Ribu) : num [1:140] 1989 2008 2027 2046 1806 ...
## $ Jumlah Puskesmas : num [1:140] 38 38 38 38 40 40 40 40 22 22 ...
## $ Jumlah Kasus Leptospirosis: num [1:140] 12 37 6 20 34 88 24 108 0 2 ...
##
##
## Kolom GeoJSON:
## [1] "GID_2" "GID_0" "COUNTRY" "GID_1" "NAME_1" "NL_NAME_1"
## [7] "NAME_2" "VARNAME_2" "NL_NAME_2" "TYPE_2" "ENGTYPE_2" "CC_2"
## [13] "HASC_2" "geometry"
##
##
## Dimensi Data:
## Data Excel: 140 baris, 5 kolom
## Data Spasial: 502 wilayah
##
##
## Preview Data Excel:
Interpretasi: Data penelitian terdiri dari 140 observasi (35 kabupaten/kota × 4 tahun) dengan 3 variabel. Data spasial berbentuk poligon yang merepresentasikan batas administratif kabupaten/kota di Jawa Tengah.
# Standarisasi nama kolom
data <- data %>%
rename(
kabkota = `Kabupaten/Kota`,
tahun = Tahun,
jumlah_penduduk = `Jumlah Penduduk (Ribu)`,
jumlah_puskesmas = `Jumlah Puskesmas`,
kasus_leptospirosis = `Jumlah Kasus Leptospirosis`
)
# Agregasi data per kabupaten/kota (rata-rata 2022-2025)
data_avg <- data %>%
group_by(kabkota) %>%
summarise(
y_var = mean(kasus_leptospirosis, na.rm = TRUE), # Rata-rata kasus
x1 = mean(jumlah_penduduk, na.rm = TRUE), # Rata-rata penduduk
x2 = mean(jumlah_puskesmas, na.rm = TRUE), # Rata-rata puskesmas
total_kasus = sum(kasus_leptospirosis, na.rm = TRUE),
.groups = 'drop'
)
cat("Wilayah di Data Excel:", nrow(data_avg), "\n")## Wilayah di Data Excel: 35
## Wilayah di GeoJSON (Seluruh Indonesia): 502
## [1] "GID_2" "GID_0" "COUNTRY" "GID_1" "NAME_1" "NL_NAME_1"
## [7] "NAME_2" "VARNAME_2" "NL_NAME_2" "TYPE_2" "ENGTYPE_2" "CC_2"
## [13] "HASC_2" "geometry"
## [1] "Aceh" "Bali" "BangkaBelitung"
## [4] "Banten" "Bengkulu" "Gorontalo"
## [7] "JakartaRaya" "Jambi" "JawaBarat"
## [10] "JawaTengah" "JawaTimur" "KalimantanBarat"
## [13] "KalimantanSelatan" "KalimantanTengah" "KalimantanTimur"
## [16] "KalimantanUtara" "KepulauanRiau" "Lampung"
## [19] "Maluku" "MalukuUtara" "NusaTenggaraBarat"
## [22] "NusaTenggaraTimur" "Papua" "PapuaBarat"
## [25] "Riau" "SulawesiBarat" "SulawesiSelatan"
## [28] "SulawesiTengah" "SulawesiTenggara" "SulawesiUtara"
## [31] "SumateraBarat" "SumateraSelatan" "SumateraUtara"
## [34] "Yogyakarta"
indo_sf_jateng <- indo_sf %>%
filter(NAME_1 == "JawaTengah")
cat("Wilayah di GeoJSON (Jawa Tengah saja):", nrow(indo_sf_jateng), "\n\n")## Wilayah di GeoJSON (Jawa Tengah saja): 36
## Sample nama wilayah di GeoJSON Jawa Tengah (NAME_2):
## [1] "Banjarnegara" "Banyumas" "Batang" "Blora" "Boyolali"
## [6] "Brebes" "Cilacap" "Demak" "Grobogan" "Jepara"
##
##
## Sample nama wilayah di Excel:
## [1] "Kab.Banjarnegara" "Kab.Banyumas" "Kab.Batang" "Kab.Blora"
## [5] "Kab.Boyolali" "Kab.Brebes" "Kab.Cilacap" "Kab.Demak"
## [9] "Kab.Grobogan" "Kab.Jepara"
library(stringr)
data_avg <- data_avg %>%
mutate(
nama_clean = str_to_lower(
str_trim(
str_replace(
str_replace(kabkota, "^Kab\\.", ""),
"^Kota ", ""
)
)
)
)
cat("\n\nSetelah cleaning:\n")##
##
## Setelah cleaning:
## Excel:
## # A tibble: 10 × 2
## kabkota nama_clean
## <chr> <chr>
## 1 Kab.Banjarnegara banjarnegara
## 2 Kab.Banyumas banyumas
## 3 Kab.Batang batang
## 4 Kab.Blora blora
## 5 Kab.Boyolali boyolali
## 6 Kab.Brebes brebes
## 7 Kab.Cilacap cilacap
## 8 Kab.Demak demak
## 9 Kab.Grobogan grobogan
## 10 Kab.Jepara jepara
indo_sf_jateng <- indo_sf_jateng %>%
mutate(
nama_clean = str_to_lower(str_trim(NAME_2))
)
cat("\n\nGeoJSON:\n")##
##
## GeoJSON:
## NAME_2 nama_clean
## 1 Banjarnegara banjarnegara
## 2 Banyumas banyumas
## 3 Batang batang
## 4 Blora blora
## 5 Boyolali boyolali
## 6 Brebes brebes
## 7 Cilacap cilacap
## 8 Demak demak
## 9 Grobogan grobogan
## 10 Jepara jepara
## [1] "banjarnegara" "banyumas" "batang" "blora" "boyolali"
## [6] "brebes" "cilacap" "demak" "grobogan" "jepara"
## [1] "banjarnegara" "banyumas" "batang" "blora" "boyolali"
## [6] "brebes" "cilacap" "demak" "grobogan" "jepara"
## [1] 35
## [1] 5
# Merge berdasarkan nama yang sudah di-clean
data_sf <- indo_sf_jateng %>%
left_join(data_avg, by = "nama_clean")
# Cek hasil matching
matched <- sum(!is.na(data_sf$y_var))
not_matched <- sum(is.na(data_sf$y_var))
cat("\n\n=== HASIL MATCHING ===\n")##
##
## === HASIL MATCHING ===
## ✓ Wilayah berhasil match: 35
## ✗ Wilayah tidak match : 5
if(not_matched > 0) {
cat("\n\nWilayah di GeoJSON yang TIDAK MATCH:\n")
not_matched_geo <- data_sf %>%
filter(is.na(y_var)) %>%
st_drop_geometry() %>%
select(NAME_2, nama_clean)
print(not_matched_geo)
cat("\n\nWilayah di Excel yang TIDAK MATCH:\n")
matched_clean <- data_sf %>%
filter(!is.na(y_var)) %>%
pull(nama_clean)
not_matched_excel <- data_avg %>%
filter(!nama_clean %in% matched_clean) %>%
select(kabkota, nama_clean)
print(not_matched_excel)
cat("\n\n💡 Coba cek perbedaan penulisan antara kedua tabel di atas\n")
}##
##
## Wilayah di GeoJSON yang TIDAK MATCH:
## NAME_2 nama_clean
## 1 KotaMagelang kotamagelang
## 2 KotaPekalongan kotapekalongan
## 3 KotaSemarang kotasemarang
## 4 KotaTegal kotategal
## 5 WadukKedungombo wadukkedungombo
##
##
## Wilayah di Excel yang TIDAK MATCH:
## # A tibble: 0 × 2
## # ℹ 2 variables: kabkota <chr>, nama_clean <chr>
##
##
## 💡 Coba cek perbedaan penulisan antara kedua tabel di atas
# Filter hanya yang match
data_sf <- data_sf %>% filter(!is.na(y_var))
cat("\n\n=== DATA FINAL ===\n")##
##
## === DATA FINAL ===
## Jumlah wilayah untuk analisis: 35 kabupaten/kota
## Total kasus 2022-2025 : 2034 kasus
## Rata-rata kasus per wilayah : 14.53 kasus/tahun
## Rata-rata penduduk : 1076.4 ribu jiwa
## Rata-rata puskesmas : 25.2 unit
# Cek apakah semua 35 wilayah sudah match
if(nrow(data_sf) == 35) {
cat("\n✅ SEMPURNA! Semua 35 kabupaten/kota Jawa Tengah berhasil di-match!\n")
} else {
cat("\n⚠️ WARNING: Hanya", nrow(data_sf), "dari 35 wilayah yang match.\n")
cat(" Mohon periksa wilayah yang tidak match di atas.\n")
}##
## ✅ SEMPURNA! Semua 35 kabupaten/kota Jawa Tengah berhasil di-match!
# Variabel yang akan dianalisis
vars_analisis <- c("y_var", "x1", "x2")
# Statistik deskriptif
desc_stats <- data_sf %>%
st_drop_geometry() %>%
select(all_of(vars_analisis)) %>%
summary()
print(desc_stats)## y_var x1 x2
## Min. : 0.000 Min. : 122.2 Min. : 5.00
## 1st Qu.: 0.375 1st Qu.: 854.3 1st Qu.:21.00
## Median : 4.000 Median :1052.8 Median :26.00
## Mean :14.529 Mean :1076.4 Mean :25.17
## 3rd Qu.:25.000 3rd Qu.:1348.6 3rd Qu.:30.00
## Max. :63.500 Max. :2051.6 Max. :40.00
# Tabel statistik lebih detail
desc_table <- data_sf %>%
st_drop_geometry() %>%
select(all_of(vars_analisis)) %>%
summarise(
across(everything(),
list(
Mean = ~mean(.x, na.rm = TRUE),
Median = ~median(.x, na.rm = TRUE),
SD = ~sd(.x, na.rm = TRUE),
Min = ~min(.x, na.rm = TRUE),
Max = ~max(.x, na.rm = TRUE),
CV = ~(sd(.x, na.rm = TRUE)/mean(.x, na.rm = TRUE))*100
))
) %>%
pivot_longer(everything(),
names_to = c("Variable", "Statistic"),
names_sep = "_") %>%
pivot_wider(names_from = Statistic, values_from = value)
desc_table %>%
kable(caption = "Tabel 1. Statistik Deskriptif Variabel Penelitian",
digits = 2,
format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)| Variable | var | Mean | Median | SD | Min | Max | CV |
|---|---|---|---|---|---|---|---|
| y | 14.52857, 4.00000, 18.46596, 0.00000, 63.50000, 127.10103 | NULL | NULL | NULL | NULL | NULL | NULL |
| x1 | NULL | 1076.432 | 1052.775 | 472.4567 | 122.25 | 2051.625 | 43.89099 |
| x2 | NULL | 25.17143 | 26 | 9.040101 | 5 | 40 | 35.91414 |
Interpretasi:
Rata-rata kasus leptospirosis di Jawa Tengah adalah 14.53 kasus per kabupaten/kota per tahun dengan standar deviasi 18.47. Coefficient of Variation (CV) sebesar 127.1% menunjukkan variabilitas yang sangat tinggi antar wilayah.
Rentang kasus dari 0 hingga 63.5 mengindikasikan disparitas spasial yang signifikan dalam distribusi kasus leptospirosis.
Jumlah penduduk berkisar antara 122 ribu hingga 2052 ribu jiwa, menunjukkan heterogenitas ukuran wilayah.
Jumlah puskesmas bervariasi dari 5 hingga 40 unit, mengindikasikan perbedaan kapasitas layanan kesehatan dasar antar wilayah.
# Matriks korelasi
cor_matrix <- data_sf %>%
st_drop_geometry() %>%
select(all_of(vars_analisis)) %>%
cor(use = "complete.obs")
# Visualisasi
corrplot(cor_matrix,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
diag = FALSE,
number.cex = 0.8,
col = colorRampPalette(c("#BB4444", "#FFFFFF", "#4444BB"))(200))Gambar 1. Matriks Korelasi Antar Variabel
Interpretasi:
Matriks korelasi menunjukkan bahwa variabel X1 memiliki korelasi positif lemah–sedang (r = 0,35) terhadap kasus leptospirosis, sedangkan X2 memiliki korelasi positif lemah (r = 0,18). Korelasi antar variabel independen sebesar 0,42 menunjukkan tidak adanya multikolinearitas yang kuat, sehingga kedua variabel layak digunakan dalam pemodelan.
# Peta distribusi kasus leptospirosis
tm_shape(data_sf) +
tm_polygons("y_var",
palette = "YlOrRd",
style = "jenks",
n = 5,
title = "Rata-rata Kasus\nLeptospirosis\n(2022-2025)",
border.col = "white",
border.alpha = 0.5,
legend.hist = TRUE) +
tm_layout(main.title = "Distribusi Spasial Kasus Leptospirosis di Jawa Tengah",
main.title.size = 1.2,
legend.outside = TRUE,
legend.outside.position = "right",
frame = FALSE) +
tm_scale_bar(position = c("left", "bottom")) +
tm_compass(position = c("right", "top")) +
tm_credits("Sumber: Data UAS Statistik Spasial 2025",
position = c("left", "bottom"))Gambar 2. Peta Distribusi Kasus Leptospirosis di Jawa Tengah
Interpretasi:
Peta choropleth rata-rata kasus leptospirosis tahun 2022–2025 menunjukkan adanya variasi spasial yang cukup jelas antar kabupaten/kota di Provinsi Jawa Tengah. Beberapa wilayah tampak memiliki rata-rata kasus yang tinggi hingga sangat tinggi, sementara sebagian besar wilayah lainnya berada pada kategori rendah. Pola ini mengindikasikan bahwa beban leptospirosis cenderung terlokalisasi pada wilayah tertentu, sehingga diperlukan perhatian dan intervensi kesehatan yang lebih terfokus pada daerah-daerah dengan intensitas kasus tinggi.
# Peta untuk semua variabel independen
map1 <- tm_shape(data_sf) +
tm_polygons("x1",
palette = "Blues",
style = "jenks",
n = 5,
title = "Penduduk\n(Ribu)",
border.col = "white",
border.alpha = 0.3) +
tm_layout(main.title = "Jumlah Penduduk",
legend.outside = FALSE,
frame = FALSE)
map2 <- tm_shape(data_sf) +
tm_polygons("x2",
palette = "Greens",
style = "jenks",
n = 5,
title = "Jumlah\nPuskesmas",
border.col = "white",
border.alpha = 0.3) +
tm_layout(main.title = "Jumlah Puskesmas",
legend.outside = FALSE,
frame = FALSE)
# Arrange maps
tmap_arrange(map1, map2, ncol = 2)Gambar 3. Peta Distribusi Variabel Independen
Interpretasi:
Pola Distribusi Jumlah Penduduk (X1)
Peta menunjukkan adanya ketimpangan distribusi penduduk antarwilayah di Jawa Tengah, di mana beberapa kabupaten/kota menjadi pusat konsentrasi populasi, sementara wilayah lainnya berpenduduk relatif lebih jarang. Perbedaan ini berpotensi memengaruhi tingkat risiko dan jumlah absolut kasus leptospirosis, karena wilayah berpenduduk besar cenderung memiliki peluang paparan dan pelaporan kasus yang lebih tinggi.
Pola Distribusi Jumlah Puskesmas (X2):
Peta jumlah puskesmas menunjukkan variasi kapasitas layanan kesehatan primer antarwilayah. Daerah dengan jumlah puskesmas lebih banyak diharapkan memiliki kemampuan deteksi dan penanganan leptospirosis yang lebih baik, sedangkan wilayah dengan fasilitas terbatas berpotensi menghadapi kendala dalam akses layanan kesehatan.
# Cek validitas geometri
data_sf <- st_make_valid(data_sf)
# Konversi ke sp untuk spdep (jika perlu)
# data_sp <- as_Spatial(data_sf)
# Queen contiguity
nb_queen <- poly2nb(data_sf, queen = TRUE)
cat("Struktur Ketetanggaan (Queen Contiguity):\n")## Struktur Ketetanggaan (Queen Contiguity):
## Jumlah wilayah: 35
## Rata-rata tetangga: 5.142857
## Min tetangga: 2
## Max tetangga: 10
# Identifikasi wilayah tanpa tetangga (islands)
islands <- which(card(nb_queen) == 0)
if(length(islands) > 0) {
cat("\nWilayah tanpa tetangga (islands):", length(islands), "\n")
cat("Nama wilayah:", data_sf$NAME_2[islands], "\n")
}
# Atasi islands dengan k-nearest neighbors
if(length(islands) > 0) {
coords <- st_coordinates(st_centroid(data_sf))
k <- ceiling(mean(card(nb_queen))) + 1
nb_knn <- knn2nb(knearneigh(coords, k = k))
# Gabungkan queen dan knn untuk islands
nb_combined <- nb_queen
nb_combined[islands] <- nb_knn[islands]
cat("\nSetelah penambahan KNN untuk islands:\n")
cat("Rata-rata tetangga:", mean(card(nb_combined)), "\n")
nb_final <- nb_combined
} else {
nb_final <- nb_queen
}
# Row-standardized weights
w_list <- nb2listw(nb_final, style = "W", zero.policy = TRUE)
# Visualisasi struktur ketetanggaan
plot(st_geometry(data_sf), border = "lightgray", main = "Struktur Ketetanggaan")
plot(nb_final, coords = st_coordinates(st_centroid(data_sf)),
add = TRUE, col = "red", lwd = 0.5)Interpretasi: Nilai suatu wilayah tidak berdiri sendiri, tetapi berpotensi dipengaruhi oleh wilayah-wilayah yang terhubung dengannya.
# Hitung Moran's I
moran_test <- moran.test(data_sf$y_var, w_list, zero.policy = TRUE)
print(moran_test)##
## Moran I test under randomisation
##
## data: data_sf$y_var
## weights: w_list
##
## Moran I statistic standard deviate = 0.83258, p-value = 0.2025
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 0.05473869 -0.02941176 0.01021554
# Ekstrak nilai
moran_i <- moran_test$estimate[1]
expected_i <- moran_test$estimate[2]
variance_i <- moran_test$estimate[3]
p_value <- moran_test$p.value
cat("\n=== RINGKASAN MORAN'S I ===\n")##
## === RINGKASAN MORAN'S I ===
## Moran's I : 0.0547
## Expected I : -0.0294
## Variance : 0.010216
## Z-score : 0.8326
## P-value : 0.2025
cat("Kesimpulan :",
ifelse(p_value < 0.05,
ifelse(moran_i > 0, "Autokorelasi Positif Signifikan",
"Autokorelasi Negatif Signifikan"),
"Tidak Ada Autokorelasi Signifikan"), "\n")## Kesimpulan : Tidak Ada Autokorelasi Signifikan
Interpretasi:
[Jika I > 0 dan p < 0.05]: Terdapat autokorelasi spasial positif yang signifikan, artinya wilayah dengan nilai tinggi cenderung bertetangga dengan wilayah nilai tinggi (clustering), dan wilayah nilai rendah bertetangga dengan wilayah nilai rendah.
[Jika I < 0 dan p < 0.05]: Terdapat autokorelasi spasial negatif yang signifikan, artinya wilayah dengan nilai tinggi cenderung bertetangga dengan wilayah nilai rendah (dispersi).
[Jika p > 0.05]: Tidak terdapat autokorelasi spasial yang signifikan, distribusi cenderung acak (random).
Berdasarkan perhitungan tersebut, tidak terdapat autokorelasi spasial global yang signifikan pada distribusi kasus leptospirosis antar kabupaten/kota. Pola sebaran kasus tidak berbeda nyata dari pola acak secara global di Jawa Tengah
# Moran scatterplot
moran.plot(data_sf$y_var, w_list,
labels = FALSE,
xlab = "Variabel Y (Standardized)",
ylab = "Spatial Lag of Y (Standardized)",
main = "Moran's I Scatterplot",
zero.policy = TRUE)Gambar 4. Moran’s I Scatterplot
Interpretasi:
Moran’s I scatterplot menunjukkan kemiringan garis regresi yang kecil dan positif, sejalan dengan nilai Moran’s I sebesar 0,0547. Sebaran titik yang relatif acak di keempat kuadran mengindikasikan bahwa hubungan antara nilai kasus leptospirosis suatu wilayah dengan rata-rata tetangganya bersifat lemah. Hal ini menegaskan bahwa tidak terdapat pola pengelompokan spasial global yang kuat, sesuai dengan hasil uji Moran’s I yang tidak signifikan secara statistik (p-value = 0,2025).
# Hitung Geary's C
geary_test <- geary.test(data_sf$y_var, w_list, zero.policy = TRUE)
print(geary_test)##
## Geary C test under randomisation
##
## data: data_sf$y_var
## weights: w_list
##
## Geary C statistic standard deviate = 0.70337, p-value = 0.2409
## alternative hypothesis: Expectation greater than statistic
## sample estimates:
## Geary C statistic Expectation Variance
## 0.91942972 1.00000000 0.01312163
geary_c <- geary_test$estimate[1]
geary_p <- geary_test$p.value
cat("\n=== RINGKASAN GEARY'S C ===\n")##
## === RINGKASAN GEARY'S C ===
## Geary's C : 0.9194
## Expected C : 1
## Z-score : 0.7034
## P-value : 0.2409
cat("Kesimpulan :",
ifelse(geary_p < 0.05,
ifelse(geary_c < 1, "Autokorelasi Positif Signifikan",
"Autokorelasi Negatif Signifikan"),
"Tidak Ada Autokorelasi Signifikan"), "\n")## Kesimpulan : Tidak Ada Autokorelasi Signifikan
Interpretasi:
Tidak terdapat autokorelasi spasial yang signifikan pada variabel kasus leptospirosis berdasarkan uji Geary’s C. Pola nilai antar wilayah cenderung acak, dan kemiripan antar tetangga tidak cukup kuat secara statistik.
# Hitung Local Moran's I
local_moran <- localmoran(data_sf$y_var, w_list, zero.policy = TRUE)
# Tambahkan ke data
data_sf$local_i <- local_moran[, 1]
data_sf$local_p <- local_moran[, 5]
# Standardize variable
data_sf$y_std <- scale(data_sf$y_var)
# Hitung spatial lag
data_sf$lag_y_std <- lag.listw(w_list, data_sf$y_std, zero.policy = TRUE)
# Klasifikasi quadrant
data_sf <- data_sf %>%
mutate(
quadrant = case_when(
y_std > 0 & lag_y_std > 0 ~ "High-High",
y_std < 0 & lag_y_std < 0 ~ "Low-Low",
y_std < 0 & lag_y_std > 0 ~ "Low-High",
y_std > 0 & lag_y_std < 0 ~ "High-Low",
TRUE ~ "Not Significant"
),
lisa_cluster = ifelse(local_p < 0.05, quadrant, "Not Significant")
)
# Hitung jumlah per kategori
lisa_summary <- data_sf %>%
st_drop_geometry() %>%
count(lisa_cluster) %>%
mutate(pct = n/sum(n)*100)
cat("=== RINGKASAN LISA CLUSTER ===\n")## === RINGKASAN LISA CLUSTER ===
## lisa_cluster n pct
## 1 High-High 2 5.714286
## 2 Not Significant 33 94.285714
##
##
## Wilayah High-High (Hotspot):
print(data_sf %>% filter(lisa_cluster == "High-High") %>%
select(kabkota, y_var, x1, x2) %>% st_drop_geometry())## kabkota y_var x1 x2
## 1 Kab.Cilacap 18.75 2017.55 38
## 2 Kab.Kebumen 47.75 1405.25 35
##
##
## Wilayah Low-Low (Coldspot):
print(data_sf %>% filter(lisa_cluster == "Low-Low") %>%
select(kabkota, y_var, x1, x2) %>% st_drop_geometry())## [1] kabkota y_var x1 x2
## <0 rows> (or 0-length row.names)
# Peta LISA
tm_shape(data_sf) +
tm_polygons("lisa_cluster",
palette = c("High-High" = "#d7191c",
"Low-Low" = "#2b83ba",
"Low-High" = "#abdda4",
"High-Low" = "#fdae61",
"Not Significant" = "#f0f0f0"),
title = "LISA Cluster",
border.col = "white",
border.alpha = 0.5) +
tm_layout(main.title = "Klaster Lokal Kasus Leptospirosis (LISA)",
main.title.size = 1.2,
legend.outside = TRUE,
frame = FALSE) +
tm_scale_bar(position = c("left", "bottom")) +
tm_compass(position = c("right", "top")) +
tm_credits("α = 0.05", position = c("right", "bottom"))Gambar 5. Peta LISA Cluster Kasus Leptospirosis
Interpretasi LISA:
Hasil analisis LISA menunjukkan adanya klaster High–High kasus leptospirosis yang signifikan secara statistik (α = 0,05). Wilayah tersebut memiliki tingkat kasus leptospirosis yang tinggi dan dikelilingi oleh wilayah dengan tingkat kasus yang juga tinggi, sehingga mengindikasikan adanya autokorelasi spasial positif. Sementara itu, sebagian besar wilayah lainnya tidak menunjukkan pola klaster yang signifikan.
# Peta p-value
tm_shape(data_sf) +
tm_polygons("local_p",
breaks = c(0, 0.01, 0.05, 0.1, 1),
palette = "-RdYlGn",
title = "P-value",
border.col = "white",
labels = c("< 0.01", "0.01-0.05", "0.05-0.10", "> 0.10")) +
tm_layout(main.title = "Signifikansi Statistik Local Moran's I",
legend.outside = TRUE,
frame = FALSE)Gambar 6. Peta Signifikansi Statistik LISA
Interpretasi:
Peta signifikansi Local Moran’s I menunjukkan apakah wilayah tersebut valid secara statistik. Peta tersebut menunjukkan bahwa hanya sebagian wilayah di Jawa Tengah, khususnya di bagian barat–selatan, yang memiliki autokorelasi spasial lokal kasus leptospirosis yang signifikan (p < 0,05). Sebagian besar wilayah lainnya tidak menunjukkan signifikansi statistik, mengindikasikan bahwa pola kejadian leptospirosis di wilayah tersebut bersifat acak.
# Model OLS tanpa efek spasial
formula_ols <- y_var ~ x1 + x2
model_ols <- lm(formula_ols, data = data_sf)
# Summary model
summary(model_ols)##
## Call:
## lm(formula = formula_ols, data = data_sf)
##
## Residuals:
## Min 1Q Median 3Q Max
## -27.355 -11.768 -3.412 8.109 44.499
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.441177 9.777788 -0.147 0.8837
## x1 0.012813 0.007145 1.793 0.0824 .
## x2 0.086507 0.373395 0.232 0.8183
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 17.85 on 32 degrees of freedom
## Multiple R-squared: 0.121, Adjusted R-squared: 0.06603
## F-statistic: 2.202 on 2 and 32 DF, p-value: 0.1271
# Ekstrak hasil
ols_coef <- coef(model_ols)
ols_r2 <- summary(model_ols)$r.squared
ols_adj_r2 <- summary(model_ols)$adj.r.squared
ols_aic <- AIC(model_ols)
cat("\n=== RINGKASAN MODEL OLS ===\n")##
## === RINGKASAN MODEL OLS ===
## R-squared : 0.121
## Adjusted R2 : 0.066
## AIC : 305.91
## Koefisien:
## (Intercept) x1 x2
## -1.4412 0.0128 0.0865
Interpretasi Model OLS:
Model OLS baseline menghasilkan:
Namun, model OLS mengabaikan spatial dependence yang telah terbukti ada (Moran’s I signifikan). Kita perlu menguji apakah spatial lag atau spatial error lebih sesuai.
# LM test untuk spatial dependence
lm_tests <- lm.LMtests(model_ols, w_list, test = "all")
print(lm_tests)##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = formula_ols, data = data_sf)
## test weights: listw
##
## RSerr = 0.28134, df = 1, p-value = 0.5958
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = formula_ols, data = data_sf)
## test weights: listw
##
## RSlag = 0.094877, df = 1, p-value = 0.7581
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = formula_ols, data = data_sf)
## test weights: listw
##
## adjRSerr = 0.79958, df = 1, p-value = 0.3712
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = formula_ols, data = data_sf)
## test weights: listw
##
## adjRSlag = 0.61312, df = 1, p-value = 0.4336
##
##
## Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial
## dependence
##
## data:
## model: lm(formula = formula_ols, data = data_sf)
## test weights: listw
##
## SARMA = 0.89446, df = 2, p-value = 0.6394
# Ekstrak p-values
lm_lag_p <- lm_tests$LMlag$p.value
lm_err_p <- lm_tests$LMerr$p.value
lm_rlag_p <- lm_tests$RLMlag$p.value
lm_rerr_p <- lm_tests$RLMerr$p.value
lm_sarma_p <- lm_tests$SARMA$p.value
cat("\n=== RINGKASAN LM TESTS ===\n")##
## === RINGKASAN LM TESTS ===
cat("LM lag (p-value) :", format.pval(lm_lag_p, digits = 4),
ifelse(lm_lag_p < 0.05, " ***", ""), "\n")## LM lag (p-value) :
cat("Robust LM lag (p-value) :", format.pval(lm_rlag_p, digits = 4),
ifelse(lm_rlag_p < 0.05, " ***", ""), "\n")## Robust LM lag (p-value) :
cat("LM error (p-value) :", format.pval(lm_err_p, digits = 4),
ifelse(lm_err_p < 0.05, " ***", ""), "\n")## LM error (p-value) :
cat("Robust LM error (p-value):", format.pval(lm_rerr_p, digits = 4),
ifelse(lm_rerr_p < 0.05, " ***", ""), "\n")## Robust LM error (p-value):
cat("LM SARMA (p-value) :", format.pval(lm_sarma_p, digits = 4),
ifelse(lm_sarma_p < 0.05, " ***", ""), "\n")## LM SARMA (p-value) : 0.6394
## List of 5
## $ RSerr :List of 5
## ..$ statistic: Named num 0.281
## .. ..- attr(*, "names")= chr "RSerr"
## ..$ parameter: Named num 1
## .. ..- attr(*, "names")= chr "df"
## ..$ p.value : Named num 0.596
## .. ..- attr(*, "names")= chr ""
## ..$ method : chr "Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial dependence"
## ..$ data.name: chr "\nmodel: lm(formula = formula_ols, data = data_sf)\ntest weights: listw\n"
## ..- attr(*, "class")= chr "htest"
## $ RSlag :List of 5
## ..$ statistic: Named num 0.0949
## .. ..- attr(*, "names")= chr "RSlag"
## ..$ parameter: Named num 1
## .. ..- attr(*, "names")= chr "df"
## ..$ p.value : Named num 0.758
## .. ..- attr(*, "names")= chr ""
## ..$ method : chr "Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial dependence"
## ..$ data.name: chr "\nmodel: lm(formula = formula_ols, data = data_sf)\ntest weights: listw\n"
## ..- attr(*, "class")= chr "htest"
## $ adjRSerr:List of 5
## ..$ statistic: Named num 0.8
## .. ..- attr(*, "names")= chr "adjRSerr"
## ..$ parameter: Named num 1
## .. ..- attr(*, "names")= chr "df"
## ..$ p.value : Named num 0.371
## .. ..- attr(*, "names")= chr ""
## ..$ method : chr "Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial dependence"
## ..$ data.name: chr "\nmodel: lm(formula = formula_ols, data = data_sf)\ntest weights: listw\n"
## ..- attr(*, "class")= chr "htest"
## $ adjRSlag:List of 5
## ..$ statistic: Named num 0.613
## .. ..- attr(*, "names")= chr "adjRSlag"
## ..$ parameter: Named num 1
## .. ..- attr(*, "names")= chr "df"
## ..$ p.value : Named num 0.434
## .. ..- attr(*, "names")= chr ""
## ..$ method : chr "Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial dependence"
## ..$ data.name: chr "\nmodel: lm(formula = formula_ols, data = data_sf)\ntest weights: listw\n"
## ..- attr(*, "class")= chr "htest"
## $ SARMA :List of 5
## ..$ statistic: Named num 0.894
## .. ..- attr(*, "names")= chr "SARMA"
## ..$ parameter: Named num 2
## .. ..- attr(*, "names")= chr "df"
## ..$ p.value : Named num 0.639
## .. ..- attr(*, "names")= chr ""
## ..$ method : chr "Rao's score (a.k.a Lagrange multiplier) diagnostics for spatial dependence"
## ..$ data.name: chr "\nmodel: lm(formula = formula_ols, data = data_sf)\ntest weights: listw\n"
## ..- attr(*, "class")= chr "htest"
## - attr(*, "class")= chr "RStestlist"
## [1] "RSerr" "RSlag" "adjRSerr" "adjRSlag" "SARMA"
lm_lag_p <- lm_tests$RSlag$p.value
lm_err_p <- lm_tests$RSerr$p.value
lm_rlag_p <- lm_tests$adjRSlag$p.value
lm_rerr_p <- lm_tests$adjRSerr$p.value
lm_sarma_p <- lm_tests$SARMA$p.value
cat("\n=== RINGKASAN LM TESTS ===\n")##
## === RINGKASAN LM TESTS ===
## LM lag (p-value) : 0.7581
## Robust LM lag (p-value) : 0.4336
## LM error (p-value) : 0.5958
## Robust LM error (p-value): 0.3712
## LM SARMA (p-value) : 0.6394
##
## === REKOMENDASI MODEL ===
if(lm_rlag_p < 0.05 & lm_rerr_p >= 0.05) {
cat("Rekomendasi: Gunakan SAR (Spatial Lag Model)\n")
} else if(lm_rerr_p < 0.05 & lm_rlag_p >= 0.05) {
cat("Rekomendasi: Gunakan SEM (Spatial Error Model)\n")
} else if(lm_rlag_p < 0.05 & lm_rerr_p < 0.05) {
cat("Rekomendasi: Gunakan SDM (Spatial Durbin Model) atau SAC\n")
} else {
cat("Rekomendasi: Model OLS mungkin sudah cukup\n")
}## Rekomendasi: Model OLS mungkin sudah cukup
Kesimpulan :
Meskipun hasil Moran’s I, Geary’s C, dan LM tests menunjukkan tidak adanya autokorelasi spasial yang signifikan, penelitian ini tetap mengestimasi model SAR, SEM, dan/atau SDM sebagai analisis pembanding untuk melihat apakah terdapat peningkatan kinerja model dibandingkan OLS
# Estimasi SAR
model_sar <- lagsarlm(formula_ols, data = data_sf, listw = w_list,
zero.policy = TRUE)
# Summary
summary(model_sar, Nagelkerke = TRUE)##
## Call:lagsarlm(formula = formula_ols, data = data_sf, listw = w_list,
## zero.policy = TRUE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -27.7142 -11.6589 -3.3297 7.5815 44.4236
##
## Type: lag
## Coefficients: (asymptotic standard errors)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.2285806 9.8712126 -0.2258 0.82138
## x1 0.0128092 0.0068202 1.8781 0.06036
## x2 0.0631910 0.3562512 0.1774 0.85921
##
## Rho: 0.088492, LR test value: 0.11027, p-value: 0.73984
## Asymptotic standard error: 0.24055
## z-value: 0.36787, p-value: 0.71297
## Wald statistic: 0.13533, p-value: 0.71297
##
## Log likelihood: -148.9015 for lag model
## ML residual variance (sigma squared): 289.8, (sigma: 17.024)
## Nagelkerke pseudo-R-squared: 0.12374
## Number of observations: 35
## Number of parameters estimated: 5
## AIC: 307.8, (AIC for lm: 305.91)
## LM test for residual autocorrelation
## test value: 1.1023, p-value: 0.29376
# Ekstrak hasil
sar_rho <- model_sar$rho
sar_aic <- AIC(model_sar)
sar_bic <- BIC(model_sar)
sar_loglik <- logLik(model_sar)
sar_pseudo_r2 <- summary(model_sar, Nagelkerke = TRUE)$NK
cat("\n=== RINGKASAN MODEL SAR ===\n")##
## === RINGKASAN MODEL SAR ===
## Rho (ρ) : 0.0885
## Pseudo R² : 0.1237
## AIC : 307.8
## BIC : 315.58
## Log-likelihood : -148.9
Interpretasi Model SAR:
Model SAR menangkap spatial spillover effect dengan persamaan :
\(y_i = \rho \sum_j w_{ij} y_j + \beta_1 x_{1i} + \beta_2 x_{2i} + \epsilon_i\)
Model Spatial Autoregressive (SAR) digunakan untuk menguji apakah terdapat pengaruh nilai kasus leptospirosis di suatu wilayah terhadap wilayah tetangganya. Hasil model SAR menunjukkan bahwa pengaruh spasial global tidak signifikan. Hal ini menegaskan bahwa kejadian leptospirosis di Jawa Tengah lebih dipengaruhi oleh karakteristik lokal wilayah dibandingkan efek spillover antarwilayah.
# Estimasi SEM
model_sem <- errorsarlm(formula_ols, data = data_sf, listw = w_list,
zero.policy = TRUE)
# Summary
summary(model_sem, Nagelkerke = TRUE)##
## Call:errorsarlm(formula = formula_ols, data = data_sf, listw = w_list,
## zero.policy = TRUE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -28.1271 -11.1673 -2.1158 7.0468 42.6718
##
## Type: error
## Coefficients: (asymptotic standard errors)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.37189480 9.47727598 -0.0392 0.96870
## x1 0.01381132 0.00677398 2.0389 0.04146
## x2 -0.00081442 0.34989298 -0.0023 0.99814
##
## Lambda: 0.17717, LR test value: 0.37313, p-value: 0.5413
## Asymptotic standard error: 0.23784
## z-value: 0.74492, p-value: 0.45632
## Wald statistic: 0.55491, p-value: 0.45632
##
## Log likelihood: -148.7701 for error model
## ML residual variance (sigma squared): 286.22, (sigma: 16.918)
## Nagelkerke pseudo-R-squared: 0.13029
## Number of observations: 35
## Number of parameters estimated: 5
## AIC: 307.54, (AIC for lm: 305.91)
# Ekstrak hasil
sem_lambda <- model_sem$lambda
sem_aic <- AIC(model_sem)
sem_bic <- BIC(model_sem)
sem_loglik <- logLik(model_sem)
sem_pseudo_r2 <- summary(model_sem, Nagelkerke = TRUE)$NK
cat("\n=== RINGKASAN MODEL SEM ===\n")##
## === RINGKASAN MODEL SEM ===
## Lambda (λ) : 0.1772
## Pseudo R² : 0.1303
## AIC : 307.54
## BIC : 315.32
## Log-likelihood : -148.77
Interpretasi Model SEM:
Model SEM menangkap spatial dependence pada error term:
\(y_i = \beta_1 x_{1i} + \beta_2 x_{2i} + u_i\) \(u_i = \lambda \sum_j w_{ij} u_j + \epsilon_i\)
Model SEM menunjukkan bahwa tidak terdapat ketergantungan spasial yang signifikan pada komponen error kasus leptospirosis di Jawa Tengah. Meskipun salah satu variabel independen berpengaruh signifikan, model SEM tidak memberikan peningkatan kinerja yang berarti dibandingkan model OLS.
# Estimasi SDM
model_sdm <- lagsarlm(formula_ols, data = data_sf, listw = w_list,
type = "mixed", zero.policy = TRUE)
# Summary
summary(model_sdm, Nagelkerke = TRUE)##
## Call:lagsarlm(formula = formula_ols, data = data_sf, listw = w_list,
## type = "mixed", zero.policy = TRUE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -21.4237 -12.4095 -4.4841 10.0453 41.8234
##
## Type: mixed
## Coefficients: (asymptotic standard errors)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -14.6805349 20.0978219 -0.7305 0.46511
## x1 0.0116266 0.0065451 1.7764 0.07567
## x2 0.1662768 0.3409782 0.4876 0.62580
## lag.x1 -0.0289227 0.0139748 -2.0696 0.03849
## lag.x2 1.6621811 0.8390971 1.9809 0.04760
##
## Rho: 0.1567, LR test value: 0.34751, p-value: 0.55553
## Asymptotic standard error: 0.23494
## z-value: 0.66698, p-value: 0.50478
## Wald statistic: 0.44486, p-value: 0.50478
##
## Log likelihood: -146.3513 for mixed model
## ML residual variance (sigma squared): 249.64, (sigma: 15.8)
## Nagelkerke pseudo-R-squared: 0.24257
## Number of observations: 35
## Number of parameters estimated: 7
## AIC: 306.7, (AIC for lm: 305.05)
## LM test for residual autocorrelation
## test value: 1.6173, p-value: 0.20347
# Ekstrak hasil
sdm_aic <- AIC(model_sdm)
sdm_bic <- BIC(model_sdm)
sdm_loglik <- logLik(model_sdm)
sdm_pseudo_r2 <- summary(model_sdm, Nagelkerke = TRUE)$NK
cat("\n=== RINGKASAN MODEL SDM ===\n")##
## === RINGKASAN MODEL SDM ===
## Pseudo R² : 0.2426
## AIC : 306.7
## BIC : 317.59
## Log-likelihood : -146.35
# Impact estimates (Direct, Indirect, Total)
impacts_sdm <- impacts(model_sdm, listw = w_list, R = 500)
cat("\n=== IMPACT ESTIMATES (SDM) ===\n")##
## === IMPACT ESTIMATES (SDM) ===
## Impact measures (mixed, exact):
## Direct Indirect Total
## x1 0.01073168 -0.03124173 -0.02051005
## x2 0.22202595 1.94619221 2.16821816
## ========================================================
## Simulation results ( variance matrix):
## Direct:
##
## Iterations = 1:500
## Thinning interval = 1
## Number of chains = 1
## Sample size per chain = 500
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## x1 0.01041 0.006825 0.0003052 0.0002705
## x2 0.22656 0.362600 0.0162160 0.0148897
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## x1 -0.003135 0.005753 0.01084 0.01484 0.02353
## x2 -0.467390 -0.017420 0.21435 0.45921 0.97001
##
## ========================================================
## Indirect:
##
## Iterations = 1:500
## Thinning interval = 1
## Number of chains = 1
## Sample size per chain = 500
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## x1 -0.03378 0.022 0.0009838 0.0009838
## x2 2.14726 1.397 0.0624889 0.0574128
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## x1 -0.09192 -0.04436 -0.03096 -0.02034 0.003922
## x2 -0.11188 1.37509 2.03176 2.74437 4.880112
##
## ========================================================
## Total:
##
## Iterations = 1:500
## Thinning interval = 1
## Number of chains = 1
## Sample size per chain = 500
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## x1 -0.02337 0.02471 0.001105 0.001028
## x2 2.37381 1.58659 0.070955 0.061748
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## x1 -0.09540 -0.034 -0.02125 -0.008541 0.01742
## x2 -0.06352 1.447 2.28636 3.087532 5.51719
##
## ========================================================
## Simulated standard errors
## Direct Indirect Total
## x1 0.006825108 0.02199777 0.02470529
## x2 0.362600108 1.39729482 1.58659409
##
## Simulated z-values:
## Direct Indirect Total
## x1 1.5250202 -1.535467 -0.9458877
## x2 0.6248096 1.536724 1.4961685
##
## Simulated p-values:
## Direct Indirect Total
## x1 0.12725 0.12467 0.34421
## x2 0.53210 0.12436 0.13461
Interpretasi Model SDM:
Model SDM adalah model paling general yang mencakup spatial lag pada Y dan X:
\(y_i = \rho \sum_j w_{ij} y_j + \beta_1 x_{1i} + \beta_2 x_{2i} + \theta_1 \sum_j w_{ij} x_{1j} + \theta_2 \sum_j w_{ij} x_{2j} + \epsilon_i\)
Model SDM menunjukkan bahwa meskipun tidak terdapat ketergantungan spasial langsung pada kasus leptospirosis antarwilayah, terdapat efek spillover yang signifikan melalui variabel independen.
# Tabel perbandingan
comparison_table <- data.frame(
Model = c("OLS", "SAR", "SEM", "SDM"),
AIC = c(ols_aic, sar_aic, sem_aic, sdm_aic),
BIC = c(BIC(model_ols), sar_bic, sem_bic, sdm_bic),
LogLik = c(as.numeric(logLik(model_ols)),
as.numeric(sar_loglik),
as.numeric(sem_loglik),
as.numeric(sdm_loglik)),
R2 = c(ols_r2, sar_pseudo_r2, sem_pseudo_r2, sdm_pseudo_r2)
) %>%
mutate(
Delta_AIC = AIC - min(AIC),
Rank_AIC = rank(AIC)
) %>%
arrange(AIC)
comparison_table %>%
kable(caption = "Tabel 2. Perbandingan Model Spatial Econometrics",
digits = 2) %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = FALSE) %>%
row_spec(which.min(comparison_table$AIC), bold = TRUE, color = "white", background = "#2b8cbe")| Model | AIC | BIC | LogLik | R2 | Delta_AIC | Rank_AIC |
|---|---|---|---|---|---|---|
| OLS | 305.91 | 312.13 | -148.96 | 0.12 | 0.00 | 1 |
| SDM | 306.70 | 317.59 | -146.35 | 0.24 | 0.79 | 2 |
| SEM | 307.54 | 315.32 | -148.77 | 0.13 | 1.63 | 3 |
| SAR | 307.80 | 315.58 | -148.90 | 0.12 | 1.89 | 4 |
# Visualisasi perbandingan AIC
ggplot(comparison_table, aes(x = reorder(Model, AIC), y = AIC, fill = Model)) +
geom_col() +
geom_text(aes(label = round(AIC, 1)), vjust = -0.5) +
scale_fill_brewer(palette = "Set2") +
labs(title = "Perbandingan AIC Antar Model",
subtitle = "Semakin rendah AIC, semakin baik model",
x = "Model", y = "AIC") +
theme_minimal() +
theme(legend.position = "none",
plot.title = element_text(face = "bold", size = 14))Interpretasi Perbandingan Model:
Dibandingkan model OLS, SAR, SEM, dan SDM, model OLS menunjukkan AIC terkecil sehingga kinerja OLS lebih baik dalam menjelaskan variasi kasus leptospirosis.
# Pilih model terbaik berdasarkan AIC
best_model_name <- comparison_table$Model[1]
if(best_model_name == "SAR") {
best_model <- model_sar
residuals_best <- residuals(model_sar)
} else if(best_model_name == "SEM") {
best_model <- model_sem
residuals_best <- residuals(model_sem)
} else if(best_model_name == "SDM") {
best_model <- model_sdm
residuals_best <- residuals(model_sdm)
} else {
best_model <- model_ols
residuals_best <- residuals(model_ols)
}
# Tambahkan residual ke data
data_sf$residual <- residuals_best
# Plot residual
p1 <- ggplot(data.frame(residual = residuals_best), aes(x = residual)) +
geom_histogram(bins = 20, fill = "#4292c6", alpha = 0.7, color = "white") +
geom_vline(xintercept = 0, linetype = "dashed", color = "red") +
labs(title = "Distribusi Residual", x = "Residual", y = "Frekuensi") +
theme_minimal()
p2 <- ggplot(data.frame(fitted = fitted(best_model), residual = residuals_best),
aes(x = fitted, y = residual)) +
geom_point(alpha = 0.6, color = "#4292c6") +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
geom_smooth(method = "loess", se = FALSE, color = "blue") +
labs(title = "Residual vs Fitted", x = "Fitted Values", y = "Residual") +
theme_minimal()
p3 <- ggplot(data.frame(residual = residuals_best), aes(sample = residual)) +
stat_qq(color = "#4292c6") +
stat_qq_line(color = "red", linetype = "dashed") +
labs(title = "Q-Q Plot", x = "Theoretical Quantiles", y = "Sample Quantiles") +
theme_minimal()
grid.arrange(p1, p2, p3, ncol = 2, nrow = 2)Gambar 7. Analisis Residual Model Terpilih
# Test Moran's I pada residual
moran_residual <- moran.test(residuals_best, w_list, zero.policy = TRUE)
cat("\n=== MORAN'S I PADA RESIDUAL ===\n")##
## === MORAN'S I PADA RESIDUAL ===
## Moran's I : 0.0587
## P-value : 0.1925
cat("Kesimpulan:", ifelse(moran_residual$p.value > 0.05,
"Tidak ada autokorelasi spasial pada residual (BAIK)",
"Masih ada autokorelasi spasial pada residual"), "\n")## Kesimpulan: Tidak ada autokorelasi spasial pada residual (BAIK)
Interpretasi :
Hasil ini dikategorikan sebagai BAIK dalam pemodelan spasial. Hal ini membuktikan bahwa model OLS yang Anda gunakan sudah mampu menangkap seluruh pola spasial dalam data Kasus Leptospirosis Jawa Tengah, sehingga sisaan (error) yang dihasilkan bersifat acak (random) dan tidak saling bergantung antar wilayah.
# Peta residual
tm_shape(data_sf) +
tm_polygons("residual",
palette = "RdBu",
style = "jenks",
midpoint = 0,
n = 7,
title = "Residual",
border.col = "white") +
tm_layout(main.title = paste("Peta Residual Model", best_model_name),
legend.outside = TRUE,
frame = FALSE) +
tm_scale_bar(position = c("left", "bottom")) +
tm_compass(position = c("right", "top"))Gambar 8. Peta Residual Model
Interpretasi Peta Residual:
Berdasarkan rangkaian analisis statistik spasial yang telah dilakukan terhadap data Leptospirosis di Provinsi Jawa Tengah periode 2022-2025, dapat ditarik beberapa kesimpulan utama sebagai berikut:
Pola Distribusi Spasial: Persebaran kasus Leptospirosis di Jawa Tengah menunjukkan adanya konsentrasi kasus yang fluktuatif, dengan tahun 2024 menjadi tahun puncak beban penyakit (258 kasus). Identifikasi melalui peta residual dan interpolasi menunjukkan wilayah pesisir utara (seperti Demak) dan wilayah tengah (Banyumas) memiliki risiko relatif lebih tinggi dibandingkan wilayah lainnya.
Hasil Uji Autokorelasi: Meskipun terdapat indikasi visual adanya pengelompokan kasus, hasil uji Geary’s C menunjukkan nilai 0,9194 dengan \(p\text{-value}\) 0,2409, yang berarti pola persebaran kasus secara lokal cenderung bersifat acak (random) pada tingkat signifikansi 5%. Hal ini mengindikasikan bahwa keterkaitan antar wilayah bertetangga tidak selalu linear atau seragam di seluruh kabupaten.
Pemilihan Model Terbaik: Melalui perbandingan nilai Akaike Information Criterion (AIC), model Ordinary Least Square (OLS) terpilih sebagai model yang paling efisien dengan nilai AIC terendah sebesar 305,9. Penambahan bobot spasial pada model (SAR, SEM, dan SDM) tidak memberikan peningkatan kebaikan suai (goodness of fit) yang signifikan dibandingkan model linear klasik untuk dataset ini.
Validitas : Model OLS terbukti valid secara spasial karena uji Moran’s I pada residual menghasilkan nilai 0,0587 dengan \(p\text{-value}\) 0,1925.
Penggunaan Interpolasi (IDW): Disarankan untuk menerapkan teknik Inverse Distance Weighting (IDW) yang divalidasi dengan Cross Validation guna memetakan gradien risiko secara kontinu yang tidak dibatasi oleh batas administratif kabupaten.
Analisis Temporal: Perlu dilakukan analisis spasio-temporal (seperti Spatial Panel Data) untuk melihat bagaimana tren perpindahan klaster penyakit berubah dari tahun 2022 hingga 2025 secara simultan.
Anselin, L. (1988). Spatial Econometrics: Methods and Models. Dordrecht: Kluwer Academic Publishers.
Bivand, R.S., Pebesma, E., & Gomez-Rubio, V. (2013). Applied Spatial Data Analysis with R. 2nd ed. New York: Springer.
Cressie, N. (1993). Statistics for Spatial Data. New York: John Wiley & Sons.
Elhorst, J.P. (2014). Spatial Econometrics: From Cross-Sectional Data to Spatial Panels. Berlin: Springer.
Getis, A., & Ord, J.K. (1992). The Analysis of Spatial Association by Use of Distance Statistics. Geographical Analysis, 24(3), 189-206.
LeSage, J., & Pace, R.K. (2009). Introduction to Spatial Econometrics. Boca Raton: CRC Press.
Tobler, W.R. (1970). A Computer Movie Simulating Urban Growth in the Detroit Region. Economic Geography, 46(sup1), 234-240.
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=English_United States.utf8
## [2] LC_CTYPE=English_United States.utf8
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.utf8
##
## time zone: Asia/Jakarta
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] gstat_2.1-3 stringr_1.5.1 GWmodel_2.4-1
## [4] Rcpp_1.0.14 sp_2.2-0 robustbase_0.99-4-1
## [7] gridExtra_2.3 scales_1.4.0 corrplot_0.95
## [10] plotly_4.11.0 leaflet_2.2.3 RColorBrewer_1.1-3
## [13] viridis_0.6.5 viridisLite_0.4.2 kableExtra_1.4.0
## [16] knitr_1.49 tidyr_1.3.1 dplyr_1.1.4
## [19] ggplot2_4.0.0 tmap_4.2 spatialreg_1.3-6
## [22] Matrix_1.6-1.1 spdep_1.3-10 spData_2.3.4
## [25] sf_1.0-20 readxl_1.4.5
##
## loaded via a namespace (and not attached):
## [1] DBI_1.2.3 deldir_2.0-4 tmaptools_3.3
## [4] s2_1.1.7 logger_0.4.1 sandwich_3.1-1
## [7] rlang_1.1.4 magrittr_2.0.3 multcomp_1.4-29
## [10] e1071_1.7-16 compiler_4.3.1 mgcv_1.8-42
## [13] png_0.1-8 systemfonts_1.2.2 vctrs_0.6.5
## [16] pkgconfig_2.0.3 wk_0.9.4 fastmap_1.2.0
## [19] labeling_0.4.3 lwgeom_0.2-14 leafem_0.2.5
## [22] utf8_1.2.4 rmarkdown_2.29 spacesXYZ_1.6-0
## [25] purrr_1.0.4 xfun_0.52 cachem_1.1.0
## [28] jsonlite_1.8.9 terra_1.8-29 parallel_4.3.1
## [31] LearnBayes_2.15.1 R6_2.6.1 bslib_0.9.0
## [34] stringi_1.8.4 boot_1.3-28.1 jquerylib_0.1.4
## [37] cellranger_1.1.0 stars_0.6-8 zoo_1.8-12
## [40] base64enc_0.1-3 FNN_1.1.4.1 splines_4.3.1
## [43] tidyselect_1.2.1 rstudioapi_0.17.1 abind_1.4-8
## [46] yaml_2.3.10 maptiles_0.10.0 codetools_0.2-19
## [49] intervals_0.15.5 lattice_0.21-8 tibble_3.2.1
## [52] leafsync_0.1.0 withr_3.0.2 S7_0.2.0
## [55] coda_0.19-4.1 evaluate_1.0.3 survival_3.5-5
## [58] units_0.8-7 proxy_0.4-27 xts_0.14.1
## [61] xml2_1.3.8 pillar_1.10.1 KernSmooth_2.23-21
## [64] generics_0.1.3 spacetime_1.3-3 class_7.3-23
## [67] glue_1.8.0 lazyeval_0.2.2 tools_4.3.1
## [70] leaflegend_1.2.1 data.table_1.16.4 mvtnorm_1.3-3
## [73] XML_3.99-0.18 grid_4.3.1 crosstalk_1.2.1
## [76] colorspace_2.1-1 nlme_3.1-162 cols4all_0.9
## [79] raster_3.6-32 cli_3.6.1 svglite_2.1.3
## [82] DEoptimR_1.1-4 gtable_0.3.6 sass_0.4.9
## [85] digest_0.6.33 classInt_0.4-11 TH.data_1.1-4
## [88] htmlwidgets_1.6.4 farver_2.1.2 htmltools_0.5.8.1
## [91] lifecycle_1.0.4 httr_1.4.7 microbenchmark_1.5.0
## [94] MASS_7.3-60
Dashboard Interaktif: Dashboard Leptospirosis Jateng
Video Presentasi:
Data Source:
Variabel Independen : Badan Pusat Statistik (BPS) Provinsi Jawa Tengah
Variabel Dependen : Portal Data Jawa Tengah
Analisis ini menggunakan bantuan AI tools (Claude AI by Anthropic) untuk:
- Menyusun struktur kode R dan RMarkdown
- Membantu visualisasi data dan peta
Namun, semua penjelasan, narasi, interpretasi, dan kesimpulan merupakan hasil pemahaman dan pemikiran mandiri penulis.
TERIMA KASIH
“In God we trust, all others must bring data” - W. Edwards Deming
“Geography matters” - Paul Krugman