Das Broom-Paket für R-Studio — mit Beispiel

0
129
putzen

— einfach mal den ganzen Mist aufräumen!

Wer mit R(-Studio) arbeitet, hat sicherlich schon festgestellt, dass das Output von z. B. einer Regressionsanalyse ziemlich unübersichtlich ist. Das Paket „Broom“ soll hier Abhilfe schaffen und räumt das Output ganz einfach auf. Wir zeigen euch, wie.

 

Ein Beispeildatensatz: mtcars

Um euch ein Beispiel zu geben, verwenden wir den Datensatz mtcars, dieser wird mit der Installation von R-Studio automatisch mitgeliefert. Anschauen könnt ihr ihn euch durch:

View(mtcars)

Wer ihn noch nicht kennt, der Datensatz besteht aus 32 Beobachtungen und 11 Variablen:

[, 1] mpg Miles/(US) gallon
[, 2] cyl Number of cylinders
[, 3] disp Displacement (cu.in.)
[, 4] hp Gross horsepower
[, 5] drat Rear axle ratio
[, 6] wt Weight (1000 lbs)
[, 7] qsec 1/4 mile time
[, 8] vs V/S
[, 9] am Transmission (0 = automatic, 1 = manual)
[,10] gear Number of forward gears
[,11] carb Number of carburetors

 

Einfache lineare Regressionsanalsyse

Mit dem Datensatz können wir nun ein Beispiel rechnen. So interessiert uns nun, ob das Gewicht (wt) und die Schnelligkeit (qsec) einen Einfluss auf den Spritverbrauch haben (mpg):

Modell:

lmfit <- lm(mpg ~ wt + qsec, mtcars)
summary(lmfit)

Ergebnis:

