rm(list=ls())
sys <- Sys.info()["sysname"]
if (sys == "Windows") {
Sys.setenv(LANG = "en")
} else {
Sys.setlocale("LC_MESSAGES", "en_US.utf8")
}
if (!require(car)) install.packages("car"); library(car) # Companion to Applied Regression: Package by John Fox accompanying his book; provides additional functions and plots for lm's and glm's
## Loading required package: car
## Warning: package 'car' was built under R version 4.1.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.1.3
if (!require(effects)) install.packages("effects"); library(effects) # graphical and tabular effect displays for fitted models
## Loading required package: effects
## Warning: package 'effects' was built under R version 4.1.3
## lattice theme set by effectsTheme()
## See ?effectsTheme for details.
if (!require(corrplot)) install.packages("corrplot"); library(corrplot) # used to plot a correlation matrix
## Loading required package: corrplot
## Warning: package 'corrplot' was built under R version 4.1.3
## corrplot 0.92 loaded
if (!require(ggplot2)) install.packages("ggplot2"); library(ggplot2) # graphics package
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.1.3
if(!require(MVA)) install.packages("MVA"); library(MVA) # bivariate boxplot
## Loading required package: MVA
## Warning: package 'MVA' was built under R version 4.1.3
## Loading required package: HSAUR2
## Warning: package 'HSAUR2' was built under R version 4.1.3
## Loading required package: tools
if(!require(KernSmooth)) install.packages("KernSmooth"); library(KernSmooth) # kernel density estimates
## Loading required package: KernSmooth
## KernSmooth 2.23 loaded
## Copyright M. P. Wand 1997-2009
if (!require(performance)) install.packages("performance"); library(performance) # posterior predictive checks
## Loading required package: performance
## Warning: package 'performance' was built under R version 4.1.3
if (!require(see)) install.packages("see"); library(see) # posterior predictive checks
## Loading required package: see
## Warning: package 'see' was built under R version 4.1.3
# library(foreign) # Read Data Stored by Minitab, S, SAS, SPSS, Stata, Systat, Weka, dBase, ...
library(MASS)
library(lattice) # graphics package
#----------------------------------1. Simple Linear Regression---------------------------------------------
# CEO salary, sales, and profit data:
dataceo <- read.table("http://statmath.wu.ac.at/~wurzer/ADAR/Data/dataceo.txt", header = TRUE)
# salary = Gehalt + Boni
# totcomp = CEO-Gesamtvergütung
# tenure = # Anzahl der Jahre als CEO (=0, wenn weniger als 6 Monate)
# age = Alter des CEO
# sales = Gesamtverkaufserlös von Unternehmen i
# profits = Gewinn für Unternehmen i
# assets = Gesamtvermögen des Unternehmens i
# 53 der Fortune-500-Firmen wurden ausgeschlossen, weil Daten zu einer oder mehreren Variablen fehlten oder weil die CEOs keine Vergütung erhielten.
#---1.1 Preliminary Descriptive Analysis:---
names(dataceo) # get variable names
## [1] "salary" "totcomp" "tenure" "age" "sales" "profits" "assets"
summary(dataceo) # Informationen über die Variablen im Datenrahmen -> Ergebnisse des Befehls 'summary' hängen von dem in Klammern angegebenen Objekt ab
## salary totcomp tenure age
## Min. : 100 Min. : 100 Min. : 0.000 Min. :34.00
## 1st Qu.: 1084 1st Qu.: 1576 1st Qu.: 2.000 1st Qu.:52.00
## Median : 1600 Median : 2951 Median : 5.000 Median :57.00
## Mean : 2028 Mean : 8340 Mean : 7.834 Mean :56.47
## 3rd Qu.: 2348 3rd Qu.: 6043 3rd Qu.:10.000 3rd Qu.:61.00
## Max. :15250 Max. :589101 Max. :60.000 Max. :84.00
## sales profits assets
## Min. : 2896 Min. :-2669.0 Min. : 717.8
## 1st Qu.: 4184 1st Qu.: 108.5 1st Qu.: 3856.9
## Median : 6704 Median : 333.1 Median : 7810.8
## Mean : 11558 Mean : 700.5 Mean : 27054.3
## 3rd Qu.: 12977 3rd Qu.: 738.0 3rd Qu.: 21105.6
## Max. :161315 Max. :22071.0 Max. :668641.0
dim(dataceo) # Anzahl der Zeilen und Spalten im Datensatz
## [1] 447 7
complete.cases(dataceo) # Sind die Einzelfälle (= Beobachtungseinheiten = Zeilen) vollständig (keine NA's)?
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [46] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [61] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [76] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [106] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [136] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [151] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [166] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [211] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [226] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [241] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [256] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [271] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [286] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [301] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [316] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [331] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [346] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [361] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [376] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [391] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [406] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [421] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [436] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
table(complete.cases(dataceo)) # Tabelle mit TRUE (vollständig) und FALSE (NA's vorhanden) Fällen
##
## TRUE
## 447
#####Punktplot----
attach(dataceo) # Objekt 'dataceo' an den R-Suchpfad anhängen -> direkter Zugriff auf die Variablen (salary, totcomp etc.) wird möglich
plot(assets, salary) # scatterplot ,Streudiagramm
options(scipen = 10) # Strafe für die wissenschaftliche Notation, d.h. die feste Notation wird bis zu einem gewissen Grad bevorzugt (siehe ?Optionen)
plot(assets, salary)
abline(lm(salary ~ assets)) # a-b-line': fügt eine Regressionslinie durch das aktuelle Diagramm hinzu. Funktioniert nur, wenn bereits ein Diagramm erstellt wurde.

#####Balkendiagramm----
hist(salary, freq = F) # histogram

