# erzeuge Datenframe
df <- data.frame(x = c( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ),
y = c( 2, 5, 8, 11, 14, 17, 20, 23, 26, 29))47 Lösungen Lineare Regression
Hier finden Sie die Lösungen zu den Übungsaufgaben von Abschnitt 44.3.
Die hier vorgestellten Lösungen stellen immer nur eine mögliche Vorgehensweisen dar und sind sicherlich nicht der Weisheit letzter Schluss. In R führen viele Wege nach Rom, und wenn Sie mit anderem Code zu den richtigen Ergebnissen kommen, dann ist das völlig in Ordnung.
47.1 Lösung zur Aufgabe 44.3.1
x und y.
x und y. Bestimmen Sie anhand des Plots, welche Regressionsfunktion die Daten am besten erklären würde.
# plot()
plot(df$x, df$y)
# ggplot()
ggplot(df, aes(x=x, y=y)) +
geom_point()
Es ist ein deutlicher linearer Zusammenhang erkennbar.
# lineares Modell
fit <- lm(y ~ x, data=df)
# anschauen
summary(fit)Warning in summary.lm(fit): im Wesentlichen ein perfekter Fit: summary kann
unzuverlässig sein
Call:
lm(formula = y ~ x, data = df)
Residuals:
Min 1Q Median 3Q Max
-3.675e-15 -8.783e-16 5.168e-16 9.646e-16 1.944e-15
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.000e+00 1.049e-15 1.906e+15 <2e-16 ***
x 3.000e+00 1.965e-16 1.527e+16 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.785e-15 on 8 degrees of freedom
Multiple R-squared: 1, Adjusted R-squared: 1
F-statistic: 2.33e+32 on 1 and 8 DF, p-value: < 2.2e-16
y erklärt durch x dem Plot hinzu.
# plot()
plot(df$x, df$y)
# Regressionsgerade
abline(lm(y~x, data=df), col="skyblue2")
# ggplot()
ggplot(df, aes(x=x, y=y)) +
geom_point() +
geom_smooth(method="lm", color="skyblue2") `geom_smooth()` using formula = 'y ~ x'

