# ANALISIS PENGUKURAN BERULANG KADAR BERAT BADAN: 2 KELOMPOK x 3 WAKTU
# Mahasiswa: Ika Wulan Sari
# NIM: 2611018005
# Jalankan seluruh script melalui Source di RStudio.
# Letakkan script ini dan journal.pone.0257326.s004 (1).xlsx dalam folder yang sama.
# Laporan HTML dibuat otomatis setelah seluruh analisis selesai.
#
# **Nama:** Ika Wulan Sari 
# **NIM:** 2611018005  
# **Mata Kuliah:** Biostatistika Intermediate  
# **Program Studi:** Magister Kesehatan Masyarakat Universitas Mulawarman
#
# ## Metode
# Data mencakup dua kelompok dan tiga pengukuran berat badan per peserta.
# Analisis meliputi repeated-measures ANOVA satu arah pada kelompok intervention, mixed ANOVA kelompok x waktu, koreksi
# Greenhouse-Geisser, pendekatan multivariat, post hoc, kontras interaksi,
# alternatif nonparametrik, dan linear mixed model (LMM).
# Baseline, bulan ke-3, dan bulan ke-6 berjarak sama.
# Outcome utama: berat badan dari WeightKg, Weightkg.M3, dan Weightkg.M6.
# ANOVA/nonparametrik: peserta lengkap; LMM: seluruh pengukuran tersedia.
# Sumber: journal.pone.0257326.s004 (1).xlsx, sheet data_set.
# Satuan berat badan: kg berdasarkan nama kolom. Kode -999 dan 999 pada berat badan/usia menjadi NA.
# ID dibuat dari urutan baris karena tidak ada kolom ID pada workbook.
# ======================= PARAMETER ANALISIS =========================
FILE_DATA <- "journal.pone.0257326.s004 (1).xlsx"
SHEET_DATA <- "data_set"
FOLDER_HASIL <- "Hasil_Analisis_Berat_Badan_Ika_Wulan_Sari"
INSTALL_PAKET_OTOMATIS <- TRUE
BUKA_HTML_OTOMATIS <- TRUE