########Boxplot----
Boxplot(~ salary) # Boxplot wird erstellt; Ausreißer (d. h. die Zeilennummern der entsprechenden Beobachtungen) werden in der Konsole zurückgegeben

## [1] "192" "27" "185" "5" "7" "6" "23" "96" "390" "207"
#####Punktediagramm mit 25 und 75 Quantil----
scatterplot(salary ~ assets) # komplexere Scatterplot-Version (einschließlich marginaler Boxplots,

# eine nicht-parametrische Regressionsgerade, nicht-parametrische Schätzung der Streuung), die im Paket "car" enthalten ist
scatterplot(salary ~ assets, ellipse = TRUE, smooth = list(style="lines")) # eine Konzentrationsellipse enthalten (d. h. ein "2-dim-Konfidenzintervall"; die Ellipse zeigt

# der Bereich, der 95 % aller Stichproben enthält, die aus der zugrunde liegenden Normalverteilung gezogen werden könnten)
smoothScatter(assets, salary) # geglättetes Streudiagramm, um übereinander liegende Beobachtungen zu berücksichtigen

bvbox(dataceo[, c("assets", "salary")], xlab = "assets", ylab = "salary") # bivariater Boxplot zur Identifizierung von 2-dim Ausreißern

# Alternative zum bivariaten Boxplot - konvexe Hülle:
(hull <- with(dataceo, chull(assets, salary)))
## [1] 11 100 338 423 358 376 157 27 192 7
with(dataceo,
plot(assets, salary, pch = 1, xlab = "assets", ylab = "salary"))
with(dataceo,
polygon(assets[hull], salary[hull], density = 15, angle = 30))

# Korrelation unter Verwendung aller Punkte gegenüber dem Entfernen der Punkte, die auf der konvexen Hülle liegen:
with(dataceo, cor(assets, salary))
## [1] 0.431036
with(dataceo, cor(assets[-hull], salary[-hull]))
## [1] 0.4977579
# Plots auf der Grundlage von bivariaten Kernel-Dichte-Schätzungen:
image(kde2d(dataceo$assets, dataceo$salary, n = 250)) # colored image

persp(kde2d(dataceo$assets, dataceo$salary, n = 50)) # perspective plot

contour(kde2d(dataceo$assets, dataceo$salary)) # contour plot

xyplot(salary ~ assets) # Streudiagramm unter Verwendung des Lattice-Pakets (könnte auch erweitert werden)

##lineare Dartesllung----
ggplot(dataceo, aes(x = assets, y = salary)) + # Streudiagramm mit ggplot2-Paket
geom_point(shape = 1) + # use circles die Zahl verändert die Zeichen der einzelnen Datenpunkte
geom_smooth(method = lm) # lineare Regressionslinie hinzufügen
## `geom_smooth()` using formula 'y ~ x'

## Kurvendarstellung----
ggplot(dataceo, aes(x = assets, y = salary)) +
geom_point(shape = 1) + # Use circles
geom_smooth() # add loess smooth
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

# # # # # Stichwort: Parametrische, nichtparametrische und semiparametrische Verfahren -> Begleitfolien# # # # #
# # # # # Schlüsselwort: Lokale polynomiale Regression -> Begleitfolien# # # # #
#---1.2 Parameter-Schätzung:---
#dataceo[,7]
regfit1.1 <- lm(dataceo[, 1] ~ dataceo[, 7]) # linke Seite der "~": abhängige Variable; rechte Seite: unabhängige Variable(n)
regfit1.1 <- lm(dataceo$salary ~ dataceo$assets) # the same
regfit1.1 <- lm(salary ~ assets, data = dataceo) # the same
regfit1.1 # geschätzte Regressionskoeffizienten
##
## Call:
## lm(formula = salary ~ assets, data = dataceo)
##
## Coefficients:
## (Intercept) assets
## 1716.84888 0.01148
names(regfit1.1) # Namen der Listenelemente des Objekts regfit1.1
## [1] "coefficients" "residuals" "effects" "rank"
## [5] "fitted.values" "assign" "qr" "df.residual"
## [9] "xlevels" "call" "terms" "model"
regfit1.1$coefficients
## (Intercept) assets
## 1716.84887504 0.01148313
summary(regfit1.1) # detailliertere Informationen über das Modellobjekt Gesamte Auswertung der Regressionsrechnung
##
## Call:
## lm(formula = salary ~ assets, data = dataceo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5309.7 -812.4 -290.1 315.7 13032.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1716.84887 79.79613 21.52 <2e-16 ***
## assets 0.01148 0.00114 10.08 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1556 on 445 degrees of freedom
## Multiple R-squared: 0.1858, Adjusted R-squared: 0.184
## F-statistic: 101.5 on 1 and 445 DF, p-value: < 2.2e-16
#---1.3 Data Transformation:----
par(mfrow = c(1, 2))
plot(density(salary), xlab = "salary", main = " (a) ") #Dichtefunktion von Gehalt
plot(density(log(salary)), xlab = "log of salary", main = " (b) ") # Log-Transformation zur Normalität #Verwendung des logarithmus zur ANnäherung an Normalfunktion

par(mfrow = c(1, 1))
scatterplot(salary ~ assets) # beide Variablen sind verzerrt

scatterplot(salary ~ assets, log = "x") # Beachten Sie die logarithmische Skala auf der x-Achse log scale verwendet z.B. Faktor 100

scatterplot(salary ~ assets, log = "y") # logarithmische Skala auf der y-Achse

# durch die Logarithmierung beider Achsen kommt es zu einer linearen Darstellung
scatterplot(salary ~ assets, log = "xy") # logarithmische Skala auf beiden Achsen -> Umwandlung in Linearität

tenure.1 <- tenure + 1 #andernfalls würde log von 0 Probleme verursachen
scatterplot(salary ~ tenure.1, log = "xy")

