# ============================================================
# ANALISIS MULTIPLE LINEAR REGRESSION (MLR) LENGKAP
# Mulai dari Estimasi hingga Uji Hipotesis & Residual
# ============================================================


# ------------------------------------------------------------
# 0. PERSIAPAN: LOAD LIBRARY DAN DATA
# ------------------------------------------------------------


# Load library
library(car)
## Loading required package: carData
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(nortest)
library(MASS)
library(olsrr)
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:MASS':
## 
##     cement
## The following object is masked from 'package:datasets':
## 
##     rivers
library(ggplot2)
library(corrplot)
## corrplot 0.95 loaded
library(moments)

# Set seed untuk reproduktifitas
set.seed(123)


# ------------------------------------------------------------
# 1. MEMBUAT DATA SIMULASI
# ------------------------------------------------------------

# Simulasi data: 100 observasi, 5 variabel independen
n <- 100

# X1 = Normal
X1 <- rnorm(n, mean = 50, sd = 10)

# X2 = Normal
X2 <- rnorm(n, mean = 30, sd = 5)

# X3 = Weibull
X3 <- rweibull(n, shape = 2, scale = 8)

# X4 = Beta
X4 <- rbeta(n, shape1 = 2, shape2 = 5) * 20

# X5 = Chi-Square
# X5 digunakan sebagai variabel dengan distribusi tidak normal
X5 <- rchisq(n, df = 5)


# Model:
# Y = 5 + 0.5*X1 + 0.3*X2 - 0.2*X3 + 0.1*X4
#     + 0.2*X5 + error

Y <- 5 + 
  0.5*X1 + 
  0.3*X2 - 
  0.2*X3 + 
  0.1*X4 + 
  0.2*X5 + 
  rnorm(n, mean = 0, sd = 3)


# Buat data frame
data <- data.frame(
  Y = Y,
  X1 = X1,
  X2 = X2,
  X3 = X3,
  X4 = X4,
  X5 = X5
)


# Tampilkan 6 baris pertama
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("DATA YANG DIGUNAKAN\n")
## DATA YANG DIGUNAKAN
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
print(head(data))
##          Y       X1       X2         X3        X4        X5
## 1 32.80633 44.39524 26.44797  0.9480543  4.315718  5.141125
## 2 38.62270 47.69823 31.28442 11.2776791  3.707507  1.772879
## 3 56.27093 65.58708 28.76654  2.5232146  4.424703 13.094574
## 4 40.51181 50.70508 28.26229  5.9390167  6.086879 19.656701
## 5 41.94787 51.29288 25.24191  7.7055151 14.002152  6.675153
## 6 45.38196 67.15065 29.77486  7.1507056  5.363228  5.572990
# ------------------------------------------------------------
# 2. STATISTIK DESKRIPTIF DAN EKSPLORASI DATA
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("1. STATISTIK DESKRIPTIF\n")
## 1. STATISTIK DESKRIPTIF
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Statistik deskriptif
summary(data)
##        Y               X1              X2              X3         
##  Min.   :25.36   Min.   :26.91   Min.   :19.73   Min.   : 0.4657  
##  1st Qu.:34.92   1st Qu.:45.06   1st Qu.:25.99   1st Qu.: 4.7105  
##  Median :38.57   Median :50.62   Median :28.87   Median : 7.0309  
##  Mean   :39.01   Mean   :50.90   Mean   :29.46   Mean   : 7.2130  
##  3rd Qu.:42.48   3rd Qu.:56.92   3rd Qu.:32.34   3rd Qu.: 9.6466  
##  Max.   :56.27   Max.   :71.87   Max.   :46.21   Max.   :22.1597  
##        X4                X5         
##  Min.   : 0.3583   Min.   : 0.1821  
##  1st Qu.: 3.9110   1st Qu.: 2.4663  
##  Median : 5.8606   Median : 4.1222  
##  Mean   : 6.2836   Mean   : 4.6251  
##  3rd Qu.: 8.6400   3rd Qu.: 6.3293  
##  Max.   :16.2690   Max.   :19.6567
# Matriks korelasi
cat("\nMatriks Korelasi:\n")
## 
## Matriks Korelasi:
cor_matrix <- cor(data)