analisis_berat_badan <- function() {
  paket <- c("readxl", "dplyr", "tidyr", "ggplot2", "afex", "emmeans", "rstatix",
             "car", "effectsize", "lme4", "lmerTest", "pbkrtest",
             "performance", "ggpubr", "WRS2", "htmltools", "base64enc")
  belum <- paket[!vapply(paket, requireNamespace, logical(1), quietly = TRUE)]
  if (length(belum)) {
    if (!INSTALL_PAKET_OTOMATIS)
      stop("Paket belum tersedia: ", paste(belum, collapse = ", "))
    install.packages(belum, repos = "https://cloud.r-project.org")
  }
  gagal <- paket[!vapply(paket, requireNamespace, logical(1), quietly = TRUE)]
  if (length(gagal)) stop("Paket belum tersedia: ", paste(gagal, collapse = ", "))
  suppressPackageStartupMessages({
    library(dplyr); library(tidyr); library(ggplot2)
  })
  opsi_lama <- options(contrasts = c("contr.sum", "contr.poly"), width = 120)
  on.exit(options(opsi_lama), add = TRUE)
  afex::afex_options(emmeans_model = "multivariate")
  theme_set(theme_bw(base_size = 12))
  set.seed(2026)
  # Cari data di folder script dan direktori kerja.
  sumber <- unlist(lapply(sys.frames(), function(fr) {
    if (!is.null(fr$ofile)) as.character(fr$ofile) else character(0)
  }))
  if (requireNamespace("rstudioapi", quietly = TRUE) && rstudioapi::isAvailable()) {
    aktif <- tryCatch(rstudioapi::getSourceEditorContext()$path,
                     error = function(e) "")
    if (nzchar(aktif)) sumber <- c(sumber, aktif)
  }
  nama_data <- c(FILE_DATA, "01-journal.pone.0257326.s004-1-.xlsx")
  kandidat <- unique(c(unlist(lapply(dirname(sumber), function(d) file.path(d, nama_data))), nama_data))
  kandidat <- kandidat[file.exists(kandidat)]
  if (!length(kandidat)) stop(
    "Berkas Excel tidak ditemukan. Letakkan data dan script dalam folder yang sama, ",
    "atau isi FILE_DATA dengan lokasi lengkap berkas. Nama yang dicari: ", FILE_DATA)
  path_data <- normalizePath(kandidat[1], winslash = "/", mustWork = TRUE)
  if (!SHEET_DATA %in% readxl::excel_sheets(path_data))
    stop("Sheet tidak ditemukan: ", SHEET_DATA)
  folder <- file.path(dirname(path_data), FOLDER_HASIL)
  message("Data: ", path_data, "\nSheet: ", SHEET_DATA, "\nHasil: ", folder)
  dir.create(folder, recursive = TRUE, showWarnings = FALSE)
  hasil <- list(); isi <- list(); grafik <- list()
  teks <- function(judul, x) {
    cat("\n", judul, "\n", sep = "")
    cat(x, "\n")
    isi[[length(isi) + 1L]] <<- htmltools::tagList(
      htmltools::tags$h2(judul), htmltools::tags$p(x))
  }
  tampil <- function(nama, x) {
    hasil[[nama]] <<- x
    cat("\n", gsub("_", " ", nama), "\n", sep = "")
    print(x)
    cetak <- capture.output(print(x))
    writeLines(cetak, file.path(folder, paste0(nama, "_Ika_Wulan_Sari.txt")))
    if (is.data.frame(x)) write.csv(x, file.path(folder, paste0(nama, "_Ika_Wulan_Sari.csv")), row.names = FALSE)
    isi[[length(isi) + 1L]] <<- htmltools::tagList(
      htmltools::tags$h2(gsub("_", " ", nama)),
      htmltools::tags$pre(paste(cetak, collapse = "\n")))
    invisible(x)
  }
  gambar <- function(nama, p, lebar = 11, tinggi = 6) {
    print(p)
    berkas <- file.path(folder, paste0(nama, "_Ika_Wulan_Sari.png"))
    ggsave(berkas, plot = p, width = lebar, height = tinggi, dpi = 300, bg = "white")
    grafik[[nama]] <<- p
    isi[[length(isi) + 1L]] <<- htmltools::tagList(
      htmltools::tags$h2(gsub("_", " ", nama)),
      htmltools::tags$img(src = base64enc::dataURI(file = berkas, mime = "image/png"),
                         style = "max-width:100%;height:auto;"))
    invisible(p)
  }
  opsional <- function(nama, ekspresi) {
    tryCatch(tampil(nama, ekspresi), error = function(e) {
      teks(nama, paste("Analisis tidak dapat diestimasi:", conditionMessage(e)))
      invisible(NULL)
    })
  }
  fp <- function(p) ifelse(is.na(p), "NA", ifelse(p < .001, "< 0,001",
                          paste0("= ", formatC(p, digits = 3, format = "f", decimal.mark = ","))))

  asli <- as.data.frame(readxl::read_excel(path_data, sheet = SHEET_DATA))
  names(asli) <- trimws(names(asli))
  wajib <- c("Group", "Ageyears", "Gender", "WeightKg", "Weightkg.M3", "Weightkg.M6")
  if (!all(wajib %in% names(asli))) stop("Kolom tidak ditemukan: ", paste(setdiff(wajib, names(asli)), collapse = ", "))
  angka <- function(x) {
    x <- trimws(as.character(x))
    x[x %in% c("", "-999", "999", "#NULL!", "NA")] <- NA_character_
    y <- suppressWarnings(as.numeric(x))
    if (any(!is.na(x) & is.na(y))) stop("Nilai tidak numerik pada kolom analisis.")
    if (any(!is.na(y) & !is.finite(y))) stop("Nilai tak hingga pada kolom analisis.")
    y
  }
  if (!nrow(asli)) stop("Tidak ada peserta.")
  dat_wide <- data.frame(id = sprintf("ROW%03d", seq_len(nrow(asli))),
    baris_excel = seq_len(nrow(asli)) + 1L,
    kelompok = trimws(as.character(asli$Group)), usia = angka(asli$Ageyears),
    jk = trimws(as.character(asli$Gender)), BB_M0 = angka(asli$WeightKg),
    BB_M3 = angka(asli$Weightkg.M3), BB_M6 = angka(asli$Weightkg.M6))
  dat_wide$jk[dat_wide$jk %in% c("9", "999", "-999", "")] <- NA_character_
  kelompok <- c("control", "intervention")
  if (anyNA(dat_wide$kelompok) || !setequal(unique(dat_wide$kelompok), kelompok))
    stop("Group harus berisi control dan intervention.")
  kolom_bb <- c("BB_M0", "BB_M3", "BB_M6")
  if (any(as.matrix(dat_wide[kolom_bb]) <= 0, na.rm = TRUE)) stop("Berat badan nonpositif ditemukan.")
  bulan <- c(0, 3, 6)
  dat_wide <- dat_wide |> mutate(id = factor(id), kelompok = factor(kelompok, levels = c("control", "intervention")))
  long_semua <- dat_wide |>
    pivot_longer(all_of(kolom_bb), names_to = "waktu", values_to = "berat_badan") |>
    mutate(waktu = factor(waktu, levels = kolom_bb, labels = c("M0", "M3", "M6")),
           bulan = bulan[as.integer(waktu)]) |> arrange(id, waktu)
  lengkap <- complete.cases(dat_wide[kolom_bb])
  wide_lengkap <- droplevels(dat_wide[lengkap, , drop = FALSE])
  dat_long <- droplevels(filter(long_semua, id %in% wide_lengkap$id))
  dat_lmm <- droplevels(filter(long_semua, !is.na(berat_badan)))
  if (any(table(wide_lengkap$kelompok) < 3)) stop("Peserta lengkap per kelompok kurang dari tiga.")
  teks("Identitas", paste("Nama: Ika Wulan Sari | NIM: 2611018005 |",
       "Mata Kuliah: Biostatistika Intermediate | Magister Kesehatan Masyarakat Universitas Mulawarman"))
  teks("Desain", paste(nrow(dat_wide), "peserta; dua kelompok; tiga waktu (M0, M3, M6).",
    sum(lengkap), "peserta lengkap untuk ANOVA;", sum(is.na(long_semua$berat_badan)),
    "pengukuran hilang; LMM menggunakan", nrow(dat_lmm), "pengukuran tersedia. Outcome: berat badan (kg)."))
  tampil("00_Kelengkapan", long_semua |> group_by(kelompok, waktu) |>
    summarise(peserta = n(), tersedia = sum(!is.na(berat_badan)), hilang = sum(is.na(berat_badan)), .groups = "drop"))
  teks("Penanganan data", "ID ROW dibuat dari urutan baris, dengan baris_excel untuk penelusuran; setiap baris diasumsikan satu peserta sesuai struktur wide. Kode -999 dan 999 pada berat badan/usia dibaca sebagai NA. Nilai berat badan 999 pada bulan 6 diperlakukan sebagai kode hilang berdasarkan pola kode pada baris yang sama (usia 999, gender 9, aktivitas -999). Tidak dilakukan imputasi. Kolom turunan overall_PA dan delta_M6_BL tidak digunakan. ANOVA, Friedman, Wilcoxon, dan robust RM memakai peserta lengkap; LMM memakai seluruh pengukuran berat badan tersedia. Hasil kedua pendekatan dapat berbeda karena sampel berbeda.")
  tampil("01_Jumlah_Peserta", dat_wide |> count(kelompok, name = "n"))
  tampil("01a_Usia", dat_wide |> group_by(kelompok) |> summarise(n = n(), mean = mean(usia, na.rm = TRUE), sd = sd(usia, na.rm = TRUE), min = min(usia, na.rm = TRUE), max = max(usia, na.rm = TRUE), .groups = "drop"))
  tampil("01b_Jenis_Kelamin", dat_wide |> count(kelompok, jk))
  teks("Berkas data yang digunakan", paste(path_data, "| Sheet:", SHEET_DATA))
  teks("Sumber data", "Workbook lampiran journal.pone.0257326.s004 (1).xlsx, sheet data_set. Berat badan menggunakan WeightKg, Weightkg.M3, dan Weightkg.M6; kelompok memakai Group. Analisis ini adalah adaptasi metode latihan, bukan reproduksi seluruh analisis artikel.")
  tampil("02_Data_Wide", head(dat_wide))
  tampil("03_Data_Long", head(dat_long, 12))
  desk <- dat_lmm |> group_by(kelompok, waktu, bulan) |>
    summarise(n = n(), mean = mean(berat_badan), sd = sd(berat_badan), median = median(berat_badan),
              min = min(berat_badan), max = max(berat_badan), se = sd / sqrt(n),
              lower = mean - qt(.975, n - 1) * se,
              upper = mean + qt(.975, n - 1) * se, .groups = "drop")
  tampil("04_Deskriptif", desk)
  teks("Sampel deskriptif", "Tabel deskriptif dan grafik profil rerata menggunakan seluruh berat badan yang tersedia pada tiap waktu. Tabel ANOVA serta grafik profil mixed ANOVA menggunakan peserta dengan tiga pengukuran lengkap.")
  tampil("05_Kovarians", cov(wide_lengkap[kolom_bb]))
  tampil("06_Korelasi", cor(wide_lengkap[kolom_bb]))
  pasangan <- combn(kolom_bb, 2)
  tampil("07_Varians_Selisih", data.frame(
    pasangan = apply(pasangan, 2, paste, collapse = " - "),
    varians = apply(pasangan, 2, function(p) var(wide_lengkap[[p[1]]] - wide_lengkap[[p[2]]]))))
  gambar("G01_Profil_Rerata_CI95", ggplot(desk, aes(bulan, mean, color = kelompok, group = kelompok)) +
    geom_line(linewidth = 1) + geom_point(size = 3) +
    geom_errorbar(aes(ymin = lower, ymax = upper), width = .5) +
    scale_x_continuous(breaks = bulan) +
    labs(title = "Profil rerata berat badan dan interval kepercayaan 95%", x = "Bulan", y = "Berat badan (kg)", color = "Kelompok") +
    theme(legend.position = "bottom"))
  gambar("G02_Lintasan_Individu", ggplot(long_semua, aes(bulan, berat_badan, group = id)) +
    geom_line(alpha = .25) + stat_summary(aes(group = kelompok), fun = mean,
      geom = "line", color = "firebrick", linewidth = 1.2) +
    facet_wrap(~ kelompok) + scale_x_continuous(breaks = bulan) +
    labs(title = "Lintasan individu dan rerata kelompok", x = "Bulan", y = "Berat badan (kg)"))
  gambar("G03_Boxplot", ggplot(dat_long, aes(waktu, berat_badan, fill = kelompok)) +
    geom_boxplot() + labs(title = "Distribusi berat badan berdasarkan kelompok dan waktu", x = "Waktu", y = "Berat badan (kg)", fill = "Kelompok") +
    theme(legend.position = "bottom"))

  d1 <- droplevels(filter(dat_long, kelompok == "intervention"))
  tampil("08_Outlier_Satu_Kelompok", d1 |> group_by(waktu) |> rstatix::identify_outliers(berat_badan))
  tampil("09_Shapiro_Satu_Kelompok", d1 |> group_by(waktu) |> rstatix::shapiro_test(berat_badan))
  gambar("G04_QQ_Satu_Kelompok", ggpubr::ggqqplot(d1, "berat_badan", facet.by = "waktu"))
  aov1_rs <- rstatix::anova_test(data = d1, dv = berat_badan, wid = id, within = waktu, effect.size = "pes")
  tampil("10_ANOVA_Rstatix_Satu_Kelompok", aov1_rs)
  aov1 <- afex::aov_ez(id = "id", dv = "berat_badan", data = d1, within = "waktu",
                       anova_table = list(es = c("ges", "pes"), correction = "GG"))
  tampil("11_RM_ANOVA", aov1)
  tampil("12_Sferisitas_dan_Koreksi_RM", summary(aov1))
  tampil("13_Multivariat_RM", aov1$Anova)
  tampil("14_Eta_Kuadrat_RM", effectsize::eta_squared(aov1, partial = TRUE))
  em1 <- emmeans::emmeans(aov1, ~ waktu)
  tampil("15_EMM_RM", as.data.frame(em1))
  tampil("16_Posthoc_RM_Bonferroni", as.data.frame(pairs(em1, adjust = "bonferroni")))
  tampil("17_RM_vs_Baseline_Holm", as.data.frame(emmeans::contrast(em1, "trt.vs.ctrl", ref = 1, adjust = "holm")))
  tampil("18_Tren_Polinomial_RM", as.data.frame(emmeans::contrast(em1, "poly")))
  tampil("19_Friedman", rstatix::friedman_test(d1, berat_badan ~ waktu | id))
  tampil("20_Kendall_W", rstatix::friedman_effsize(d1, berat_badan ~ waktu | id))
  tampil("21_Wilcoxon_Berpasangan", d1 |> arrange(waktu, id) |>
           rstatix::wilcox_test(berat_badan ~ waktu, paired = TRUE, p.adjust.method = "bonferroni"))
  opsional("22_Robust_RM_Trim20", WRS2::rmanova(d1$berat_badan, d1$waktu, d1$id, tr = .2))

  tampil("23_Outlier_Mixed", dat_long |> group_by(kelompok, waktu) |> rstatix::identify_outliers(berat_badan))
  tampil("24_Shapiro_Mixed", dat_long |> group_by(kelompok, waktu) |> rstatix::shapiro_test(berat_badan))
  gambar("G05_QQ_Mixed", ggpubr::ggqqplot(dat_long, "berat_badan", ggtheme = theme_bw()) +
           facet_grid(waktu ~ kelompok), tinggi = 9)
  tampil("25_Levene", dat_long |> group_by(waktu) |> rstatix::levene_test(berat_badan ~ kelompok))
  tampil("26_Box_M", rstatix::box_m(wide_lengkap[kolom_bb], wide_lengkap$kelompok))
  aov2 <- afex::aov_ez(id = "id", dv = "berat_badan", data = dat_long, between = "kelompok", within = "waktu",
                       anova_table = list(es = c("ges", "pes"), correction = "GG"))
  tampil("27_Mixed_ANOVA", aov2)
  tampil("28_Sferisitas_dan_Koreksi_Mixed", summary(aov2))
  tampil("29_Multivariat_Mixed", aov2$Anova)
  tampil("30_Eta_Kuadrat_Mixed", effectsize::eta_squared(aov2, partial = TRUE))
  gambar("G06_Profil_Mixed_ANOVA", afex::afex_plot(aov2, x = "waktu", trace = "kelompok",
           error = "within", mapping = c("colour", "shape", "linetype")) +
           labs(title = "Profil mixed ANOVA", x = "Waktu", y = "Berat badan (kg)"))
  teks("Interval grafik mixed ANOVA", "Interval within-subject pada grafik afex berbeda dari interval kepercayaan rerata biasa pada grafik profil deskriptif.")
  tampil("31_Efek_Waktu_per_Kelompok", as.data.frame(emmeans::joint_tests(aov2, by = "kelompok")))
  tampil("32_Efek_Kelompok_per_Waktu", as.data.frame(emmeans::joint_tests(aov2, by = "waktu")))
  em2 <- emmeans::emmeans(aov2, ~ waktu | kelompok)
  em2b <- emmeans::emmeans(aov2, ~ kelompok | waktu)
  tampil("33_EMM_Waktu_per_Kelompok", as.data.frame(em2))
  tampil("34_Waktu_vs_Baseline_Holm", as.data.frame(emmeans::contrast(em2, "trt.vs.ctrl", ref = 1, adjust = "holm")))
  tampil("35_Antarkelompok_Tukey", as.data.frame(pairs(em2b, adjust = "tukey")))
  em_full <- emmeans::emmeans(aov2, ~ waktu * kelompok)
  ki <- emmeans::contrast(em_full, interaction = list(
    waktu = list("M6-M0" = c(-1, 0, 1)), kelompok = "pairwise"), adjust = "holm")
  tampil("36_Kontras_Perbedaan_Perubahan", as.data.frame(ki))
  tren <- as.data.frame(emmeans::contrast(em_full,
    interaction = c(waktu = "poly", kelompok = "pairwise"), adjust = "none"))
  tren_lin <- subset(tren, waktu_poly == "linear")
  tren_lin$p.holm <- p.adjust(tren_lin$p.value, "holm")
  tampil("37_Kontras_Tren_Linear", tren_lin)
  teks("Koreksi perbandingan", "Holm untuk waktu versus baseline berlaku dalam tiap kelompok; Tukey berlaku dalam tiap waktu. Kontras perbedaan perubahan dan tren linear memakai Holm pada masing-masing keluarga kontras.")
  tabel_gg <- as.data.frame(afex::nice(aov2, correction = "GG", es = "pes"))
  tampil("38_Tabel_ANOVA_GG", tabel_gg)
  tab_num <- as.data.frame(aov2$anova_table)
  if ("kelompok:waktu" %in% rownames(tab_num)) {
    r <- tab_num["kelompok:waktu", , drop = FALSE]
    teks("Interpretasi interaksi", paste0("Mixed ANOVA dengan koreksi Greenhouse-Geisser menghasilkan interaksi kelompok x waktu: F(",
      round(r[["num Df"]], 2), ", ", round(r[["den Df"]], 2), ") = ", round(r[["F"]], 3),
      "; p ", fp(r[["Pr(>F)"]]), ". ",
      if (r[["Pr(>F)"]] < .05) "Pola perubahan berat badan berbeda secara statistik antar kelompok."
      else "Belum ditemukan bukti statistik perbedaan pola perubahan berat badan antar kelompok.",
      " Arah dan besarnya perbedaan dinilai dari rerata serta kontras perubahan M6-M0."))
  }

  kontrol <- lme4::lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 200000))
  lmm1 <- lmerTest::lmer(berat_badan ~ kelompok * waktu + (1 | id), data = dat_lmm, REML = TRUE, control = kontrol)
  lmm2 <- lmerTest::lmer(berat_badan ~ kelompok * waktu + (1 + bulan | id), data = dat_lmm, REML = TRUE, control = kontrol)
  tampil("39_LMM_Intersep", summary(lmm1))
  tampil("40_LMM_Intersep_Slope", summary(lmm2))
  tampil("41_Perbandingan_LMM_REML", anova(lmm1, lmm2, refit = FALSE))
  teks("Perbandingan model", "Kedua model mempunyai fixed effects yang sama. Perbandingan REML mengikuti materi; nilai p likelihood-ratio bersifat pendekatan karena varians acak diuji pada batas ruang parameter.")
  tampil("42_Singularitas_LMM", data.frame(model = c("Intersep", "Intersep dan slope"),
         singular = c(lme4::isSingular(lmm1), lme4::isSingular(lmm2))))
  opsional("43_LMM_Kenward_Roger", anova(lmm2, ddf = "Kenward-Roger"))
  opsional("44_ICC", performance::icc(lmm1))
  rd <- data.frame(prediksi = fitted(lmm2), residual = resid(lmm2))
  gambar("G07_QQ_Residual_LMM", ggplot(rd, aes(sample = residual)) + stat_qq() + stat_qq_line() +
         labs(title = "Q-Q residual LMM", x = "Kuantil teoretis", y = "Kuantil residual"))
  ra <- data.frame(intersep = lme4::ranef(lmm2)$id[, 1])
  gambar("G08_QQ_Intersep_Acak", ggplot(ra, aes(sample = intersep)) + stat_qq() + stat_qq_line() +
         labs(title = "Q-Q intersep acak LMM", x = "Kuantil teoretis", y = "Kuantil intersep acak"))
  gambar("G09_Residual_vs_Prediksi", ggplot(rd, aes(prediksi, residual)) + geom_point(alpha = .5) +
         geom_hline(yintercept = 0, linetype = 2) + labs(title = "Residual versus nilai prediksi LMM", x = "Prediksi berat badan", y = "Residual"))
  em_lmm <- emmeans::emmeans(lmm2, ~ waktu | kelompok, lmer.df = "kenward-roger")
  tampil("45_EMM_LMM", as.data.frame(em_lmm))

  # Data hilang yang nyata menggantikan demonstrasi penghapusan buatan.
  dat_miss <- long_semua
  lmm_miss <- lmm2
  teks("LMM dan data hilang", "Model LMM utama sudah memakai data hilang yang nyata: baris dengan berat badan NA dikeluarkan, pengukuran tersedia dari peserta tidak lengkap tetap digunakan. Tidak dibuat penghapusan pengukuran secara buatan. Interpretasi LMM mengandalkan asumsi missing at random bersyarat pada model; asumsi ini tidak terbukti hanya dari data ini.")
  tampil("47_Ringkasan_Data_Hilang", data.frame(pengukuran_hilang = sum(is.na(long_semua$berat_badan)),
    peserta_tidak_lengkap = sum(!lengkap), peserta_lengkap = sum(lengkap),
    pengukuran_dianalisis_LMM = nobs(lmm2)))
  tampil("48_Informasi_Sesi", sessionInfo())
  write.csv(dat_wide, file.path(folder, "Data_Berat_Badan_Ika_Wulan_Sari_Wide.csv"), row.names = FALSE)
  write.csv(long_semua, file.path(folder, "Data_Berat_Badan_Ika_Wulan_Sari_Long.csv"), row.names = FALSE)
  write.csv(dat_miss, file.path(folder, "Data_Berat_Badan_Ika_Wulan_Sari_Missing_Asli.csv"), row.names = FALSE)
  saveRDS(list(hasil = hasil, data_wide = dat_wide, data_long = long_semua, data_anova = dat_long, data_lmm = dat_lmm,
    aov1 = aov1, aov2 = aov2, lmm1 = lmm1, lmm2 = lmm2, lmm_miss = lmm_miss),
    file.path(folder, "Objek_Analisis_Berat_Badan_Ika_Wulan_Sari.rds"))
  laporan <- htmltools::tags$html(lang = "id",
    htmltools::tags$head(htmltools::tags$meta(charset = "UTF-8"),
      htmltools::tags$title("Analisis Berat Badan Ika Wulan Sari: 2 x 3"),
      htmltools::tags$style("body{font-family:Arial,sans-serif;max-width:1100px;margin:40px auto;padding:20px;line-height:1.6;color:#17342e}h1,h2{color:#0b6b4f}h2{border-bottom:1px solid #d9e4e0;padding-top:24px}pre{background:#f3f7f5;padding:16px;overflow:auto;font-size:13px}img{display:block;margin:15px auto}")),
    htmltools::tags$body(htmltools::tags$h1("Analisis Pengukuran Berulang Berat Badan Ika Wulan Sari: 2 x 3"), isi))
  path_html <- file.path(folder, "Laporan_Analisis_Berat_Badan_Ika_Wulan_Sari.html")
  htmltools::save_html(laporan, path_html)
  if (BUKA_HTML_OTOMATIS && interactive())
    try(utils::browseURL(path_html), silent = TRUE)
  cat("\nHasil analisis: ", normalizePath(folder), "\n", sep = "")
  invisible(list(hasil = hasil, grafik = grafik, data_wide = dat_wide,
                 data_long = long_semua, data_anova = dat_long, data_lmm = dat_lmm, aov1 = aov1, aov2 = aov2,
                 lmm1 = lmm1, lmm2 = lmm2, lmm_miss = lmm_miss))
}