scatterplot(salary ~ age, log = "y")

regfit1.2 <- lm(log(salary) ~ log(assets), data = dataceo)
regfit1.2 # ein Anstieg des Vermögens ist nun mit einem proportionalen (und nicht einem absoluten wie in regfit1.1) Anstieg des Gehalts verbunden
##
## Call:
## lm(formula = log(salary) ~ log(assets), data = dataceo)
##
## Coefficients:
## (Intercept) log(assets)
## 5.3133 0.2267
1.01 ^ coef(regfit1.2)[2] # Beim Vergleich von CEO-Paaren, die sich bei den Vermögenswerten ihres Unternehmens um 1 % unterscheiden, sind die CEOs der Unternehmen mit den um 1 % höheren
## log(assets)
## 1.002258
# Vermögenswerte haben ein um 0,2 % höheres Gehalt # -> von Ökonomen "Elastizität" genannt
#andere Transformationen: Quadratwurzel, quadratisch, kubisch, ... -> abhängig von der Struktur der Daten und dem Ziel der Transformation
# (Beziehungen linearisieren, Streuung ausgleichen usw.)
#----------------------------------2. Multiple Linear Regression-------------------------------------------
#---2.1 Preliminary Descriptive Analysis:---
#Streudiagramm mehrerer Variablen----
pairs(dataceo[c(1, 3, 4, 7)]) # Streudiagramm-Matrix der beteiligten Variablen (paarweise)

pairs(dataceo[c(1, 3, 4, 7)], panel = panel.smooth) # jedem Panel des Bildschirms eine glatte Oberfläche hinzufügen

pairs(dataceo[c(1, 3, 4, 7)], upper.panel = panel.smooth, lower.panel = NULL) # keine Paneele oberhalb der Diagonale

# um zu sehen, wie man die Funktionen des Panels weiter anpassen kann, siehe ?pairs für Beispiele
scatterplotMatrix(~ salary + tenure + age + assets) # 'car' package version

scatterplotMatrix(~ salary + tenure + age + assets, diagonal = list(method = "boxplot")) # boxplots instead of

# adaptive (= mit variabler Bandbreite) Kernel-Dichte-Schätzungen in den diagonalen Feldern des Diagramms
#Korrelatinsmatrix erstellen----
cor.dataceo <- cor(dataceo[c(1, 3, 4, 7)]) # eine Korrelationsmatrix zu berechnen
corrplot(cor.dataceo, method = "ellipse") # Korrelationsmatrix visualisieren (Paket 'corrplot')

corrplot(cor.dataceo, method = "number", type = "lower") # siehe ?corrplot für mögliche Anpassungen

#---2.2 "Naive" Schätzung eines multiplen Regressionsproblems (d. h. es werden keine Annahmen über Linearität usw. im Voraus getroffen)
# -> Regression des Gehalts auf Betriebszugehörigkeit, Alter und Vermögen:---
regfit2.1 <- lm(salary ~ tenure + age + assets)
summary(regfit2.1)
##
## Call:
## lm(formula = salary ~ tenure + age + assets)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5429.5 -770.5 -275.5 338.6 12718.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1071.28459 638.36341 1.678 0.09402 .
## tenure 28.39738 9.66493 2.938 0.00347 **
## age 7.62357 11.72896 0.650 0.51604
## assets 0.01121 0.00113 9.917 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1538 on 443 degrees of freedom
## Multiple R-squared: 0.2084, Adjusted R-squared: 0.203
## F-statistic: 38.88 on 3 and 443 DF, p-value: < 2.2e-16
round(confint(regfit2.1), 3) # Berechnung der Konfidenzintervalle für alle Koeffizienten die 3 gibt die Anzahl der Nachkommastellen an
## 2.5 % 97.5 %
## (Intercept) -183.312 2325.882
## tenure 9.403 47.392
## age -15.428 30.675
## assets 0.009 0.013
#---2.3 Diagnostics:---
qqnorm(residuals(regfit2.1)) # QQ-Plot zur Identifizierung nicht normaler Fehler
qqline(residuals(regfit2.1)) # dem QQ-Plot eine Linie hinzufügen, die eine Normalverteilung darstellt

shapiro.test(residuals(regfit2.1)) # hochsignifikant -> Hinweis auf nicht-normale Fehler
##
## Shapiro-Wilk normality test
##
## data: residuals(regfit2.1)
## W = 0.71725, p-value < 2.2e-16
ks.test(residuals(regfit2.1), "pnorm") # hochsignifikant -> auch Hinweis auf nicht-normale Fehler
##
## One-sample Kolmogorov-Smirnov test
##
## data: residuals(regfit2.1)
## D = 0.63087, p-value < 2.2e-16
## alternative hypothesis: two-sided
# 'car' package diagnostics:
qqPlot(regfit2.1, line = "none") # eine annähernde punktweise 95%ige Konfidenzhüllkurve auf der Grundlage eines parametrischen Bootstraps verwendet

## [1] 27 192
# (berechnet unter der Annahme, dass die Fehler normalverteilt sind) wenn sich die Punkte innerhalb des Konfidenzintervalls befinden wäre das Modell in Ordnung
# Identify non-linear relationships:
residualPlots(regfit2.1) # Diagramm unten rechts: gekrümmter Trend (sollte linear sein) -> Anpassung nicht angemessen; alle Tests auf mangelnde Anpassung (für Linearität)

## Test stat Pr(>|Test stat|)
## tenure -2.1628 0.0310896 *
## age -2.0328 0.0426727 *
## assets -3.4680 0.0005757 ***
## Tukey test -3.3912 0.0006959 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# der einzelnen Variablen zeigen das gleiche Ergebnis (p-Werte < 0,05) die Grafik zeigt eine Kurve darum ist es ein Problem
plot(fitted.values(regfit2.1), rstandard(regfit2.1)) # Nicht konstante Fehlervarianz identifizieren -> hier schwer zu erkennen

