# 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