# 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