web-dev-qa-db-fra.com

Extraire pvalue de glm

J'effectue de nombreuses régressions et je ne suis intéressé que par l'effet sur le coefficient et la valeur p d'une variable particulière. Donc, dans mon script, j'aimerais pouvoir simplement extraire la valeur de p du résumé glm (obtenir le coefficient lui-même est facile). Le seul moyen que je connaisse pour afficher la valeur de p est d'utiliser le résumé (myReg). Y a-t-il un autre moyen?

par exemple.:

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

J'ai essayé de traiter fit$coefficients en tant que matrice, mais je ne parviens toujours pas à extraire simplement la valeur de p.

Est-il possible de faire cela?

Merci!

32
Clark Henry

Tu veux

coef(summary(fit))[,4]

qui extrait le vecteur colonne de valeurs p de la sortie tabulaire représentée par summary(fit). Les valeurs p - ne sont réellement calculées que lorsque vous exécutez summary() sur l'ajustement du modèle.

Soit dit en passant, utilisez des fonctions d'extraction plutôt que de plonger dans des objets si vous pouvez:

fit$coefficients[2]

devrait être

coef(fit)[2]

S'il n'y a pas de fonctions d'extraction, str() est votre ami. Il vous permet de regarder la structure de n'importe quel objet, ce qui vous permet de voir ce que contient l'objet et comment l'extraire:

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"

Par conséquent, nous notons le composant coefficients que nous pouvons extraire à l'aide de coef(), mais d'autres composants n'ont pas d'extracteurs, comme null.deviance, Que vous pouvez extraire sous la forme summ$null.deviance.

53
Gavin Simpson

J'ai utilisé cette technique dans le passé pour extraire des données de prédicteur de summary ou d'un objet de modèle ajusté:

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

ce qui me permet de modifier facilement la variable sur laquelle je veux obtenir des données.

Ou comme indiqué @Ben, utilisez match ou %in%, un peu plus propre que grepl:

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

Au lieu du nombre, vous pouvez mettre directement le nom

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

les autres disponibles dans le résumé des coefficients:

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

2
R. Prost

Eh bien, ce serait une autre façon, mais pas la manière la plus efficace de l'exécuter:

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

Cela garantit que les valeurs extraites de la glm ne sont pas dans StatsBase. Là, vous pouvez jouer avec pVals selon vos besoins. J'espère que ça aide, Ebby

1
Ebby