linear regression

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

linear regression

Beitrag von wbart »

Hallo,

ich versuche den ganzen Tag bereits aus einer Tabelle mehrere lineare regressionen zu berechnen um dann die besten Modelle auszuwählen. Leider renne ich nur in eine Reihe von Fehlermeldungen. Im Prinzip sollte dies doch mittels lm() und lapply möglich sein.

Wie würde denn eine Musterlösung aussehen?

Hier ein fiktiver Datensatz. age ist die unabhängige Variable und var1-5 sind die jeweiligen abhängigen Variablen.

Code: Alles auswählen

age=c(10,15,20,22,10,60,66,70,65,77)
var1=c(runif(10, min = 1, max = 2))
var2=c(runif(10, min = 1, max = 4))
var3=c(runif(10, min = 1, max = 6))
var4=c(runif(10, min = 1, max = 3))
var5=c(runif(10, min = 1, max = 4))
data=cbind(age, var1,var2, var3, var4, var5 )
data<-as_tibble(data)
Vielen Dank für die Unterstützung

Gruß
wbart
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: linear regression

Beitrag von bigben »

Hallo,

ich hoffe, Du hast nicht vor, was ich vermute. Wenn doch, dann kann ich nur sagen: lass das.

Vorschlag: lmSubsets::lmSubsets()

https://rdrr.io/cran/lmSubsets/man/lmSubsets.html

Vorschläge mit combn:

https://stackoverflow.com/questions/681 ... data-table

https://stackoverflow.com/questions/649 ... model-in-r

https://stackoverflow.com/a/22956397

Vorschläge mit MUMIn

https://stackoverflow.com/a/22966967

https://stackoverflow.com/questions/286 ... bles-and-a

Vorschlag mmodely::get.model.combos:

https://rdrr.io/cran/mmodely/man/get.model.combos.html

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: linear regression

Beitrag von bigben »

Hier mal was zum Lernen. Ich habe Deinem Beispiel von oben ein set.seed(4711) vorangesetzt, um es voll reproduzierbar zu machen. Da alle Variablen außer age reine Zufallsvariablen sind, haben Sie keinen Vorhersagewert für age. Das sieht auch lm() so (p = 0,450). Trotzdem findet eine einfache schrittweise Regression darin ein signifikantes Modell mit p = 0,015 und "belegt", dass var1 der richtige von den fünf Pädiktoren ist:

Code: Alles auswählen

set.seed(4711)
data <- data.frame(
  age = c(10,15,20,22,10,60,66,70,65,77),
  var1 = runif(10, min = 1, max = 2),
  var2 = runif(10, min = 1, max = 4),
  var3 = runif(10, min = 1, max = 6),
  var4 = runif(10, min = 1, max = 3),
  var5 = runif(10, min = 1, max = 4)
  )

summary(lm(age ~ ., data = data))
#> 
#> Call:
#> lm(formula = age ~ ., data = data)
#> 
#> Residuals:
#>        1        2        3        4        5        6        7        8 
#>  -2.0450 -21.5073  -0.3204 -29.6045 -11.0714  31.8487  19.0272   4.0935 
#>        9       10 
#>  10.0069  -0.4276 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)
#> (Intercept)   64.310    184.191   0.349    0.745
#> var1         -49.023     40.874  -1.199    0.297
#> var2           7.646     16.326   0.468    0.664
#> var3           2.603     12.736   0.204    0.848
#> var4           4.993     20.959   0.238    0.823
#> var5           4.817     15.474   0.311    0.771
#> 
#> Residual standard error: 27.2 on 4 degrees of freedom
#> Multiple R-squared:  0.583,  Adjusted R-squared:  0.06173 
#> F-statistic: 1.118 on 5 and 4 DF,  p-value: 0.4699

optimiert <- step(lm(age ~ ., data = data)) 
#> Start:  AIC=68.9
#> age ~ var1 + var2 + var3 + var4 + var5
#> 
#>        Df Sum of Sq    RSS    AIC
#> - var3  1     30.91 2990.2 67.005
#> - var4  1     41.98 3001.3 67.042
#> - var5  1     71.68 3031.0 67.141
#> - var2  1    162.28 3121.6 67.435
#> <none>              2959.3 68.901
#> - var1  1   1064.25 4023.5 69.973
#> 
#> Step:  AIC=67.01
#> age ~ var1 + var2 + var4 + var5
#> 
#>        Df Sum of Sq    RSS    AIC
#> - var4  1     14.62 3004.8 65.054
#> - var5  1     41.09 3031.3 65.142
#> - var2  1    170.89 3161.1 65.561
#> <none>              2990.2 67.005
#> - var1  1   2235.27 5225.5 70.587
#> 
#> Step:  AIC=65.05
#> age ~ var1 + var2 + var5
#> 
#>        Df Sum of Sq    RSS    AIC
#> - var5  1     72.91 3077.7 63.294
#> - var2  1    165.02 3169.9 63.589
#> <none>              3004.8 65.054
#> - var1  1   2246.70 5251.5 68.637
#> 
#> Step:  AIC=63.29
#> age ~ var1 + var2
#> 
#>        Df Sum of Sq    RSS    AIC
#> - var2  1    169.95 3247.7 61.831
#> <none>              3077.7 63.294
#> - var1  1   2197.01 5274.8 66.681
#> 
#> Step:  AIC=61.83
#> age ~ var1
#> 
#>        Df Sum of Sq    RSS    AIC
#> <none>              3247.7 61.831
#> - var1  1    3848.8 7096.5 67.648
summary(optimiert)
#> 
#> Call:
#> lm(formula = age ~ var1, data = data)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -38.816  -6.569   5.975   9.743  25.866 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)   
#> (Intercept)   133.35      30.50   4.372  0.00238 **
#> var1          -61.32      19.91  -3.079  0.01514 * 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 20.15 on 8 degrees of freedom
#> Multiple R-squared:  0.5424, Adjusted R-squared:  0.4851 
#> F-statistic: 9.481 on 1 and 8 DF,  p-value: 0.01514


Soviel nur um zu verdeutlichen, welchen Unsinn das Herumprobieren mit Prädiktoren fördert. Stell Dir nur mal vor, das wären nicht offensichtliche Zufallszahlen, sondern die Ergebnisse einer Pilotstudie. Das könnte ganz leicht zur Folge haben, dass die Hauptstudie jetzt mit Aufwand var1 untersucht, obwohl var1 nun wirklich gar nichts taugt.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: linear regression

Beitrag von wbart »

Vielen Dank bigben,

ich werde mich da durcharbeiten. Wo liegt den der Denkfehler? wenn man eine einfache lineare regression machen möchte und hat nur einen prediktor wäre das doch legitim oder. Wenn ich mehrere vom selben Typ habe doch auch, oder?

VG
wbart
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: linear regression

Beitrag von bigben »

Du hast von mir lauter Links bekommen, wie man einfach alle Prädiktorkombinationen durchprobiert - und ein Beispiel, wie da in die Irre führen kann. Man darf einfach so entstehenden p-Werten überhaupt nicht trauen.
Als hypothesengenerierendes Verfahren kann sowas unter Umständen ausprobiert werden, nicht als Hypothesentest.

LG, Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten