1. Kütüphanelerin Yüklenmesi

Kodu Göster / Gizle
library(readr)
library(tidyverse)
library(tidyr)
library(dendextend)
library(knitr)
library(gridExtra)
library(ggplot2)
library(VIM)
library(corrplot)
library(car)
library(ResourceSelection)
library(glmulti)
library(tree)
library(randomForest)
library(ISLR)
library(class)
library(pROC)
library(gtools)
library(tidyverse)
library(GGally)
library(superml)
library(caret)
library(Boruta)
library("stringr")
library("tidyr")
library("readr")
library("here")
library("skimr")
library("janitor")
library("lubridate")
library(gridExtra)
library(ggplot2)
library(VIM)
library(corrplot)
library(car)
library(ResourceSelection)
library(glmulti)
library(tree)
library(randomForest)
library(ISLR)
library(class)
library(pROC)
library(gtools)
library(tidyverse)
library("scales")
library("ggcorrplot")
library("ggrepel")
library("forcats")
library("corrgram")
library(tidymodels)
library(baguette)
library(discrim)
library(bonsai)
library(ResourceSelection)
library(kableExtra)
library(broom)
library(dplyr)
library(caret)
library(tidyr)
library(corrplot)
library("Hmisc")
library(psych)
library(factoextra)
library("DescTools")
library(ResourceSelection)
library(haven)
library(effectsize)
library(rstatix)
library(ggpubr)
library(biotools)
library(PerformanceAnalytics)
library(heplots)
library(gplots)
clean_df <- read.csv('/home/ilke/Downloads/clean_heart.csv')

2. MANOVA

shapiro.test(clean_df$Age)
## 
##  Shapiro-Wilk normality test
## 
## data:  clean_df$Age
## W = 0.99405, p-value = 0.007295
shapiro.test(clean_df$RestingBP)
## 
##  Shapiro-Wilk normality test
## 
## data:  clean_df$RestingBP
## W = 0.98148, p-value = 9.338e-08
shapiro.test(clean_df$Cholesterol)
## 
##  Shapiro-Wilk normality test
## 
## data:  clean_df$Cholesterol
## W = 0.9931, p-value = 0.002519
shapiro.test(clean_df$MaxHR)
## 
##  Shapiro-Wilk normality test
## 
## data:  clean_df$MaxHR
## W = 0.98886, p-value = 3.55e-05
shapiro.test(clean_df$Oldpeak)
## 
##  Shapiro-Wilk normality test
## 
## data:  clean_df$Oldpeak
## W = 0.82343, p-value < 2.2e-16

Ekstra Box-Cox/log/sqrt dönüşümleri uygulandı ve Scale ederek de denendi. Hiçbiriyle değişken bazında normallik sağlanamadı. Veriyi değişken bazında normal dağılıma uygun hale getiremedim. Cholesterol,MaxHR Ve Age değişkenlerini kullandığımda çok değişkenli normallik sağlandı.

clean_df %>%
  dplyr::select(Cholesterol,MaxHR,Age,Oldpeak,RestingBP) %>%
  mshapiro_test()
## # A tibble: 1 × 2
##   statistic p.value
##       <dbl>   <dbl>
## 1     0.993 0.00157

Normallik Varsayımı

H0: Bağımlı değişkenler tüm faktör gruplarında normal olarak dağılmıştır. H1: Bağımlı değişkenler tüm faktör gruplarında normal olarak dağılmamıştır. yapılan mshapiro_test ile h0 hipotezi reddedilemez. Yani çok değişkenli normallik sağlanmıştır.

clean_df %>%
  dplyr::select(Cholesterol,MaxHR,Age) %>%
  mshapiro_test()
## # A tibble: 1 × 2
##   statistic p.value
##       <dbl>   <dbl>
## 1     0.997   0.283
plotmeans(Cholesterol~ST_Slope,xlab="ST_SLOPE",ylab="CHOLESTEROL", main="Mean Plot\nwith 95% CI",data=clean_df)

plotmeans(MaxHR~ST_Slope, xlab="ST_SLOPE",ylab="MAXHR", main="Mean Plot\nwith 95% CI",data=clean_df)

plotmeans(Age~ST_Slope, xlab="ST_SLOPE",ylab="AGE", main="Mean Plot\nwith 95% CI",data=clean_df)

plotmeans(Cholesterol~RestingECG,xlab="RESTİNGECG",ylab="cholesterol", main="Mean Plot\nwith 95% CI",data=clean_df)

