Dezember 09, 2016

Übersicht – Heute

  • Daten selektieren (ca. 15 min)

  • Daten analysieren (ca. 45 min)
    • Allgemeine deskriptive Statistik
    • Verteilungen von Daten testen
  • Daten modellieren (ca. 30 min)

  • Schnittstellen zwischen R und anderer Software (ca. 15 min)

  • Kaleidoskop, Diskussion und freies Arbeiten (ca. 60 min)

Daten selektieren

Daten selektieren – Einleitung

  • Anwendung vieler bisheriger Kenntnisse
    • Indizierung
    • Logische Operatoren
    • if() und ifelse()
  • Nötig, um die Datensätze von Interesse zu selektieren
  • Grundprinzip: Isolation von Fällen (Zeilen) durch einen Spaltenindex

  • Arbeit hier mit einem Data frame (eigener oder data(cars))

Daten selektieren – Die Werkzeuge

  • which()
    • Erzeugt Indexvektor (Zeilennummer) aufgrund einer logischen Abfrage
    • Beispiel: which(cars$speed > 20), cars[which(cars$speed > 20),]
  • Direkte Bool'sche Indizierung
    • Beispiel: seq(1, nrow(cars))[cars$speed > 20], cars[cars$speed > 20,]
  • Verknüpfung mehrerer logischer Ausdrücke
    • Beispiel: cars[cars$speed > 20 & cars$dist < 70,]

Daten selektieren – Die Werkzeuge

  • Mustererkennung mit grepl()
    • Beispiel: cars[grepl(x = cars$speed, pattern = 24),]
  • Mustergruppierung mit match()
    • match(x = cars$speed, table = c(18, 24))
    • Nützlich in Verbindung mit aggregate(), unique() und which()

Daten selektieren – Fragen und Übungen

  • Zeit: 5 Minuten, Art: Diskussion und selbständige Arbeit

  • Arbeiten Sie mit Ihrem eigenen Datensatz (alternativ mit data(mtcars))
    • Erstellen Sie Indexvektoren anhand der oben besprochenen Tools
    • Isolieren Sie Teildatensätze (sinnvolle Objektnamen vergeben)
    • Lesen Sie die Hilfe für aggregate() und unique(). Wozu können diese Funktionen sinnvoll genutzt werden?

Daten analysieren – I

Daten analysieren – Deskriptive Statistik in Zahlen

  • Einfache statistische Zusammenfassung mit summary() (Min, Max, arithm. Mittel, Median, 1. und 3. Quartil)
  • Alle diese Funktionen sind auch einzeln aufrufbar (min(), max(), mean(), median(), quantile())
  • Anzahl an Werten mit length() oder nrow
  • Streuungsmaße mit range(), var(), sd()

Daten analysieren – Deskriptive Statistik in Zahlen

  • Viele Funktionen haben weitere Argumente, die einen Blick wert sind
    • mean() mit trim, um Ausreißer abzuschneiden
    • weighted.mean(), um (fehler-)gewichtete Mittelwerte zu rechnen
    • quantile() besitzt 9 verschiedene Rechenmethoden

Daten analysieren – Korrelation (Varianz & Kovarianz) von Datenreihen

  • Korrelation (cor()), Varianz (var()) und Kovarianz (cov()) können für eine Matrix oder paarweise für Vektoren (Data frame-Elemente) berechnet werden
cor(cars)
##           speed      dist
## speed 1.0000000 0.8068949
## dist  0.8068949 1.0000000
cor(cars$speed, cars$dist)
## [1] 0.8068949

Daten analysieren – Korrelationstests

  • Achtung! Vollständiger Korrelationstest mit cor.test()
test <- cor.test(x = cars$speed, y = cars$dist, method = "pearson")
print(test)
## 
##  Pearson's product-moment correlation
## 
## data:  cars$speed and cars$dist
## t = 9.464, df = 48, p-value = 1.49e-12
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6816422 0.8862036
## sample estimates:
##       cor 
## 0.8068949
str(test)
## List of 9
##  $ statistic  : Named num 9.46
##   ..- attr(*, "names")= chr "t"
##  $ parameter  : Named int 48
##   ..- attr(*, "names")= chr "df"
##  $ p.value    : num 1.49e-12
##  $ estimate   : Named num 0.807
##   ..- attr(*, "names")= chr "cor"
##  $ null.value : Named num 0
##   ..- attr(*, "names")= chr "correlation"
##  $ alternative: chr "two.sided"
##  $ method     : chr "Pearson's product-moment correlation"
##  $ data.name  : chr "cars$speed and cars$dist"
##  $ conf.int   : atomic [1:2] 0.682 0.886
##   ..- attr(*, "conf.level")= num 0.95
##  - attr(*, "class")= chr "htest"

Daten analysieren – Kontingenztabellen

  • Kontingenztabellen werden erzeugt durch Kreuzklassifikation (table)