#wenn man das naive Modell zuerst schätzt sieht man wo die Probleme liegen
# -> Modellverfeinerung 1: Nehmen Sie den Logarithmus der Antwort:
regfit2.2 <- lm(log(salary) ~ tenure + age + assets) #die Krümmung wird versucht mit der Logarithmusfunktion wegzubekommen
summary(regfit2.2)
##
## Call:
## lm(formula = log(salary) ~ tenure + age + assets)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.3610 -0.3797 0.0023 0.3646 2.1555
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.7842961490 0.2436236184 27.847 < 2e-16 ***
## tenure 0.0068813935 0.0036885029 1.866 0.0628 .
## age 0.0081186011 0.0044762139 1.814 0.0704 .
## assets 0.0000035201 0.0000004314 8.160 3.49e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5869 on 443 degrees of freedom
## Multiple R-squared: 0.1579, Adjusted R-squared: 0.1522
## F-statistic: 27.69 on 3 and 443 DF, p-value: < 2.2e-16
qqPlot(regfit2.2, line = "none") #die Punkte liegen schon näher an dem gemeinsam geschätzeten Konfidenzintervall, es gibt nicht mehr viele problematische Beobachtungen

## [1] 27 100
residualPlots(regfit2.2) # Residueenplot ist nach wie vor ein Problem, die Signifikanz hat sich im Vergleich zu 2.1 verbessert (siehe Statistik)

## Test stat Pr(>|Test stat|)
## tenure -2.2732 0.0234946 *
## age -2.5724 0.0104253 *
## assets -3.8652 0.0001276 ***
## Tukey test -4.2438 0.00002198 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(fitted.values(regfit2.2), rstandard(regfit2.2))

# -> model refinement 2: transform predictors: es wird der logarithmus von den Prädiktoren assets und tenure gerechnet
regfit2.3 <- lm(log(salary) ~ log(tenure + 1) + age + log(assets)) # 1 hinzufügen, um -Inf-Werte aufgrund von log(0) zu vermeiden
regfit2.3 <- lm(log(salary) ~ log1p(tenure) + age + log(assets)) # the same
# andere mögliche Transformationen bei Vorhandensein von Nullen: Box-Cox-Transformationen (BC), inverse hyperbolische Sinustransformation (IHS), Mischungsmodelle
summary(regfit2.3)
##
## Call:
## lm(formula = log(salary) ~ log1p(tenure) + age + log(assets))
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.6089 -0.2961 -0.0168 0.3218 1.9555
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.922576 0.275706 17.854 < 2e-16 ***
## log1p(tenure) 0.135574 0.032170 4.214 0.0000304 ***
## age 0.002826 0.004234 0.667 0.505
## log(assets) 0.225227 0.020302 11.094 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5524 on 443 degrees of freedom
## Multiple R-squared: 0.2539, Adjusted R-squared: 0.2488
## F-statistic: 50.25 on 3 and 443 DF, p-value: < 2.2e-16
qqPlot(regfit2.3) #sieht schon viel besser aus

## [1] 27 100
residualPlots(regfit2.3) # alle Diagramme und Tests zeigen jetzt lineare Muster; im Allgemeinen können die erforderlichen Transformationen komplizierter sein

## Test stat Pr(>|Test stat|)
## log1p(tenure) -0.6861 0.4930
## age -1.5827 0.1142
## log(assets) 0.2438 0.8075
## Tukey test -0.5616 0.5744
#die Krümmung von tenure und assets hat sich stark verbessert
plot(fitted.values(regfit2.3), rstandard(regfit2.3)) # die Varuianz hat sich auch stark verbessert, konstant über alle fitted values, haben die gleiche Variation

# Ausreißerdiagnose (ein einflussreicher Ausreißer scheint vorhanden zu sein - Beobachtung Nr. 100):
residualPlots(regfit2.3, id = TRUE) # id=TRUE, die Ausreißer werden gelabelt values outside -2,+2

## Test stat Pr(>|Test stat|)
## log1p(tenure) -0.6861 0.4930
## age -1.5827 0.1142
## log(assets) 0.2438 0.8075
## Tukey test -0.5616 0.5744
qqPlot(regfit2.3, id = TRUE, line = "none")

## [1] 27 100
#Test auf Ausreißer----
outlierTest(regfit2.3) # zeigt die outlier an, kann sich jedoch aufgrund der Normalverteilungskurve andern!!! Signifikanzlevel
## rstudent unadjusted p-value Bonferroni p
## 100 -6.940743 0.000000000013968 0.0000000062436
outlierTest(regfit2.3)$p * 447 # == "Bonferroni p" -> adjustment for multiple testing 'bonferronie behebt das Problem das in der Vorzeile angesprochen wurde
## 100
## 0.000000006243589
#447 hängt mit der EInstellung des Konfidenzintervalls an
#Plot zur ANsicht von Ausreißer----
infIndexPlot(regfit2.3, id = TRUE) # residuen sind eingezeichnet, jeder Punkt ist getestet und Bonferroni korrigiert 1Zeile obere AUsreißer

# 2 Zeile Mittele werte, 3 Zeile untere Ausreißer, 4. Zeile identifizerit Werte mit großem Einfluss
# (Regressions-)Ausreißer: y-Werte, die in Abhängigkeit von den Werten der Prädiktoren ungewöhnlich sind;
# große student Restwerte (Panels 2 und 3) deuten auf Ausreißer hin
# ---
# leverage values: Beobachtungen, die relativ weit vom Regressionsraum entfernt sind;
# sie haben potenziell einen großen Einfluss auf die Regressionskoeffizienten
# large hat-values (panel 4) indicate leverage values
# ---
# einflussreiche Punkte sind Beobachtungen, die sowohl abweichend sind als auch einen hohen leverage
# große Cook's distances (panel 1) einflussreiche Punkte angeben
influencePlot(regfit2.3, id = TRUE) # all in one: x-axis: hat values; y-axis: studentized residuals;

