Seite 1 von 1

linear regression

Verfasst: Mo Jan 30, 2023 2:49 pm
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

Re: linear regression

Verfasst: Mo Jan 30, 2023 4:46 pm
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

Re: linear regression

Verfasst: Mo Jan 30, 2023 5:16 pm
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

Re: linear regression

Verfasst: Di Jan 31, 2023 8:31 am
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

Re: linear regression

Verfasst: Di Jan 31, 2023 8:14 pm
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