hasil_berat_badan <- analisis_berat_badan()
## Registered S3 method overwritten by 'lme4':
##   method           from
##   na.action.merMod car
## Data: /Users/nazmy/Downloads/journal.pone.0257326.s004 (1).xlsx
## Sheet: data_set
## Hasil: /Users/nazmy/Downloads/Hasil_Analisis_Berat_Badan_Ika_Wulan_Sari
## 
## Identitas
## Nama: Ika Wulan Sari | NIM: 2611018005 | Mata Kuliah: Biostatistika Intermediate | Magister Kesehatan Masyarakat Universitas Mulawarman 
## 
## Desain
## 166 peserta; dua kelompok; tiga waktu (M0, M3, M6). 162 peserta lengkap untuk ANOVA; 5 pengukuran hilang; LMM menggunakan 493 pengukuran tersedia. Outcome: berat badan (kg). 
## 
## 00 Kelengkapan
## # A tibble: 6 × 5
##   kelompok     waktu peserta tersedia hilang
##   <fct>        <fct>   <int>    <int>  <int>
## 1 control      M0         81       81      0
## 2 control      M3         81       81      0
## 3 control      M6         81       79      2
## 4 intervention M0         85       85      0
## 5 intervention M3         85       84      1
## 6 intervention M6         85       83      2
## 
## Penanganan data
## ID ROW dibuat dari urutan baris, dengan baris_excel untuk penelusuran; setiap baris diasumsikan satu peserta sesuai struktur wide. Kode -999 dan 999 pada berat badan/usia dibaca sebagai NA. Nilai berat badan 999 pada bulan 6 diperlakukan sebagai kode hilang berdasarkan pola kode pada baris yang sama (usia 999, gender 9, aktivitas -999). Tidak dilakukan imputasi. Kolom turunan overall_PA dan delta_M6_BL tidak digunakan. ANOVA, Friedman, Wilcoxon, dan robust RM memakai peserta lengkap; LMM memakai seluruh pengukuran berat badan tersedia. Hasil kedua pendekatan dapat berbeda karena sampel berbeda. 
## 
## 01 Jumlah Peserta
##       kelompok  n
## 1      control 81
## 2 intervention 85
## 
## 01a Usia
## # A tibble: 2 × 6
##   kelompok         n  mean    sd   min   max
##   <fct>        <int> <dbl> <dbl> <dbl> <dbl>
## 1 control         81  71.2  5.04    65    81
## 2 intervention    85  70.4  4.61    65    85
## 
## 01b Jenis Kelamin
##       kelompok jk  n
## 1      control  F 47
## 2      control  M 34
## 3 intervention  F 50
## 4 intervention  M 35
## 
## Berkas data yang digunakan
## /Users/nazmy/Downloads/journal.pone.0257326.s004 (1).xlsx | Sheet: data_set 
## 
## Sumber data
## Workbook lampiran journal.pone.0257326.s004 (1).xlsx, sheet data_set. Berat badan menggunakan WeightKg, Weightkg.M3, dan Weightkg.M6; kelompok memakai Group. Analisis ini adalah adaptasi metode latihan, bukan reproduksi seluruh analisis artikel. 
## 
## 02 Data Wide
##       id baris_excel     kelompok usia jk BB_M0 BB_M3 BB_M6
## 1 ROW001           2 intervention   78  M    84    84    84
## 2 ROW002           3 intervention   65  M    97    NA    NA
## 3 ROW003           4 intervention   74  M    92    92    90
## 4 ROW004           5 intervention   69  F    62    62    62
## 5 ROW005           6 intervention   68  F    60    60    NA
## 6 ROW006           7 intervention   75  M    83    83    81
## 
## 03 Data Long
## # A tibble: 12 × 8
##    id     baris_excel kelompok      usia jk    waktu berat_badan bulan
##    <fct>        <int> <fct>        <dbl> <chr> <fct>       <dbl> <dbl>
##  1 ROW001           2 intervention    78 M     M0             84     0
##  2 ROW001           2 intervention    78 M     M3             84     3
##  3 ROW001           2 intervention    78 M     M6             84     6
##  4 ROW003           4 intervention    74 M     M0             92     0
##  5 ROW003           4 intervention    74 M     M3             92     3
##  6 ROW003           4 intervention    74 M     M6             90     6
##  7 ROW004           5 intervention    69 F     M0             62     0
##  8 ROW004           5 intervention    69 F     M3             62     3
##  9 ROW004           5 intervention    69 F     M6             62     6
## 10 ROW006           7 intervention    75 M     M0             83     0
## 11 ROW006           7 intervention    75 M     M3             83     3
## 12 ROW006           7 intervention    75 M     M6             81     6
## 
## 04 Deskriptif
## # A tibble: 6 × 12
##   kelompok     waktu bulan     n  mean    sd median   min   max    se lower upper
##   <fct>        <fct> <dbl> <int> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 control      M0        0    81  78.0  15.4   75      52   122  1.71  74.6  81.4
## 2 control      M3        3    81  78.0  15.5   75      49   122  1.72  74.6  81.4
## 3 control      M6        6    79  77.2  15.4   74      52   125  1.73  73.8  80.7
## 4 intervention M0        0    85  77.9  15.1   77      50   115  1.64  74.7  81.2
## 5 intervention M3        3    84  77.2  15.0   76.5    49   115  1.64  74.0  80.5
## 6 intervention M6        6    83  76.7  14.8   76      50   117  1.63  73.5  80.0
## 
## Sampel deskriptif
## Tabel deskriptif dan grafik profil rerata menggunakan seluruh berat badan yang tersedia pada tiap waktu. Tabel ANOVA serta grafik profil mixed ANOVA menggunakan peserta dengan tiga pengukuran lengkap. 
## 
## 05 Kovarians
##          BB_M0    BB_M3    BB_M6
## BB_M0 228.2643 226.4029 220.7430
## BB_M3 226.4029 230.2750 223.9765
## BB_M6 220.7430 223.9765 226.6943
## 
## 06 Korelasi
##           BB_M0     BB_M3     BB_M6
## BB_M0 1.0000000 0.9875058 0.9703933
## BB_M3 0.9875058 1.0000000 0.9802996
## BB_M6 0.9703933 0.9802996 1.0000000
## 
## 07 Varians Selisih
##        pasangan   varians
## 1 BB_M0 - BB_M3  5.733456
## 2 BB_M0 - BB_M6 13.472471
## 3 BB_M3 - BB_M6  9.016218

