web-dev-qa-db-de.com

PWert aus glm extrahieren

Ich führe viele Regressionen durch und interessiere mich nur für die Auswirkung auf den Koeffizienten und den p-Wert einer bestimmten Variablen. Daher möchte ich in meinem Skript nur den p-Wert aus der glm-Zusammenfassung extrahieren können (das Abrufen des Koeffizienten selbst ist einfach). Die einzige Möglichkeit, den p-Wert anzuzeigen, ist die Verwendung der Zusammenfassung (myReg). Gibt es einen anderen Weg?

z.B.:

fit <- glm(y ~ x1 + x2, myData)
x1Coeff <- fit$coefficients[2] # only returns coefficient, of course
x1pValue <- ???

Ich habe versucht, fit$coefficients Als Matrix zu behandeln, kann den p-Wert aber immer noch nicht einfach extrahieren.

Ist das möglich?

Vielen Dank!

32
Clark Henry

Sie wollen

coef(summary(fit))[,4]

dies extrahiert den Spaltenvektor von p Werten aus der tabellarischen Ausgabe, die durch summary(fit) gezeigt wird. Die p - Werte werden erst berechnet, wenn Sie summary() für die Modellanpassung ausführen.

Übrigens: Verwenden Sie Extraktionsfunktionen, anstatt sich mit Objekten zu befassen, wenn Sie:

fit$coefficients[2]

sollte sein

coef(fit)[2]

Wenn es keine Extraktorfunktionen gibt, ist str() Ihr Freund. Sie können sich die Struktur eines Objekts ansehen und sehen, was das Objekt enthält und wie es extrahiert wird:

summ <- summary(fit)

> str(summ, max = 1)
List of 17
 $ call          : language glm(formula = counts ~ outcome + treatment, family = poisson())
 $ terms         :Classes 'terms', 'formula' length 3 counts ~ outcome + treatment
  .. ..- attr(*, "variables")= language list(counts, outcome, treatment)
  .. ..- attr(*, "factors")= int [1:3, 1:2] 0 1 0 0 0 1
  .. .. ..- attr(*, "dimnames")=List of 2
  .. ..- attr(*, "term.labels")= chr [1:2] "outcome" "treatment"
  .. ..- attr(*, "order")= int [1:2] 1 1
  .. ..- attr(*, "intercept")= int 1
  .. ..- attr(*, "response")= int 1
  .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
  .. ..- attr(*, "predvars")= language list(counts, outcome, treatment)
  .. ..- attr(*, "dataClasses")= Named chr [1:3] "numeric" "factor" "factor"
  .. .. ..- attr(*, "names")= chr [1:3] "counts" "outcome" "treatment"
 $ family        :List of 12
  ..- attr(*, "class")= chr "family"
 $ deviance      : num 5.13
 $ aic           : num 56.8
 $ contrasts     :List of 2
 $ df.residual   : int 4
 $ null.deviance : num 10.6
 $ df.null       : int 8
 $ iter          : int 4
 $ deviance.resid: Named num [1:9] -0.671 0.963 -0.17 -0.22 -0.956 ...
  ..- attr(*, "names")= chr [1:9] "1" "2" "3" "4" ...
 $ coefficients  : num [1:5, 1:4] 3.04 -4.54e-01 -2.93e-01 1.34e-15 1.42e-15 ...
  ..- attr(*, "dimnames")=List of 2
 $ aliased       : Named logi [1:5] FALSE FALSE FALSE FALSE FALSE
  ..- attr(*, "names")= chr [1:5] "(Intercept)" "outcome2" "outcome3" "treatment2" ...
 $ dispersion    : num 1
 $ df            : int [1:3] 5 4 5
 $ cov.unscaled  : num [1:5, 1:5] 0.0292 -0.0159 -0.0159 -0.02 -0.02 ...
  ..- attr(*, "dimnames")=List of 2
 $ cov.scaled    : num [1:5, 1:5] 0.0292 -0.0159 -0.0159 -0.02 -0.02 ...
  ..- attr(*, "dimnames")=List of 2
 - attr(*, "class")= chr "summary.glm"

Daher notieren wir die coefficients -Komponente, die wir mit coef() extrahieren können, aber andere Komponenten haben keine Extraktoren, wie null.deviance, Die Sie als summ$null.deviance.

53
Gavin Simpson

Ich habe diese Technik in der Vergangenheit verwendet, um Prädiktorendaten aus summary oder einem angepassten Modellobjekt abzurufen:

coef(summary(m))[grepl("var_i_want$",row.names(coef(summary(m)))), 4]

auf diese Weise kann ich leicht bearbeiten, für welche Variable ich Daten abrufen möchte.

Oder verwenden Sie match oder %in%, etwas sauberer als grepl:

coef(summary(m))[row.names(coef(summary(m))) %in% "var_i_want" , 4]
4
James King

Anstelle der Nummer können Sie direkt den Namen eingeben

coef(summary(fit))[,'Pr(>|z|)']

die anderen sind in der Koeffizientenzusammenfassung aufgeführt:

Estimate Std. Error z value Pr(>|z|)

2
R. Prost

Nun, dies wäre eine andere Methode, jedoch nicht die effizienteste:

a = coeftable(model).cols[4]
pVals = [ a[i].v for i in 1:length(a) ]

Dadurch wird sichergestellt, dass die aus dem glm extrahierten Werte nicht in StatsBase enthalten sind. Darin können Sie mit pVals nach Ihren Wünschen herumspielen. Hoffe es hilft, Ebby

1
Ebby