## StudRes Hat CookD
## 27 3.5972258 0.005499006 0.017418228
## 67 1.0147136 0.042694920 0.011479521
## 97 -2.5894799 0.024753055 0.042007006
## 100 -6.9407430 0.019699244 0.218723617
## 184 -0.4029077 0.041768248 0.001772347
#1. wenn es ein outlier ist sieht man es , man hat die Werte der hat values und die gestrichelten Linien zeigt an welche Werte als problematisch anzusehen sind
#Cooks distance ist anhand des Durchmessers der Blasen dargestellt, es zeigt das Pkt 100 ein großes Problem ist
# Flächen von Kreisen: proportional zum Wert von Cook's distance,
# Punkte mit größter hat values (Linien mit dem Doppelten und Dreifachen des Durchschnitts hat value), Cook's distances,
# or studentized residuals are flagged
# Faustregeln: Hat werte, die größer sind als das Dreifache des Durchschnitts, deuten auf Hebelwirkungen hin, Cook's Distanzen
# > 1 indicate influential points
# model refinement 4: Neueinschätzung des Modells ohne den Ausreißer
regfit2.4 <- update(regfit2.3, subset = -c(100)) # take previous model regift2.3, but without observation no. 100
# hier wird die Reihe 100 ausgeschlossen
compareCoefs(regfit2.3, regfit2.4) # Vergleichen Sie die Koeffizienten der beiden Modelle, bei ALter erhöht sich der Koeffizient am meisten
## Calls:
## 1: lm(formula = log(salary) ~ log1p(tenure) + age + log(assets))
## 2: lm(formula = log(salary) ~ log1p(tenure) + age + log(assets), subset =
## -c(100))
##
## Model 1 Model 2
## (Intercept) 4.923 4.734
## SE 0.276 0.264
##
## log1p(tenure) 0.1356 0.1486
## SE 0.0322 0.0306
##
## age 0.00283 0.00396
## SE 0.00423 0.00403
##
## log(assets) 0.2252 0.2372
## SE 0.0203 0.0194
##
cC <- as.data.frame(compareCoefs(regfit2.3, regfit2.4, print = FALSE))
round(cbind(coef = cC$'Model 2' / cC$'Model 1', se = cC$'SE 2' / cC$'SE 1') * 100, 2) # heier sieht man die Koeffizietne sind größer als zuvor was sehr gut ist
## coef se
## [1,] 96.16 95.58
## [2,] 109.61 95.25
## [3,] 140.27 95.15
## [4,] 105.30 95.44
#das R² hat sich ebenfalls von 25 auf 29% gesteigert. summary()
# Eliminiert man nur diesen einen von 447 CEOs, erhöht sich der log(Assets)-Koeffizient um 5%
# log1p(tenure) Koeffizient um fast 10 % und der Alterskoeffizient um über 40 %. Standardfehler
# sind nicht so stark betroffen, gehen aber alle um etwa 5% zurück -> höhere Genauigkeit der Schätzung
# die Fehlernormalität der vier Modelle zu vergleichen, um die Auswirkungen der Verfeinerungen zu erkennen:
par(mfrow = c(2, 2)) #den Parameter mfrow ändern
qqPlot(regfit2.1)
## [1] 27 192
qqPlot(regfit2.2)
## [1] 27 100
qqPlot(regfit2.3)
## [1] 27 100
qqPlot(regfit2.4)

## 27 157
## 27 156
par(mfrow = c(1, 1)) # restore the initial settings for mfrow
#jetzt schaut die Normalverteilung gut aus
residualPlots(regfit2.4)

## Test stat Pr(>|Test stat|)
## log1p(tenure) -0.0560 0.9554
## age -1.2634 0.2071
## log(assets) 0.6021 0.5474
## Tukey test 0.3434 0.7313
# linearität ist weitgehenst gegeben
# die Anpassung der vier Modelle zu vergleichen:
par(mfrow = c(2, 2))
plot(fitted.values(regfit2.1), rstandard(regfit2.1))
plot(fitted.values(regfit2.2), rstandard(regfit2.2))
plot(fitted.values(regfit2.3), rstandard(regfit2.3))
plot(fitted.values(regfit2.4), rstandard(regfit2.4))

