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!
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
.
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]
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|)
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