knitr::opts_chunk$set(echo = TRUE)
library(readxl)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.1.6
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(psych)
##
## Attaching package: 'psych'
##
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(corrplot)
## corrplot 0.95 loaded
library(GGally)
data <- read_excel("parkinsons_dataset.xlsx")
## New names:
## • `MDVP:Jitter` -> `MDVP:Jitter...4`
## • `MDVP:Jitter` -> `MDVP:Jitter...5`
## • `MDVP:Shimmer` -> `MDVP:Shimmer...9`
## • `MDVP:Shimmer` -> `MDVP:Shimmer...10`
head(data)
## # A tibble: 6 × 23
## `MDVP:Fo` `MDVP:Fhi` `MDVP:Flo` `MDVP:Jitter...4` `MDVP:Jitter...5` `MDVP:RAP`
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 120. 157. 75.0 0.00784 0.00784 0.0037
## 2 122. 149. 114. 0.00968 0.00968 0.00465
## 3 117. 131. 112. 0.0105 0.0105 0.00544
## 4 117. 138. 111. 0.00997 0.00997 0.00502
## 5 116. 142. 111. 0.0128 0.0128 0.00655
## 6 121. 131. 114. 0.00968 0.00968 0.00463
## # ℹ 17 more variables: `MDVP:PPQ` <dbl>, `Jitter:DDP` <dbl>,
## # `MDVP:Shimmer...9` <dbl>, `MDVP:Shimmer...10` <dbl>, `Shimmer:APQ3` <dbl>,
## # `Shimmer:APQ5` <dbl>, `MDVP:APQ` <dbl>, `Shimmer:DDA` <dbl>, NHR <dbl>,
## # HNR <dbl>, RPDE <dbl>, DFA <dbl>, spread1 <dbl>, spread2 <dbl>, D2 <dbl>,
## # PPE <dbl>, target <dbl>
# Struktur data
str(data)
## tibble [195 × 23] (S3: tbl_df/tbl/data.frame)
## $ MDVP:Fo : num [1:195] 120 122 117 117 116 ...
## $ MDVP:Fhi : num [1:195] 157 149 131 138 142 ...
## $ MDVP:Flo : num [1:195] 75 114 112 111 111 ...
## $ MDVP:Jitter...4 : num [1:195] 0.00784 0.00968 0.0105 0.00997 0.01284 ...
## $ MDVP:Jitter...5 : num [1:195] 0.00784 0.00968 0.0105 0.00997 0.01284 ...
## $ MDVP:RAP : num [1:195] 0.0037 0.00465 0.00544 0.00502 0.00655 0.00463 0.00155 0.00144 0.00293 0.00268 ...
## $ MDVP:PPQ : num [1:195] 0.00554 0.00696 0.00781 0.00698 0.00908 0.0075 0.00202 0.00182 0.00332 0.00332 ...
## $ Jitter:DDP : num [1:195] 0.0111 0.0139 0.0163 0.015 0.0197 ...
## $ MDVP:Shimmer...9 : num [1:195] 0.0437 0.0613 0.0523 0.0549 0.0643 ...
## $ MDVP:Shimmer...10: num [1:195] 0.0437 0.0613 0.0523 0.0549 0.0643 ...
## $ Shimmer:APQ3 : num [1:195] 0.0218 0.0313 0.0276 0.0292 0.0349 ...
## $ Shimmer:APQ5 : num [1:195] 0.0313 0.0452 0.0386 0.0401 0.0483 ...
## $ MDVP:APQ : num [1:195] 0.0297 0.0437 0.0359 0.0377 0.0447 ...
## $ Shimmer:DDA : num [1:195] 0.0654 0.094 0.0827 0.0877 0.1047 ...
## $ NHR : num [1:195] 0.0221 0.0193 0.0131 0.0135 0.0177 ...
## $ HNR : num [1:195] 21 19.1 20.7 20.6 19.6 ...
## $ RPDE : num [1:195] 0.415 0.458 0.43 0.435 0.417 ...
## $ DFA : num [1:195] 0.815 0.82 0.825 0.819 0.823 ...
## $ spread1 : num [1:195] -4.81 -4.08 -4.44 -4.12 -3.75 ...
## $ spread2 : num [1:195] 0.266 0.336 0.311 0.334 0.235 ...
## $ D2 : num [1:195] 2.3 2.49 2.34 2.41 2.33 ...
## $ PPE : num [1:195] 0.285 0.369 0.333 0.369 0.41 ...
## $ target : num [1:195] 1 1 1 1 1 1 1 1 1 1 ...
# Dimensi data
dim(data)
## [1] 195 23
str(data) digunakan untuk mengetahui tipe masing-masing variabel, sedangkan dim(data) digunakan untuk mengetahui jumlah baris (observasi) dan kolom (variabel).
summary(data)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## Min. : 88.33 Min. :102.1 Min. : 65.48 Min. :0.001680
## 1st Qu.:117.57 1st Qu.:134.9 1st Qu.: 84.29 1st Qu.:0.003460
## Median :148.79 Median :175.8 Median :104.31 Median :0.004940
## Mean :154.23 Mean :197.1 Mean :116.32 Mean :0.006220
## 3rd Qu.:182.77 3rd Qu.:224.2 3rd Qu.:140.02 3rd Qu.:0.007365
## Max. :260.11 Max. :592.0 Max. :239.17 Max. :0.033160
## MDVP:Jitter...5 MDVP:RAP MDVP:PPQ Jitter:DDP
## Min. :0.001680 Min. :0.000680 Min. :0.000920 Min. :0.002040
## 1st Qu.:0.003460 1st Qu.:0.001660 1st Qu.:0.001860 1st Qu.:0.004985
## Median :0.004940 Median :0.002500 Median :0.002690 Median :0.007490
## Mean :0.006220 Mean :0.003306 Mean :0.003446 Mean :0.009920
## 3rd Qu.:0.007365 3rd Qu.:0.003835 3rd Qu.:0.003955 3rd Qu.:0.011505
## Max. :0.033160 Max. :0.021440 Max. :0.019580 Max. :0.064330
## MDVP:Shimmer...9 MDVP:Shimmer...10 Shimmer:APQ3 Shimmer:APQ5
## Min. :0.00954 Min. :0.00954 Min. :0.004550 Min. :0.00570
## 1st Qu.:0.01650 1st Qu.:0.01650 1st Qu.:0.008245 1st Qu.:0.00958
## Median :0.02297 Median :0.02297 Median :0.012790 Median :0.01347
## Mean :0.02971 Mean :0.02971 Mean :0.015664 Mean :0.01788
## 3rd Qu.:0.03789 3rd Qu.:0.03789 3rd Qu.:0.020265 3rd Qu.:0.02238
## Max. :0.11908 Max. :0.11908 Max. :0.056470 Max. :0.07940
## MDVP:APQ Shimmer:DDA NHR HNR
## Min. :0.00719 Min. :0.01364 Min. :0.000650 Min. : 8.441
## 1st Qu.:0.01308 1st Qu.:0.02474 1st Qu.:0.005925 1st Qu.:19.198
## Median :0.01826 Median :0.03836 Median :0.011660 Median :22.085
## Mean :0.02408 Mean :0.04699 Mean :0.024847 Mean :21.886
## 3rd Qu.:0.02940 3rd Qu.:0.06080 3rd Qu.:0.025640 3rd Qu.:25.076
## Max. :0.13778 Max. :0.16942 Max. :0.314820 Max. :33.047
## RPDE DFA spread1 spread2
## Min. :0.2566 Min. :0.5743 Min. :-7.965 Min. :0.006274
## 1st Qu.:0.4213 1st Qu.:0.6748 1st Qu.:-6.450 1st Qu.:0.174350
## Median :0.4960 Median :0.7223 Median :-5.721 Median :0.218885
## Mean :0.4985 Mean :0.7181 Mean :-5.684 Mean :0.226510
## 3rd Qu.:0.5876 3rd Qu.:0.7619 3rd Qu.:-5.046 3rd Qu.:0.279234
## Max. :0.6852 Max. :0.8253 Max. :-2.434 Max. :0.450493
## D2 PPE target
## Min. :1.423 Min. :0.04454 Min. :0.0000
## 1st Qu.:2.099 1st Qu.:0.13745 1st Qu.:1.0000
## Median :2.362 Median :0.19405 Median :1.0000
## Mean :2.382 Mean :0.20655 Mean :0.7538
## 3rd Qu.:2.636 3rd Qu.:0.25298 3rd Qu.:1.0000
## Max. :3.671 Max. :0.52737 Max. :1.0000
Fungsi summary(data) digunakan untuk menampilkan ringkasan statistik setiap variabel, seperti nilai minimum, maksimum, median, mean, dan kuartil. Informasi ini berguna untuk mendeteksi kejanggalan nilai, sebaran data, serta indikasi awal adanya outlier.
colSums(is.na(data))
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 0 0 0 0
## MDVP:Jitter...5 MDVP:RAP MDVP:PPQ Jitter:DDP
## 0 0 0 0
## MDVP:Shimmer...9 MDVP:Shimmer...10 Shimmer:APQ3 Shimmer:APQ5
## 0 0 0 0
## MDVP:APQ Shimmer:DDA NHR HNR
## 0 0 0 0
## RPDE DFA spread1 spread2
## 0 0 0 0
## D2 PPE target
## 0 0 0
colSums(is.na(data)) digunakan untuk menghitung jumlah missing value pada setiap variabel. karena keberadaan nilai yang hilang dapat memengaruhi perhitungan matriks korelasi dan hasil PCA.
data_numeric <- data %>%
select(where(is.numeric))
colnames(data_numeric)
## [1] "MDVP:Fo" "MDVP:Fhi" "MDVP:Flo"
## [4] "MDVP:Jitter...4" "MDVP:Jitter...5" "MDVP:RAP"
## [7] "MDVP:PPQ" "Jitter:DDP" "MDVP:Shimmer...9"
## [10] "MDVP:Shimmer...10" "Shimmer:APQ3" "Shimmer:APQ5"
## [13] "MDVP:APQ" "Shimmer:DDA" "NHR"
## [16] "HNR" "RPDE" "DFA"
## [19] "spread1" "spread2" "D2"
## [22] "PPE" "target"
dim(data_numeric)
## [1] 195 23
pemilihan variabel numerik menggunakan select(where(is.numeric)) karena PCA hanya dapat diterapkan pada data numerik, sehingga pemisahan ini memastikan bahwa seluruh variabel yang dianalisis memenuhi syarat. Fungsi colnames() digunakan untuk menampilkan nama variabel numerik, dan dim() untuk memastikan ukuran data setelah seleksi.
data_numeric %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(x = value)) +
geom_histogram(bins = 30, fill = "skyblue", color = "black") +
facet_wrap(~ name, scales = "free") +
theme_minimal()
histogram dibuat untuk setiap variabel numerik menggunakan pivot_longer() dan geom_histogram(). Visualisasi ini bertujuan untuk melihat bentuk distribusi data, apakah cenderung simetris, menceng, atau memiliki nilai ekstrem. Penggunaan facet_wrap() memungkinkan setiap variabel ditampilkan dalam panel terpisah sehingga mudah dibandingkan.
cor_matrix <- cor(data_numeric)
corrplot(cor_matrix,
method = "color",
type = "upper",
tl.cex = 0.6,
tl.col = "black")
Matriks korelasi dihitung menggunakan fungsi cor() dan divisualisasikan dengan corrplot(). Visualisasi korelasi ini bertujuan untuk mengidentifikasi hubungan antarvariabel, terutama korelasi tinggi yang menjadi dasar kelayakan PCA dan deteksi multikolinearitas.
data_numeric %>%
pivot_longer(cols = everything()) %>%
ggplot(aes(y = value)) +
geom_boxplot(fill="lightblue") +
facet_wrap(~ name, scales="free") +
theme_minimal()
Boxplot kemudian dibuat untuk setiap variabel menggunakan geom_boxplot(). Visualisasi ini membantu mengidentifikasi sebaran data serta mendeteksi adanya outlier secara visual, meskipun outlier tidak langsung dihapus karena PCA relatif toleran terhadapnya.
data_numeric <- na.omit(data_numeric)
dim(data_numeric)
## [1] 195 23
na.omit() digunakan untuk menghapus observasi yang memiliki nilai hilang. Metode ini dipilih karena sederhana dan tidak mengubah struktur varians data, selama jumlah observasi yang dihapus relatif kecil. Setelah itu, dim(data_numeric) digunakan untuk memastikan ukuran data setelah penghapusan nilai hilang.
apply(data_numeric, 2, var)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 1.713137e+03 8.370703e+03 1.894113e+03 2.350440e-05
## MDVP:Jitter...5 MDVP:RAP MDVP:PPQ Jitter:DDP
## 2.350440e-05 8.807685e-06 7.611952e-06 7.926954e-05
## MDVP:Shimmer...9 MDVP:Shimmer...10 Shimmer:APQ3 Shimmer:APQ5
## 3.555839e-04 3.555839e-04 1.030867e-04 1.445695e-04
## MDVP:APQ Shimmer:DDA NHR HNR
## 2.871919e-04 9.277580e-04 1.633651e-03 1.958739e+01
## RPDE DFA spread1 spread2
## 1.080388e-02 3.062054e-03 1.188553e+00 6.956521e-03
## D2 PPE target
## 1.465351e-01 8.121492e-03 1.865186e-01
apply(data_numeric, 2, var) untuk memastikan tidak ada variabel dengan varians nol atau sangat kecil.
cor_matrix_final <- cor(data_numeric)
round(cor_matrix_final, 3)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4 MDVP:Jitter...5
## MDVP:Fo 1.000 0.401 0.597 -0.118 -0.118
## MDVP:Fhi 0.401 1.000 0.085 0.102 0.102
## MDVP:Flo 0.597 0.085 1.000 -0.140 -0.140
## MDVP:Jitter...4 -0.118 0.102 -0.140 1.000 1.000
## MDVP:Jitter...5 -0.118 0.102 -0.140 1.000 1.000
## MDVP:RAP -0.076 0.097 -0.101 0.990 0.990
## MDVP:PPQ -0.112 0.091 -0.096 0.974 0.974
## Jitter:DDP -0.076 0.097 -0.100 0.990 0.990
## MDVP:Shimmer...9 -0.098 0.002 -0.145 0.769 0.769
## MDVP:Shimmer...10 -0.098 0.002 -0.145 0.769 0.769
## Shimmer:APQ3 -0.095 -0.004 -0.151 0.747 0.747
## Shimmer:APQ5 -0.071 -0.010 -0.101 0.726 0.726
## MDVP:APQ -0.078 0.005 -0.107 0.758 0.758
## Shimmer:DDA -0.095 -0.004 -0.151 0.747 0.747
## NHR -0.022 0.164 -0.109 0.907 0.907
## HNR 0.059 -0.025 0.211 -0.728 -0.728
## RPDE -0.384 -0.112 -0.400 0.361 0.361
## DFA -0.446 -0.343 -0.050 0.099 0.099
## spread1 -0.414 -0.077 -0.395 0.694 0.694
## spread2 -0.249 -0.003 -0.244 0.385 0.385
## D2 0.178 0.176 -0.101 0.433 0.433
## PPE -0.372 -0.070 -0.340 0.722 0.722
## target -0.384 -0.166 -0.380 0.278 0.278
## MDVP:RAP MDVP:PPQ Jitter:DDP MDVP:Shimmer...9
## MDVP:Fo -0.076 -0.112 -0.076 -0.098
## MDVP:Fhi 0.097 0.091 0.097 0.002
## MDVP:Flo -0.101 -0.096 -0.100 -0.145
## MDVP:Jitter...4 0.990 0.974 0.990 0.769
## MDVP:Jitter...5 0.990 0.974 0.990 0.769
## MDVP:RAP 1.000 0.957 1.000 0.760
## MDVP:PPQ 0.957 1.000 0.957 0.798
## Jitter:DDP 1.000 0.957 1.000 0.760
## MDVP:Shimmer...9 0.760 0.798 0.760 1.000
## MDVP:Shimmer...10 0.760 0.798 0.760 1.000
## Shimmer:APQ3 0.745 0.764 0.745 0.988
## Shimmer:APQ5 0.710 0.787 0.710 0.983
## MDVP:APQ 0.737 0.804 0.737 0.950
## Shimmer:DDA 0.745 0.764 0.745 0.988
## NHR 0.920 0.845 0.920 0.722
## HNR -0.722 -0.732 -0.721 -0.835
## RPDE 0.342 0.333 0.342 0.447
## DFA 0.064 0.196 0.064 0.160
## spread1 0.648 0.716 0.648 0.655
## spread2 0.324 0.408 0.324 0.452
## D2 0.427 0.413 0.427 0.507
## PPE 0.671 0.770 0.671 0.694
## target 0.267 0.289 0.267 0.367
## MDVP:Shimmer...10 Shimmer:APQ3 Shimmer:APQ5 MDVP:APQ
## MDVP:Fo -0.098 -0.095 -0.071 -0.078
## MDVP:Fhi 0.002 -0.004 -0.010 0.005
## MDVP:Flo -0.145 -0.151 -0.101 -0.107
## MDVP:Jitter...4 0.769 0.747 0.726 0.758
## MDVP:Jitter...5 0.769 0.747 0.726 0.758
## MDVP:RAP 0.760 0.745 0.710 0.737
## MDVP:PPQ 0.798 0.764 0.787 0.804
## Jitter:DDP 0.760 0.745 0.710 0.737
## MDVP:Shimmer...9 1.000 0.988 0.983 0.950
## MDVP:Shimmer...10 1.000 0.988 0.983 0.950
## Shimmer:APQ3 0.988 1.000 0.960 0.897
## Shimmer:APQ5 0.983 0.960 1.000 0.949
## MDVP:APQ 0.950 0.897 0.949 1.000
## Shimmer:DDA 0.988 1.000 0.960 0.897
## NHR 0.722 0.716 0.658 0.694
## HNR -0.835 -0.827 -0.814 -0.800
## RPDE 0.447 0.435 0.400 0.451
## DFA 0.160 0.151 0.214 0.157
## spread1 0.655 0.611 0.647 0.673
## spread2 0.452 0.402 0.457 0.502
## D2 0.507 0.467 0.502 0.537
## PPE 0.694 0.645 0.702 0.722
## target 0.367 0.348 0.351 0.364
## Shimmer:DDA NHR HNR RPDE DFA spread1 spread2
## MDVP:Fo -0.095 -0.022 0.059 -0.384 -0.446 -0.414 -0.249
## MDVP:Fhi -0.004 0.164 -0.025 -0.112 -0.343 -0.077 -0.003
## MDVP:Flo -0.151 -0.109 0.211 -0.400 -0.050 -0.395 -0.244
## MDVP:Jitter...4 0.747 0.907 -0.728 0.361 0.099 0.694 0.385
## MDVP:Jitter...5 0.747 0.907 -0.728 0.361 0.099 0.694 0.385
## MDVP:RAP 0.745 0.920 -0.722 0.342 0.064 0.648 0.324
## MDVP:PPQ 0.764 0.845 -0.732 0.333 0.196 0.716 0.408
## Jitter:DDP 0.745 0.920 -0.721 0.342 0.064 0.648 0.324
## MDVP:Shimmer...9 0.988 0.722 -0.835 0.447 0.160 0.655 0.452
## MDVP:Shimmer...10 0.988 0.722 -0.835 0.447 0.160 0.655 0.452
## Shimmer:APQ3 1.000 0.716 -0.827 0.435 0.151 0.611 0.402
## Shimmer:APQ5 0.960 0.658 -0.814 0.400 0.214 0.647 0.457
## MDVP:APQ 0.897 0.694 -0.800 0.451 0.157 0.673 0.502
## Shimmer:DDA 1.000 0.716 -0.827 0.435 0.151 0.611 0.402
## NHR 0.716 1.000 -0.714 0.371 -0.132 0.541 0.318
## HNR -0.827 -0.714 1.000 -0.599 -0.009 -0.673 -0.432
## RPDE 0.435 0.371 -0.599 1.000 -0.111 0.591 0.480
## DFA 0.151 -0.132 -0.009 -0.111 1.000 0.196 0.167
## spread1 0.611 0.541 -0.673 0.591 0.196 1.000 0.652
## spread2 0.402 0.318 -0.432 0.480 0.167 0.652 1.000
## D2 0.467 0.471 -0.601 0.237 -0.165 0.495 0.524
## PPE 0.645 0.553 -0.693 0.546 0.270 0.962 0.645
## target 0.348 0.189 -0.362 0.309 0.232 0.565 0.455
## D2 PPE target
## MDVP:Fo 0.178 -0.372 -0.384
## MDVP:Fhi 0.176 -0.070 -0.166
## MDVP:Flo -0.101 -0.340 -0.380
## MDVP:Jitter...4 0.433 0.722 0.278
## MDVP:Jitter...5 0.433 0.722 0.278
## MDVP:RAP 0.427 0.671 0.267
## MDVP:PPQ 0.413 0.770 0.289
## Jitter:DDP 0.427 0.671 0.267
## MDVP:Shimmer...9 0.507 0.694 0.367
## MDVP:Shimmer...10 0.507 0.694 0.367
## Shimmer:APQ3 0.467 0.645 0.348
## Shimmer:APQ5 0.502 0.702 0.351
## MDVP:APQ 0.537 0.722 0.364
## Shimmer:DDA 0.467 0.645 0.348
## NHR 0.471 0.553 0.189
## HNR -0.601 -0.693 -0.362
## RPDE 0.237 0.546 0.309
## DFA -0.165 0.270 0.232
## spread1 0.495 0.962 0.565
## spread2 0.524 0.645 0.455
## D2 1.000 0.481 0.340
## PPE 0.481 1.000 0.531
## target 0.340 0.531 1.000
Output matriks korelasi menunjukkan hubungan linear antar seluruh variabel numerik. Terlihat bahwa banyak variabel memiliki korelasi sangat tinggi (mendekati 1), khususnya pada kelompok variabel Jitter (MDVP:Jitter…4, MDVP:Jitter…5, MDVP:RAP, Jitter:DDP) dan Shimmer (MDVP:Shimmer…9, MDVP:Shimmer…10, Shimmer:APQ3, Shimmer:DDA). Korelasi sebesar 1.000 menunjukkan adanya duplikasi informasi sempurna, yang menyebabkan matriks korelasi menjadi singular (tidak dapat diinvers). Selain itu, variabel seperti spread1 dan PPE juga menunjukkan korelasi yang sangat tinggi (0.962), menandakan redundansi informasi. Kondisi ini menjadi indikasi awal adanya multikolinearitas ekstrem.
kmo_result <- KMO(data_numeric)
## Error in solve.default(r) :
## Lapack routine dgesv: system is exactly singular: U[22,22] = 0
## matrix is not invertible, image not found
kmo_result
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_numeric)
## Overall MSA = 0.5
## MSA for each item =
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 0.5 0.5 0.5 0.5
## MDVP:Jitter...5 MDVP:RAP MDVP:PPQ Jitter:DDP
## 0.5 0.5 0.5 0.5
## MDVP:Shimmer...9 MDVP:Shimmer...10 Shimmer:APQ3 Shimmer:APQ5
## 0.5 0.5 0.5 0.5
## MDVP:APQ Shimmer:DDA NHR HNR
## 0.5 0.5 0.5 0.5
## RPDE DFA spread1 spread2
## 0.5 0.5 0.5 0.5
## D2 PPE target
## 0.5 0.5 0.5
KMO(data_numeric) dijalankan, muncul error “matrix is not invertible”. Hal ini terjadi karena adanya korelasi sempurna atau hampir sempurna antarvariabel, sehingga matriks korelasi tidak dapat diinvers. Meskipun demikian, output tetap menampilkan nilai Overall MSA = 0.5, yang menunjukkan kelayakan data berada pada batas minimum. Nilai MSA tiap variabel juga bernilai 0.5, yang menandakan bahwa struktur korelasi masih lemah dan PCA belum optimal dilakukan pada data ini tanpa perbaikan.
bartlett_result <- cortest.bartlett(cor_matrix_final,
n = nrow(data_numeric))
bartlett_result
## $chisq
## [1] Inf
##
## $p.value
## [1] 0
##
## $df
## [1] 253
Hasil uji Bartlett menunjukkan nilai chi-square = ∞ (infinite) dengan p-value = 0, yang menandakan bahwa matriks korelasi secara signifikan berbeda dari matriks identitas. Namun, nilai chi-square yang tidak terbatas ini muncul akibat masalah singularitas matriks. Artinya, meskipun terdapat korelasi antarvariabel, struktur korelasi tersebut tidak stabil untuk analisis PCA pada tahap ini.
cor_matrix <- cor(data_numeric)
which(abs(cor_matrix) > 0.9 & abs(cor_matrix) < 1, arr.ind = TRUE)
## row col
## MDVP:RAP 6 4
## MDVP:PPQ 7 4
## Jitter:DDP 8 4
## NHR 15 4
## MDVP:RAP 6 5
## MDVP:PPQ 7 5
## Jitter:DDP 8 5
## NHR 15 5
## MDVP:Jitter...4 4 6
## MDVP:Jitter...5 5 6
## MDVP:PPQ 7 6
## Jitter:DDP 8 6
## NHR 15 6
## MDVP:Jitter...4 4 7
## MDVP:Jitter...5 5 7
## MDVP:RAP 6 7
## Jitter:DDP 8 7
## MDVP:Jitter...4 4 8
## MDVP:Jitter...5 5 8
## MDVP:RAP 6 8
## MDVP:PPQ 7 8
## NHR 15 8
## Shimmer:APQ3 11 9
## Shimmer:APQ5 12 9
## MDVP:APQ 13 9
## Shimmer:DDA 14 9
## Shimmer:APQ3 11 10
## Shimmer:APQ5 12 10
## MDVP:APQ 13 10
## Shimmer:DDA 14 10
## MDVP:Shimmer...9 9 11
## MDVP:Shimmer...10 10 11
## Shimmer:APQ5 12 11
## Shimmer:DDA 14 11
## MDVP:Shimmer...9 9 12
## MDVP:Shimmer...10 10 12
## Shimmer:APQ3 11 12
## MDVP:APQ 13 12
## Shimmer:DDA 14 12
## MDVP:Shimmer...9 9 13
## MDVP:Shimmer...10 10 13
## Shimmer:APQ5 12 13
## MDVP:Shimmer...9 9 14
## MDVP:Shimmer...10 10 14
## Shimmer:APQ3 11 14
## Shimmer:APQ5 12 14
## MDVP:Jitter...4 4 15
## MDVP:Jitter...5 5 15
## MDVP:RAP 6 15
## Jitter:DDP 8 15
## PPE 22 19
## spread1 19 22
Output dari fungsi which(abs(cor_matrix) > 0.9 & abs(cor_matrix) < 1) menampilkan banyak pasangan variabel yang memiliki korelasi lebih dari 0.9. Hal ini mengonfirmasi adanya multikolinearitas ekstrem, terutama pada kelompok Jitter dan Shimmer. Temuan ini menjelaskan mengapa uji KMO gagal dan memperkuat alasan perlunya seleksi variabel sebelum PCA.
colnames(data_numeric)
## [1] "MDVP:Fo" "MDVP:Fhi" "MDVP:Flo"
## [4] "MDVP:Jitter...4" "MDVP:Jitter...5" "MDVP:RAP"
## [7] "MDVP:PPQ" "Jitter:DDP" "MDVP:Shimmer...9"
## [10] "MDVP:Shimmer...10" "Shimmer:APQ3" "Shimmer:APQ5"
## [13] "MDVP:APQ" "Shimmer:DDA" "NHR"
## [16] "HNR" "RPDE" "DFA"
## [19] "spread1" "spread2" "D2"
## [22] "PPE" "target"
data_selected <- data_numeric %>%
select(
`MDVP:Fo`,
`MDVP:Fhi`,
`MDVP:Flo`,
`MDVP:Jitter...4`,
`MDVP:RAP`,
NHR,
`MDVP:Shimmer...9`,
`Shimmer:APQ3`,
HNR,
RPDE,
DFA,
spread1,
D2,
PPE
)
KMO(data_selected)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_selected)
## Overall MSA = 0.8
## MSA for each item =
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 0.57 0.65 0.65 0.80
## MDVP:RAP NHR MDVP:Shimmer...9 Shimmer:APQ3
## 0.80 0.91 0.80 0.78
## HNR RPDE DFA spread1
## 0.91 0.79 0.42 0.81
## D2 PPE
## 0.78 0.82
cor_matrix2 <- cor(data_selected)
cortest.bartlett(cor_matrix2, n = nrow(data_selected))
## $chisq
## [1] 3730.203
##
## $p.value
## [1] 0
##
## $df
## [1] 91
Setelah memilih 14 variabel yang lebih representatif dan mengurangi redundansi, dilakukan kembali uji KMO. Hasilnya menunjukkan Overall MSA = 0.8, yang tergolong baik dan menandakan bahwa data sudah layak untuk PCA. Nilai MSA per variabel sebagian besar berada di atas 0.7, meskipun variabel DFA memiliki nilai relatif rendah (0.42), yang menunjukkan kontribusinya terhadap struktur faktor relatif lemah namun masih dapat dipertahankan.
data_scaled <- scale(data_selected)
data_scaled <- as.data.frame(data_scaled)
# Verifikasi
apply(data_scaled, 2, mean)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 3.538725e-17 1.154964e-16 1.104969e-16 8.340399e-18
## MDVP:RAP NHR MDVP:Shimmer...9 Shimmer:APQ3
## -6.980941e-19 -2.407346e-18 4.124861e-17 9.951614e-17
## HNR RPDE DFA spread1
## 3.984957e-17 -9.771886e-17 6.390702e-16 3.789404e-16
## D2 PPE
## 5.612591e-16 5.388207e-18
apply(data_scaled, 2, sd)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 1 1 1 1
## MDVP:RAP NHR MDVP:Shimmer...9 Shimmer:APQ3
## 1 1 1 1
## HNR RPDE DFA spread1
## 1 1 1 1
## D2 PPE
## 1 1
Output hasil pengecekan mean menunjukkan nilai yang sangat mendekati nol, sedangkan standar deviasi seluruh variabel bernilai satu. Hal ini membuktikan bahwa proses standardisasi berhasil.
matrix korelasi dan eigenvalue
# Matriks korelasi
cor_matrix <- cor(data_scaled)
# Eigenvalue
eigen_result <- eigen(cor_matrix)
eigen_values <- eigen_result$values
eigen_values
## [1] 6.983828661 2.324704014 1.290673724 0.835885960 0.767218606 0.560734648
## [7] 0.527141078 0.268566474 0.217816676 0.119798769 0.058456740 0.030054688
## [13] 0.009818755 0.005301209
Nilai eigen menunjukkan bahwa tiga komponen pertama memiliki eigenvalue > 1, yaitu sekitar 6.98, 2.32, dan 1.29. Ini berarti ketiga komponen tersebut menjelaskan varians yang lebih besar dibandingkan satu variabel asli, sehingga layak dipertahankan menurut kriteria Kaiser.
n_components <- sum(eigen_values > 1)
n_components
## [1] 3
scree plot
plot(eigen_values,
type = "b",
pch = 19,
xlab = "Komponen",
ylab = "Eigenvalue",
main = "Scree Plot")
abline(h = 1, col = "red", lty = 2)
Scree plot memperlihatkan penurunan tajam eigenvalue dari PC1 ke PC3, kemudian melandai setelahnya. Pola ini mengindikasikan adanya titik siku (elbow) pada komponen ke-3, yang memperkuat keputusan untuk mempertahankan tiga komponen utama.
library(psych)
fa.parallel(data_scaled, fa = "pc", n.iter = 100)
## Parallel analysis suggests that the number of factors = NA and the number of components = 2
Hasil parallel analysis menyarankan dua komponen utama, yang lebih konservatif dibandingkan kriteria Kaiser. Perbedaan ini umum terjadi dan menunjukkan bahwa secara statistik ketat, dua komponen sudah cukup, namun tiga komponen masih dapat dipertahankan untuk menjaga informasi tambahan.
pca_result <- prcomp(data_scaled,
center = FALSE,
scale. = FALSE)
summary(pca_result)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.6427 1.5247 1.13608 0.91427 0.8759 0.74882 0.72604
## Proportion of Variance 0.4988 0.1661 0.09219 0.05971 0.0548 0.04005 0.03765
## Cumulative Proportion 0.4988 0.6649 0.75709 0.81679 0.8716 0.91165 0.94930
## PC8 PC9 PC10 PC11 PC12 PC13 PC14
## Standard deviation 0.51823 0.46671 0.34612 0.24178 0.17336 0.09909 0.07281
## Proportion of Variance 0.01918 0.01556 0.00856 0.00418 0.00215 0.00070 0.00038
## Cumulative Proportion 0.96848 0.98404 0.99260 0.99677 0.99892 0.99962 1.00000
Ringkasan PCA menunjukkan bahwa PC1 menjelaskan 49.9% varians, PC2 menjelaskan 16.6%, dan PC3 menjelaskan 9.2%. Secara kumulatif, ketiga komponen tersebut menjelaskan sekitar 75.7% varians total, yang merupakan hasil yang baik dalam reduksi dimensi.
# Ambil loading PCA
loadings <- pca_result$rotation[, 1:n_components]
# Hitung communalities (h2)
h2 <- rowSums(loadings^2)
pc_table <- data.frame(
Variable = rownames(loadings),
round(loadings, 3),
h2 = round(h2, 3)
)
pc_table
## Variable PC1 PC2 PC3 h2
## MDVP:Fo MDVP:Fo 0.091 0.571 -0.065 0.339
## MDVP:Fhi MDVP:Fhi -0.005 0.404 0.277 0.239
## MDVP:Flo MDVP:Flo 0.116 0.371 -0.475 0.376
## MDVP:Jitter...4 MDVP:Jitter...4 -0.341 0.106 -0.158 0.152
## MDVP:RAP MDVP:RAP -0.334 0.136 -0.170 0.159
## NHR NHR -0.316 0.206 -0.031 0.144
## MDVP:Shimmer...9 MDVP:Shimmer...9 -0.340 0.064 -0.162 0.146
## Shimmer:APQ3 Shimmer:APQ3 -0.332 0.066 -0.167 0.142
## HNR HNR 0.337 -0.078 -0.059 0.123
## RPDE RPDE -0.225 -0.192 0.424 0.267
## DFA DFA -0.043 -0.374 -0.594 0.495
## spread1 spread1 -0.322 -0.184 0.099 0.147
## D2 D2 -0.222 0.220 0.196 0.136
## PPE PPE -0.326 -0.167 0.009 0.134
Tabel loading menunjukkan kontribusi masing-masing variabel terhadap setiap komponen. PC1 didominasi oleh variabel Jitter, Shimmer, NHR, dan HNR, sedangkan PC2 lebih dipengaruhi oleh variabel frekuensi (MDVP:Fo, MDVP:Fhi, MDVP:Flo). PC3 terutama dipengaruhi oleh variabel nonlinier seperti DFA dan RPDE. Nilai communality (h²) menunjukkan proporsi varians setiap variabel yang berhasil dijelaskan oleh tiga komponen utama, dengan nilai tertinggi pada variabel DFA.
importance <- summary(pca_result)$importance
round(importance[, 1:n_components], 3)
## PC1 PC2 PC3
## Standard deviation 2.643 1.525 1.136
## Proportion of Variance 0.499 0.166 0.092
## Cumulative Proportion 0.499 0.665 0.757
scores <- as.data.frame(pca_result$x[, 1:n_components])
head(scores)
## PC1 PC2 PC3
## 1 -1.224799 -1.698307 -1.239611
## 2 -2.833640 -1.429951 -1.785067
## 3 -2.164274 -1.606432 -2.041774
## 4 -2.456567 -1.641508 -1.876906
## 5 -3.476575 -1.577141 -2.317853
## 6 -1.731965 -1.793448 -2.006584
plot(scores$PC1,
scores$PC2,
xlab = "PC1",
ylab = "PC2",
main = "Plot PC1 vs PC2",
pch = 19,
col = "blue")
Plot PC1 dan PC2 memperlihatkan sebaran observasi berdasarkan dua komponen utama pertama yang menjelaskan sekitar 66% varians total. Plot ini membantu mengidentifikasi pola, kelompok, atau potensi pemisahan antarobservasi berdasarkan karakteristik utama data.
R <- cor(data_scaled)
round(R, 3)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4 MDVP:RAP NHR
## MDVP:Fo 1.000 0.401 0.597 -0.118 -0.076 -0.022
## MDVP:Fhi 0.401 1.000 0.085 0.102 0.097 0.164
## MDVP:Flo 0.597 0.085 1.000 -0.140 -0.101 -0.109
## MDVP:Jitter...4 -0.118 0.102 -0.140 1.000 0.990 0.907
## MDVP:RAP -0.076 0.097 -0.101 0.990 1.000 0.920
## NHR -0.022 0.164 -0.109 0.907 0.920 1.000
## MDVP:Shimmer...9 -0.098 0.002 -0.145 0.769 0.760 0.722
## Shimmer:APQ3 -0.095 -0.004 -0.151 0.747 0.745 0.716
## HNR 0.059 -0.025 0.211 -0.728 -0.722 -0.714
## RPDE -0.384 -0.112 -0.400 0.361 0.342 0.371
## DFA -0.446 -0.343 -0.050 0.099 0.064 -0.132
## spread1 -0.414 -0.077 -0.395 0.694 0.648 0.541
## D2 0.178 0.176 -0.101 0.433 0.427 0.471
## PPE -0.372 -0.070 -0.340 0.722 0.671 0.553
## MDVP:Shimmer...9 Shimmer:APQ3 HNR RPDE DFA spread1
## MDVP:Fo -0.098 -0.095 0.059 -0.384 -0.446 -0.414
## MDVP:Fhi 0.002 -0.004 -0.025 -0.112 -0.343 -0.077
## MDVP:Flo -0.145 -0.151 0.211 -0.400 -0.050 -0.395
## MDVP:Jitter...4 0.769 0.747 -0.728 0.361 0.099 0.694
## MDVP:RAP 0.760 0.745 -0.722 0.342 0.064 0.648
## NHR 0.722 0.716 -0.714 0.371 -0.132 0.541
## MDVP:Shimmer...9 1.000 0.988 -0.835 0.447 0.160 0.655
## Shimmer:APQ3 0.988 1.000 -0.827 0.435 0.151 0.611
## HNR -0.835 -0.827 1.000 -0.599 -0.009 -0.673
## RPDE 0.447 0.435 -0.599 1.000 -0.111 0.591
## DFA 0.160 0.151 -0.009 -0.111 1.000 0.196
## spread1 0.655 0.611 -0.673 0.591 0.196 1.000
## D2 0.507 0.467 -0.601 0.237 -0.165 0.495
## PPE 0.694 0.645 -0.693 0.546 0.270 0.962
## D2 PPE
## MDVP:Fo 0.178 -0.372
## MDVP:Fhi 0.176 -0.070
## MDVP:Flo -0.101 -0.340
## MDVP:Jitter...4 0.433 0.722
## MDVP:RAP 0.427 0.671
## NHR 0.471 0.553
## MDVP:Shimmer...9 0.507 0.694
## Shimmer:APQ3 0.467 0.645
## HNR -0.601 -0.693
## RPDE 0.237 0.546
## DFA -0.165 0.270
## spread1 0.495 0.962
## D2 1.000 0.481
## PPE 0.481 1.000
Pada output diatas terlihat bahwa variabel gangguan suara seperti MDVP:Jitter, MDVP:RAP, NHR, MDVP:Shimmer, Shimmer:APQ3, spread1, dan PPE memiliki korelasi yang sangat tinggi (di atas 0,7). Hal ini menunjukkan bahwa variabel-variabel tersebut cenderung mengukur dimensi yang sama. Selain itu, HNR memiliki korelasi negatif yang kuat terhadap jitter dan shimmer, yang berarti ketika gangguan suara meningkat, nilai HNR menurun.
# Factor Analysis
eigen_result <- eigen(R)
cat("Eigenvalue:\n")
## Eigenvalue:
eigen_result$values
## [1] 6.983828661 2.324704014 1.290673724 0.835885960 0.767218606 0.560734648
## [7] 0.527141078 0.268566474 0.217816676 0.119798769 0.058456740 0.030054688
## [13] 0.009818755 0.005301209
cat("Eigenvector:\n")
## Eigenvector:
eigen_result$vectors
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.091038821 -0.57097689 0.064964952 0.24964246 0.06423131
## [2,] -0.005420219 -0.40350034 -0.276520195 -0.52506374 0.41414205
## [3,] 0.115675326 -0.37081407 0.474987197 0.27441586 -0.10135801
## [4,] -0.340800371 -0.10588450 0.157619269 -0.30732038 -0.10560689
## [5,] -0.333826220 -0.13593780 0.169597817 -0.29563645 -0.16300268
## [6,] -0.316157166 -0.20642905 0.030739319 -0.26765568 -0.27766502
## [7,] -0.340172475 -0.06403024 0.162418591 0.15850761 -0.04852590
## [8,] -0.331760695 -0.06581191 0.166873244 0.14968736 -0.10282372
## [9,] 0.336655885 0.07804727 0.059198713 -0.25629079 0.05835749
## [10,] -0.225464796 0.19170430 -0.424097496 0.24230414 -0.33800422
## [11,] -0.042571661 0.37392472 0.594425136 -0.06321664 0.37052556
## [12,] -0.321555432 0.18408269 -0.098700456 0.02573087 0.27472257
## [13,] -0.221884791 -0.22022783 -0.195965381 0.39504809 0.51517756
## [14,] -0.326135629 0.16699344 -0.008719855 0.02340323 0.30086073
## [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] -0.003687217 -0.04327519 -0.36552456 0.583099433 0.30657121 -0.14102976
## [2,] -0.380466744 -0.36857818 0.14373429 -0.093449781 -0.05205870 0.01680559
## [3,] 0.257076448 -0.52303225 0.22732852 -0.354264569 -0.13943929 0.03301346
## [4,] 0.212763829 0.03870889 0.02304286 0.142093665 0.08359961 0.36891380
## [5,] 0.215294979 0.06969986 0.05438592 0.145198130 0.09398974 0.41694781
## [6,] 0.159706422 0.18340310 0.24165425 -0.060064534 0.03801930 -0.75930455
## [7,] -0.398776343 0.05117515 -0.19364752 -0.278233076 0.15857984 0.04302211
## [8,] -0.466175476 0.08606183 -0.19891404 -0.270288879 0.12143222 0.01716305
## [9,] 0.204129188 0.01236481 -0.14864219 -0.378644031 0.77291715 -0.02826547
## [10,] -0.082994662 -0.49775993 0.33519942 0.178369808 0.39841483 0.03416733
## [11,] -0.227185351 -0.10099998 0.33811029 0.352042046 0.18450555 -0.14555754
## [12,] 0.303492463 -0.24362128 -0.32090391 -0.099198356 -0.03531205 -0.03628054
## [13,] 0.201940272 0.38334895 0.43270108 -0.146431303 0.17789006 0.10299875
## [14,] 0.250233744 -0.27252411 -0.34076531 0.002257011 -0.06024517 -0.23458088
## [,12] [,13] [,14]
## [1,] -0.073868520 -0.012226398 0.007001881
## [2,] -0.010848747 0.011376765 -0.015881544
## [3,] -0.003650318 0.011415316 0.020402920
## [4,] 0.136576455 -0.314090460 0.643677309
## [5,] -0.044583797 0.332978808 -0.597121674
## [6,] -0.086248082 -0.033060945 -0.009020738
## [7,] 0.111478523 -0.627817211 -0.340864688
## [8,] -0.109082614 0.593022595 0.329869178
## [9,] 0.034408093 0.034730349 0.009949658
## [10,] 0.024871774 0.011255703 0.011121254
## [11,] -0.091374399 -0.005202279 -0.008318646
## [12,] -0.706922672 -0.100034373 0.015840715
## [13,] 0.045486934 0.035528097 0.019998374
## [14,] 0.655778805 0.174673190 -0.048797281
n_factors <- sum(eigen_result$values > 1)
n_factors
## [1] 3
Pada hasil eigenvalue menunjukkan nilai 6,98; 2,32; dan 1,29 sebagai tiga nilai terbesar yang melebihi 1. Berdasarkan kriteria Kaiser (eigenvalue > 1), maka dapat disimpulkan untuk mempertahankan tiga faktor. Nilai eigen pertama yang sangat besar (6,98) menunjukkan bahwa faktor pertama menjelaskan proporsi variasi terbesar dalam data. Secara keseluruhan, tiga faktor ini mampu menjelaskan sekitar 76% variasi total data, yang berarti sebagian besar informasi dari variabel asli telah diringkas secara efektif.
L_list <- list()
for (i in 1:n_factors) {
L_list[[i]] <- sqrt(eigen_result$values[i]) * eigen_result$vectors[, i]
}
L <- do.call(cbind, L_list)
colnames(L) <- paste0("Factor", 1:n_factors)
rownames(L) <- colnames(data_scaled)
cat("Factor Loading (Manual):\n")
## Factor Loading (Manual):
round(L, 3)
## Factor1 Factor2 Factor3
## MDVP:Fo 0.241 -0.871 0.074
## MDVP:Fhi -0.014 -0.615 -0.314
## MDVP:Flo 0.306 -0.565 0.540
## MDVP:Jitter...4 -0.901 -0.161 0.179
## MDVP:RAP -0.882 -0.207 0.193
## NHR -0.836 -0.315 0.035
## MDVP:Shimmer...9 -0.899 -0.098 0.185
## Shimmer:APQ3 -0.877 -0.100 0.190
## HNR 0.890 0.119 0.067
## RPDE -0.596 0.292 -0.482
## DFA -0.113 0.570 0.675
## spread1 -0.850 0.281 -0.112
## D2 -0.586 -0.336 -0.223
## PPE -0.862 0.255 -0.010
Hasil factor loading manual menunjukkan bahwa Faktor 1 memiliki loading sangat tinggi pada variabel jitter, RAP, shimmer, NHR, spread1, dan PPE, serta loading negatif pada HNR. Ini menunjukkan bahwa faktor pertama merepresentasikan dimensi gangguan kestabilan suara. Faktor 2 memiliki loading besar pada MDVP:Fo, MDVP:Fhi, dan MDVP:Flo, sehingga dapat diinterpretasikan sebagai dimensi frekuensi dasar suara. Faktor 3 memiliki loading tertinggi pada DFA dan RPDE, yang berkaitan dengan kompleksitas dan karakteristik nonlinear sinyal suara. Loading yang mendekati ±1 menunjukkan kontribusi yang sangat kuat terhadap faktor tersebut.
fa_none <- principal(data_scaled, nfactors = n_factors, rotate = "none", scores = TRUE)
print(fa_none)
## Principal Components Analysis
## Call: principal(r = data_scaled, nfactors = n_factors, rotate = "none",
## scores = TRUE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## PC1 PC2 PC3 h2 u2 com
## MDVP:Fo -0.24 0.87 0.07 0.82 0.18 1.2
## MDVP:Fhi 0.01 0.62 -0.31 0.48 0.52 1.5
## MDVP:Flo -0.31 0.57 0.54 0.70 0.30 2.5
## MDVP:Jitter...4 0.90 0.16 0.18 0.87 0.13 1.1
## MDVP:RAP 0.88 0.21 0.19 0.86 0.14 1.2
## NHR 0.84 0.31 0.03 0.80 0.20 1.3
## MDVP:Shimmer...9 0.90 0.10 0.18 0.85 0.15 1.1
## Shimmer:APQ3 0.88 0.10 0.19 0.81 0.19 1.1
## HNR -0.89 -0.12 0.07 0.81 0.19 1.0
## RPDE 0.60 -0.29 -0.48 0.67 0.33 2.4
## DFA 0.11 -0.57 0.68 0.79 0.21 2.0
## spread1 0.85 -0.28 -0.11 0.81 0.19 1.3
## D2 0.59 0.34 -0.22 0.51 0.49 1.9
## PPE 0.86 -0.25 -0.01 0.81 0.19 1.2
##
## PC1 PC2 PC3
## SS loadings 6.98 2.32 1.29
## Proportion Var 0.50 0.17 0.09
## Cumulative Var 0.50 0.66 0.76
## Proportion Explained 0.66 0.22 0.12
## Cumulative Proportion 0.66 0.88 1.00
##
## Mean item complexity = 1.5
## Test of the hypothesis that 3 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.05
## with the empirical chi square 96.52 with prob < 0.00017
##
## Fit based upon off diagonal values = 0.99
Pada output ini ditampilkan nilai loading yang sudah dihitung menggunakan fungsi principal. Nilai SS loadings menunjukkan jumlah variasi yang dijelaskan masing-masing komponen, yaitu 6,98; 2,32; dan 1,29. Proporsi varians kumulatif sebesar 0,76 berarti 76% variasi data dapat dijelaskan oleh tiga faktor. Nilai RMSR sebesar 0,05 menunjukkan residual error yang kecil, sehingga model dapat dikatakan memiliki kecocokan yang baik. Nilai fit sebesar 0,99 juga menunjukkan bahwa model sangat sesuai dengan data. Communality (h2) sebagian besar tinggi (di atas 0,7), yang berarti variabel-variabel cukup baik dijelaskan oleh faktor.
# Factor Analysis with rotation varimax
fa_varimax <- principal(data_scaled, nfactors = n_factors, rotate = "varimax", scores = TRUE)
print(fa_varimax)
## Principal Components Analysis
## Call: principal(r = data_scaled, nfactors = n_factors, rotate = "varimax",
## scores = TRUE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC3 RC2 h2 u2 com
## MDVP:Fo 0.00 -0.68 0.60 0.82 0.18 2.0
## MDVP:Fhi 0.09 -0.16 0.67 0.48 0.52 1.2
## MDVP:Flo -0.03 -0.84 0.06 0.70 0.30 1.0
## MDVP:Jitter...4 0.93 0.07 -0.02 0.87 0.13 1.0
## MDVP:RAP 0.93 0.02 0.00 0.86 0.14 1.0
## NHR 0.87 0.05 0.19 0.80 0.20 1.1
## MDVP:Shimmer...9 0.91 0.10 -0.07 0.85 0.15 1.0
## Shimmer:APQ3 0.89 0.09 -0.07 0.81 0.19 1.0
## HNR -0.85 -0.26 -0.11 0.81 0.19 1.2
## RPDE 0.38 0.72 0.10 0.67 0.33 1.6
## DFA 0.12 -0.08 -0.88 0.79 0.21 1.1
## spread1 0.71 0.54 -0.15 0.81 0.19 2.0
## D2 0.58 0.14 0.38 0.51 0.49 1.9
## PPE 0.75 0.45 -0.20 0.81 0.19 1.8
##
## RC1 RC3 RC2
## SS loadings 6.42 2.32 1.86
## Proportion Var 0.46 0.17 0.13
## Cumulative Var 0.46 0.62 0.76
## Proportion Explained 0.61 0.22 0.18
## Cumulative Proportion 0.61 0.82 1.00
##
## Mean item complexity = 1.3
## Test of the hypothesis that 3 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.05
## with the empirical chi square 96.52 with prob < 0.00017
##
## Fit based upon off diagonal values = 0.99
Setelah dilakukan rotasi varimax, struktur faktor menjadi lebih sederhana dan mudah diinterpretasikan. Faktor pertama (RC1) memiliki loading sangat tinggi pada jitter, RAP, shimmer, NHR, spread1, dan PPE, sehingga tetap merepresentasikan gangguan kestabilan suara. Faktor kedua (RC2) didominasi oleh DFA dengan loading sangat tinggi (-0,88), menunjukkan dimensi nonlinear scaling yang berdiri sendiri. Faktor ketiga (RC3) berkaitan dengan frekuensi dasar dan kompleksitas sinyal seperti Flo dan RPDE. Varians kumulatif tetap sebesar 76%, RMSR tetap 0,05, dan fit 0,99, yang menunjukkan model tetap sangat baik setelah rotasi.
cat("Communalities:\n")
## Communalities:
round(fa_varimax$communality, 3)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 0.821 0.477 0.704 0.869
## MDVP:RAP NHR MDVP:Shimmer...9 Shimmer:APQ3
## 0.858 0.798 0.852 0.815
## HNR RPDE DFA spread1
## 0.810 0.673 0.794 0.813
## D2 PPE
## 0.506 0.808
Communality menunjukkan proporsi varians masing-masing variabel yang dapat dijelaskan oleh faktor. Sebagian besar nilai communalities berada di atas 0,7, yang berarti faktor mampu menjelaskan sebagian besar variasi variabel tersebut. Nilai terendah terdapat pada D2 (sekitar 0,50), yang berarti hanya sekitar 50% variasinya dijelaskan oleh faktor, namun masih dapat diterima.
scores_FA <- as.data.frame(fa_varimax$scores)
head(scores_FA)
## RC1 RC3 RC2
## 1 0.4206147 0.09222119 -1.568643
## 2 1.1466952 -0.15548044 -1.777375
## 3 0.9314602 -0.32397861 -2.009523
## 4 0.9973320 -0.17130142 -1.930955
## 5 1.4602085 -0.34315701 -2.170984
## 6 0.7407270 -0.27846952 -2.075209
data_scaled_no_dfa <- data_scaled[, !colnames(data_scaled) %in% c("DFA")]
Nilai Overall MSA sebesar 0,81 menunjukkan bahwa data sangat layak untuk dilakukan analisis faktor meskipun variabel DFA dihapus. Nilai MSA per variabel sebagian besar di atas 0,7, meskipun MDVP:Fhi memiliki nilai lebih rendah (0,48) yang menunjukkan kecukupan sampel untuk variabel tersebut relatif lebih lemah dibanding variabel lainnya.
library(psych)
# KMO
KMO(data_scaled_no_dfa)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data_scaled_no_dfa)
## Overall MSA = 0.81
## MSA for each item =
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 0.63 0.48 0.69 0.80
## MDVP:RAP NHR MDVP:Shimmer...9 Shimmer:APQ3
## 0.80 0.94 0.80 0.78
## HNR RPDE spread1 D2
## 0.91 0.80 0.82 0.76
## PPE
## 0.82
# Bartlett Test
R_no_dfa <- cor(data_scaled_no_dfa)
cortest.bartlett(R_no_dfa, n = nrow(data_scaled_no_dfa))
## $chisq
## [1] 3558.988
##
## $p.value
## [1] 0
##
## $df
## [1] 78
Nilai chi-square sebesar 3558,988 dengan p-value 0 menunjukkan bahwa matriks korelasi signifikan dan bukan matriks identitas. Artinya, antar variabel terdapat korelasi yang cukup untuk dilakukan analisis faktor.
eigen_result_no_dfa <- eigen(R_no_dfa)
eigen_values_no_dfa <- eigen_result_no_dfa$values
eigen_values_no_dfa
## [1] 6.973124340 2.130681609 0.976393008 0.833789362 0.627359959 0.532282436
## [7] 0.435811002 0.243023734 0.132576948 0.066984225 0.032818083 0.009828364
## [13] 0.005326931
# Jumlah faktor (Kaiser > 1)
n_factors_no_dfa <- sum(eigen_values_no_dfa > 1)
n_factors_no_dfa
## [1] 2
Setelah DFA dihapus, hanya terdapat dua eigenvalue yang lebih besar dari satu, yaitu 6,97 dan 2,13. Oleh karena itu, jumlah faktor yang dipertahankan hanya dua. Varians kumulatif yang dijelaskan menjadi 70%, lebih rendah dibandingkan model sebelumnya (76%), yang menunjukkan adanya penurunan kemampuan model dalam merangkum informasi.
plot(eigen_values_no_dfa,
type = "b",
pch = 19,
xlab = "Komponen",
ylab = "Eigenvalue",
main = "Scree Plot Tanpa DFA")
abline(h = 1, col = "red", lty = 2)
Pada model ini, faktor pertama menjelaskan 54% variasi, dan faktor kedua 16%, dengan total 70%. Nilai RMSR sebesar 0,06 sedikit lebih besar dibanding model dengan DFA (0,05), yang menunjukkan error sedikit meningkat meskipun masih tergolong baik. Fit tetap tinggi (0,99), sehingga model masih dapat diterima.
fa_none_no_dfa <- principal(data_scaled_no_dfa,
nfactors = n_factors_no_dfa,
rotate = "none",
scores = TRUE)
print(fa_none_no_dfa)
## Principal Components Analysis
## Call: principal(r = data_scaled_no_dfa, nfactors = n_factors_no_dfa,
## rotate = "none", scores = TRUE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## PC1 PC2 h2 u2 com
## MDVP:Fo -0.23 0.86 0.80 0.20 1.1
## MDVP:Fhi 0.02 0.56 0.31 0.69 1.0
## MDVP:Flo -0.30 0.67 0.55 0.45 1.4
## MDVP:Jitter...4 0.90 0.19 0.85 0.15 1.1
## MDVP:RAP 0.88 0.23 0.83 0.17 1.1
## NHR 0.84 0.29 0.79 0.21 1.2
## MDVP:Shimmer...9 0.90 0.13 0.82 0.18 1.0
## Shimmer:APQ3 0.88 0.14 0.79 0.21 1.0
## HNR -0.89 -0.09 0.80 0.20 1.0
## RPDE 0.60 -0.42 0.54 0.46 1.8
## spread1 0.85 -0.30 0.81 0.19 1.2
## D2 0.59 0.29 0.43 0.57 1.4
## PPE 0.86 -0.24 0.80 0.20 1.2
##
## PC1 PC2
## SS loadings 6.97 2.13
## Proportion Var 0.54 0.16
## Cumulative Var 0.54 0.70
## Proportion Explained 0.77 0.23
## Cumulative Proportion 0.77 1.00
##
## Mean item complexity = 1.2
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.06
## with the empirical chi square 101.95 with prob < 6.2e-05
##
## Fit based upon off diagonal values = 0.99
Setelah rotasi, faktor pertama tetap didominasi oleh variabel gangguan kestabilan suara seperti jitter, RAP, shimmer, dan NHR. Faktor kedua didominasi oleh variabel frekuensi dasar seperti Fo, Fhi, dan Flo. Namun, tidak ada lagi faktor ketiga yang merepresentasikan dimensi nonlinear karena variabel DFA telah dihapus. Struktur menjadi lebih sederhana tetapi kehilangan satu dimensi laten penting.
fa_varimax_no_dfa <- principal(data_scaled_no_dfa,
nfactors = n_factors_no_dfa,
rotate = "varimax",
scores = TRUE)
print(fa_varimax_no_dfa)
## Principal Components Analysis
## Call: principal(r = data_scaled_no_dfa, nfactors = n_factors_no_dfa,
## rotate = "varimax", scores = TRUE)
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 h2 u2 com
## MDVP:Fo -0.01 0.89 0.80 0.20 1.0
## MDVP:Fhi 0.16 0.53 0.31 0.69 1.2
## MDVP:Flo -0.12 0.73 0.55 0.45 1.1
## MDVP:Jitter...4 0.92 -0.05 0.85 0.15 1.0
## MDVP:RAP 0.91 0.00 0.83 0.17 1.0
## NHR 0.89 0.07 0.79 0.21 1.0
## MDVP:Shimmer...9 0.90 -0.10 0.82 0.18 1.0
## Shimmer:APQ3 0.88 -0.09 0.79 0.21 1.0
## HNR -0.89 0.14 0.80 0.20 1.0
## RPDE 0.47 -0.56 0.54 0.46 1.9
## spread1 0.74 -0.50 0.81 0.19 1.8
## D2 0.64 0.13 0.43 0.57 1.1
## PPE 0.77 -0.45 0.80 0.20 1.6
##
## RC1 RC2
## SS loadings 6.66 2.44
## Proportion Var 0.51 0.19
## Cumulative Var 0.51 0.70
## Proportion Explained 0.73 0.27
## Cumulative Proportion 0.73 1.00
##
## Mean item complexity = 1.2
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.06
## with the empirical chi square 101.95 with prob < 6.2e-05
##
## Fit based upon off diagonal values = 0.99
Nilai communalities sebagian besar tetap tinggi, namun beberapa variabel seperti D2 (0,43) dan RPDE (0,53) menunjukkan penurunan kemampuan faktor dalam menjelaskan variasinya. Hal ini menunjukkan bahwa penghapusan DFA sedikit mengurangi kekuatan model dalam menjelaskan beberapa variabel.
round(fa_varimax_no_dfa$communality, 3)
## MDVP:Fo MDVP:Fhi MDVP:Flo MDVP:Jitter...4
## 0.796 0.312 0.546 0.847
## MDVP:RAP NHR MDVP:Shimmer...9 Shimmer:APQ3
## 0.833 0.788 0.824 0.786
## HNR RPDE spread1 D2
## 0.803 0.535 0.807 0.431
## PPE
## 0.796
scores_FA_no_dfa <- as.data.frame(fa_varimax_no_dfa$scores)
head(scores_FA_no_dfa)
## RC1 RC2
## 1 0.2414280 -0.7864874
## 2 0.8952044 -0.6911097
## 3 0.6295221 -0.6958576
## 4 0.7225793 -0.7841011
## 5 1.1217692 -0.7790116
## 6 0.4379155 -0.7794609