# Daten erzeugen
<- data.frame(Stunden=c(1:9),
df Bakterien=c(25, 28, 47, 65, 86, 121, 190, 290, 362))
48 Lösungen Nicht-Lineare Regression
Hier finden Sie die Lösungen zu den Übungsaufgaben von Abschnitt 44.4.
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.
48.1 Lösung zur Aufgabe 44.4.1
Stunden
und Bakterien
.
# plot()
plot(df$Stunden, df$Bakterien)
# ggplot()
ggplot(df, aes(x=Stunden, y=Bakterien)) +
geom_point()
Die Punktwolken sprechen für einen exponentiellen Anstieg.
# quadratisch
<- lm(Bakterien ~ Stunden + I(Stunden^2), data=df)
q summary(q)
Call:
lm(formula = Bakterien ~ Stunden + I(Stunden^2), data = df)
Residuals:
Min 1Q Median 3Q Max
-16.617 -8.297 -1.430 9.916 15.442
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 53.2381 15.9862 3.330 0.0158 *
Stunden -26.7420 7.3403 -3.643 0.0108 *
I(Stunden^2) 6.8009 0.7159 9.500 7.75e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 12.56 on 6 degrees of freedom
Multiple R-squared: 0.9919, Adjusted R-squared: 0.9892
F-statistic: 368.8 on 2 and 6 DF, p-value: 5.254e-07
# exponentiell
<- lm(log(Bakterien) ~ Stunden, data=df)
e summary(e)
Call:
lm(formula = log(Bakterien) ~ Stunden, data = df)
Residuals:
Min 1Q Median 3Q Max
-0.12676 -0.06057 0.01145 0.03920 0.11190
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.75498 0.06174 44.62 7.41e-10 ***
Stunden 0.35199 0.01097 32.08 7.39e-09 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.08498 on 7 degrees of freedom
Multiple R-squared: 0.9932, Adjusted R-squared: 0.9923
F-statistic: 1029 on 1 and 7 DF, p-value: 7.389e-09
# Vorbereitung quadratisch
<- predict(q, list(Stunden=df$Stunden))
vorhersageQ # plot() quadratisch
plot(df$Stunden, df$Bakterien,
main="quadratischer Zusammenhang")
lines(df$Stunden, vorhersageQ, col="tan4")
# ggplot() quadratisch
ggplot(df, aes(x=Stunden, y=Bakterien)) +
geom_point() +
geom_line(aes(y=vorhersageQ), col="tan4")
# Vorbereitung exponentiell
<- exp(predict(e, list(Stunden=df$Stunden)))
vorhersageE
# plot() exponentiell
plot(df$Stunden, df$Bakterien,
main="exponentieller Zusammenhang")
lines(df$Stunden, vorhersageE, col="wheat")
# ggplot() exponentiell
ggplot(df, aes(x=Stunden, y=Bakterien)) +
geom_point() +
geom_line(aes(y=vorhersageE), col="wheat")
# Vorhersage
exp(predict(e, list(Stunden=c(3, 10))))
1 2
45.19322 531.05241
Nach 3 Stunden können wir 46 Bakterien erwarten, nach 10 Stunden 532.
# neues Modell
$BakterienLog <- log(df$Bakterien)
df<- lm(BakterienLog ~ Stunden, data=df)
fit <- exp(fit$coefficients[1])
a <- fit$coefficients[2]
b # Vorhersage für 100 Bakterien
log(100) - log(a)) / b (
(Intercept)
5.256395
Nach ca 5.3 Stunden sind 100 Bakterien zu erwarten.
48.2 Lösung zur Aufgabe 44.4.2
diet
in Ihre R-Session.
# lade Datensatz
load(url("https://www.produnis.de/R/data/diet.RData"))
# plot()
plot(diet$days, diet$weight.loss)
# ggplot()
ggplot(diet, aes(x=days, y=weight.loss)) +
geom_point()
# Vergleiche Bestimmheitsmaße verschiedener Modelle
# quadratisches Modell
<- lm(weight.loss ~ days + I(days^2), data=diet)
q
# exponentielles Modell
<- lm (log(weight.loss) ~ days, data=diet)
e
# logarithmisches Modell
<- lm(weight.loss ~ log(days), data=diet)
l
# sigmoidales Modell
<- lm(log(weight.loss) ~ I(1/days), data=diet)
s
<- data.frame(Modell = c("quadratisch", "exponentiell",
result "logarithmisch", "sigmoidal"),
R.square = c(summary(q)$r.square,
summary(e)$r.square,
summary(l)$r.square,
summary(s)$r.square))
# Anzeigen
order(result$R.square, decreasing = TRUE),] result[
Modell R.square
4 sigmoidal 0.6662170
1 quadratisch 0.5397848
3 logarithmisch 0.5254856
2 exponentiell 0.4308936
## oder mit der compare.lm()-Funktion
::compare.lm(diet$weight.loss, diet$days) jgsbook
Modell R.square
6 sigmoidal 0.6662170
7 potenz 0.5684490
3 kubisch 0.5584355
2 quadratisch 0.5397848
5 logarithmisch 0.5254856
1 linear 0.4356390
4 exponentiell 0.4308936
Das sigmoidale Modell kann die Daten am besten erklären, da in diesem Modell das Bestimmtheitsmaß am größten ist.
# sigmoidales Modell
<- lm(log(weight.loss) ~ I(1/days), data=diet)
s
# vorhersage vorbereiten
<- seq(min(diet$days), max(diet$days))
tage # alle "tage" vorhersagen
<- predict(s, list(days=tage))
vorhersage -1]=exp(vorhersage[-1])
vorhersage[
# plot()
plot(diet$days, diet$weight.loss)
lines(tage, vorhersage, col="purple")
# ggplot()
# in Datenframe für ggplot speichern
<- data.frame(tage, vorhersage)
helper
ggplot(diet, aes(x=days, y=weight.loss)) +
geom_point(color="#FF9999", size=3) +
# Legend
scale_linetype("Regression model") +
# Sigmoidal model
geom_line(data=helper, aes(x=tage, y=vorhersage, linetype="Sigmoidal"))
Auch die Vorhersagewerte für die Idealkurve können mittels compare.lm()
und dem Parameter predict=TRUE
erzeugt werden.
<- jgsbook::compare.lm(diet$weight.loss, diet$days,
help predict=TRUE)
# anschauen
head(help)
pred.x line quad cube expo loga sigm power
1 14.00 7.645786 4.766305 3.526750 6.714088 5.166988 1.262199 4.966500
2 14.01 7.647113 4.770032 3.532726 6.715040 5.171506 3.537806 4.969006
3 14.02 7.648440 4.773757 3.538700 6.715992 5.176020 3.542430 4.971512
4 14.03 7.649767 4.777483 3.544671 6.716944 5.180531 3.547052 4.974018
5 14.04 7.651094 4.781207 3.550641 6.717896 5.185040 3.551675 4.976523
6 14.05 7.652422 4.784931 3.556608 6.718848 5.189544 3.556296 4.979027
logistic
1 4.261378
2 4.264669
3 4.267962
4 4.271256
5 4.274552
6 4.277850
# plot()
plot(diet$days, diet$weight.loss)
lines(help$pred.x, help$sigm, col="purple")
# ggplot()
ggplot(diet, aes(x=days, y=weight.loss)) +
geom_point(color="#FF9999", size=3) +
# Legend
scale_linetype("Regression model") +
# Sigmoidal model
geom_line(data=help, aes(x=pred.x, y=sigm, linetype="Sigmoidal"))
# Subset bilden
<- subset(diet, exercise=="no")
df1
# Vergleiche Bestimmheitsmaße verschiedener Modelle
# quadratisches Modell
<- lm(weight.loss ~ days + I(days^2), data=df1)
q1
# exponentielles Modell
<- lm (log(weight.loss) ~ days, data=df1)
e1
# logarithmisches Modell
<- lm(weight.loss ~ log(days), data=df1)
l1
# sigmoidales Modell
<- lm(log(weight.loss) ~ I(1/days), data=df1)
s1
<- data.frame(Modell = c("quadratisch", "exponentiell",
result1 "logarithmisch", "sigmoidal"),
R.square = c(summary(q1)$r.square,
summary(e1)$r.square,
summary(l1)$r.square,
summary(s1)$r.square))
order(result1$R.square, decreasing = TRUE),] result1[
Modell R.square
4 sigmoidal 0.7401212
1 quadratisch 0.7100610
3 logarithmisch 0.6494521
2 exponentiell 0.5222832
# oder mittels compare.lm()
::compare.lm(df1$weight.loss, df1$days) jgsbook
Modell R.square
6 sigmoidal 0.7401212
3 kubisch 0.7151929
2 quadratisch 0.7100610
7 potenz 0.6700051
5 logarithmisch 0.6494521
1 linear 0.5286338
4 exponentiell 0.5222832
Das sigmoidale Modell liefert wieder die beste Erklärung der Daten.
# Subset bilden
<- subset(diet, exercise=="yes")
df2
# Vergleiche Bestimmheitsmaße verschiedener Modelle
# quadratisches Modell
<- lm(weight.loss ~ days + I(days^2), data=df2)
q2
# exponentielles Modell
<- lm (log(weight.loss) ~ days, data=df2)
e2
# logarithmisches Modell
<- lm(weight.loss ~ log(days), data=df2)
l2
# sigmoidales Modell
<- lm(log(weight.loss) ~ I(1/days), data=df2)
s2
<- data.frame(Modell = c("quadratisch", "exponentiell",
result2 "logarithmisch", "sigmoidal"),
R.square = c(summary(q2)$r.square,
summary(e2)$r.square,
summary(l2)$r.square,
summary(s2)$r.square))
order(result1$R.square, decreasing = TRUE),] result2[
Modell R.square
4 sigmoidal 0.8305013
1 quadratisch 0.7791671
3 logarithmisch 0.7885173
2 exponentiell 0.4945564
# oder mittels compare.lm()
::compare.lm(df2$weight.loss, df2$days) jgsbook
Modell R.square
3 kubisch 0.8326179
6 sigmoidal 0.8305013
5 logarithmisch 0.7885173
2 quadratisch 0.7791671
7 potenz 0.6704843
1 linear 0.6623502
4 exponentiell 0.4945564
Das kubische Modell liefert hier die beste Erklärung der Daten.
# Vorhersage Kein Sport
exp(predict(s1, list(days=c(30,100))))
1 2
7.808926 13.806339
# Vorhersage Sport
exp(predict(s2, list(days=c(30,100))))
1 2
11.28578 21.13143
48.3 Lösung zur Aufgabe 44.4.3
<- data.frame(Stunden = c(2:8),
df Konzentration = c(25, 36, 48, 64, 86, 114, 168))
# exponentielles Modell
<- lm(log(Konzentration) ~ Stunden, data=df)
fit summary(fit)
Call:
lm(formula = log(Konzentration) ~ Stunden, data = df)
Residuals:
1 2 3 4 5 6 7
-0.023147 0.034218 0.014623 -0.004972 -0.016786 -0.042212 0.038276
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.627468 0.033673 78.03 6.55e-09 ***
Stunden 0.307277 0.006253 49.14 6.59e-08 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.03309 on 5 degrees of freedom
Multiple R-squared: 0.9979, Adjusted R-squared: 0.9975
F-statistic: 2415 on 1 and 5 DF, p-value: 6.594e-08
# Vorhersage 10 Stunden
exp(predict(fit, list(Stunden=10)))
1
298.94
Nach 10 Stunden beträgt die Konzentration 298,94 mg/dl.
Das Bestimmtheitsmaß R2 des Modells ist mit 0,9979 sehr groß. Die Daten werden sehr gut durch das Modell erklärt.
# exponentielles Modell
<- lm(log(Konzentration) ~ Stunden, data=df)
fit
# coefficienten
<- fit$coefficient[1]
a <- fit$coefficient[2]
b
# Vorhersage 100 mg/dl
log(100) - a ) / b (
(Intercept)
6.436209
Nach 6,436209 Stunden sind 100 mg/dl erreicht.