plotmeans(MaxHR~RestingECG, xlab="RESTİNGECG",ylab="Maxhr", main="Mean Plot\nwith 95% CI",data=clean_df)

plotmeans(Age~RestingECG, xlab="RESTİNGECG",ylab="AGE", main="Mean Plot\nwith 95% CI",data=clean_df)

Korelasyon tablosuna bakılarak çoklu doğrusallık kontrol edildi. Pearson Correlation değerleri 0.8den küçük olduğundan çoklu doğrusallık yok denebilir.

cor_matrix <- cor(clean_df[, c("Age", "Cholesterol", "MaxHR")])
# Korelasyon matrisini görselleştir ve değerleri ekle
corrplot(
  cor_matrix,
  method = "color", 
  type = "upper", 
  tl.col = "black",
  addCoef.col = "black",  
  number.cex = 0.7       
)

H0: Varyans-Kovaryans matrisi homojendir (Değişkenler arasındaki varyanslar ve kovaryanslar eşittir).

H1: Varyans-Kovaryans matrisi homojen değildir (En az bir değişkenin varyansı veya kovaryansı diğerlerinden farklıdır).

Gruplar arası varyans-kovaryans matrisi homojenliği için Box’s test kullanılılır. Bu test istatistiğine bakılarak H0 reddedilemez. Yani gruplar arası kovaryans eşitliğinin sağlandığını söyleyebiliriz. Bu durumda MANOVA test istatistiği için Wilk’s lambdayı kullanacağız.

library(biotools)
box_m(clean_df[, c("Age","Cholesterol","MaxHR")], clean_df$ST_Slope)
## # A tibble: 1 × 4
##   statistic p.value parameter method                                            
##       <dbl>   <dbl>     <dbl> <chr>                                             
## 1      10.4   0.583        12 Box's M-test for Homogeneity of Covariance Matric…

2.1 Tek Yönlü Manova

H0 : ‘birleşik değişken’ açısından grup ortalamaları arasında bir fark yoktur. H1 : ‘birleşik değişken’ açısından en az bir grup ortalaması diğerlerinden farklıdır.

df_manova <- manova(cbind(Cholesterol,MaxHR,Age) ~ ST_Slope,data=clean_df)

summary(df_manova, test = "Wilks")
##            Df   Wilks approx F num Df den Df    Pr(>F)    
## ST_Slope    2 0.82183   23.951      6   1394 < 2.2e-16 ***
## Residuals 699                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Varyans Homojenliği Varsayımı H0: Grup varyansları eşittir (Varyanslar homojendir). H1: En az bir grup varyansı diğerlerinden farklıdır (Varyanslar homojen değildir). Levene’s test kullanılarak her bir bağımlı değişken için varyans homojenliği test edilir. Test istatistiğine bakılarak h0 reddedilemez. Yani bağımlı değişkenlerin her birisi için varyans homojenliğinin sağlandığı söylenebilir.

library(car)
#Homogeneity of variance- Levene's Test
clean_df %>% 
  pivot_longer( c(Cholesterol,MaxHR,Age),names_to = "variable", values_to = "value") %>%
  group_by(variable) %>%
  levene_test(value ~ ST_Slope,center=mean)
## # A tibble: 3 × 5
##   variable      df1   df2 statistic     p
##   <chr>       <int> <int>     <dbl> <dbl>
## 1 Age             2   699     0.847 0.429
## 2 Cholesterol     2   699     0.362 0.696
## 3 MaxHR           2   699     1.51  0.223

Kovaryans matrislerinin homojenliği varsayımı sağlandığı için Wilk’s Lambda bakılır. Sig. (p) .05’ten küçük olduğundan sıfır hipotezini reddedilir. Tek yönlü MANOVA analizi sonucuna göre, kişilerin (ST_SLOPE) zirve egzersiz ST segmentinin eğimi grupları arasında, yaş, kolesterol ve maksimum kalp atışı değişkenlerinden oluşan birleşik değişken açısından anlamlı fark vardır. Kısmi eta kare sonucu (.093) birleşik bağımlı değişkendeki varyansın yaklaşık yüzde 9’unun bağımsız değişken tarafından açıklandığını gösteriyor.

etasq(df_manova, test="Wilks")
##               eta^2
## ST_Slope 0.09345409

→ Yaş için