print(round(cor_matrix, 3))
##         Y     X1     X2     X3     X4     X5
## Y   1.000  0.760  0.263 -0.092  0.009  0.089
## X1  0.760  1.000 -0.050  0.011 -0.059 -0.052
## X2  0.263 -0.050  1.000 -0.101 -0.089  0.063
## X3 -0.092  0.011 -0.101  1.000  0.094  0.107
## X4  0.009 -0.059 -0.089  0.094  1.000 -0.085
## X5  0.089 -0.052  0.063  0.107 -0.085  1.000
# Visualisasi matriks korelasi
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  addCoef.col = "black",
  tl.col = "black",
  tl.srt = 45,
  title = "Matriks Korelasi Antar Variabel",
  mar = c(0,0,2,0)
)

# Scatter plot matrix
pairs(
  data,
  main = "Scatter Plot Matrix",
  pch = 19,
  col = "steelblue"
)

# ------------------------------------------------------------
# 3. ESTIMASI MODEL MULTIPLE LINEAR REGRESSION
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("2. ESTIMASI MODEL MLR\n")
## 2. ESTIMASI MODEL MLR
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Fit model MLR
model <- lm(
  Y ~ X1 + X2 + X3 + X4 + X5,
  data = data
)


# Ringkasan model
cat("\nRingkasan Model:\n")
## 
## Ringkasan Model:
print(summary(model))
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.3186 -2.4312 -0.0366  2.1377  8.0578 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.41563    2.95303   1.157   0.2503    
## X1           0.48151    0.03472  13.867  < 2e-16 ***
## X2           0.33859    0.06602   5.129 1.56e-06 ***
## X3          -0.14242    0.08645  -1.647   0.1028    
## X4           0.16578    0.09343   1.774   0.0792 .  
## X5           0.23691    0.10406   2.277   0.0251 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.138 on 94 degrees of freedom
## Multiple R-squared:  0.6988, Adjusted R-squared:  0.6827 
## F-statistic: 43.61 on 5 and 94 DF,  p-value: < 2.2e-16
# Ekstrak koefisien
cat("\nKoefisien Regresi:\n")
## 
## Koefisien Regresi:
coef_df <- data.frame(
  Variabel = names(coef(model)),
  Koefisien = round(coef(model), 4),
  Std_Error = round(summary(model)$coefficients[, 2], 4),
  t_value = round(summary(model)$coefficients[, 3], 4),
  p_value = round(summary(model)$coefficients[, 4], 4)
)

print(coef_df)
##                Variabel Koefisien Std_Error t_value p_value
## (Intercept) (Intercept)    3.4156    2.9530  1.1567  0.2503
## X1                   X1    0.4815    0.0347 13.8674  0.0000
## X2                   X2    0.3386    0.0660  5.1289  0.0000
## X3                   X3   -0.1424    0.0864 -1.6475  0.1028
## X4                   X4    0.1658    0.0934  1.7745  0.0792
## X5                   X5    0.2369    0.1041  2.2767  0.0251
# Interval kepercayaan 95%
cat("\nInterval Kepercayaan 95%:\n")
## 
## Interval Kepercayaan 95%:
ci <- confint(model, level = 0.95)

print(round(ci, 4))
##               2.5 % 97.5 %
## (Intercept) -2.4477 9.2789
## X1           0.4126 0.5505
## X2           0.2075 0.4697
## X3          -0.3141 0.0292
## X4          -0.0197 0.3513
## X5           0.0303 0.4435
# ------------------------------------------------------------
# 4. UJI SIGNIFIKANSI SIMULTAN (UJI F)
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("3. UJI SIGNIFIKANSI SIMULTAN (UJI F)\n")
## 3. UJI SIGNIFIKANSI SIMULTAN (UJI F)
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Ekstrak informasi F-test
f_stat <- summary(model)$fstatistic

