# Working Directory setzen
# setwd("C:/Users/slk/Regressionsanalyse")

# Daten einlesen als "dat"
dat <- read.csv("Regression_example.csv")

# Daten anschauen
head(dat)
##   X Haustier  Jobzufr Krankheit       LeZu
## 1 1    Katze 53.44309  35.37710  -2.987541
## 2 2    Katze 63.91812  29.55197   8.054369
## 3 3    Katze 55.84479  26.65133  48.622638
## 4 4    Katze 66.15583  33.98732 -22.299830
## 5 5    Katze 53.26513  31.74178  28.687545
## 6 6    Katze 55.04067  25.61240  49.233477
# uVs:
# Haustier (dichotom), Jobzufriedenheit, Krankheitsstatus (metrisch) 
# aV:
# Lebenszufriedenheit (metrisch)

### Multiple Regression 

## Datenaufbereitung
# Dichotomen Prädiktor als Faktor kodieren
dat$Haustier.f <- factor(dat$Haustier)
levels(dat$Haustier.f) # Hund ist Referenzkategorie
## [1] "Hund"  "Katze"
# alternativ: dichotomen Prädiktor als Dummy kodieren
dat$Haustier.Dummy <- ifelse(dat$Haustier == "Katze", 1, 0) # Hund ist Referenz

# einen Prädiktor zentrieren
dat$Jobzufr.z <- scale(dat$Jobzufr, scale = FALSE)

# in Daten überprüfen mit view(dat)


## Multiple Regresson durchführen 
# mit Interaktion zwischen Jobzufriedenheit und Krankheit
fit <- lm(LeZu ~ Jobzufr.z * Krankheit + Haustier.f, 
          data = dat)
summary(fit)
## 
## Call:
## lm(formula = LeZu ~ Jobzufr.z * Krankheit + Haustier.f, data = dat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -14.2760  -3.3704   0.0741   3.0124  16.6384 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         205.346441   2.336207  87.897  < 2e-16 ***
## Jobzufr.z             0.905828   0.208348   4.348 2.24e-05 ***
## Krankheit            -5.465457   0.076085 -71.833  < 2e-16 ***
## Haustier.fKatze      -5.605751   0.745975  -7.515 2.18e-12 ***
## Jobzufr.z:Krankheit  -0.096477   0.006996 -13.790  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.157 on 190 degrees of freedom
## Multiple R-squared:  0.9782, Adjusted R-squared:  0.9777 
## F-statistic:  2131 on 4 and 190 DF,  p-value: < 2.2e-16
# Interaktionsplot von Krankheit und Jobzufriedenheit (Johnson Neyman Plot)
# install.packages("interactions")
library(interactions)

johnson_neyman(fit, 
               pred = Krankheit, # Variable, die moderiert wird
               modx = Jobzufr.z, # Moderatorvariable
               alpha = .05, # Alphaniveau 
               sig.color = "black", # Farbe
               insig.color = "grey")
## JOHNSON-NEYMAN INTERVAL 
## 
## When Jobzufr.z is OUTSIDE the interval [-65.66, -49.86], the slope of
## Krankheit is p < .05.
## 
## Note: The range of observed values of Jobzufr.z is [-30.42, 29.13]

## Voraussetzungen und Störfaktoren prüfen

# Multikollinearität

# Korrelationsmatrix anschauen
# alle metrischen Prädiktoren auswählen und in subset speichern
dat_subset <- dat[,c("Jobzufr", "Krankheit")]
cor(dat_subset) # Korrelation zwischen Jobzufr und Krankheit fast 0
##               Jobzufr   Krankheit
## Jobzufr    1.00000000 -0.01077629
## Krankheit -0.01077629  1.00000000
# Varianzinflationsfaktor pro Prädiktor (VIF > 10 gilt als Problem)
# install.packages("car")
library(car)
## Lade nötiges Paket: carData
vif(fit) # Korrelation einer Variable mit ihrem Interaktionsterm 
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
##           Jobzufr.z           Krankheit          Haustier.f Jobzufr.z:Krankheit 
##           38.366026            1.120666            1.013948           38.458078
# ist zwangsläufig vorhanden 


# Regressionsdiagnostik 
par(mfrow = c(2,2)) # alle Regressionsplot in 1 Abbildung
plot(fit)

# Von oben links nach unten rechts (Siehe Luhmann, 2020, S. 249):
# 1. Linearitätsannahme verletzt wenn hier Linie nicht parallel zur 
#    x-Achse verläuft - hier ok!
# 2. Normalverteilung der Residuen verltzt wenn Punkte nicht nah an 
#    Linie verlaufen. Leichte Abweichungen in den Randbereichen sind ok. 
#    - hier: ok!
# 3. Homoskedastizitätsannahme verletzt, wenn die Punkte nicht unsyste-
#    matisch um die Linie herum verteilt sind, d.h. wenn die Punkte z.B.
#    links näher an der linie sind als rechts. - hier: ok!
# 4. Ausreißer und einflussreiche Datenpunkte kann man in allen Abbildungen 
#    an den dazunotierten Zeilennummern erkennen, im letzten Plot sind
#    außerdem ihre Hebelwerte (Leverage) ausgegeben. 


# Code für Korrektur für Heteroskedastizität
# install.packages("sandwich")
# install.packages("lmtest")
library(sandwich)
library(lmtest)
## Lade nötiges Paket: zoo
## 
## Attache Paket: 'zoo'
## Die folgenden Objekte sind maskiert von 'package:base':
## 
##     as.Date, as.Date.numeric
# HC3 Korrektur für Standardfehler und p-Werte (Standardmethode):
coeftest(fit, vcov = vcovHC(fit))
## 
## t test of coefficients:
## 
##                        Estimate  Std. Error  t value  Pr(>|t|)    
## (Intercept)         205.3464412   2.5135912  81.6944 < 2.2e-16 ***
## Jobzufr.z             0.9058278   0.2247258   4.0308 8.038e-05 ***
## Krankheit            -5.4654565   0.0839561 -65.0990 < 2.2e-16 ***
## Haustier.fKatze      -5.6057505   0.7486342  -7.4880 2.552e-12 ***
## Jobzufr.z:Krankheit  -0.0964771   0.0075531 -12.7731 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1