H0: Yaş değişkeni açısından grup ortalamaları arasında bir fark yoktur. H1: Yaş değişkeni açısından açısından en az bir grup ortalaması diğerlerinden farklıdır. H0 reddedilir Yani Zirve egzersiz ST segmentinin Up, Down ve Flat eğimli olan kişilerin yaşları arasında anlamlı bir farklılık vardır.

→ MaxHR için

H0: MaxHR değişkeni açısından grup ortalamaları arasında bir fark yoktur. H1: MaxHR değişkeni açısından açısından en az bir grup ortalaması diğerlerinden farklıdır. Ho reddedilir. Zirve egzersiz ST segmentinin Up, Down ve Flat eğimli olan kişilerin maksimum kalp atışları arasında anlamlı bir farklılık vardır.

→ Cholesterol için

H0: Cholesterol değişkeni açısından grup ortalamaları arasında bir fark yoktur. H1: Cholesterol değişkeni açısından açısından en az bir grup ortalaması diğerlerinden farklıdır. H0 reddedilemez. Zirve egzersiz ST segmentinin Up, Down ve Flat eğimli olan kişilerin kolesterolleri arasında anlamlı bir farklılık yoktur. Yani değişikliği yaratan değişkenler yaş ve maksimum kalp atış hızıdır. Levene istatistiğine bakarak tüm değişkenler için varyans homojenliği varsayımının sağlandığı görülmüştü. Bu yüzden etkili olan Maksimum kalp atışı ve yaş değişkeni için Tukey bakılarak yorum yapıldı.

### Test of Between Subjects####Farkliligi yaratan degisken hangisi ?
summary.aov(df_manova)
##  Response Cholesterol :
##              Df  Sum Sq Mean Sq F value  Pr(>F)  
## ST_Slope      2   13660  6830.2  2.6715 0.06985 .
## Residuals   699 1787124  2556.7                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response MaxHR :
##              Df Sum Sq Mean Sq F value    Pr(>F)    
## ST_Slope      2  62806 31402.8  62.146 < 2.2e-16 ***
## Residuals   699 353208   505.3                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response Age :
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## ST_Slope      2   4955 2477.34  29.459 5.21e-13 ***
## Residuals   699  58782   84.09                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Maksimum kalp atışı için : Zirve egzersiz ST segmentinin eğimi Up(yukarı) olanların maksimum kalp atış ortalamaları down(aşağı) ve Flat(düz) olanlara göre daha yüksektir. Ayrıca zirve egzersiz st segmenti eğimi down(aşağı) olanların da flat(düz) olanlara göre maksimum kalp atışı ortalamaları daha yüksektir. Yani maksimum kalp atış ortalaması en yüksek olan grup Zirve egzersiz ST segmentinin eğimi Up(yukarı) olanlandır. En düşük olanlar ise düz olanlardır.

Yaş için Zirve egzersiz ST segmentinin eğimi Down olanların yaş ortalamaları Up ve Flat olanlara göre daha yüksektir. Ayrıca zirve egzersiz st segmenti eğimi Flat olanların da up olanlara göre yaş ortalamaları daha yüksektir. Yani yaş ortalaması en yüksek olan grup Zirve egzersiz ST segmentinin eğimi Down olanlandır. En düşük olanlar ise up olanlardır.En genç grup Zirve egzersiz ST segmentinin eğimi up(yukarı) olanlardır.

m_tukey2 <- clean_df %>%
  pivot_longer( c(MaxHR,Age),names_to = "variables", values_to = "value") %>%
  group_by(variables) %>%
  tukey_hsd(value ~ ST_Slope)
m_tukey2<-m_tukey2[,c(1,4,3,6:10)]
m_tukey2
## # A tibble: 6 × 8
##   variables group2 group1 estimate conf.low conf.high     p.adj p.adj.signif
##   <chr>     <chr>  <chr>     <dbl>    <dbl>     <dbl>     <dbl> <chr>       
## 1 Age       Flat   Down      -2.73    -6.72      1.25 0.242     ns          
## 2 Age       Up     Down      -7.69   -11.7      -3.71 0.0000202 ****        
## 3 Age       Up     Flat      -4.96    -6.62     -3.29 0         ****        
## 4 MaxHR     Flat   Down      -3.13   -12.9       6.64 0.732     ns          
## 5 MaxHR     Up     Down      16.0      6.27     25.8  0.00037   ***         
## 6 MaxHR     Up     Flat      19.2     15.1      23.2  0         ****