f_value <- f_stat[1]

df1 <- f_stat[2]

df2 <- f_stat[3]

f_pvalue <- pf(
  f_value,
  df1,
  df2,
  lower.tail = FALSE
)


cat("\nHipotesis:\n")
## 
## Hipotesis:
cat(
  "H0: β1 = β2 = β3 = β4 = β5 = 0 ",
  "(Model tidak signifikan)\n"
)
## H0: β1 = β2 = β3 = β4 = β5 = 0  (Model tidak signifikan)
cat(
  "H1: Minimal ada satu βj ≠ 0 ",
  "(Model signifikan)\n"
)
## H1: Minimal ada satu βj ≠ 0  (Model signifikan)
cat("\nHasil Uji F:\n")
## 
## Hasil Uji F:
cat(
  "F-statistic:",
  round(f_value, 4),
  "\n"
)
## F-statistic: 43.6093
cat(
  "df1:",
  df1,
  "\n"
)
## df1: 5
cat(
  "df2:",
  df2,
  "\n"
)
## df2: 94
cat(
  "p-value:",
  format(f_pvalue, scientific = TRUE),
  "\n"
)
## p-value: 4.815451e-23
if (f_pvalue < 0.05) {
  
  cat(
    "Kesimpulan: Tolak H0 → Model signifikan pada α = 5%\n"
  )
  
} else {
  
  cat(
    "Kesimpulan: Gagal Tolak H0 → Model tidak signifikan\n"
  )
}
## Kesimpulan: Tolak H0 → Model signifikan pada α = 5%
# ------------------------------------------------------------
# 5. UJI SIGNIFIKANSI PARSIAL (UJI T)
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("4. UJI SIGNIFIKANSI PARSIAL (UJI T)\n")
## 4. UJI SIGNIFIKANSI PARSIAL (UJI T)
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("\nHipotesis untuk setiap βj:\n")
## 
## Hipotesis untuk setiap βj:
cat(
  "H0: βj = 0 (Variabel tidak signifikan)\n"
)
## H0: βj = 0 (Variabel tidak signifikan)
cat(
  "H1: βj ≠ 0 (Variabel signifikan)\n"
)
## H1: βj ≠ 0 (Variabel signifikan)
cat("\nHasil Uji T:\n")
## 
## Hasil Uji T:
for (i in 2:nrow(coef_df)) {
  
  var_name <- coef_df$Variabel[i]
  
  t_val <- coef_df$t_value[i]
  
  p_val <- coef_df$p_value[i]
  
  sig <- ifelse(
    p_val < 0.001,
    "***",
    ifelse(
      p_val < 0.01,
      "**",
      ifelse(
        p_val < 0.05,
        "*",
        ifelse(
          p_val < 0.1,
          ".",
          "ns"
        )
      )
    )
  )
  
  cat(
    sprintf(
      "%-10s: t = %7.4f, p = %8.4f %s\n",
      var_name,
      t_val,
      p_val,
      sig
    )
  )
}
## X1        : t = 13.8674, p =   0.0000 ***
## X2        : t =  5.1289, p =   0.0000 ***
## X3        : t = -1.6475, p =   0.1028 ns
## X4        : t =  1.7745, p =   0.0792 .
## X5        : t =  2.2767, p =   0.0251 *
cat(
  "\nKeterangan: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1, ns tidak signifikan\n"
)
## 
## Keterangan: *** p<0.001, ** p<0.01, * p<0.05, . p<0.1, ns tidak signifikan
# ------------------------------------------------------------
# 6. KOEFISIEN DETERMINASI (R² dan Adjusted R²)
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("5. KOEFISIEN DETERMINASI\n")
## 5. KOEFISIEN DETERMINASI
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
r_squared <- summary(model)$r.squared

adj_r_squared <- summary(model)$adj.r.squared

resid_se <- summary(model)$sigma