## Warning: Removed 5 rows containing non-finite outside the scale range
## (`stat_summary()`).
## Warning: Removed 5 rows containing missing values or values outside the scale
## range (`geom_line()`).
## Warning: Removed 5 rows containing non-finite outside the scale range
## (`stat_summary()`).
## Warning: Removed 5 rows containing missing values or values outside the scale
## range (`geom_line()`).

## 
## 08 Outlier Satu Kelompok
## # A tibble: 1 × 10
##   waktu id     baris_excel kelompok      usia jk    berat_badan bulan is.outlier is.extreme
##   <fct> <fct>        <int> <fct>        <dbl> <chr>       <dbl> <dbl> <lgl>      <lgl>     
## 1 M6    ROW049          50 intervention    67 M             117     6 TRUE       FALSE     
## 
## 09 Shapiro Satu Kelompok
## # A tibble: 3 × 4
##   waktu variable    statistic     p
##   <fct> <chr>           <dbl> <dbl>
## 1 M0    berat_badan     0.980 0.222
## 2 M3    berat_badan     0.980 0.222
## 3 M6    berat_badan     0.980 0.229

## 
## 10 ANOVA Rstatix Satu Kelompok
## ANOVA Table (type III tests)
## 
## $ANOVA
##   Effect DFn DFd   F     p p<.05  pes
## 1  waktu   2 164 4.3 0.015     * 0.05
## 
## $`Mauchly's Test for Sphericity`
##   Effect     W        p p<.05
## 1  waktu 0.735 3.76e-06     *
## 
## $`Sphericity Corrections`
##   Effect  GGe      DF[GG] p[GG] p[GG]<.05   HFe       DF[HF] p[HF] p[HF]<.05
## 1  waktu 0.79 1.58, 129.6 0.023         * 0.803 1.61, 131.72 0.022         *
## 
## 
## 11 RM ANOVA
## Anova Table (Type 3 tests)
## 
## Response: berat_badan
##   Effect           df  MSE      F  ges  pes p.value
## 1  waktu 1.58, 129.60 8.52 4.30 * .001 .050    .023
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
## 
## Sphericity correction method: GG 
## 
## 12 Sferisitas dan Koreksi RM
## 
## Univariate Type III Repeated-Measures ANOVA Assuming Sphericity
## 
##              Sum Sq num Df Error SS den Df   F value  Pr(>F)    
## (Intercept) 1490059      1    53785     82 2271.7469 < 2e-16 ***
## waktu            58      2     1105    164    4.3004 0.01513 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Mauchly Tests for Sphericity
## 
##       Test statistic    p-value
## waktu         0.7346 3.7587e-06
## 
## 
## Greenhouse-Geisser and Huynh-Feldt Corrections
##  for Departure from Sphericity
## 
##        GG eps Pr(>F[GG])  
## waktu 0.79026    0.02307 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##          HF eps Pr(>F[HF])
## waktu 0.8031868 0.02247642
## 
## 13 Multivariat RM
## 
## Type III Repeated Measures MANOVA Tests: Pillai test statistic
##             Df test stat approx F num Df den Df  Pr(>F)    
## (Intercept)  1   0.96516  2271.75      1     82 < 2e-16 ***
## waktu        1   0.06571     2.85      2     81 0.06376 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 14 Eta Kuadrat RM
## # Effect Size for ANOVA (Type III)
## 
## Parameter | Eta2 (partial) |       95% CI
## -----------------------------------------
## waktu     |           0.05 | [0.01, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
## 15 EMM RM
##  waktu   emmean       SE df lower.CL upper.CL
##  M0    77.89157 1.644411 82 74.62031 81.16282
##  M3    77.45783 1.645062 82 74.18528 80.73038
##  M6    76.72289 1.629268 82 73.48176 79.96402
## 
## Confidence level used: 0.95 
## 
## 16 Posthoc RM Bonferroni
##  contrast  estimate        SE df t.ratio p.value
##  M0 - M3  0.4337349 0.3346889 82   1.296  0.5959
##  M0 - M6  1.1686747 0.4952965 82   2.360  0.0620
##  M3 - M6  0.7349398 0.3600227 82   2.041  0.1333
## 
## P value adjustment: bonferroni method for 3 tests 
## 
## 17 RM vs Baseline Holm
##  contrast   estimate        SE df t.ratio p.value
##  M3 - M0  -0.4337349 0.3346889 82  -1.296  0.1986
##  M6 - M0  -1.1686747 0.4952965 82  -2.360  0.0413
## 
## P value adjustment: holm method for 2 tests 
## 
## 18 Tren Polinomial RM
##  contrast    estimate        SE df t.ratio p.value
##  linear    -1.1686747 0.4952965 82  -2.360  0.0207
##  quadratic -0.3012048 0.4877985 82  -0.617  0.5386
## 
## 
## 19 Friedman
## # A tibble: 1 × 6
##   .y.             n statistic    df      p method       
## * <chr>       <int>     <dbl> <dbl>  <dbl> <chr>        
## 1 berat_badan    83      5.17     2 0.0753 Friedman test
## 
## 20 Kendall W
## # A tibble: 1 × 5
##   .y.             n effsize method    magnitude
## * <chr>       <int>   <dbl> <chr>     <ord>    
## 1 berat_badan    83  0.0312 Kendall W small    
## 
## 21 Wilcoxon Berpasangan
## # A tibble: 3 × 9
##   .y.         group1 group2    n1    n2 statistic      p  p.adj p.adj.signif
## * <chr>       <chr>  <chr>  <int> <int>     <dbl>  <dbl>  <dbl> <chr>       
## 1 berat_badan M0     M3        83    83       58  0.128  0.383  ns          
## 2 berat_badan M0     M6        83    83     1524  0.0304 0.0913 ns          
## 3 berat_badan M3     M6        83    83     1410. 0.0504 0.151  ns          
## 
## 22 Robust RM Trim20
## Call:
## WRS2::rmanova(y = d1$berat_badan, groups = d1$waktu, blocks = d1$id, 
##     tr = 0.2)
## 
## Test statistic: F = 3.2291 
## Degrees of freedom 1: 1.68 
## Degrees of freedom 2: 83.89 
## p-value: 0.05298 
## 
## 
## 23 Outlier Mixed
## # A tibble: 8 × 10
##   kelompok     waktu id     baris_excel  usia jk    berat_badan bulan is.outlier is.extreme
##   <fct>        <fct> <fct>        <int> <dbl> <chr>       <dbl> <dbl> <lgl>      <lgl>     
## 1 control      M0    ROW140         141    68 M             122     0 TRUE       FALSE     
## 2 control      M3    ROW140         141    68 M             122     3 TRUE       FALSE     
## 3 control      M6    ROW092          93    65 F             112     6 TRUE       FALSE     
## 4 control      M6    ROW127         128    72 M             111     6 TRUE       FALSE     
## 5 control      M6    ROW140         141    68 M             125     6 TRUE       FALSE     
## 6 control      M6    ROW144         145    69 M             107     6 TRUE       FALSE     
## 7 control      M6    ROW163         164    78 F             110     6 TRUE       FALSE     
## 8 intervention M6    ROW049          50    67 M             117     6 TRUE       FALSE     
## 
## 24 Shapiro Mixed
## # A tibble: 6 × 5
##   kelompok     waktu variable    statistic       p
##   <fct>        <fct> <chr>           <dbl>   <dbl>
## 1 control      M0    berat_badan     0.956 0.00786
## 2 control      M3    berat_badan     0.965 0.0294 
## 3 control      M6    berat_badan     0.954 0.00662
## 4 intervention M0    berat_badan     0.980 0.222  
## 5 intervention M3    berat_badan     0.980 0.222  
## 6 intervention M6    berat_badan     0.980 0.229