2.2 Çift Yönlü Manova

Zirve egzersiz ST segmentinin eğiminin yönü ve istirahat elektrokardiyogram sonuçları gruplarına göre yaş, kolesterol ve maksimum kalp atış hızı değişkenleri incelenecek.

Varyans-Kovaryans matrisinin homojenliği varsayımı sağlandı.

library(heplots)
boxM(cbind(Cholesterol,MaxHR,Age) ~ RestingECG*ST_Slope, data=clean_df)
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  Y
## Chi-Sq (approx.) = 62.987, df = 48, p-value = 0.07203

H0 : Zirve egzersiz ST segmentinin eğiminin yönü ve istirahat elektrokardiyogram sonuçları arasındaki etkileşim etkilerinin toplamı sıfırdır. H1 : Zirve egzersiz ST segmentinin eğiminin yönü ve istirahat elektrokardiyogram sonuçları etkilerinin toplamı sıfırdan farklıdır.

Varyans-Kovaryans matrislerinin homojenliği varsayımı sağlandığı için Wilk’s Lambda satırına bakılır. Sig. (p) .05’ten küçük olduğu durumda sıfır hipotezini reddedilir.Zirve egzersiz ST segmentinin eğiminin yönü ve istirahat elektrokardiyogram sonuçlarının etkileşiminin bağımlı değişkenler üzerinde anlamlı bir etkisi vardır. Yani gruplar arasında anlamlı bir farklılık oluşur.

df_cift <- manova(cbind(Cholesterol,MaxHR,Age) ~ RestingECG*ST_Slope,data=clean_df)
summary(df_cift, test = "Wilks")
##                      Df   Wilks approx F num Df den Df  Pr(>F)    
## RestingECG            2 0.90607   11.645      6 1382.0 9.3e-13 ***
## ST_Slope              2 0.82600   23.102      6 1382.0 < 2e-16 ***
## RestingECG:ST_Slope   4 0.96682    1.956     12 1828.5 0.02462 *  
## Residuals           693                                           
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Partial Eta Squared Hesaplamak İçin
etasq(df_cift, test="Wilks")
##                          eta^2
## RestingECG          0.04274102
## ST_Slope            0.09115576
## RestingECG:ST_Slope 0.01118583

Varyans Homojenliği Varsayımı sadece kolesterol için sağlandı.

#Homogeneity of variance- Levene's Test
clean_df %>% 
  pivot_longer( c(Cholesterol,MaxHR,Age),names_to = "variable", values_to = "value") %>%
  group_by(variable) %>%
  levene_test(value ~ RestingECG*ST_Slope,center=mean)
## # A tibble: 3 × 5
##   variable      df1   df2 statistic      p
##   <chr>       <int> <int>     <dbl>  <dbl>
## 1 Age             8   693      2.37 0.0160
## 2 Cholesterol     8   693      1.03 0.410 
## 3 MaxHR           8   693      2.29 0.0201

Zirve egzersiz ST segmentinin eğiminin yönü ve istirahat elektrokardiyogram sonuçlarının etkileşiminin bağımlı değişkenler üzerinde farklılığı yaratan kolesterol değişkenidir. Varyans Homojenliği Varsayımı kolesterol için sağlandığından Tukey’e bakılır.

