Regressionskoeffizientenwerte extrahieren

77

Ich habe ein Regressionsmodell für einige Zeitreihendaten, die den Drogenkonsum untersuchen. Der Zweck besteht darin, einen Spline an eine Zeitreihe anzupassen und 95% CI usw. zu berechnen. Das Modell sieht wie folgt aus:

id <- ts(1:length(drug$Date))
a1 <- ts(drug$Rate)
a2 <- lag(a1-1)
tg <- ts.union(a1,id,a2)
mg <-lm (a1~a2+bs(id,df=df1),data=tg) 

Die zusammenfassende Ausgabe von mgist:

Call:
lm(formula = a1 ~ a2 + bs(id, df = df1), data = tg)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.31617 -0.11711 -0.02897  0.12330  0.40442 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        0.77443    0.09011   8.594 1.10e-11 ***
a2                 0.13270    0.13593   0.976  0.33329    
bs(id, df = df1)1 -0.16349    0.23431  -0.698  0.48832    
bs(id, df = df1)2  0.63013    0.19362   3.254  0.00196 ** 
bs(id, df = df1)3  0.33859    0.14399   2.351  0.02238 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Ich verwende den Pr(>|t|)Wert von a2, um zu testen, ob die untersuchten Daten autokorreliert sind.

Ist es möglich, diesen Wert von Pr(>|t|)(in diesem Modell 0.33329) zu extrahieren und in einem Skalar zu speichern, um einen logischen Test durchzuführen?

Kann es alternativ mit einer anderen Methode ausgearbeitet werden?

John
quelle
. @ John - Warum haben Sie den Pr(>|t|)Wert von a2und keine der ersten drei Spalten verwendet?
Chetan Arvind Patil

Antworten:

86

Ein summary.lmObjekt speichert diese Werte in einem matrixaufgerufenen 'coefficients'. Auf den Wert, den Sie suchen, kann also zugegriffen werden mit:

a2Pval <- summary(mg)$coefficients[2, 4]

Oder allgemeiner / lesbarer coef(summary(mg))["a2","Pr(>|t|)"]. Sehen Sie hier , warum dieses Verfahren bevorzugt.

wkmor1
quelle
Wie können wir diese Eigenschaften der "entdecken" summary? Woher hast du das gefunden / gewusst?
Stephen Boesch
Du meinst zB coef(summary(mg))[, c("t value","Pr(>|t|)")]? Aber danke für den Link - das vergesse ich immer!
Christoph
@javadba, können Sie str(mg)oder names(mg)zum Beispiel.
PatrickT
2
@PatrickT thx. Diese kleinen Dinge machen einen großen Unterschied. Ich fand heraus , über data.tableund verwandelte meine Aussichten auf R .. aber muß noch diese Art von Tipps.
StephenBoesch
32

Das Paket ist broomhier praktisch (es verwendet das "ordentliche" Format).

tidy(mg) gibt einen schön formatierten Datenrahmen mit Koeffizienten, t-Statistiken usw. Funktioniert auch für andere Modelle (z. B. plm, ...).

Beispiel aus broomdem Github-Repo:

lmfit <- lm(mpg ~ wt, mtcars)
require(broom)    
tidy(lmfit)

      term estimate std.error statistic   p.value
1 (Intercept)   37.285   1.8776    19.858 8.242e-19
2          wt   -5.344   0.5591    -9.559 1.294e-10

is.data.frame(tidy(lmfit))
[1] TRUE
Helix123
quelle
1
Um das OP daraus zu beantworten: td[1, "estimate"]oder td[td$term == "(Intercept)","estimate"]oder sogartdt <- as.data.table(td); setkey(tdt); tdt["(Intercept)","estimate"]
PatrickT
3

Um Ihre Frage zu beantworten, können Sie den Inhalt der Modellausgabe untersuchen, indem Sie das Modell als Variable speichern und im Umgebungsfenster darauf klicken. Sie können dann herumklicken, um zu sehen, was es enthält und was wo gespeichert ist.

Eine andere Möglichkeit besteht darin yourmodelname$, die Komponenten des Modells einzeln einzugeben und auszuwählen, um zu sehen, was sie jeweils enthalten. Wenn Sie zu kommen yourmodelname$coefficients, sehen Sie alle gewünschten Beta-, P- und T-Werte.

Kevin Rosenfield
quelle
2

Übergeben Sie einfach Ihr Regressionsmodell an die folgende Funktion:

    plot_coeffs <- function(mlr_model) {
      coeffs <- coefficients(mlr_model)
      mp <- barplot(coeffs, col="#3F97D0", xaxt='n', main="Regression Coefficients")
      lablist <- names(coeffs)
      text(mp, par("usr")[3], labels = lablist, srt = 45, adj = c(1.1,1.1), xpd = TRUE, cex=0.6)
    }

Verwenden Sie wie folgt:

model <- lm(Petal.Width ~ ., data = iris)

plot_coeffs(model)

Geben Sie hier die Bildbeschreibung ein

Kybernetisch
quelle
1
Ich habe Ihren Code geplündert und finde ihn nützlich. Möglicherweise möchten Sie es so ändern, dass na-Werte entfernt werden und der Haupttitel über die Funktion eingegeben werden kann.
user1945827