## 
## 25 Levene
## # A tibble: 3 × 5
##   waktu   df1   df2 statistic     p
##   <fct> <int> <int>     <dbl> <dbl>
## 1 M0        1   160    0.0311 0.860
## 2 M3        1   160    0.0169 0.897
## 3 M6        1   160    0.0813 0.776
## 
## 26 Box M
## # A tibble: 1 × 4
##   statistic  p.value parameter method                                             
##       <dbl>    <dbl>     <dbl> <chr>                                              
## 1      58.5 9.10e-11         6 Box's M-test for Homogeneity of Covariance Matrices
## 
## 27 Mixed ANOVA
## Anova Table (Type 3 tests)
## 
## Response: berat_badan
##           Effect           df    MSE       F   ges   pes p.value
## 1       kelompok       1, 160 680.04    0.00 <.001 <.001    .954
## 2          waktu 1.63, 261.28   5.75 5.84 ** <.001  .035    .006
## 3 kelompok:waktu 1.63, 261.28   5.75    1.18 <.001  .007    .302
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
## 
## Sphericity correction method: GG 
## 
## 28 Sferisitas dan Koreksi Mixed
## 
## Univariate Type III Repeated-Measures ANOVA Assuming Sphericity
## 
##                 Sum Sq num Df Error SS den Df   F value    Pr(>F)    
## (Intercept)    2911656      1   108806    160 4281.6198 < 2.2e-16 ***
## kelompok             2      1   108806    160    0.0033  0.954163    
## waktu               55      2     1504    320    5.8397  0.003229 ** 
## kelompok:waktu      11      2     1504    320    1.1783  0.309124    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Mauchly Tests for Sphericity
## 
##                Test statistic    p-value
## waktu                 0.77527 1.6271e-09
## kelompok:waktu        0.77527 1.6271e-09
## 
## 
## Greenhouse-Geisser and Huynh-Feldt Corrections
##  for Departure from Sphericity
## 
##                GG eps Pr(>F[GG])   
## waktu          0.8165   0.005903 **
## kelompok:waktu 0.8165   0.302380   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##                   HF eps  Pr(>F[HF])
## waktu          0.8237657 0.005763773
## kelompok:waktu 0.8237657 0.302710119
## 
## 29 Multivariat Mixed
## 
## Type III Repeated Measures MANOVA Tests: Pillai test statistic
##                Df test stat approx F num Df den Df  Pr(>F)    
## (Intercept)     1   0.96398   4281.6      1    160 < 2e-16 ***
## kelompok        1   0.00002      0.0      1    160 0.95416    
## waktu           1   0.04721      3.9      2    159 0.02139 *  
## kelompok:waktu  1   0.01127      0.9      2    159 0.40601    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 30 Eta Kuadrat Mixed
## # Effect Size for ANOVA (Type III)
## 
## Parameter      | Eta2 (partial) |       95% CI
## ----------------------------------------------
## kelompok       |       2.07e-05 | [0.00, 1.00]
## waktu          |           0.04 | [0.01, 1.00]
## kelompok:waktu |       7.31e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
## Warning: Panel(s) show a mixed within-between-design.
## Error bars do not allow comparisons across all means.
## Suppress error bars with: error = "none"

