1 Kontext
Dieser Post bezieht sich auf diese Fallstudie.
2 Vorbereitung
library(tidyverse) # Datenjudo
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.4 ✓ purrr 0.3.4
## ✓ tibble 3.1.2 ✓ dplyr 1.0.6
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(moderndive) # Daten
library(modelr) # für "add_predictions()"
data("house_prices")
3 LogY-LogX-Modell
Bei einem LogY-LogX-Modell gilt: Steigt X um 1%, so steigt Y um k%.
LogY-X-Modell: Steigt X um 1 Einheit, so steigt Y um k%.
house_prices <- house_prices %>%
mutate(
log10_price = log10(price),
log10_size = log10(sqft_living)
)
Hier ist die Basis des Logarithmus 10, so dass gilt \(lg(100) = 2, lg(1000) = 3\) etc.
4 Modell 1
Wir beziehen uns auf dieses Modell.
# Fit regression model:
price_interaction <- lm(log10_price ~ log10_size * condition,
data = house_prices)
# Get regression table:
get_regression_table(price_interaction)
## # A tibble: 10 x 7
## term estimate std_error statistic p_value lower_ci upper_ci
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 intercept 3.33 0.451 7.38 0 2.45 4.22
## 2 log10_size 0.69 0.148 4.65 0 0.399 0.98
## 3 condition2 0.047 0.498 0.094 0.925 -0.93 1.02
## 4 condition3 -0.367 0.452 -0.812 0.417 -1.25 0.519
## 5 condition4 -0.398 0.453 -0.879 0.38 -1.29 0.49
## 6 condition5 -0.883 0.457 -1.93 0.053 -1.78 0.013
## 7 log10_size:condition2 -0.024 0.163 -0.148 0.882 -0.344 0.295
## 8 log10_size:condition3 0.133 0.148 0.893 0.372 -0.158 0.424
## 9 log10_size:condition4 0.146 0.149 0.979 0.328 -0.146 0.437
## 10 log10_size:condition5 0.31 0.15 2.07 0.039 0.016 0.604
5 Vorhersage zum Beispiel aus der Fallstudie
preds1 <- predict(price_interaction,
newdata = data.frame(
condition = factor("5"), #nominal skaliert
log10_size = 3.28))
preds1 # 5.73
## 1
## 5.725459
100000 -> 1000000
500000
Das ist der Wert des Hauses in der Log-Skala. Für die Rohwerte müssen wir den Logarithmus wieder umkehren, also die Umkehrfunktion anwenden, das ist die Exponenzialfunktion, hier zur Basis 10:
10^5.73 # delog
## [1] 537031.8
Der Wert der Immobilie liegt also, laut Modell, bei gut 500 Tausend Dollar.
6 Vorhersagen wie im Prognose-Wettbewerb
house_prices <-
house_prices %>%
add_predictions(price_interaction,
var = "pred_log10") %>%
mutate(pred = 10^pred_log10) # da Log-Basis 10
Wäre die Basis des Log. nicht 10, sondern e, dann hieße der Code:
house_prices <-
house_prices %>%
add_predictions(price_interaction,
var = "pred_log10") %>%
mutate(pred_e = 2.71^pred_log10) # da Log-Basis 10
7 Check
Ein Blick in die Daten:
house_prices %>%
select(price, pred_log10, pred) %>%
slice(1:10)
## # A tibble: 10 x 3
## price pred_log10 pred
## <dbl> <dbl> <dbl>
## 1 221900 5.49 308270.
## 2 538000 5.77 584591.
## 3 180000 5.34 217028.
## 4 604000 5.74 546648.
## 5 510000 5.62 412162.
## 6 1225000 6.03 1079632.
## 7 257500 5.62 419208.
## 8 291850 5.45 282254.
## 9 229500 5.64 432227.
## 10 323000 5.66 454069.
Unser Modell scheint plausible Vorhersagen zu tätigen.