Call:
lm(formula = mpg ~ wt + qsec, data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.3962 -2.1431 -0.2129  1.4915  5.7486 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  19.7462     5.2521   3.760 0.000765 ***
wt           -5.0480     0.4840 -10.430 2.52e-11 ***
qsec          0.9292     0.2650   3.506 0.001500 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.596 on 29 degrees of freedom
Multiple R-squared:  0.8264,	Adjusted R-squared:  0.8144 
F-statistic: 69.03 on 2 and 29 DF,  p-value: 9.395e-12

Wir sehen nun ein sehr unaufgeräumtes Ergebnis, das aus drei Teilen besteht. Im ersten Teil unter Residuals finden wir die Beobachtung (Min, Max, Median usw.). Im zweiten unter Coefficients die Komponenten, wie den p-Wert, und im dritten Teil unser Modell mit entsprechender F-Statistik und R².

Mit Hilfe von „Broom“ können wir unsere Ergebnisse aber auch schön(er) darstellen lassen. Zuerst solltet ihr das Paket aber installieren und laden:

install.packages(“broom”) 
library(broom)

 

Broom in Aktion

Ihr habt mit Broom nun die Möglichkeit, alle drei Teile einzeln ausgeben zu lassen:

Zuerst die Komponenten (Teil 2) mit tidyr():

> tidy(lmfit)
         term  estimate std.error  statistic      p.value
1 (Intercept) 19.746223 5.2520617   3.759709 7.650466e-04
2          wt -5.047982 0.4839974 -10.429771 2.518948e-11
3        qsec  0.929198 0.2650173   3.506179 1.499883e-03

Danach die Observationen (Teil 1) mit augment(), wo jede Zeile eine Beobachtung aus dem Datensatz ist. (Achtung, die letzten beiden Spalten wurden in eine neue Zeile geschrieben!)

> augment(lmfit)
             .rownames  mpg    wt  qsec   .fitted   .se.fit      .resid       .hat .sigma
1            Mazda RX4 21.0 2.620 16.46 21.815109 0.6832424 -0.81510855 0.06925986 2.637300
2        Mazda RX4 Wag 21.0 2.875 17.02 21.048224 0.5468271 -0.04822401 0.04436414 2.642112
3           Datsun 710 22.8 2.320 18.61 25.327279 0.6397681 -2.52727880 0.06072636 2.595763
4       Hornet 4 Drive 21.4 3.215 19.44 21.580569 0.6231436 -0.18056924 0.05761138 2.641895
5    Hornet Sportabout 18.7 3.440 17.02 18.196114 0.5120709  0.50388581 0.03890382 2.640343
6              Valiant 18.1 3.460 20.22 21.068588 0.8032106 -2.96858808 0.09571739 2.575422
7           Duster 360 14.3 3.570 15.84 16.443423 0.7010125 -2.14342291 0.07290940 2.608421
8            Merc 240D 24.4 3.190 20.00 22.227120 0.7302126  2.17288034 0.07910987 2.607247
9             Merc 230 22.8 3.150 22.90 25.123713 1.4101406 -2.32371308 0.29502367 2.589845
10            Merc 280 19.2 3.440 18.30 19.385488 0.4909773 -0.18548760 0.03576473 2.641888
11           Merc 280C 17.8 3.440 18.90 19.943006 0.5571043 -2.14300639 0.04604739 2.609389
12          Merc 450SE 16.4 4.070 17.40 15.368981 0.6147893  1.03101923 0.05607697 2.634506
13          Merc 450SL 17.3 3.730 17.60 17.271134 0.5204289  0.02886576 0.04018415 2.642123
14         Merc 450SLC 15.2 3.780 18.00 17.390414 0.5387353 -2.19041433 0.04306089 2.608022
15  Cadillac Fleetwood 10.4 5.250 17.98  9.951297 1.0916727  0.44870314 0.17681412 2.640475
16 Lincoln Continental 10.4 5.424 17.82  8.924276 1.1612916  1.47572368 0.20008504 2.623664
17   Chrysler Imperial 14.7 5.345 17.42  8.951388 1.1149850  5.74861230 0.18444635 2.352379
18            Fiat 128 32.4 2.200 19.47 26.732147 0.7508141  5.66785310 0.08363669 2.393496
19         Honda Civic 30.4 1.615 18.52 28.802478 0.8918780  1.59752172 0.11801654 2.622499
20      Toyota Corolla 33.9 1.835 19.90 28.974215 0.9091942  4.92578455 0.12264373 2.448094
21       Toyota Corona 21.5 2.465 20.01 25.896199 0.7735519 -4.39619858 0.08877914 2.494666
22    Dodge Challenger 15.5 3.520 16.87 17.652896 0.5348830 -2.15289593 0.04244725 2.609209
23         AMC Javelin 15.2 3.435 17.30 18.481530 0.4873703 -3.28152953 0.03524115 2.565582
24          Camaro Z28 13.3 3.840 15.41 14.680913 0.8069223 -1.38091265 0.09660408 2.627824
25    Pontiac Firebird 19.2 3.845 17.05 16.179557 0.5703305  3.02044258 0.04825977 2.576528
26           Fiat X1-9 27.3 1.935 18.90 27.540219 0.7829311 -0.24021927 0.09094506 2.641700
27       Porsche 914-2 26.0 2.140 16.70 24.461147 0.7941163  1.53885259 0.09356216 2.624412
28        Lotus Europa 30.4 1.513 16.90 27.812072 1.0132627  2.58792829 0.15232675 2.588179
29      Ford Pantera L 15.8 3.170 14.50 17.217490 1.0029250 -1.41749041 0.14923442 2.626118
30        Ferrari Dino 19.7 2.770 15.50 20.165881 0.8318811 -0.46588119 0.10267260 2.640493
31       Maserati Bora 15.0 3.570 14.60 15.291217 0.9642049 -0.29121742 0.13793379 2.641464
32          Volvo 142E 21.4 2.780 18.60 22.995915 0.5294628 -1.59591510 0.04159134 2.624106
        .cooksd  .std.resid
1  2.627038e-03 -0.32543724
2  5.587076e-06 -0.01900129
3  2.174253e-02 -1.00443793
4  1.046036e-04 -0.07164647
5  5.288512e-04  0.19797699
6  5.101445e-02 -1.20244126
7  1.927373e-02 -0.85745788
8  2.178198e-02  0.87216352
9  1.585198e-01 -1.06600994
10 6.545298e-05 -0.07275945
11 1.149236e-02 -0.84513499
12 3.308687e-03  0.40875633
13 1.797445e-06  0.01134893
14 1.115778e-02 -0.86248219
15 2.598066e-03  0.19049175
16 3.367812e-02  0.63554917
17 4.532124e-01  2.45190009
18 1.582375e-01  2.28060859
19 1.914813e-02  0.65521310
20 1.911855e-01  2.02559882
21 1.021948e-01 -1.77390963
22 1.061160e-02 -0.84743754
23 2.016397e-02 -1.28686488
24 1.116304e-02 -0.55961992
25 2.403811e-02  1.19255217
26 3.140692e-04 -0.09704626
27 1.333611e-02  0.62257836
28 7.021574e-02  1.08268973
29 2.048803e-02 -0.59194477
30 1.368718e-03 -0.18943740
31 7.784575e-04 -0.12081283
32 5.703374e-03 -0.62791439

Und zuletzt könnt ihr euch den dritten Teil mit glance() ausgeben lassen. (Jedes Modell erhält hier eine Zeile.)

> glance(lmfit)
  r.squared adj.r.squared    sigma statistic      p.value df    logLik      AIC      BIC deviance
1 0.8264161     0.8144448 2.596175  69.03311 9.394765e-12  3 -74.36025 156.7205 162.5834 195.4636
  df.residual
1          29

Wie ihr feststellen könnt, lassen sich die Ergebnise nicht nur schöner darstellen, sondern ihr bekommt mit augment() auch detailierte Informationen. Natürlich lässt sich Broom auch bei anderen statistischen Methoden einsetzten:

[lightbox_image src=“http://www.psystudents.org/wp-content/uploads/2016/08/Broom.png“ bigimage=“http://www.psystudents.org/wp-content/uploads/2016/08/Broom.png“ title=“Quelle: Broom-Präsentation von David Robinson“ alt=“Broom“]

 

Da geht noch mehr

Wir können mit den gewonnenen — aufgräumten — Daten auch bessere Modellvergleiche machen und Grafiken mit Hilfe von ggplot2 zeichnen lassen:

[lightbox_image src=“http://www.psystudents.org/wp-content/uploads/2016/08/Broom2.png“ bigimage=“http://www.psystudents.org/wp-content/uploads/2016/08/Broom2.png“ title=“Quelle: Broom-Präsentation von David Robinson“ alt=“Broom“]

Für unser einfaches Beispielmodell könnten wir uns z. B. die Konfidenzintervalle grafisch ausgeben lassen:

# ggplot2 installieren, sofern dies noch nicht passiert ist:
install.packages("ggplot2")
library(ggplot2)

# Grafik erstellen
lmfit <- lm(mpg ~ wt + qsec, mtcars) # Zur Erinnerung, das ist unser Modell

td <- tidy(lmfit, conf.int = TRUE) # Speichern in td mit den Konfidenzintervallen

ggplot(td, aes(estimate, term, color = term)) +
  geom_point() +
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high)) # ggplot erstellt dann die Grafik

Unsere Grafik sieht dann wie folgt aus:

[lightbox_image src=“http://www.psystudents.org/wp-content/uploads/2016/08/Rplot.png“ bigimage=“http://www.psystudents.org/wp-content/uploads/2016/08/Rplot.png“ title=“Quelle: Broom-Präsentation von David Robinson“ alt=“Broom“]

Natürlich gibt es noch viel mehr Möglichkeiten, einen Teil davon könnt ihr in der originalen Präsentation nachlesen.