x erklärt durch y ebenfalls dem Plot hinzu, aber in roter Farbe.
# plot()
plot(df$x, df$y)
# Regressionsgeraden
abline(lm(y~x, data=df), col="skyblue2")
abline(lm(x~y, data=df), col="red")
# ggplot()
ggplot(df, aes(x=x, y=y)) +
geom_point() +
geom_smooth(method="lm", color="skyblue2") +
geom_smooth(aes(x=y, y=x), method="lm", color="red") `geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

Achten Sie darauf, die Variablen nicht zu vertauschen!
fit <- lm(y ~ x, data=df)
# Residuen
fit$residuals 1 2 3 4 5
-3.675227e-15 4.362024e-16 1.944285e-15 1.385502e-15 1.048764e-15
6 7 8 9 10
7.120252e-16 5.973314e-16 -1.293719e-15 3.679437e-16 -1.523107e-15
Die Residuen sind sehr klein. Die Regressionsgerade scheint sehr gut zu passen.
47.2 Lösung zur Aufgabe 44.3.2
Lernen und Durchgefallen.
# erzeuge Datenframe
df <- data.frame(Lernen = c( 3.5, 0.6, 2.8, 2.5, 2.6, 3.9, 1.5, 0.7, 3.6, 3.7,
2.2, 3.3, 1.7, 1.1, 2.0, 3.5, 2.1, 1.8, 1.1, 0.7,
1.3, 3.1, 2.3, 3.2, 0.9, 1.7, 0.2, 2.9, 1.0, 2.3),
Durchgefallen = c( 1, 5, 1, 3, 1, 0, 3, 3, 1, 1,
2, 0, 3, 3, 3, 0, 2, 2, 4, 4,
4, 0, 2, 2, 4, 2, 5, 1, 3, 2))Lernen und Durchgefallen.
# entweder
table(df$Lernen, df$Durchgefallen)
0 1 2 3 4 5
0.2 0 0 0 0 0 1
0.6 0 0 0 0 0 1
0.7 0 0 0 1 1 0
0.9 0 0 0 0 1 0
1 0 0 0 1 0 0
1.1 0 0 0 1 1 0
1.3 0 0 0 0 1 0
1.5 0 0 0 1 0 0
1.7 0 0 1 1 0 0
1.8 0 0 1 0 0 0
2 0 0 0 1 0 0
2.1 0 0 1 0 0 0
2.2 0 0 1 0 0 0
2.3 0 0 2 0 0 0
2.5 0 0 0 1 0 0
2.6 0 1 0 0 0 0
2.8 0 1 0 0 0 0
2.9 0 1 0 0 0 0
3.1 1 0 0 0 0 0
3.2 0 0 1 0 0 0
3.3 1 0 0 0 0 0
3.5 1 1 0 0 0 0
3.6 0 1 0 0 0 0
3.7 0 1 0 0 0 0
3.9 1 0 0 0 0 0
# oder
xtabs(~ Lernen + Durchgefallen, data=df) Durchgefallen
Lernen 0 1 2 3 4 5
0.2 0 0 0 0 0 1
0.6 0 0 0 0 0 1
0.7 0 0 0 1 1 0
0.9 0 0 0 0 1 0
1 0 0 0 1 0 0
1.1 0 0 0 1 1 0
1.3 0 0 0 0 1 0
1.5 0 0 0 1 0 0
1.7 0 0 1 1 0 0
1.8 0 0 1 0 0 0
2 0 0 0 1 0 0
2.1 0 0 1 0 0 0
2.2 0 0 1 0 0 0
2.3 0 0 2 0 0 0
2.5 0 0 0 1 0 0
2.6 0 1 0 0 0 0
2.8 0 1 0 0 0 0
2.9 0 1 0 0 0 0
3.1 1 0 0 0 0 0
3.2 0 0 1 0 0 0
3.3 1 0 0 0 0 0
3.5 1 1 0 0 0 0
3.6 0 1 0 0 0 0
3.7 0 1 0 0 0 0
3.9 1 0 0 0 0 0
Durchgefallen erklärt durch Lernen durch und plotten Sie Ihr Ergebnis.
# lineare Regression
fit <- lm(Durchgefallen ~ Lernen , data=df)
summary(fit)
Call:
lm(formula = Durchgefallen ~ Lernen, data = df)
Residuals:
Min 1Q Median 3Q Max
-1.03614 -0.53214 -0.02013 0.49187 1.22587
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.8491 0.2622 18.49 < 2e-16 ***
Lernen -1.2300 0.1106 -11.12 8.7e-12 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6359 on 28 degrees of freedom
Multiple R-squared: 0.8155, Adjusted R-squared: 0.8089
F-statistic: 123.8 on 1 and 28 DF, p-value: 8.7e-12
# plot()
plot(df$Lernen, df$Durchgefallen)
# Regressionsgerade
abline(lm(Durchgefallen ~ Lernen, data=df), col="skyblue2")
# ggplot()
ggplot(df, aes(x=Lernen, y=Durchgefallen)) +
geom_point() +
geom_smooth(method="lm", color="skyblue2") `geom_smooth()` using formula = 'y ~ x'

# Koeffizienten anzeigen
fit$coefficients(Intercept) Lernen
4.849127 -1.229997
Der Regressionskoeffizient für Lernen beträgt -1.2299972. Das bedeutet, dass mit ungefähr jeder Stunde Lernen ein Kurs weniger nicht bestanden wird.
# aktuelles Modell
# Residuen anschauen
fit$residuals 1 2 3 4 5 6
0.455862792 0.888870974 -0.405135233 1.225865613 -0.651134669 -0.052138337
7 8 9 10 11 12
-0.004131565 -0.988129308 0.578862510 0.701862227 -0.143133540 -0.790136644
13 14 15 16 17 18
0.241867871 -0.496130437 0.610867024 -0.544137208 -0.266133258 -0.635132412
19 20 21 22 23 24
0.503869563 0.011870692 0.749868999 -1.036136080 -0.020133822 1.086863638
25 26 27 28 29 30
0.257870128 -0.758132129 0.396872103 -0.282135515 -0.619130154 -0.020133822
# Modell aus anderer Aufgabe
df2 <- data.frame(x = c( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ),
y = c( 2, 5, 8, 11, 14, 17, 20, 23, 26, 29))
fit2 <- lm(y~x, data=df2)
fit2$residuals 1 2 3 4 5
-3.675227e-15 4.362024e-16 1.944285e-15 1.385502e-15 1.048764e-15
6 7 8 9 10
7.120252e-16 5.973314e-16 -1.293719e-15 3.679437e-16 -1.523107e-15
Im aktuellen Modell sind die Residuen größer als im vorherigen Modell. Somit ist das vorherige Modell besser.
# aktuelles Modell
lernen <- summary(fit)
# R^2 anschauen
lernen$r.squared[1] 0.8154995
# Korrelationskoeffizient
cor.test(df$Lernen, df$Durchgefallen)
Pearson's product-moment correlation
data: df$Lernen and df$Durchgefallen
t = -11.125, df = 28, p-value = 8.7e-12
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.9532031 -0.8045264
sample estimates:
cor
-0.9030501
Das Bestimmtheitsmaß \(R^{2}\) beträgt 0.8154995. Somit können 81.55% des Rauschens im aktuellen Modell erklärt werden.
Der Korrelationskoeffizient von -0.9030501 ist nahe an -1. Dies spricht für einen starken negativen Zusammenhang.
# aktuelles Modell
predict(fit, list(Lernen=3)) 1
1.159136
Wenn der Student 3 Stunden lernt, wird er wahrscheinlich “nur” durch 1 Kurs durchfallen.
# neues Modell
fit <- lm(Lernen ~ Durchgefallen, data = df)
# Wieviel lernen für Durchgefallen=0?
predict(fit, list(Durchgefallen=0)) 1
3.607387
Wenn der Student 3 Stunden lernt, wird er wahrscheinlich “nur” durch 1 Kurs durchfallen.
47.3 Lösung zur Aufgabe 44.3.3
Minuten und Alkohol.
# erzeuge Datenframe
df <- data.frame(Alkohol = c(1.6, 1.7, 1.5, 1.1, 0.7, 0.2, 2.1),
Minuten = c(30, 60, 90, 120, 150, 180, 210))# Korrelation
cor(df$Minuten, df$Alkohol)[1] -0.2730367
Der Korrelationskoeffizient ist eher gering. Das spricht für keinen starken Zusammenhang.
Alkohol erklärt durch Minuten. Gibt es Punkte mit großen Residuen? Wenn ja, entfernen Sie diese und führen die Berechnungen erneut durch. Hat sich der Korrelationskoeffizient verbessert?
# plot()
plot(df$Minuten, df$Alkohol)
abline(lm(Alkohol ~ Minuten, data=df))
# ggplot()
ggplot(df, aes(x=Minuten, y=Alkohol)) +
geom_point()+
geom_smooth(method="lm", color="skyblue2") `geom_smooth()` using formula = 'y ~ x'

Der letzte Wert ist ein deutlicher Ausreißer, wahrscheinlich ein Tippfehler bei der Dateneingabe.
# entferne letzten Wert
df <- df[-7,]
# Korrelation
cor(df$Minuten, df$Alkohol)[1] -0.944155
Der Korrelationskoeffizient ist nun sehr nah an -1. Das spricht für einen starken Zusammenhang.
# Modell
# plot()
plot(df$Minuten, df$Alkohol)
abline(lm(Alkohol ~ Minuten, data=df))
# ggplot()
ggplot(df, aes(x=Minuten, y=Alkohol)) +
geom_point()+
geom_smooth(method="lm", color="skyblue2") `geom_smooth()` using formula = 'y ~ x'

# Koeffizienten
fit <- lm(Alkohol ~ Minuten, data=df)
fit$coefficient (Intercept) Minuten
2.173333333 -0.009904762
Der Alkoholspiegel sinkt pro Minute um -0.0099048 g/l.
# Koeffizienten
fit <- lm(Minuten ~ Alkohol, data=df)
predict(fit, list(Alkohol=0.3)) 1
180
Der Alkoholspiegel wird nach 180 Minuten auf \(0,3\) g/l fallen.
47.4 Lösung zur Aufgabe 44.3.4
age.height in Ihre R-Session.
# lade Datensatz
load(url("https://www.produnis.de/R/data/age.height.RData"))Größe erklärt durch Alter. Ist das lineare Modell geeignet, den Zusammenhang zwischen Alter und Körpergröße zu erklären?
# Regression
fit <- lm(height ~ age, data=age.height)
summary(fit)
Call:
lm(formula = height ~ age, data = age.height)
Residuals:
Min 1Q Median 3Q Max
-0.9137 -0.1018 0.0449 0.1644 0.4202
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.413724 0.091080 15.522 2.77e-15 ***
age 0.004612 0.002036 2.265 0.0314 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2852 on 28 degrees of freedom
Multiple R-squared: 0.1549, Adjusted R-squared: 0.1247
F-statistic: 5.131 on 1 and 28 DF, p-value: 0.03142
R2 ist eher gering, es können nur 15.49% des Rauschens mit dem Modell erklärt werden.
# plot()
plot(age.height$age, age.height$height)
abline(fit)
# ggplot()
ggplot(age.height, aes(x=age, y=height)) +
geom_point()+
geom_smooth(method="lm", color="skyblue2") `geom_smooth()` using formula = 'y ~ x'

Ab etwa 20 Jahren ändert sich die Punktetendenz.
Alter in einen ordinalen Faktor mit den Ausprägungen “jünger als 20” und “20 und älter” einteilt.
# klassieren
age.height$ageK <- cut(age.height$age,
breaks = c(0,20, Inf),
right=FALSE,
labels = c("jünger als 20",
"20 und älter"))
# anschauen
head(age.height) age height ageK
1 18 1.72 jünger als 20
2 21 1.90 20 und älter
3 45 1.67 20 und älter
4 59 1.78 20 und älter
5 21 1.86 20 und älter
6 22 1.78 20 und älter
Alter und Körpergröße am besten erklärt?
# Gruppen
df1 <- subset(age.height, ageK=="jünger als 20")
# Regression
fit1 <- lm(height ~ age, data=df1)
summary(fit1)
Call:
lm(formula = height ~ age, data = df1)
Residuals:
Min 1Q Median 3Q Max
-0.22746 -0.05601 -0.03485 0.08416 0.28351
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.727459 0.094487 7.699 5.75e-05 ***
age 0.057671 0.007738 7.453 7.25e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.1525 on 8 degrees of freedom
Multiple R-squared: 0.8741, Adjusted R-squared: 0.8584
F-statistic: 55.54 on 1 and 8 DF, p-value: 7.245e-05
Das Bestimmtheitsmaß in der Gruppe “jünger als 20” liegt bei 0.8741033, d.h. es werden 87.41% des Rauschens erklärt.
# Gruppen
df2 <- subset(age.height, ageK=="20 und älter")
# Regression
fit2 <- lm(height ~ age, data=df2)
summary(fit2)
Call:
lm(formula = height ~ age, data = df2)
Residuals:
Min 1Q Median 3Q Max
-0.25783 -0.04614 -0.01064 0.07793 0.14155
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.876084 0.056839 33.007 < 2e-16 ***
age -0.003375 0.001051 -3.213 0.00483 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.09931 on 18 degrees of freedom
Multiple R-squared: 0.3644, Adjusted R-squared: 0.3291
F-statistic: 10.32 on 1 and 18 DF, p-value: 0.004827
Das Bestimmtheitsmaß in der Gruppe “20 und älter” liegt bei 0.3644171, d.h. es werden 36.44% des Rauschens erklärt.
# < 20 Jahre
plot(df1$age, df1$height)
abline(fit1)
# >= 20 Jahre
plot(df2$age, df2$height)
abline(fit2)
## ggplot()
# < 20 Jahre
ggplot(df1, aes(x=age, y=height)) +
geom_point() +
geom_smooth(method="lm")`geom_smooth()` using formula = 'y ~ x'

# >= 20 Jahre
ggplot(df2, aes(x=age, y=height)) +
geom_point() +
geom_smooth(method="lm")`geom_smooth()` using formula = 'y ~ x'

# 14 jährige Person
predict(fit1, list(age=14)) 1
1.534847
# 38 jährige Person
predict(fit2, list(age=38)) 1
1.747827
47.5 Lösung zur Aufgabe 44.3.5
df <- data.frame(Jahr=c(1:5),
Wirksamkeit=c(96, 84, 70, 58, 52)
)Wirksamkeit erklärt durch Jahr durch und plotten Sie Ihr Ergebnis.
# Regression
fit <- lm(Wirksamkeit~Jahr, data=df)
summary(fit)
Call:
lm(formula = Wirksamkeit ~ Jahr, data = df)
Residuals:
1 2 3 4 5
1.2 0.6 -2.0 -2.6 2.8
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 106.2000 2.7350 38.83 3.76e-05 ***
Jahr -11.4000 0.8246 -13.82 0.000819 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.608 on 3 degrees of freedom
Multiple R-squared: 0.9845, Adjusted R-squared: 0.9794
F-statistic: 191.1 on 1 and 3 DF, p-value: 0.0008192
# plot()
plot(df$Jahr, df$Wirksamkeit)
abline(fit)
# ggplot()
ggplot(df, aes(x=Jahr, y=Wirksamkeit)) +
geom_point() +
geom_smooth(method="lm")`geom_smooth()` using formula = 'y ~ x'

# Regression
fit$coefficients(Intercept) Jahr
106.2 -11.4
Der Wirksamkeitsverlust beträgt 11.4% pro Jahr.
# anderes Modell
fit2 <- lm(Jahr ~ Wirksamkeit, data=df)
# 80% und 0%
predict(fit2, list(Wirksamkeit=c(80,0))) 1 2
2.309091 9.218182
Nach 2.31 Jahren ist die Wirksamkeit bei 80%, nach 9.22 Jahren bei 0%.
47.6 Lösung zur Aufgabe 44.3.6
df <- data.frame(Dosis=c(2,2, 2,2,2,2,
3,3, 3,3,3,3,
3, 4,4,4,4,4, 4,4),
Tage =c(5,5, 6,6,6,6,
3,3, 5,5,5,5,
6, 3,3,3,3,3, 5,5))# Regression
fit <- lm(Tage~Dosis, data=df)
summary(fit)
Call:
lm(formula = Tage ~ Dosis, data = df)
Residuals:
Min 1Q Median 3Q Max
-1.6023 -0.5560 0.3513 0.3977 1.4440
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.7413 0.7941 9.749 1.32e-08 ***
Dosis -1.0463 0.2517 -4.156 0.000593 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.9059 on 18 degrees of freedom
Multiple R-squared: 0.4897, Adjusted R-squared: 0.4614
F-statistic: 17.28 on 1 and 18 DF, p-value: 0.000593
# Regression
fit$coefficients(Intercept) Dosis
7.741313 -1.046332
Mit jeder Dosiserhöhung um 1 verkürzt sich die Heilungsdauer um ca. 1 Tag.
# Regression
cor(df$Dosis, df$Tage)[1] -0.69981
Der Korrelationskoeffizient ist größer als 0,5. Es liegt ein mittelstarker Zusammenhang vor.
# Vorhersage
predict(fit, list(Dosis=5)) 1
2.509653
# neues Modell
fit2 <- lm(Dosis~Tage, data=df)
# Vorhersage
predict(fit2, list(Tage=4)) 1
3.307427
47.7 Lösung zur Aufgabe 44.3.7
heigths.weights.students in Ihre R-Session.
# lade Datensatz
load(url("https://www.produnis.de/R/data/heights.weights.students.RData"))Gewicht erklärt durch Größe durch und plotten Sie Ihr Modell.
# Regression
fit <- lm(weight ~ height, data=heights.weights.students)
summary(fit)
Call:
lm(formula = weight ~ height, data = heights.weights.students)
Residuals:
Min 1Q Median 3Q Max
-16.6372 -4.8272 0.9568 4.8008 16.6542
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -91.15252 13.28198 -6.863 6.16e-10 ***
height 0.96724 0.08009 12.077 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 7.356 on 98 degrees of freedom
Multiple R-squared: 0.5981, Adjusted R-squared: 0.594
F-statistic: 145.9 on 1 and 98 DF, p-value: < 2.2e-16
# plot()
plot(heights.weights.students$height, heights.weights.students$weight)
abline(fit)
# ggplot()
ggplot(heights.weights.students, aes(x=height, y=weight)) +
geom_point() +
geom_smooth(method="lm")`geom_smooth()` using formula = 'y ~ x'

m <- subset(heights.weights.students, sex=="male")
w <- subset(heights.weights.students, sex=="female")
fit1 <- lm(weight ~ height, data=m)
fit2 <- lm(weight ~ height, data=w)
## plot()
# männlich
plot(m$height, m$weight)
abline(fit1, col="royalblue")
# weiblich
plot(w$height, w$weight)
abline(fit2, col="pink")
## ggplot()
# männlich
ggplot(m, aes(x=height, y=weight)) +
geom_point() +
geom_smooth(method="lm", color="royalblue")`geom_smooth()` using formula = 'y ~ x'

# weiblich
ggplot(w, aes(x=height, y=weight)) +
geom_point() +
geom_smooth(method="lm", color="pink")`geom_smooth()` using formula = 'y ~ x'

# Männer
summary(fit1)$r.squared[1] 0.6699418
# Frauen
summary(fit2)$r.squared[1] 0.3828876
Das Modell der Männer erklärt 0.67% der Streuung, und das der Frauen “nur” 0.38%. Somit ist das Modell für Männer besser als das der Frauen.
# Männer
predict(fit1, list(height=170)) 1
75.048
# Frauen
predict(fit2, list(height=170)) 1
71.8338
47.8 Lösung zur Aufgabe 44.3.8
# lade Datensatz
load(url("https://www.produnis.de/R/data/neonates.RData"))# entweder
table(neonates$smoke, neonates$apgar1)
2 3 4 5 6 7 8 9
No 1 6 18 50 77 40 23 5
Yes 3 15 20 31 20 6 5 0
# oder
xtabs(~ smoke + apgar1, data=neonates) apgar1
smoke 2 3 4 5 6 7 8 9
No 1 6 18 50 77 40 23 5
Yes 3 15 20 31 20 6 5 0
Kinder von Frauen, die nicht während der Schangerschaft rauchen, haben höhere APGAR1-Werte als Kinder von Raucherinnen.
# entweder
table(neonates$age, neonates$apgar1)
2 3 4 5 6 7 8 9
greater than 20 2 10 22 53 69 34 24 4
less than 20 2 11 16 28 28 12 4 1
# oder
xtabs(~ age + apgar1, data=neonates) apgar1
age 2 3 4 5 6 7 8 9
greater than 20 2 10 22 53 69 34 24 4
less than 20 2 11 16 28 28 12 4 1
Kinder von Frauen, die älter als 20 Jahre sind, haben höhere APGAR1-Werte als Kinder von jüngeren Müttern.
Geburtsgewicht erklärt durch Anzahl täglich gerauchter Zigaretten durch. Gibt es einen starken linearen Zusammenhang?
# Regression
fit <- lm(weight ~ cigarettes, data=neonates)
summary(fit)
Call:
lm(formula = weight ~ cigarettes, data = neonates)
Residuals:
Min 1Q Median 3Q Max
-0.98756 -0.16656 -0.00649 0.18769 1.03544
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.146557 0.018604 169.13 <2e-16 ***
cigarettes -0.031067 0.002512 -12.37 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2832 on 318 degrees of freedom
Multiple R-squared: 0.3248, Adjusted R-squared: 0.3227
F-statistic: 153 on 1 and 318 DF, p-value: < 2.2e-16
Der Zusammenhang ist eher gering.
# plot()
plot(neonates$cigarettes, neonates$weight)
abline(fit)
# ggplot()
ggplot(neonates, aes(x=cigarettes, y=weight)) +
geom_point() +
geom_smooth(method="lm", color="pink")`geom_smooth()` using formula = 'y ~ x'

Der Zusammenhang wird durch die Nichtraucherinnen (0 Zigaretten) verzerrt.
# Subset erzeugen
smoke <- subset(neonates, smoke=="Yes")
# Regression
fit2 <- lm(weight ~ cigarettes, data=smoke)
summary(fit2)
Call:
lm(formula = weight ~ cigarettes, data = smoke)
Residuals:
Min 1Q Median 3Q Max
-0.168338 -0.057531 0.002855 0.068180 0.168662
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.687879 0.025542 144.38 <2e-16 ***
cigarettes -0.069462 0.001928 -36.03 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.08735 on 98 degrees of freedom
Multiple R-squared: 0.9298, Adjusted R-squared: 0.9291
F-statistic: 1298 on 1 and 98 DF, p-value: < 2.2e-16
# plot()
plot(smoke$cigarettes, smoke$weight)
abline(fit2)
# ggplot()
ggplot(smoke, aes(x=cigarettes, y=weight)) +
geom_point() +
geom_smooth(method="lm", color="pink")`geom_smooth()` using formula = 'y ~ x'

Der Zusammenhang ist nun sehr stark.
# Vorhersage
predict(fit2, list(cigarettes=c(5, 30))) 1 2
3.340570 1.604026
# Subset
s1 <- subset(smoke, age=="greater than 20")
s2 <- subset(smoke, age=="less than 20")
# neue Modelle
fit1 <- lm(weight ~ cigarettes, data=s1)
fit1 <- lm(weight ~ cigarettes, data=s2)
# vergleichen
summary(fit1)
Call:
lm(formula = weight ~ cigarettes, data = s2)
Residuals:
Min 1Q Median 3Q Max
-0.151567 -0.049334 -0.001749 0.062936 0.127103
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.65752 0.05636 64.90 < 2e-16 ***
cigarettes -0.06833 0.00375 -18.22 6.33e-14 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.08286 on 20 degrees of freedom
Multiple R-squared: 0.9432, Adjusted R-squared: 0.9404
F-statistic: 332.1 on 1 and 20 DF, p-value: 6.333e-14
summary(fit2)
Call:
lm(formula = weight ~ cigarettes, data = smoke)
Residuals:
Min 1Q Median 3Q Max
-0.168338 -0.057531 0.002855 0.068180 0.168662
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.687879 0.025542 144.38 <2e-16 ***
cigarettes -0.069462 0.001928 -36.03 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.08735 on 98 degrees of freedom
Multiple R-squared: 0.9298, Adjusted R-squared: 0.9291
F-statistic: 1298 on 1 and 98 DF, p-value: < 2.2e-16
Der Zusammenhang bleibt unabhängig von der Altersgruppe bestehen.