### Test of Between Subjects####Farklilik yaratan degisken hangisi ?
summary.aov(df_cift) #sadece chol
##  Response Cholesterol :
##                      Df  Sum Sq Mean Sq F value  Pr(>F)  
## RestingECG            2   16520  8260.2  3.2803 0.03820 *
## ST_Slope              2   13644  6821.9  2.7091 0.06730 .
## RestingECG:ST_Slope   4   25571  6392.8  2.5387 0.03884 *
## Residuals           693 1745049  2518.1                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response MaxHR :
##                      Df Sum Sq Mean Sq F value    Pr(>F)    
## RestingECG            2  10181  5090.6 10.2909 3.943e-05 ***
## ST_Slope              2  61537 30768.3 62.1991 < 2.2e-16 ***
## RestingECG:ST_Slope   4   1487   371.8  0.7516    0.5571    
## Residuals           693 342809   494.7                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response Age :
##                      Df Sum Sq Mean Sq F value    Pr(>F)    
## RestingECG            2   3337 1668.69 20.8199 1.657e-09 ***
## ST_Slope              2   4191 2095.38 26.1438 1.132e-11 ***
## RestingECG:ST_Slope   4    666  166.45  2.0767   0.08219 .  
## Residuals           693  55543   80.15                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
etasq(aov(Cholesterol~RestingECG*ST_Slope, data=clean_df))
##                     Partial eta^2
## RestingECG            0.009368800
## ST_Slope              0.007757882
## RestingECG:ST_Slope   0.014441992
## Residuals                      NA
# Çoklu Karsilastirmalar (Multiple Comparisons)
chol_aov <- aov(Cholesterol ~ RestingECG*ST_Slope, data =clean_df)
etasq(chol_aov)
##                     Partial eta^2
## RestingECG            0.009368800
## ST_Slope              0.007757882
## RestingECG:ST_Slope   0.014441992
## Residuals                      NA
TukeyHSD(chol_aov, "RestingECG")
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Cholesterol ~ RestingECG * ST_Slope, data = clean_df)
## 
## $RestingECG
##                   diff       lwr        upr     p adj
## Normal-LVH -11.4132127 -22.23492 -0.5915006 0.0359048
## ST-LVH     -11.5388669 -25.85624  2.7785029 0.1414551
## ST-Normal   -0.1256542 -12.52381 12.2725024 0.9996876
chol_aov <- aov(Cholesterol ~ RestingECG*ST_Slope, data =clean_df)
etasq(chol_aov)
##                     Partial eta^2
## RestingECG            0.009368800
## ST_Slope              0.007757882
## RestingECG:ST_Slope   0.014441992
## Residuals                      NA
TukeyHSD(chol_aov, "ST_Slope")
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Cholesterol ~ RestingECG * ST_Slope, data = clean_df)
## 
## $ST_Slope
##                diff        lwr       upr     p adj
## Flat-Down 16.000514  -5.815821 37.816848 0.1974306
## Up-Down    8.677426 -13.121878 30.476731 0.6183420
## Up-Flat   -7.323087 -16.430293  1.784118 0.1427080

→ RestingECG için

Normal-LVH Karşılaştırması :Ortalama kolesterol düzeyi, “Normal” ve “LVH” durumları arasında istatistiksel olarak anlamlı bir fark gösterir. Bu fark, “Normal” durumunun ortalama kolesterol düzeyinin “LVH” durumundan yaklaşık 11.41 birim daha düşük olduğunu gösterir.

ST-LVH Karşılaştırması: Bu durumda, ortalama kolesterol düzeyleri arasındaki fark istatistiksel olarak anlamlı değildir. P değeri 0.1414 olduğundan, bu durumdaki farkın tesadüfi olma olasılığı yüksektir.

ST-Normal Karşılaştırması: “ST” ve “Normal” durumları arasındaki ortalama kolesterol düzeyleri arasında istatistiksel olarak anlamlı bir fark bulunmamaktadır. P değeri yüksek olduğundan, bu durumdaki farkın tesadüfi olma olasılığı yüksektir.

→ ST_SLOPE için

Flat-Down Karşılaştırması: Ortalama kolesterol düzeyi, “Flat” ve “Down” eğim durumları arasında istatistiksel olarak anlamlı bir fark göstermez. P değeri 0.1974 olduğundan, bu durumdaki farkın tesadüfi olma olasılığı yüksektir.

Up-Down Karşılaştırması: “Up” ve “Down” eğim durumları arasındaki ortalama kolesterol düzeyleri arasında istatistiksel olarak anlamlı bir fark bulunmamaktadır. P değeri yüksek olduğundan, bu durumdaki farkın tesadüfi olma olasılığı yüksektir.

Up-Flat Karşılaştırması: Ortalama kolesterol düzeyi, “Up” ve “Flat” eğim durumları arasında istatistiksel olarak anlamlı bir fark gösterir. Bu durumda, “Up” eğimdurumunun ortalama kolesterol düzeyinin “Flat” eğim durumundan yaklaşık 7.32 birim daha düşük olduğunu gösterir.

# için Etkilesim Grafikleri (Interaction Plots) 
attach(clean_df)
interaction.plot(ST_Slope,RestingECG,Age, fun=mean, type="l", legend=TRUE,col=1:3, lwd=2)

interaction.plot(ST_Slope,RestingECG,Cholesterol, fun=mean, type="l", legend=TRUE, col=1:3,lwd=2)

interaction.plot(ST_Slope,RestingECG,MaxHR, fun=mean, type="l", legend=TRUE, col=1:3,lwd=2)

detach(clean_df)