# DATA SIMULASI: 15 responden, 3 perlakuan, 3 pengukuran.
# Di RStudio: buka file ini lalu klik Source. Tidak perlu paket tambahan.
# Angka sama dengan Data_Simulasi_Gizi_3_Perlakuan.xlsx.
# Hasil tersimpan pada folder hasil_gizi di working directory (lihat getwd()).
out <- file.path(getwd(), "hasil_gizi")
dir.create(out, recursive=TRUE, showWarnings=FALSE)
options(width=110, digits=7)
data <- data.frame(
  ID=factor(sprintf("R%02d", 1:15)),
  Perlakuan=factor(rep(c("Leaflet","Video","Diskusi"), each=5),
                   levels=c("Leaflet","Video","Diskusi")),
  Pre=c(45,60,50,55,40,50,45,60,40,55,55,40,50,60,45),
  Minggu1=c(55,65,60,55,50,65,60,70,60,65,75,60,70,70,65),
  Minggu2=c(60,65,65,60,55,75,65,80,70,65,85,75,80,90,70))
long <- reshape(data, varying=c("Pre","Minggu1","Minggu2"),
                v.names="Skor", timevar="Waktu", times=c("Pre","Minggu1","Minggu2"),
                idvar="ID", direction="long")
long$Waktu <- factor(long$Waktu, levels=c("Pre","Minggu1","Minggu2"))
long <- long[order(long$ID,long$Waktu), ]; rownames(long) <- NULL
stopifnot(nrow(long)==45, all(table(long$ID)==3), all(table(data$Perlakuan)==5))
deskriptif <- do.call(rbind,lapply(levels(data$Perlakuan),function(g) {
  do.call(rbind,lapply(levels(long$Waktu),function(t) {
    x <- long$Skor[long$Perlakuan==g & long$Waktu==t]
    data.frame(Perlakuan=g,Waktu=t,N=length(x),Mean=mean(x),SD=sd(x))
  }))
}))
model <- aov(Skor ~ Perlakuan * Waktu + Error(ID/Waktu), data=long)
tab <- summary(model)
Y <- as.matrix(data[,c("Pre","Minggu1","Minggu2")])
mlm <- lm(Y ~ Perlakuan, data=data)
# Sphericity: kovarians residual setelah memperhitungkan kelompok.
mauchly <- mauchly.test(mlm, X=~1)
C <- qr.Q(qr(contr.helmert(3)))
S <- crossprod(residuals(mlm))/df.residual(mlm)
Sc <- t(C) %*% S %*% C
epsilon <- sum(diag(Sc))^2/(2*sum(Sc^2))
within <- tab[["Error: ID:Waktu"]][[1]]
between <- tab[["Error: ID"]][[1]]
efek <- c("Waktu","Perlakuan:Waktu")
gg <- do.call(rbind,lapply(efek,function(e) {
  df1 <- within[e,"Df"] * epsilon
  df2 <- within["Residuals","Df"] * epsilon
  f <- within[e,"F value"]
  data.frame(Efek=e,Epsilon_GG=epsilon,df1_GG=df1,df2_GG=df2,F=f,
             p_GG=pf(f,df1,df2,lower.tail=FALSE),
             Eta2_parsial=within[e,"Sum Sq"]/(within[e,"Sum Sq"]+within["Residuals","Sum Sq"]))
}))
# Diagnostik normalitas residual rerata subjek dan dua kontras waktu.
res_diag <- cbind(Rerata=rowMeans(residuals(mlm)),residuals(mlm)%*%C)
colnames(res_diag) <- c("Rerata_subjek","Kontras_waktu_1","Kontras_waktu_2")
normalitas <- do.call(rbind,lapply(seq_len(ncol(res_diag)),function(j) {
  a <- shapiro.test(res_diag[,j]);data.frame(Komponen=colnames(res_diag)[j],W=unname(a$statistic),p=a$p.value)
}))
# Brown-Forsythe (Levene berbasis median) pada setiap waktu.
homogenitas <- do.call(rbind,lapply(levels(long$Waktu),function(t) {
 d <- subset(long,Waktu==t)
 d$dev <- abs(d$Skor-ave(d$Skor,d$Perlakuan,FUN=median))
 a <- anova(lm(dev~Perlakuan,data=d))
 data.frame(Waktu=t,F=a[1,"F value"],df1=a[1,"Df"],df2=a[2,"Df"],p=a[1,"Pr(>F)"])
}))
# Analisis lanjutan khusus perubahan awal ke minggu 2.
data$Perubahan <- data$Minggu2-data$Pre
gain_model <- aov(Perubahan~Perlakuan,data=data)
gain_desc <- aggregate(Perubahan~Perlakuan,data,function(x)c(Mean=mean(x),SD=sd(x)))
posthoc <- TukeyHSD(gain_model)
write.csv(deskriptif,file.path(out,"Deskriptif.csv"),row.names=FALSE)
write.csv(long,file.path(out,"Data_Long.csv"),row.names=FALSE)
write.csv(gg,file.path(out,"ANOVA_Koreksi_GG.csv"),row.names=FALSE)
logfile <- file.path(out,"Output_Analisis_R.txt")
sink(logfile)
cat("ANALISIS DATA SIMULASI GIZI\n",R.version.string,"\n\n")
cat("Data fiktif disusun manual untuk latihan. Tidak mewakili penelitian nyata.\n")
cat("Desain: 3 kelompok independen x 3 waktu berulang, 5 responden/kelompok.\n")
cat("Analisis utama: interaksi perlakuan x waktu; alfa 0,05.\n\nDATA\n");print(data)
cat("\nDESKRIPTIF\n");print(deskriptif,row.names=FALSE)
cat("\nANOVA CAMPURAN TANPA KOREKSI\n");print(tab)
cat("\nUJI SPHERICITY MAUCHLY\n");print(mauchly)
cat("\nKOREKSI GREENHOUSE-GEISSER (dilaporkan konsisten untuk efek waktu)\n");print(gg,row.names=FALSE)
cat("\nSHAPIRO-WILK RESIDUAL\n");print(normalitas,row.names=FALSE)
cat("\nBROWN-FORSYTHE PER WAKTU\n");print(homogenitas,row.names=FALSE)
cat("\nPERUBAHAN MINGGU 2 DIKURANGI PRE\n");print(gain_desc)
cat("\nANOVA PERUBAHAN\n");print(summary(gain_model))
cat("\nTUKEY: SELISIH PERUBAHAN ANTARKELOMPOK, CI 95%\n");print(posthoc)
cat("\nCATATAN\n")
cat("Uji lanjut menilai perubahan Pre ke Minggu2, bukan seluruh pasangan waktu.\n")
cat("Tukey mengoreksi tiga perbandingan pasangan kelompok untuk perubahan tersebut.\n")
cat("Ukuran sampel kecil; uji asumsi memiliki daya terbatas. p>0,05 bukan bukti asumsi pasti terpenuhi.\n")
cat("Independensi antarsubjek merupakan asumsi desain, tidak dapat diuji dari angka ini.\n")
cat("Hasil hanya latihan dan tidak membuktikan efektivitas metode edukasi di populasi nyata.\n\n")
print(sessionInfo());sink()
png(file.path(out,"Grafik_Perubahan_Skor.png"),width=1400,height=900,res=150)
means <- sapply(levels(data$Perlakuan),function(g)colMeans(Y[data$Perlakuan==g,,drop=FALSE]))
par(mar=c(5,5,5,2))
matplot(1:3,means,type="b",pch=c(16,17,15),lty=1,lwd=2,
        col=c("#2563EB","#D97706","#15803D"),xaxt="n",ylim=c(40,90),
        xlab="Waktu pengukuran",ylab="Rerata skor pengetahuan (0-100)",
        main="Perubahan skor pengetahuan gizi")