## 
## Interval grafik mixed ANOVA
## Interval within-subject pada grafik afex berbeda dari interval kepercayaan rerata biasa pada grafik profil deskriptif. 
## 
## 31 Efek Waktu per Kelompok
## kelompok = control:
##  model term df1 df2 F.ratio p.value
##  waktu        2 160   0.738  0.4797
## 
## kelompok = intervention:
##  model term df1 df2 F.ratio p.value
##  waktu        2 160   4.224  0.0163
## 
## 
## 32 Efek Kelompok per Waktu
## waktu = M0:
##  model term df1 df2 F.ratio p.value
##  kelompok     1 160   0.011  0.9179
## 
## waktu = M3:
##  model term df1 df2 F.ratio p.value
##  kelompok     1 160   0.005  0.9460
## 
## waktu = M6:
##  model term df1 df2 F.ratio p.value
##  kelompok     1 160   0.043  0.8360
## 
## 
## 33 EMM Waktu per Kelompok
## kelompok = control:
##  waktu   emmean       SE  df lower.CL upper.CL
##  M0    77.64557 1.705077 160 74.27821 81.01293
##  M3    77.62025 1.712602 160 74.23803 81.00247
##  M6    77.21519 1.699031 160 73.85977 80.57061
## 
## kelompok = intervention:
##  waktu   emmean       SE  df lower.CL upper.CL
##  M0    77.89157 1.663483 160 74.60635 81.17678
##  M3    77.45783 1.670825 160 74.15812 80.75755
##  M6    76.72289 1.657585 160 73.44932 79.99646
## 
## Confidence level used: 0.95 
## 
## 34 Waktu vs Baseline Holm
## kelompok = control:
##  contrast   estimate        SE  df t.ratio p.value
##  M3 - M0  -0.0253165 0.2692487 160  -0.094  0.9252
##  M6 - M0  -0.4303797 0.4121384 160  -1.044  0.5959
## 
## kelompok = intervention:
##  contrast   estimate        SE  df t.ratio p.value
##  M3 - M0  -0.4337349 0.2626806 160  -1.651  0.1007
##  M6 - M0  -1.1686747 0.4020847 160  -2.907  0.0083
## 
## P value adjustment: holm method for 2 tests 
## 
## 35 Antarkelompok Tukey
## waktu = M0:
##  contrast                 estimate       SE  df t.ratio p.value
##  control - intervention -0.2459966 2.382113 160  -0.103  0.9179
## 
## waktu = M3:
##  contrast                 estimate       SE  df t.ratio p.value
##  control - intervention  0.1624218 2.392627 160   0.068  0.9460
## 
## waktu = M6:
##  contrast                 estimate       SE  df t.ratio p.value
##  control - intervention  0.4922983 2.373667 160   0.207  0.8360
## 
## 
## 36 Kontras Perbedaan Perubahan
##  waktu_custom kelompok_pairwise      estimate        SE  df t.ratio p.value
##  M6-M0        control - intervention 0.738295 0.5757866 160   1.282  0.2016
## 
## 
## 37 Kontras Tren Linear
##   waktu_poly      kelompok_pairwise estimate        SE  df  t.ratio   p.value    p.holm
## 1     linear control - intervention 0.738295 0.5757866 160 1.282237 0.2016141 0.2016141
## 
## Koreksi perbandingan
## Holm untuk waktu versus baseline berlaku dalam tiap kelompok; Tukey berlaku dalam tiap waktu. Kontras perbedaan perubahan dan tren linear memakai Holm pada masing-masing keluarga kontras. 
## 
## 38 Tabel ANOVA GG
##           Effect           df    MSE       F   pes p.value
## 1       kelompok       1, 160 680.04    0.00 <.001    .954
## 2          waktu 1.63, 261.28   5.75 5.84 **  .035    .006
## 3 kelompok:waktu 1.63, 261.28   5.75    1.18  .007    .302
## 
## Interpretasi interaksi
## Mixed ANOVA dengan koreksi Greenhouse-Geisser menghasilkan interaksi kelompok x waktu: F(1.63, 261.28) = 1.178; p = 0,302. Belum ditemukan bukti statistik perbedaan pola perubahan berat badan antar kelompok. Arah dan besarnya perbedaan dinilai dari rerata serta kontras perubahan M6-M0. 
## 
## 39 LMM Intersep
## Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
## Formula: berat_badan ~ kelompok * waktu + (1 | id)
##    Data: dat_lmm
## Control: kontrol
## 
## REML criterion at convergence: 2982.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -5.9171 -0.2753 -0.0353  0.3056  8.2191 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  id       (Intercept) 226.983  15.066  
##  Residual               4.655   2.158  
## Number of obs: 493, groups:  id, 166
## 
## Fixed effects:
##                   Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept)       77.61576    1.17376 163.97873  66.126   <2e-16 ***
## kelompok1          0.24376    1.17376 163.97873   0.208    0.836    
## waktu1             0.34336    0.13749 323.03899   2.497    0.013 *  
## waktu2             0.11444    0.13749 323.00216   0.832    0.406    
## kelompok1:waktu1  -0.19053    0.13749 323.03899  -1.386    0.167    
## kelompok1:waktu2   0.01369    0.13749 323.00216   0.100    0.921    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) klmpk1 waktu1 waktu2 klm1:1
## kelompok1    0.024                            
## waktu1      -0.001  0.000                     
## waktu2       0.000 -0.001 -0.493              
## klmpk1:wkt1  0.000 -0.001  0.020 -0.007       
## klmpk1:wkt2 -0.001  0.000 -0.007  0.020 -0.493
## 
## 40 LMM Intersep Slope
## Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
## Formula: berat_badan ~ kelompok * waktu + (1 + bulan | id)
##    Data: dat_lmm
## Control: kontrol
## 
## REML criterion at convergence: 2949.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -5.4050 -0.1686 -0.0384  0.1796  5.9556 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev. Corr  
##  id       (Intercept) 231.0333 15.200         
##           bulan         0.2219  0.471   -0.13 
##  Residual               2.6604  1.631         
## Number of obs: 493, groups:  id, 166
## 
## Fixed effects:
##                   Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept)       77.61539    1.17365 163.97447  66.132   <2e-16 ***
## kelompok1          0.24375    1.17365 163.97447   0.208   0.8357    
## waktu1             0.34373    0.15149 204.84543   2.269   0.0243 *  
## waktu2             0.11448    0.10413 163.87485   1.099   0.2732    
## kelompok1:waktu1  -0.19052    0.15149 204.84543  -1.258   0.2099    
## kelompok1:waktu2   0.01404    0.10413 163.87485   0.135   0.8929    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) klmpk1 waktu1 waktu2 klm1:1
## kelompok1    0.024                            
## waktu1       0.023  0.001                     
## waktu2       0.000 -0.001 -0.335              
## klmpk1:wkt1  0.001  0.023  0.020 -0.004       
## klmpk1:wkt2 -0.001  0.000 -0.004  0.021 -0.335
## 
## 41 Perbandingan LMM REML
## Data: dat_lmm
## Models:
## lmm1: berat_badan ~ kelompok * waktu + (1 | id)
## lmm2: berat_badan ~ kelompok * waktu + (1 + bulan | id)
##      npar    AIC    BIC  logLik -2*log(L)  Chisq Df Pr(>Chisq)    
## lmm1    8 2998.5 3032.1 -1491.2    2982.5                         
## lmm2   10 2969.3 3011.3 -1474.7    2949.3 33.209  2   6.15e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Perbandingan model
## Kedua model mempunyai fixed effects yang sama. Perbandingan REML mengikuti materi; nilai p likelihood-ratio bersifat pendekatan karena varians acak diuji pada batas ruang parameter. 
## 
## 42 Singularitas LMM
##                model singular
## 1           Intersep    FALSE
## 2 Intersep dan slope    FALSE
## 
## 43 LMM Kenward Roger
## Type III Analysis of Variance Table with Kenward-Roger's method
##                 Sum Sq Mean Sq NumDF  DenDF F value Pr(>F)  
## kelompok        0.1148  0.1148     1 164.00  0.0431 0.8357  
## waktu          24.0500 12.0250     2 215.34  4.5061 0.0121 *
## kelompok:waktu  4.4532  2.2266     2 215.34  0.8344 0.4356  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 44 ICC
## # Intraclass Correlation Coefficient
## 
##     Adjusted ICC: 0.980
##   Unadjusted ICC: 0.979