cat(
  "\nR-squared:",
  round(r_squared, 4),
  "\n"
)
## 
## R-squared: 0.6988
cat(
  "Adjusted R-squared:",
  round(adj_r_squared, 4),
  "\n"
)
## Adjusted R-squared: 0.6827
cat(
  "Residual Standard Error:",
  round(resid_se, 4),
  "\n"
)
## Residual Standard Error: 3.1382
cat(
  "Interpretasi: Model mampu menjelaskan",
  round(r_squared * 100, 2),
  "% variasi pada Y\n"
)
## Interpretasi: Model mampu menjelaskan 69.88 % variasi pada Y
# ------------------------------------------------------------
# 7. UJI ASUMSI RESIDUAL
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("6. UJI ASUMSI RESIDUAL\n")
## 6. UJI ASUMSI RESIDUAL
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Ekstrak residual
residuals <- residuals(model)

fitted_values <- fitted(model)

standardized_resid <- rstandard(model)


# --- 7.1. UJI NORMALITAS RESIDUAL ---

cat("\n--- 6.1. UJI NORMALITAS RESIDUAL ---\n")
## 
## --- 6.1. UJI NORMALITAS RESIDUAL ---
# Shapiro-Wilk Test
shapiro_test <- shapiro.test(residuals)

cat("\nShapiro-Wilk Test:\n")
## 
## Shapiro-Wilk Test:
cat(
  "W =",
  round(shapiro_test$statistic, 4),
  "\n"
)
## W = 0.9936
cat(
  "p-value =",
  round(shapiro_test$p.value, 4),
  "\n"
)
## p-value = 0.9237
cat(
  "Kesimpulan:",
  ifelse(
    shapiro_test$p.value > 0.05,
    "Residual berdistribusi normal",
    "Residual TIDAK berdistribusi normal"
  ),
  "\n"
)
## Kesimpulan: Residual berdistribusi normal
# Kolmogorov-Smirnov Test
ks_test <- ks.test(
  residuals,
  "pnorm",
  mean(residuals),
  sd(residuals)
)

cat("\nKolmogorov-Smirnov Test:\n")
## 
## Kolmogorov-Smirnov Test:
cat(
  "D =",
  round(ks_test$statistic, 4),
  "\n"
)
## D = 0.0458
cat(
  "p-value =",
  round(ks_test$p.value, 4),
  "\n"
)
## p-value = 0.9848
cat(
  "Kesimpulan:",
  ifelse(
    ks_test$p.value > 0.05,
    "Residual berdistribusi normal",
    "Residual TIDAK berdistribusi normal"
  ),
  "\n"
)
## Kesimpulan: Residual berdistribusi normal
# Anderson-Darling Test
ad_test <- ad.test(residuals)

cat("\nAnderson-Darling Test:\n")
## 
## Anderson-Darling Test:
cat(
  "A =",
  round(ad_test$statistic, 4),
  "\n"
)
## A = 0.2166
cat(
  "p-value =",
  round(ad_test$p.value, 4),
  "\n"
)
## p-value = 0.8401
cat(
  "Kesimpulan:",
  ifelse(
    ad_test$p.value > 0.05,
    "Residual berdistribusi normal",
    "Residual TIDAK berdistribusi normal"
  ),
  "\n"
)
## Kesimpulan: Residual berdistribusi normal
# Jarque-Bera Test
jb_test <- jarque.test(residuals)

cat("\nJarque-Bera Test:\n")
## 
## Jarque-Bera Test:
cat(
  "JB =",
  round(jb_test$statistic, 4),
  "\n"
)
## JB = 0.5471
cat(
  "p-value =",
  round(jb_test$p.value, 4),
  "\n"
)
## p-value = 0.7607
cat(
  "Kesimpulan:",
  ifelse(
    jb_test$p.value > 0.05,
    "Residual berdistribusi normal",
    "Residual TIDAK berdistribusi normal"
  ),
  "\n"
)
## Kesimpulan: Residual berdistribusi normal
# --- 7.2. UJI HETEROSKEDASTISITAS ---