axis(1,at=1:3,labels=c("Sebelum edukasi","Minggu 1","Minggu 2"))
legend("topleft",legend=levels(data$Perlakuan),col=c("#2563EB","#D97706","#15803D"),pch=c(16,17,15),lty=1,bty="n")
mtext("Data simulasi; 5 responden per kelompok. Garis menunjukkan rerata.",side=3,line=0.5,cex=0.8)
dev.off()
## png 
##   2
cat(readLines(logfile),sep="\n")
## ANALISIS DATA SIMULASI GIZI
##  R version 4.6.1 (2026-06-24 ucrt) 
## 
## Data fiktif disusun manual untuk latihan. Tidak mewakili penelitian nyata.
## Desain: 3 kelompok independen x 3 waktu berulang, 5 responden/kelompok.
## Analisis utama: interaksi perlakuan x waktu; alfa 0,05.
## 
## DATA
##     ID Perlakuan Pre Minggu1 Minggu2 Perubahan
## 1  R01   Leaflet  45      55      60        15
## 2  R02   Leaflet  60      65      65         5
## 3  R03   Leaflet  50      60      65        15
## 4  R04   Leaflet  55      55      60         5
## 5  R05   Leaflet  40      50      55        15
## 6  R06     Video  50      65      75        25
## 7  R07     Video  45      60      65        20
## 8  R08     Video  60      70      80        20
## 9  R09     Video  40      60      70        30
## 10 R10     Video  55      65      65        10
## 11 R11   Diskusi  55      75      85        30
## 12 R12   Diskusi  40      60      75        35
## 13 R13   Diskusi  50      70      80        30
## 14 R14   Diskusi  60      70      90        30
## 15 R15   Diskusi  45      65      70        25
## 
## DESKRIPTIF
##  Perlakuan   Waktu N Mean       SD
##    Leaflet     Pre 5   50 7.905694
##    Leaflet Minggu1 5   57 5.700877
##    Leaflet Minggu2 5   61 4.183300
##      Video     Pre 5   50 7.905694
##      Video Minggu1 5   64 4.183300
##      Video Minggu2 5   71 6.519202
##    Diskusi     Pre 5   50 7.905694
##    Diskusi Minggu1 5   68 5.700877
##    Diskusi Minggu2 5   80 7.905694
## 
## ANOVA CAMPURAN TANPA KOREKSI
## 
## Error: ID
##           Df Sum Sq Mean Sq F value Pr(>F)  
## Perlakuan  2  754.4   377.2   3.518 0.0627 .
## Residuals 12 1286.7   107.2                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Error: ID:Waktu
##                 Df Sum Sq Mean Sq F value   Pr(>F)    
## Waktu            2   3274  1637.2 138.682 6.51e-14 ***
## Perlakuan:Waktu  4    459   114.7   9.718 8.06e-05 ***
## Residuals       24    283    11.8                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## UJI SPHERICITY MAUCHLY
## 
##  Mauchly's test of sphericity
##  Contrasts orthogonal to
##  ~1
## 
## 
## data:  SSD matrix from lm(formula = Y ~ Perlakuan, data = data)
## W = 0.85827, p-value = 0.4315
## 
## 
## KOREKSI GREENHOUSE-GEISSER (dilaporkan konsisten untuk efek waktu)
##             Efek Epsilon_GG   df1_GG   df2_GG          F         p_GG Eta2_parsial
##            Waktu  0.8758637 1.751727 21.02073 138.682353 1.942693e-12    0.9203623
##  Perlakuan:Waktu  0.8758637 3.503455 21.02073   9.717647 1.971518e-04    0.6182635
## 
## SHAPIRO-WILK RESIDUAL
##         Komponen         W          p
##    Rerata_subjek 0.9262578 0.23974057
##  Kontras_waktu_1 0.8829085 0.05244247
##  Kontras_waktu_2 0.9397654 0.37942912
## 
## BROWN-FORSYTHE PER WAKTU
##    Waktu            F df1 df2         p
##      Pre 7.663220e-31   2  12 1.0000000
##  Minggu1 1.176471e-01   2  12 0.8900225
##  Minggu2 9.333333e-01   2  12 0.4200055
## 
## PERUBAHAN MINGGU 2 DIKURANGI PRE
##   Perlakuan Perubahan.Mean Perubahan.SD
## 1   Leaflet      11.000000     5.477226
## 2     Video      21.000000     7.416198
## 3   Diskusi      30.000000     3.535534
## 
## ANOVA PERUBAHAN
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Perlakuan    2  903.3   451.7    13.9 0.000752 ***
## Residuals   12  390.0    32.5                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## TUKEY: SELISIH PERUBAHAN ANTARKELOMPOK, CI 95%
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Perubahan ~ Perlakuan, data = data)
## 
## $Perlakuan
##                 diff        lwr      upr     p adj
## Video-Leaflet     10  0.3808808 19.61912 0.0414967
## Diskusi-Leaflet   19  9.3808808 28.61912 0.0005362
## Diskusi-Video      9 -0.6191192 18.61912 0.0674679
## 
## 
## CATATAN
## Uji lanjut menilai perubahan Pre ke Minggu2, bukan seluruh pasangan waktu.
## Tukey mengoreksi tiga perbandingan pasangan kelompok untuk perubahan tersebut.
## Ukuran sampel kecil; uji asumsi memiliki daya terbatas. p>0,05 bukan bukti asumsi pasti terpenuhi.
## Independensi antarsubjek merupakan asumsi desain, tidak dapat diuji dari angka ini.
## Hasil hanya latihan dan tidak membuktikan efektivitas metode edukasi di populasi nyata.
## 
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=English_Indonesia.utf8  LC_CTYPE=English_Indonesia.utf8    LC_MONETARY=English_Indonesia.utf8
## [4] LC_NUMERIC=C                       LC_TIME=English_Indonesia.utf8    
## 
## time zone: Asia/Makassar
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.39   R6_2.6.1        fastmap_1.2.0   xfun_0.61       cachem_1.1.0    knitr_1.52     
##  [7] htmltools_0.5.9 rmarkdown_2.32  lifecycle_1.0.5 cli_3.6.6       sass_0.4.10     jquerylib_0.1.4
## [13] compiler_4.6.1  tools_4.6.1     evaluate_1.0.5  bslib_0.12.0    yaml_2.3.12     rlang_1.3.0    
## [19] jsonlite_2.0.0
cat("\n\nHasil tersimpan di:",normalizePath(out),"\n")
## 
## 
## Hasil tersimpan di: C:\Users\user\Downloads\hasil_gizi