## 
## 45 EMM LMM
## kelompok = control:
##  waktu   emmean       SE     df lower.CL upper.CL
##  M0    78.01235 1.698561 164.61 74.65857 81.36612
##  M3    77.98765 1.686043 166.49 74.65887 81.31643
##  M6    77.57742 1.688780 164.64 74.24296 80.91188
## 
## kelompok = intervention:
##  waktu   emmean       SE     df lower.CL upper.CL
##  M0    77.90588 1.658113 164.61 74.63197 81.17979
##  M3    77.47208 1.646201 166.61 74.22198 80.72219
##  M6    76.73695 1.648781 164.72 73.48148 79.99242
## 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## 
## LMM dan data hilang
## Model LMM utama sudah memakai data hilang yang nyata: baris dengan berat badan NA dikeluarkan, pengukuran tersedia dari peserta tidak lengkap tetap digunakan. Tidak dibuat penghapusan pengukuran secara buatan. Interpretasi LMM mengandalkan asumsi missing at random bersyarat pada model; asumsi ini tidak terbukti hanya dari data ini. 
## 
## 47 Ringkasan Data Hilang
##   pengukuran_hilang peserta_tidak_lengkap peserta_lengkap pengukuran_dianalisis_LMM
## 1                 5                     4             162                       493
## 
## 48 Informasi Sesi
## R version 4.6.1 (2026-06-24)
## Platform: aarch64-apple-darwin23
## Running under: macOS Tahoe 26.5.2
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: Asia/Singapore
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] ggplot2_4.0.3 tidyr_1.3.2   dplyr_1.2.1  
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1    farver_2.1.2        S7_0.2.2            fastmap_1.2.0       reshape_0.8.10     
##  [6] bayestestR_0.19.0   digest_0.6.39       estimability_2.0.0  lifecycle_1.0.5     magrittr_2.0.5     
## [11] compiler_4.6.1      rlang_1.3.0         sass_0.4.10         tools_4.6.1         utf8_1.2.6         
## [16] yaml_2.3.12         knitr_1.52          ggsignif_0.6.4      labeling_0.4.3      plyr_1.8.9         
## [21] RColorBrewer_1.1-3  abind_1.4-8         withr_3.0.3         purrr_1.2.2         numDeriv_2016.8-1.1
## [26] grid_4.6.1          afex_1.5-1          datawizard_1.4.0    ggpubr_1.0.0        emmeans_2.0.4      
## [31] scales_1.4.0        MASS_7.3-66         insight_1.5.4       cli_3.6.6           mvtnorm_1.4-2      
## [36] rmarkdown_2.32      ragg_1.5.2          reformulas_0.4.4    generics_0.1.4      otel_0.2.0         
## [41] rstudioapi_0.19.0   performance_0.18.2  reshape2_1.4.5      parameters_0.29.3   readxl_1.5.0.1     
## [46] minqa_1.2.8         cachem_1.1.0        stringr_1.6.0       splines_4.6.1       parallel_4.6.1     
## [51] effectsize_1.0.3    cellranger_1.1.0    WRS2_1.1-7          base64enc_0.1-6     vctrs_0.7.3        
## [56] boot_1.3-32         Matrix_1.7-6        jsonlite_2.0.0      carData_3.0-6       car_3.1-5          
## [61] pbkrtest_0.5.5      rstatix_1.1.0       Formula_1.2-6       systemfonts_1.3.2   jquerylib_0.1.4    
## [66] glue_1.8.1          nloptr_2.2.1        stringi_1.8.9       gtable_0.3.6        lme4_2.0-6         
## [71] lmerTest_3.2-1      tibble_3.3.1        pillar_1.11.1       htmltools_0.5.9     R6_2.6.1           
## [76] textshaping_1.0.5   Rdpack_2.6.6        evaluate_1.0.5      lattice_0.23-1      rbibutils_2.4.1    
## [81] backports_1.5.1     broom_1.0.13        bslib_0.12.0        Rcpp_1.1.2          nlme_3.1-171       
## [86] xfun_0.61           pkgconfig_2.0.3    
## 
## Hasil analisis: /Users/nazmy/Downloads/Hasil_Analisis_Berat_Badan_Ika_Wulan_Sari