bp_test <- bptest(model)

glejser_test <- bptest(
  model,
  ~ fitted(model)
)


cat(
  "Breusch-Pagan p-value:",
  round(bp_test$p.value, 4),
  "\n"
)
## Breusch-Pagan p-value: 0.0029
cat(
  "Glejser p-value:",
  round(glejser_test$p.value, 4),
  "\n"
)
## Glejser p-value: 0.0237
# Kesimpulan
if (
  bp_test$p.value > 0.05 &
  glejser_test$p.value > 0.05
) {
  
  cat(
    "Kesimpulan: Tidak ada heteroskedastisitas\n"
  )
  
} else {
  
  cat(
    "Kesimpulan: Ada heteroskedastisitas\n"
  )
}
## Kesimpulan: Ada heteroskedastisitas
# --- 7.3. UJI AUTOKORELASI ---

cat("\n--- 6.3. UJI AUTOKORELASI ---\n")
## 
## --- 6.3. UJI AUTOKORELASI ---
# Durbin-Watson Test
dw_test <- dwtest(model)

cat("\nDurbin-Watson Test:\n")
## 
## Durbin-Watson Test:
cat(
  "DW =",
  round(dw_test$statistic, 4),
  "\n"
)
## DW = 2.2335
cat(
  "p-value =",
  round(dw_test$p.value, 4),
  "\n"
)
## p-value = 0.8816
cat(
  "Kesimpulan:",
  ifelse(
    dw_test$statistic < 1.5,
    "Ada autokorelasi positif",
    ifelse(
      dw_test$statistic > 2.5,
      "Ada autokorelasi negatif",
      "Tidak ada autokorelasi"
    )
  ),
  "\n"
)
## Kesimpulan: Tidak ada autokorelasi
# Breusch-Godfrey Test
bg_test <- bgtest(
  model,
  order = 1
)

cat("\nBreusch-Godfrey Test (Lag 1):\n")
## 
## Breusch-Godfrey Test (Lag 1):
cat(
  "LM =",
  round(bg_test$statistic, 4),
  "\n"
)
## LM = 1.7107
cat(
  "p-value =",
  round(bg_test$p.value, 4),
  "\n"
)
## p-value = 0.1909
cat(
  "Kesimpulan:",
  ifelse(
    bg_test$p.value > 0.05,
    "Tidak ada autokorelasi",
    "Ada autokorelasi"
  ),
  "\n"
)
## Kesimpulan: Tidak ada autokorelasi
# --- 7.4. UJI MULTIKOLINEARITAS ---

cat("\n--- 6.4. UJI MULTIKOLINEARITAS ---\n")
## 
## --- 6.4. UJI MULTIKOLINEARITAS ---
# VIF
vif_values <- vif(model)

cat("\nVIF Values:\n")
## 
## VIF Values:
print(round(vif_values, 4))
##     X1     X2     X3     X4     X5 
## 1.0099 1.0241 1.0335 1.0288 1.0288
cat("\nInterpretasi VIF:\n")
## 
## Interpretasi VIF:
for (i in 1:length(vif_values)) {
  
  vif_val <- vif_values[i]
  
  var_name <- names(vif_values)[i]
  
  status <- ifelse(
    vif_val < 5,
    "Tidak ada multikolinearitas",
    ifelse(
      vif_val < 10,
      "Multikolinearitas moderat",
      "Multikolinearitas serius"
    )
  )
  
  cat(
    sprintf(
      "%-10s: VIF = %7.4f → %s\n",
      var_name,
      vif_val,
      status
    )
  )
}
## X1        : VIF =  1.0099 → Tidak ada multikolinearitas
## X2        : VIF =  1.0241 → Tidak ada multikolinearitas
## X3        : VIF =  1.0335 → Tidak ada multikolinearitas
## X4        : VIF =  1.0288 → Tidak ada multikolinearitas
## X5        : VIF =  1.0288 → Tidak ada multikolinearitas
# Tolerance
tolerance <- 1 / vif_values