table(cars[1:15,])
##      dist
## speed 2 4 10 14 16 17 18 20 22 24 26 28 34
##    4  1 0  1  0  0  0  0  0  0  0  0  0  0
##    7  0 1  0  0  0  0  0  0  1  0  0  0  0
##    8  0 0  0  0  1  0  0  0  0  0  0  0  0
##    9  0 0  1  0  0  0  0  0  0  0  0  0  0
##    10 0 0  0  0  0  0  1  0  0  0  1  0  1
##    11 0 0  0  0  0  1  0  0  0  0  0  1  0
##    12 0 0  0  1  0  0  0  1  0  1  0  1  0

Daten analysieren – Stem-and-leaf-Plots

  • Stem-and-leaf-Plots sind einfache direkte Darstellung klassifizierter Häufgkeiten
stem(cars$speed)
## 
##   The decimal point is at the |
## 
##    4 | 00
##    6 | 00
##    8 | 00
##   10 | 00000
##   12 | 00000000
##   14 | 0000000
##   16 | 00000
##   18 | 0000000
##   20 | 00000
##   22 | 00
##   24 | 00000

Daten analysieren – graphische Funktionen

  • Vor allem explorative und repräsentative Zwecke
  • Datenreihen gegeneinander oder übereinander plotten
  • Plots, die die Datenverteilung beschreiben

Graphische Darstellungen – Daten gegeneinander

par(mfcol = c(1, 2), mar = c(5, 4, 2, 1))
cars_sort <- cars[order(cars$speed),]
plot(x = cars$speed, y = cars$dist)
plot(x = cars_sort$speed, y = cars_sort$dist, type = "l")

Graphische Darstellungen – qq-Plots

par(mfcol = c(1, 2), mar = c(5, 4, 2, 1))
qqplot(x = cars$speed, y = cars$dist)
qqnorm(cars$speed)

Graphische Darstellungen – Histogramme

par(mfcol = c(1, 2), mar = c(5, 4, 2, 1))
hist(x = cars$speed)
H <- hist(x = cars$dist, breaks = 15, col = "peachpuff")
rug(x = cars$dist)

Graphische Darstellungen – Kernel Density Estimate plots

par(mfcol = c(1, 2), mar = c(5, 4, 2, 1))
D <- density(x = cars$speed)
plot(D)
rug(x = cars$speed)
plot(density(cars$dist, bw = 1))

Verteilungen testen – Kolmogorov-Smirnov-Test

  • KS-Test testet, ob Daten aus der gleichen Verteilung wie die Referenzverteilung stammen
  • Test basiert auf Vergleich der gesamten Verteilung
x <- rnorm(1000000)
ks.test(x = x, y = "pnorm")
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.00054509, p-value = 0.9277
## alternative hypothesis: two-sided

Verteilungen testen – Kolmogorov-Smirnov-Test

  • KS-Test testet, ob Daten aus der gleichen Verteilung wie die Referenzverteilung stammen
  • Test basiert auf Vergleich der gesamten Verteilung
ks.test(x = cars$speed, y = cars$dist)
## Warning in ks.test(x = cars$speed, y = cars$dist): cannot compute exact p-
## value with ties
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  cars$speed and cars$dist
## D = 0.76, p-value = 5.735e-13
## alternative hypothesis: two-sided

Verteilungen testen – t-Test

  • Test basiert auf Vergleich von Mittelwerten
t.test(x = rnorm(10000, 100))
## 
##  One Sample t-test
## 
## data:  rnorm(10000, 100)
## t = 9890.3, df = 9999, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##   99.98275 100.02238
## sample estimates:
## mean of x 
##  100.0026

Verteilungen testen – weitere Tests

  • Shapiro-Wilk-Test (nur für Normalverteilungen)
  • Cramér–von Mises distance und Anderson–Darling
  • Chi-Quadrat-Test
  • usw.

Daten modellieren

Daten modellieren – Regressionsanalyse

  • Anpassen eines (linearen) Modells an einen empirischen Datensatz
  • Möglichkeit der Vorhersage von Daten aufgrund des empirischen Datensatzes
  • Beschreibt den Zusammenhang zwischen unabhängigen und abhängigen Variablen
  • In R sehr viele und flexible Regressionsmöglichkeiten

  • Im einfachsten Fall: lineare Regression mit lm()
  • Benötigt zwei Vektoren oder einen Data frame mit zwei Variablen
  • Benötigt die Angabe eines Modells (z.B. y ~ x)

Daten modellieren – Regressionsanalyse

## Einfache Regression
model <- lm(formula = cars$dist ~ cars$speed)

## Alternative bei Data frames
model <- lm(formula = dist ~ speed, data = cars)

## Zusammenfassung
summary(model)
## 
## Call:
## lm(formula = dist ~ speed, data = cars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -29.069  -9.525  -2.272   9.215  43.201 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -17.5791     6.7584  -2.601   0.0123 *  
## speed         3.9324     0.4155   9.464 1.49e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared:  0.6511, Adjusted R-squared:  0.6438 
## F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