par(mfrow = c(1, 1))
vif(regfit2.4) # Erkennen von Multikollinearität---- - Varianzinflationsfaktoren ################Multikollinearitätscheck
## log1p(tenure) age log(assets)
## 1.198365 1.208011 1.010450
#Multikolinearität wie ist die Vorhersagekraft des Modells durch einen einzelnen Prädiktor auf alle vorhergesagt werden
#in der Regressionsrechneung verwendet man 4-5 spezifische Untersuchungen die zur Abschätzung der Modellierung angewandt werden.
#Wie verändert sich der Effekt beim hinzufügen anderer Variablen
# -> Faustregel: vifs sollten 4 nicht überschreiten (-> Breite der Konfidenzintervalle)
# wird verdoppelt / die Genauigkeit der Schätzung wird halbiert)
sqrt(vif(regfit2.4)) # -> Multikollinearität ist hier kein Problem, die prozentualen Veränderungen sind gering
## log1p(tenure) age log(assets)
## 1.094699 1.099095 1.005212
# Übliche Methoden zur Behebung von Multikollinearität: Modellwiederholung, Variable
# Es gibt verschiedene Wege um mit Multikollinearität umzugehen, z.B. vorgelagerte PCA
# Auswahl, voreingenommene Schätzung, Einbeziehung zusätzlicher Vorabinformationen, vorgelagerte Analyse mit PCA
# Vorsicht! Keine dieser Maßnahmen sollte mechanisch durchgeführt werden, da sie möglicherweise nicht
# vertretbar. Eine schnelle Lösung gibt es nicht!
#---2.4 Interpretation:---
# Konfidenzintervalle für das Modell regfit2.4:
confint(regfit2.4)
## 2.5 % 97.5 %
## (Intercept) 4.215747669 5.25153754
## log1p(tenure) 0.088381151 0.20881873
## age -0.003953078 0.01188138
## log(assets) 0.199076642 0.27524121
cbind(Estimate = coef(regfit2.4), confint(regfit2.4))
## Estimate 2.5 % 97.5 %
## (Intercept) 4.73364261 4.215747669 5.25153754
## log1p(tenure) 0.14859994 0.088381151 0.20881873
## age 0.00396415 -0.003953078 0.01188138
## log(assets) 0.23715893 0.199076642 0.27524121
# Effect Plots erleichtern die Interpretation von Koeffizienten in komplexen Modellen (d. h. Modelle, die Folgendes enthalten
# transformierte Variablen, Interaktionen usw.):
#effect plots age ist nicht logarithmiert, es zeigt die geschätzte REgressionslinie von Age auf salary, es zeigt keinen wirklich starken effect, age war nicht signifikant
plot(effect("age", regfit2.4))# Wie wirkt sich das Alter nach dem oben beschriebenen Modell auf das log(Gehalt) aus?

# die übrigen Prädiktoren auf typische Werte (z. B. Mittelwerte) setzen?
eff.regfit2.4 <- allEffects(regfit2.4) # zeigt alle effekte der REgressionsrechnung an
eff.regfit2.4
## model: log(salary) ~ log1p(tenure) + age + log(assets)
##
## tenure effect
## tenure
## 0 20 30 40 60
## 7.375866 7.828282 7.886156 7.927703 7.986742
##
## age effect
## age
## 30 50 60 70 80
## 7.593986 7.673269 7.712911 7.752552 7.792194
##
## assets effect
## assets
## 700 200000 300000 500000 700000
## 6.833990 8.175122 8.271282 8.392429 8.472226
class(eff.regfit2.4) # object of type 'efflist'
## [1] "efflist"
class(eff.regfit2.4$age) # object of type 'eff'
## [1] "eff"
plot(allEffects(regfit2.4)) # x-axis is on the original scale in every plot,

#es zeigt eine Kurve an weil die Prädiktoren logarithmiert sind. tenure hat enenstarken effekt konfidenzintervall ist nicht so weit, stärkster effect bei assets
#wenn assets steigen, steigt salary stark an;;
# aber zwei der Prädiktoren wurden im Modell transformiert -> scheinbar nicht-lineare Beziehungen!
plot(effect("tenure", regfit2.4)) # Note - effect is not called tenure, but log1p(tenure)
## NOTE: tenure does not appear in the model

plot(effect("log1p(tenure)", regfit2.4))

plot(allEffects(regfit2.4)[1]) # the same

# uDie logarithmische Skala auf der x-Achse führt zu einer grafischen Darstellung der im Modell verwendeten linearen Beziehung
plot(effect("log(assets)", regfit2.4), transform.x = list(assets = list(trans = log, inverse = function(x) exp(x))),
ticks.x = list(assets = list(at = c(1e2, 1e3, 1e4, 1e5))))

#hier wird wieder zurücklogarithmiert für die Grafik, linearer Zusammenhang
#aber log und exp verursachen Probleme mit dem Plot für Tenure:
plot(effect("log1p(tenure)", regfit2.4), transform.x = list(tenure = list(trans = log, inverse = function(x) exp(x))),
ticks.x = list(tenure = list(at = c(10, 20, 30, 40, 50, 60))))

# Lösung: log1p anstelle von log und expm1 anstelle von exp(x) verwenden
plot(effect("log1p(tenure)", regfit2.4), transform.x = list(tenure = list(trans = log1p, inverse = function(x) expm1(x))),
ticks.x = list(tenure = list(at = c(10, 20, 30, 40, 50, 60))))

# all effects, same y limits
plot(allEffects(regfit2.4), transform.x = list(tenure = list(trans = log1p, inverse = function(x) expm1(x)),
assets = list(trans = log, inverse = function(x) exp(x))),
ylim = c(6.5, 9),
ticks.x = list(tenure = list(at = c(0, 10, 20, 30, 40, 60)), assets = list(at = c(1e2, 1e3, 1e4, 1e5))))