cat("\nTolerance Values:\n")
## 
## Tolerance Values:
print(round(tolerance, 4))
##     X1     X2     X3     X4     X5 
## 0.9902 0.9764 0.9676 0.9720 0.9720
# Condition Number
cat(
  "\nCondition Number:",
  round(kappa(model), 4),
  "\n"
)
## 
## Condition Number: 279.6448
cat(
  "(Condition Number > 30 mengindikasikan multikolinearitas)\n"
)
## (Condition Number > 30 mengindikasikan multikolinearitas)
# --- 7.5. UJI LINEARITAS ---

cat("\n--- 6.5. UJI LINEARITAS ---\n")
## 
## --- 6.5. UJI LINEARITAS ---
# Ramsey RESET Test
reset_test <- resettest(
  model,
  power = 2:3,
  type = "fitted"
)

cat("\nRamsey RESET Test:\n")
## 
## Ramsey RESET Test:
cat(
  "F =",
  round(reset_test$statistic, 4),
  "\n"
)
## F = 0.1979
cat(
  "p-value =",
  round(reset_test$p.value, 4),
  "\n"
)
## p-value = 0.8208
cat(
  "Kesimpulan:",
  ifelse(
    reset_test$p.value > 0.05,
    "Model linear (spesifikasi benar)",
    "Model TIDAK linear (spesifikasi salah)"
  ),
  "\n"
)
## Kesimpulan: Model linear (spesifikasi benar)
# ------------------------------------------------------------
# 8. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("7. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS\n")
## 7. DIAGNOSTIK OUTLIER DAN INFLUENTIAL POINTS
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Cook's Distance
cooks_d <- cooks.distance(model)

cat("\nCook's Distance:\n")
## 
## Cook's Distance:
cat(
  "Nilai maksimum:",
  round(max(cooks_d), 4),
  "\n"
)
## Nilai maksimum: 0.2185
cat(
  "Jumlah observasi dengan Cook's D > 1:",
  sum(cooks_d > 1),
  "\n"
)
## Jumlah observasi dengan Cook's D > 1: 0
# Leverage (Hat Values)
leverage <- hatvalues(model)

cat("\nLeverage (Hat Values):\n")
## 
## Leverage (Hat Values):
cat(
  "Nilai maksimum:",
  round(max(leverage), 4),
  "\n"
)
## Nilai maksimum: 0.2657
cat(
  "Threshold 2(k+1)/n:",
  round(
    2 * length(coef(model)) / n,
    4
  ),
  "\n"
)
## Threshold 2(k+1)/n: 0.12
cat(
  "Jumlah observasi dengan leverage > threshold:",
  sum(
    leverage >
      2 * length(coef(model)) / n
  ),
  "\n"
)
## Jumlah observasi dengan leverage > threshold: 6
# Studentized Residuals
std_resid <- rstudent(model)

cat("\nStudentized Residuals:\n")
## 
## Studentized Residuals:
cat(
  "Nilai maksimum absolut:",
  round(max(abs(std_resid)), 4),
  "\n"
)
## Nilai maksimum absolut: 2.8833
cat(
  "Jumlah observasi dengan |std_resid| > 3:",
  sum(abs(std_resid) > 3),
  "\n"
)
## Jumlah observasi dengan |std_resid| > 3: 0
# DFBETAS
dfbetas_val <- dfbetas(model)

cat("\nDFBETAS:\n")
## 
## DFBETAS:
cat(
  "Jumlah observasi dengan |DFBETAS| > 1:",
  sum(abs(dfbetas_val) > 1),
  "\n"
)
## Jumlah observasi dengan |DFBETAS| > 1: 0
# ------------------------------------------------------------
# 9. VISUALISASI DIAGNOSTIK
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("8. VISUALISASI DIAGNOSTIK\n")
## 8. VISUALISASI DIAGNOSTIK
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Set par untuk 2x2 plot
par(mfrow = c(2, 2))