Daten modellieren – Regressionsanalyse

str(model)
## List of 12
##  $ coefficients : Named num [1:2] -17.58 3.93
##   ..- attr(*, "names")= chr [1:2] "(Intercept)" "speed"
##  $ residuals    : Named num [1:50] 3.85 11.85 -5.95 12.05 2.12 ...
##   ..- attr(*, "names")= chr [1:50] "1" "2" "3" "4" ...
##  $ effects      : Named num [1:50] -303.914 145.552 -8.115 9.885 0.194 ...
##   ..- attr(*, "names")= chr [1:50] "(Intercept)" "speed" "" "" ...
##  $ rank         : int 2
##  $ fitted.values: Named num [1:50] -1.85 -1.85 9.95 9.95 13.88 ...
##   ..- attr(*, "names")= chr [1:50] "1" "2" "3" "4" ...
##  $ assign       : int [1:2] 0 1
##  $ qr           :List of 5
##   ..$ qr   : num [1:50, 1:2] -7.071 0.141 0.141 0.141 0.141 ...
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : chr [1:50] "1" "2" "3" "4" ...
##   .. .. ..$ : chr [1:2] "(Intercept)" "speed"
##   .. ..- attr(*, "assign")= int [1:2] 0 1
##   ..$ qraux: num [1:2] 1.14 1.27
##   ..$ pivot: int [1:2] 1 2
##   ..$ tol  : num 1e-07
##   ..$ rank : int 2
##   ..- attr(*, "class")= chr "qr"
##  $ df.residual  : int 48
##  $ xlevels      : Named list()
##  $ call         : language lm(formula = dist ~ speed, data = cars)
##  $ terms        :Classes 'terms', 'formula'  language dist ~ speed
##   .. ..- attr(*, "variables")= language list(dist, speed)
##   .. ..- attr(*, "factors")= int [1:2, 1] 0 1
##   .. .. ..- attr(*, "dimnames")=List of 2
##   .. .. .. ..$ : chr [1:2] "dist" "speed"
##   .. .. .. ..$ : chr "speed"
##   .. ..- attr(*, "term.labels")= chr "speed"
##   .. ..- attr(*, "order")= int 1
##   .. ..- attr(*, "intercept")= int 1
##   .. ..- attr(*, "response")= int 1
##   .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
##   .. ..- attr(*, "predvars")= language list(dist, speed)
##   .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
##   .. .. ..- attr(*, "names")= chr [1:2] "dist" "speed"
##  $ model        :'data.frame':   50 obs. of  2 variables:
##   ..$ dist : num [1:50] 2 10 4 22 16 10 18 26 34 17 ...
##   ..$ speed: num [1:50] 4 4 7 7 8 9 10 10 10 11 ...
##   ..- attr(*, "terms")=Classes 'terms', 'formula'  language dist ~ speed
##   .. .. ..- attr(*, "variables")= language list(dist, speed)
##   .. .. ..- attr(*, "factors")= int [1:2, 1] 0 1
##   .. .. .. ..- attr(*, "dimnames")=List of 2
##   .. .. .. .. ..$ : chr [1:2] "dist" "speed"
##   .. .. .. .. ..$ : chr "speed"
##   .. .. ..- attr(*, "term.labels")= chr "speed"
##   .. .. ..- attr(*, "order")= int 1
##   .. .. ..- attr(*, "intercept")= int 1
##   .. .. ..- attr(*, "response")= int 1
##   .. .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
##   .. .. ..- attr(*, "predvars")= language list(dist, speed)
##   .. .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
##   .. .. .. ..- attr(*, "names")= chr [1:2] "dist" "speed"
##  - attr(*, "class")= chr "lm"

Daten modellieren – Regressionsanalyse

  • coef() Modellkoeffizienten
  • resid() Modellresiduals
  • fitted() Angebpasste Werte
  • deviance() Summe der Residual-Quadrate
  • anova() ANOVA
  • predict() Vorhersagen mit dem Modell
  • plot() Vier deskriptive Plots des Modells

Daten modellieren – Regressionsanalyse – Weitere Analyse des Modells

plot(x = cars$dist, y = model$residuals)
abline(h = 0)

Daten modellieren – weitere Modelle

  • Multiple lineare Regression lm(y ~ x1 + x2 + x3, data=mydata)
  • Logistische Regression glm(..., family = "logit")
  • Nichtlineare Regression nls(y ~ a * x / (b + x))

Schnittstellen

Schnittstellen zwischen R und SPSS

Probieren und Diskutieren

Was soll man da in Folien packen?

  • Die Präsentation ist am Ende!
  • Zeit zum Diskutieren und Probieren!

  • Welche Themen blieben unberührt?
  • Wo ging es zu schnell?
  • Was verdient mehr Gewicht?

  • Feedback: BITTE HIER KLICKEN

Geschafft