# die STeigung zeigt die Stärke des Effekts an
#---2.5 Prediction:---
predict(regfit2.4) # prediction for all observations in the data set
## 1 2 3 4 5 6 7 8
## 8.239068 7.871394 7.915165 7.972891 8.452412 7.943661 8.564511 7.850641
## 9 10 11 12 13 14 15 16
## 7.658088 7.742206 8.566611 7.770588 7.744820 7.705575 7.408011 8.125529
## 17 18 19 20 21 22 23 24
## 7.477561 8.434612 8.287656 7.594916 7.768171 7.811271 8.385632 7.512667
## 25 26 27 28 29 30 31 32
## 7.587097 7.373760 7.520433 7.525725 7.843131 7.399033 7.688896 7.827345
## 33 34 35 36 37 38 39 40
## 7.526742 7.549279 7.642985 7.554458 8.322039 7.810138 7.556566 7.432221
## 41 42 43 44 45 46 47 48
## 7.425861 7.316710 7.740658 7.628451 7.892725 7.532024 8.307004 8.083665
## 49 50 51 52 53 54 55 56
## 7.374324 7.126370 7.564849 7.884972 8.138529 7.392757 7.664425 7.588028
## 57 58 59 60 61 62 63 64
## 8.065699 7.401105 7.367759 7.598069 7.417328 8.047607 7.441371 7.600908
## 65 66 67 68 69 70 71 72
## 8.136913 7.557353 7.375952 8.348046 8.040059 7.525159 7.580606 7.477470
## 73 74 75 76 77 78 79 80
## 7.439437 7.412046 7.381494 7.649282 7.839062 7.585681 7.153812 7.376199
## 81 82 83 84 85 86 87 88
## 7.362312 7.408813 7.624837 7.369778 7.681059 7.172187 7.077835 7.109611
## 89 90 91 92 93 94 95 96
## 7.603022 6.842794 7.926618 7.572617 7.466052 7.724806 7.633587 7.737979
## 97 98 99 101 102 103 104 105
## 7.716766 7.362253 7.393001 7.667408 7.002067 7.277403 7.099295 7.717770
## 106 107 108 109 110 111 112 113
## 7.713393 7.460036 7.227967 7.506033 7.470968 7.625392 8.009696 7.339863
## 114 115 116 117 118 119 120 121
## 7.147152 8.119914 7.584925 7.375389 7.462492 7.377277 7.158513 7.404762
## 122 123 124 125 126 127 128 129
## 7.488136 7.462492 7.234089 7.963833 7.358634 7.437166 7.513418 7.302118
## 130 131 132 133 134 135 136 137
## 7.253721 7.304196 7.803433 7.692087 7.272140 7.690717 7.167197 7.302125
## 138 139 140 141 142 143 144 145
## 7.562712 7.470210 7.911772 7.109070 7.692574 7.201065 7.273892 8.137601
## 146 147 148 149 150 151 152 153
## 7.677565 7.484303 7.371536 7.037107 7.546033 7.226718 7.509584 7.166938
## 154 155 156 157 158 159 160 161
## 7.824511 7.302014 7.386841 7.151727 7.488681 7.286614 7.505371 7.719379
## 162 163 164 165 166 167 168 169
## 7.491362 6.977822 7.248367 7.331342 7.781415 7.043502 7.516930 6.845556
## 170 171 172 173 174 175 176 177
## 7.121546 7.182849 7.334245 7.324170 7.358155 7.389458 7.296786 6.990053
## 178 179 180 181 182 183 184 185
## 7.309083 7.556536 7.412942 7.292205 7.883642 7.236198 7.814120 8.114031
## 186 187 188 189 190 191 192 193
## 7.561205 7.328476 7.201811 8.050881 7.167953 7.284719 7.929682 7.980326
## 194 195 196 197 198 199 200 201
## 7.557947 7.182578 7.852215 7.403394 7.174774 7.229544 7.143303 7.168723
## 202 203 204 205 206 207 208 209
## 7.015776 7.062048 7.760359 7.658560 7.300132 8.017544 7.176640 7.525308
## 210 211 212 213 214 215 216 217
## 7.454980 7.469544 7.420358 7.236562 7.716157 7.868365 7.572249 7.314619
## 218 219 220 221 222 223 224 225
## 6.712702 7.228025 7.298597 7.051842 7.331689 6.934388 6.730781 7.567837
## 226 227 228 229 230 231 232 233
## 7.316990 7.272089 7.279092 7.255703 7.156636 7.094387 7.598281 7.315938
## 234 235 236 237 238 239 240 241
## 7.253819 7.173870 7.753901 7.720411 7.885395 7.682278 7.591253 7.267535
## 242 243 244 245 246 247 248 249
## 7.250748 7.305012 7.236270 7.381814 7.734301 7.642811 7.141550 7.675437
## 250 251 252 253 254 255 256 257
## 6.895731 7.850861 7.069005 7.333114 7.264327 7.245901 7.656981 7.525299
## 258 259 260 261 262 263 264 265
## 6.980997 7.729983 7.471852 7.043927 7.331932 7.336529 7.266556 7.143375
## 266 267 268 269 270 271 272 273
## 7.860962 7.143819 7.339614 7.318245 7.281275 7.039983 7.068146 7.561698
## 274 275 276 277 278 279 280 281
## 7.102904 7.553592 7.217998 7.375642 7.664377 7.123439 6.863714 6.895893
## 282 283 284 285 286 287 288 289
## 7.435198 7.730933 7.525595 7.428011 7.666426 7.563632 7.462686 7.612323
## 290 291 292 293 294 295 296 297
## 7.156261 7.062889 7.321024 7.117594 6.907713 7.410624 7.408148 7.165703
## 298 299 300 301 302 303 304 305
## 6.979370 7.426612 7.189744 7.338120 6.733712 7.065277 7.190917 7.149525
## 306 307 308 309 310 311 312 313
## 6.794055 7.509515 7.209560 7.620135 7.148963 7.129611 7.301932 6.786533
## 314 315 316 317 318 319 320 321
## 7.285719 7.389998 7.344067 6.879372 7.348492 7.166498 7.598641 7.329307
## 322 323 324 325 326 327 328 329
## 7.036507 7.396825 7.278637 7.009430 7.145603 7.258979 7.146036 7.097420
## 330 331 332 333 334 335 336 337
## 7.030880 7.426829 7.186451 7.828278 7.260174 7.093515 7.283360 7.446808
## 338 339 340 341 342 343 344 345
## 6.607673 7.061825 6.896061 6.620364 7.140483 7.175217 7.160072 7.125302
## 346 347 348 349 350 351 352 353
## 7.725400 7.453996 7.419908 7.242592 7.263169 7.530294 7.112906 7.135712
## 354 355 356 357 358 359 360 361
## 7.164497 7.078723 7.603765 7.657317 7.103129 7.178735 6.951316 7.510510
## 362 363 364 365 366 367 368 369
## 7.163889 7.419603 7.300447 7.296361 7.694986 6.988951 7.072079 7.297803
## 370 371 372 373 374 375 376 377
## 7.386860 6.924590 7.196563 6.972699 6.722807 7.192293 7.281539 7.435121
## 378 379 380 381 382 383 384 385
## 6.934721 7.429700 6.718275 7.371539 6.973920 7.507789 7.740742 7.235060
## 386 387 388 389 390 391 392 393
## 6.885521 7.737115 7.808918 7.418168 7.754334 7.152038 7.425065 7.255515
## 394 395 396 397 398 399 400 401
## 6.686934 6.954325 7.165889 7.393019 7.242633 7.178372 7.120853 7.003526
## 402 403 404 405 406 407 408 409
## 7.107373 7.081541 7.081883 7.249014 6.983906 6.971627 6.970274 6.977050
## 410 411 412 413 414 415 416 417
## 7.235711 7.173681 7.117257 7.823807 6.694830 7.202549 7.318970 6.971498
## 418 419 420 421 422 423 424 425
## 7.211300 6.831632 6.911005 8.043616 7.184507 6.935172 7.122111 7.560082
## 426 427 428 429 430 431 432 433
## 7.331249 7.602936 7.361365 6.777894 6.761430 6.813436 7.638508 6.750751
## 434 435 436 437 438 439 440 441
## 7.159163 7.765682 7.270522 7.011500 7.275226 7.381188 7.918719 6.821923
## 442 443 444 445 446 447
## 7.032031 7.810634 7.275977 7.178933 7.261196 7.132691
comp.salary <- data.frame(obs = log(dataceo$salary)[-100], est = predict(regfit2.4)) # compare observed and fitted/predicted values
head(comp.salary)
## obs est
## 1 8.016318 8.239068
## 2 8.707814 7.871394
## 3 8.180601 7.915165
## 4 8.101678 7.972891
## 5 9.210340 8.452412
## 6 9.145802 7.943661
head(resid(regfit2.4)) # difference between observed and predicted values
## 1 2 3 4 5 6
## -0.2227502 0.8364194 0.2654361 0.1287872 0.7579281 1.2021409
comp.salary2 <- data.frame(obs = dataceo$salary[-100], est = exp(predict(regfit2.4))) # comparison on the original scale
head(comp.salary2) # zeigt an ob man über oder unterschätzt
## obs est
## 1 3030 3786.010
## 2 6050 2621.217
## 3 3571 2738.498
## 4 3300 2901.232
## 5 10000 4686.364
## 6 9375 2817.657
head(predict(regfit2.4, interval = "confidence")) # predictions including confidence intervals
## fit lwr upr
## 1 8.239068 8.103023 8.375113
## 2 7.871394 7.707141 8.035648
## 3 7.915165 7.822757 8.007573
## 4 7.972891 7.872251 8.073530
## 5 8.452412 8.293110 8.611714
## 6 7.943661 7.846362 8.040960
#ceo kriegt in wirklichkeit 9,21 millionen sollte eigentlich 8,45 Millionen bekommen
newceo <- data.frame(tenure = 1, age = 60, assets = 500000) # suppose there is a new CEO with the given characteristics
# -> what is the predicted salary?
predict(regfit2.4, newdata = newceo)
## 1
## 8.186579
round(exp(predict(regfit2.4, newdata = newceo))) # 3.59 Millionen sollten dem neuen CEO bezahlt werden
## 1
## 3592
# Posterior predictive checks: Posterior predictive checks means âsimulating replicated data under the fitted model
# and then comparing these to the observed dataâ. Posterior predictive checks can be used to âlook
# for systematic discrepancies between real and simulated dataâ.
# direct usage of the function when using original (non-transformed) data: ####Multiple SImulationen auf Daten angewandt
#?ppcheck
#pp_check(regfit2.1)
# doesn't work after transformations took place:
#pp_check(regfit2.4)
# Transform data outside the model formula, then build and check it:
dat.trans <- regfit2.4$model
names(dat.trans) <- c("salary", "tenure", "age", "assets")
regfit.trans <- lm(salary ~ tenure + age + assets, dat.trans)
#pp_check(regfit.trans)
#---2.6 Checking model fit:---
# Posterior predictive checks: Posterior predictive checks means â???osimulating replicated data under the fitted model
# and then comparing these to the observed dataâ???. Posterior predictive checks can be used to â???olook
# for systematic discrepancies between real and simulated dataâ???.
# Model using the original (non-transformed) data:
check_posterior_predictions(regfit2.1)
## Warning: Maximum value of original data is not included in the replicated data.
## Model may not capture the variation of the data.

check_posterior_predictions(regfit2.1) #yrep = Y=immer und immer wieder geschätztes Modell Y = der Wirklichkeit # kein gute Modell, negative Gehälter anzugeben macht keinen Sinn
## Warning: Maximum value of original data is not included in the replicated data.
## Model may not capture the variation of the data.

# after model refinements:
check_posterior_predictions(regfit2.2) # response transformation # über und unterschätzung von Werten in Modell 2
## Warning: Minimum value of original data is not included in the replicated data.
## Model may not capture the variation of the data.

check_posterior_predictions(regfit2.3) # Log TRansformation der Prädiktoren die Kurve hinten ist besser geschätzt, trotzdem gibt es wieder über und unterschätzung
## Warning: Minimum value of original data is not included in the replicated data.
## Model may not capture the variation of the data.

check_posterior_predictions(regfit2.4) # outlier #outlier wird entfernt darum gibt es keine Warnmeldung mehr

#R² kann nicht unbedingt weiterhelfen