# Plot 1: Residual vs Fitted
plot(
  fitted_values,
  residuals,
  xlab = "Fitted Values",
  ylab = "Residuals",
  main = "Residual vs Fitted",
  pch = 19,
  col = "steelblue"
)

abline(
  h = 0,
  col = "red",
  lty = 2
)

lines(
  lowess(fitted_values, residuals),
  col = "green",
  lwd = 2
)


# Plot 2: QQ-Plot
qqnorm(
  residuals,
  pch = 19,
  col = "steelblue",
  main = "Normal Q-Q Plot"
)

qqline(
  residuals,
  col = "red",
  lwd = 2
)


# Plot 3: Scale-Location
plot(
  fitted_values,
  sqrt(abs(standardized_resid)),
  xlab = "Fitted Values",
  ylab = "√|Standardized Residuals|",
  main = "Scale-Location",
  pch = 19,
  col = "steelblue"
)

lines(
  lowess(
    fitted_values,
    sqrt(abs(standardized_resid))
  ),
  col = "green",
  lwd = 2
)


# Plot 4: Residual vs Leverage
plot(
  leverage,
  standardized_resid,
  xlab = "Leverage",
  ylab = "Standardized Residuals",
  main = "Residual vs Leverage",
  pch = 19,
  col = "steelblue"
)

abline(
  h = 0,
  col = "red",
  lty = 2
)

abline(
  v = 2 * length(coef(model)) / n,
  col = "red",
  lty = 2
)

# Reset par
par(mfrow = c(1, 1))


# ------------------------------------------------------------
# 10. UJI BOX-COX UNTUK TRANSFORMASI
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("9. UJI BOX-COX\n")
## 9. UJI BOX-COX
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Box-Cox transformation
bc <- boxcox(
  model,
  lambda = seq(-2, 2, 0.1)
)

lambda_opt <- bc$x[which.max(bc$y)]

cat(
  "\nOptimal Lambda:",
  round(lambda_opt, 4),
  "\n"
)
## 
## Optimal Lambda: 0.101
cat("Interpretasi:\n")
## Interpretasi:
cat("- Jika λ ≈ 1: Tidak perlu transformasi\n")
## - Jika λ ≈ 1: Tidak perlu transformasi
cat("- Jika λ ≈ 0: Gunakan log transformation\n")
## - Jika λ ≈ 0: Gunakan log transformation
cat("- Jika λ ≈ 0.5: Gunakan square root transformation\n")
## - Jika λ ≈ 0.5: Gunakan square root transformation
# ------------------------------------------------------------
# 11. PEMILIHAN MODEL (STEPWISE)
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("10. PEMILIHAN MODEL (STEPWISE)\n")
## 10. PEMILIHAN MODEL (STEPWISE)
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Stepwise selection
step_model <- step(
  model,
  direction = "both",
  trace = 1
)
## Start:  AIC=234.54
## Y ~ X1 + X2 + X3 + X4 + X5
## 
##        Df Sum of Sq     RSS    AIC
## <none>               925.74 234.54
## - X3    1     26.73  952.47 235.39
## - X4    1     31.01  956.75 235.84
## - X5    1     51.05  976.79 237.91
## - X2    1    259.06 1184.80 257.22
## - X1    1   1893.87 2819.61 343.92
cat("\nModel Terbaik (Stepwise):\n")
## 
## Model Terbaik (Stepwise):
print(summary(step_model))
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.3186 -2.4312 -0.0366  2.1377  8.0578 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.41563    2.95303   1.157   0.2503    
## X1           0.48151    0.03472  13.867  < 2e-16 ***
## X2           0.33859    0.06602   5.129 1.56e-06 ***
## X3          -0.14242    0.08645  -1.647   0.1028    
## X4           0.16578    0.09343   1.774   0.0792 .  
## X5           0.23691    0.10406   2.277   0.0251 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.138 on 94 degrees of freedom
## Multiple R-squared:  0.6988, Adjusted R-squared:  0.6827 
## F-statistic: 43.61 on 5 and 94 DF,  p-value: < 2.2e-16
# ------------------------------------------------------------
# 12. RINGKASAN HASIL
# ------------------------------------------------------------

cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("11. RINGKASAN HASIL ANALISIS\n")
## 11. RINGKASAN HASIL ANALISIS
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("\n--- MODEL AKHIR ---\n")
## 
## --- MODEL AKHIR ---
cat("Persamaan Regresi:\n")
## Persamaan Regresi:
cat(
  sprintf(
    "Y = %.4f + %.4f*X1 + %.4f*X2 + %.4f*X3 + %.4f*X4 + %.4f*X5\n",
    coef(model)[1],
    coef(model)[2],
    coef(model)[3],
    coef(model)[4],
    coef(model)[5],
    coef(model)[6]
  )
)
## Y = 3.4156 + 0.4815*X1 + 0.3386*X2 + -0.1424*X3 + 0.1658*X4 + 0.2369*X5
cat("\n--- UJI SIGNIFIKANSI ---\n")
## 
## --- UJI SIGNIFIKANSI ---
cat(
  "Uji F (Simultan): p-value =",
  format(f_pvalue, scientific = TRUE),
  "\n"
)
## Uji F (Simultan): p-value = 4.815451e-23
cat("Uji t (Parsial):\n")
## Uji t (Parsial):
for (i in 2:nrow(coef_df)) {
  
  cat(
    sprintf(
      "  %s: p-value = %.4f\n",
      coef_df$Variabel[i],
      coef_df$p_value[i]
    )
  )
}
##   X1: p-value = 0.0000
##   X2: p-value = 0.0000
##   X3: p-value = 0.1028
##   X4: p-value = 0.0792
##   X5: p-value = 0.0251
cat("\n--- UJI ASUMSI RESIDUAL ---\n")
## 
## --- UJI ASUMSI RESIDUAL ---
cat(
  "Normalitas (Shapiro-Wilk): p-value =",
  round(shapiro_test$p.value, 4),
  "\n"
)
## Normalitas (Shapiro-Wilk): p-value = 0.9237
cat(
  "Heteroskedastisitas (Breusch-Pagan): p-value =",
  round(bp_test$p.value, 4),
  "\n"
)
## Heteroskedastisitas (Breusch-Pagan): p-value = 0.0029
cat(
  "Autokorelasi (Durbin-Watson): DW =",
  round(dw_test$statistic, 4),
  "\n"
)
## Autokorelasi (Durbin-Watson): DW = 2.2335
cat(
  "Multikolinearitas (VIF max):",
  round(max(vif_values), 4),
  "\n"
)
## Multikolinearitas (VIF max): 1.0335
cat(
  "Linearitas (Ramsey RESET): p-value =",
  round(reset_test$p.value, 4),
  "\n"
)
## Linearitas (Ramsey RESET): p-value = 0.8208
cat("\n--- KESIMPULAN ---\n")
## 
## --- KESIMPULAN ---
cat(
  "R-squared:",
  round(r_squared, 4),
  "\n"
)
## R-squared: 0.6988
cat(
  "Adjusted R-squared:",
  round(adj_r_squared, 4),
  "\n"
)
## Adjusted R-squared: 0.6827
cat(
  "Distribusi X1: Normal\n"
)
## Distribusi X1: Normal
cat(
  "Distribusi X2: Normal\n"
)
## Distribusi X2: Normal
cat(
  "Distribusi X3: Weibull\n"
)
## Distribusi X3: Weibull
cat(
  "Distribusi X4: Beta\n"
)
## Distribusi X4: Beta
cat(
  "Distribusi X5: Chi-Square (non-normal)\n"
)
## Distribusi X5: Chi-Square (non-normal)
cat("\n", rep("=", 60), "\n")
## 
##  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
cat("ANALISIS SELESAI\n")
## ANALISIS SELESAI
cat(rep("=", 60), "\n")
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =