library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Data paparan (Zij) - 8 individu, 10 tahun paparan, kolom ke-11 adalah status infeksi akhir
data <- matrix(c(
0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1,
0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0,
0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0
), nrow = 8, byrow = TRUE)
Pemisahan data
Zij <- data[, 1:10] # Data paparan (8 individu, 10 tahun)
H <- data[, 11] # Status infeksi akhir
Inisialisasi probabilitas infeksi awal (P_j)
J <- ncol(Zij) # Jumlah tahun paparan
n <- nrow(Zij) # Jumlah individu
P_j <- rep(0.1, J) # Probabilitas infeksi awal
max_iter <- 100 # Jumlah iterasi maksimum
tol <- 1e-6 # Toleransi konvergensi
Algoritma EM
for (iter in 1:max_iter) {
# E-step: Menghitung ekspektasi E(Xij | Hi, P_j)
E_Xij <- matrix(0, n, J) # Inisialisasi E(Xij) dengan nol
for (i in 1:n) {
if (H[i] == 1) { # Hanya untuk individu yang akhirnya terinfeksi
denom <- 1 - prod(1 - Zij[i, ] * P_j, na.rm = TRUE) # Penyebut
if (!is.na(denom) && denom > 0) { # Pastikan denom bukan NaN atau nol
E_Xij[i, ] <- Zij[i, ] * P_j / denom
} else {
E_Xij[i, ] <- 0 # Jika denom nol, tetapkan ke nol untuk menghindari NaN
}
}
}
# M-step: Update probabilitas infeksi P_j
sum_Zij <- colSums(Zij, na.rm = TRUE) # Menghitung jumlah paparan per tahun
sum_E_Xij <- colSums(E_Xij, na.rm = TRUE) # Menghitung jumlah ekspektasi
new_P_j <- ifelse(sum_Zij > 0, sum_E_Xij / sum_Zij, 0) # Update dengan kondisi valid
# Pastikan nilai P_j tetap dalam rentang [0, 1]
new_P_j <- pmax(0, pmin(new_P_j, 1))
# Cetak hasil iterasi
cat("Iterasi:", iter, "P_j:", round(new_P_j, 6), "\n")
# Cek konvergensi
if (sum(abs(new_P_j - P_j), na.rm = TRUE) < tol) {
cat("Konvergen pada iterasi:", iter, "\n")
break
}
P_j <- new_P_j # Update nilai P_j untuk iterasi selanjutnya
}
## Iterasi: 1 P_j: 0 0.123001 0 0.184502 0.246002 0.5 0.369004 0 0.123001 0
## Iterasi: 2 P_j: 0 0.097601 0 0.150734 0.329189 0.5 0.602937 0 0.097601 0
## Iterasi: 3 P_j: 0 0.071701 0 0.097399 0.383639 0.5 0.779195 0 0.071701 0
## Iterasi: 4 P_j: 0 0.050976 0 0.05552 0.418536 0.5 0.888316 0 0.050976 0
## Iterasi: 5 P_j: 0 0.035674 0 0.029574 0.441532 0.5 0.946361 0 0.035674 0
## Iterasi: 6 P_j: 0 0.024739 0 0.01523 0.457778 0.5 0.974695 0 0.024739 0
## Iterasi: 7 P_j: 0 0.017029 0 0.007719 0.469778 0.5 0.988045 0 0.017029 0
## Iterasi: 8 P_j: 0 0.011639 0 0.003884 0.47868 0.5 0.994299 0 0.011639 0
## Iterasi: 9 P_j: 0 0.007906 0 0.001948 0.485172 0.5 0.997251 0 0.007906 0
## Iterasi: 10 P_j: 0 0.005342 0 0.000975 0.489807 0.5 0.998662 0 0.005342 0
## Iterasi: 11 P_j: 0 0.003596 0 0.000488 0.493055 0.5 0.999343 0 0.003596 0
## Iterasi: 12 P_j: 0 0.002413 0 0.000244 0.495297 0.5 0.999676 0 0.002413 0
## Iterasi: 13 P_j: 0 0.001616 0 0.000122 0.49683 0.5 0.999839 0 0.001616 0
## Iterasi: 14 P_j: 0 0.001081 0 6.1e-05 0.49787 0.5 0.99992 0 0.001081 0
## Iterasi: 15 P_j: 0 0.000722 0 3.1e-05 0.498572 0.5 0.99996 0 0.000722 0
## Iterasi: 16 P_j: 0 0.000482 0 1.5e-05 0.499044 0.5 0.99998 0 0.000482 0
## Iterasi: 17 P_j: 0 0.000322 0 8e-06 0.499361 0.5 0.99999 0 0.000322 0
## Iterasi: 18 P_j: 0 0.000215 0 4e-06 0.499573 0.5 0.999995 0 0.000215 0
## Iterasi: 19 P_j: 0 0.000143 0 2e-06 0.499715 0.5 0.999998 0 0.000143 0
## Iterasi: 20 P_j: 0 9.5e-05 0 1e-06 0.49981 0.5 0.999999 0 9.5e-05 0
## Iterasi: 21 P_j: 0 6.4e-05 0 0 0.499873 0.5 0.999999 0 6.4e-05 0
## Iterasi: 22 P_j: 0 4.2e-05 0 0 0.499915 0.5 1 0 4.2e-05 0
## Iterasi: 23 P_j: 0 2.8e-05 0 0 0.499943 0.5 1 0 2.8e-05 0
## Iterasi: 24 P_j: 0 1.9e-05 0 0 0.499962 0.5 1 0 1.9e-05 0
## Iterasi: 25 P_j: 0 1.3e-05 0 0 0.499975 0.5 1 0 1.3e-05 0
## Iterasi: 26 P_j: 0 8e-06 0 0 0.499983 0.5 1 0 8e-06 0
## Iterasi: 27 P_j: 0 6e-06 0 0 0.499989 0.5 1 0 6e-06 0
## Iterasi: 28 P_j: 0 4e-06 0 0 0.499993 0.5 1 0 4e-06 0
## Iterasi: 29 P_j: 0 2e-06 0 0 0.499995 0.5 1 0 2e-06 0
## Iterasi: 30 P_j: 0 2e-06 0 0 0.499997 0.5 1 0 2e-06 0
## Iterasi: 31 P_j: 0 1e-06 0 0 0.499998 0.5 1 0 1e-06 0
## Iterasi: 32 P_j: 0 1e-06 0 0 0.499999 0.5 1 0 1e-06 0
## Iterasi: 33 P_j: 0 0 0 0 0.499999 0.5 1 0 0 0
## Konvergen pada iterasi: 33
Hasil estimasi probabilitas infeksi per tahun
cat("Probabilitas infeksi final per tahun:\n")
## Probabilitas infeksi final per tahun:
print(round(P_j, 6))
## [1] 0.000000 0.000001 0.000000 0.000000 0.499999 0.500000 1.000000 0.000000
## [9] 0.000001 0.000000