2016-11-15 1 views
2

J'ai un fichier rda qui contient un modèle de régression logistique. Garder d'autres choses de côté si je veux seulement savoir quels sont les types de données pour les variables indépendantes utilisées dans le glm comment puis-je les vérifier? Par exemple si mon Y~ X1+X2+X3 comment puis-je savoir quels types de données le X1, X2 et X3 sont? À ce stade, je n'ai pas le cadre de données pour étudier les types de données. Toute aide sera grandement appréciée.Déterminer la classe de variables dans un modèle de régression sans accéder à la trame de données d'origine

+0

Vous ne savez pas exactement ce que vous entendez par ne pas avoir accès à la base de données, mais la façon typique de comprendre le type de données d'un objet est d'utiliser 'class()'. Par exemple 'var <-" foobar "; class (var) 'renvoie' [1] "caractère" '. Vous aurez probablement besoin de charger le fichier Rdata dans R, alors vous pourrez peut-être vérifier le contenu de l'objet glm avec 'str()', puis essayer quelque chose comme 'class (glm $ X1)' – user5359531

+0

@ZheyuanLi , Je recommande de ne pas dépendant de '$ model', car cela retournera' NULL' si 'model = FALSE' a été utilisé dans l'appel de la fonction. 'model.frame' (voir ma réponse ci-dessous) fonctionnera quand même. – Benjamin

Répondre

3

Je voudrais d'abord offrir quelque chose de plus utile. Que diriez-vous de vérifier $terms? (L'utilisation fit ci-dessous à titre d'exemple)

## or `attr(terms(fit), "dataClasses")` 
attr(fit$terms, "dataClasses") 
#   mpg   qsec factor(am)   wt factor(gear) 
# "numeric" "numeric"  "factor" "numeric"  "factor" 

Étant donné que votre question ne mentionne que l'identification des classes de données, cela suffit. Mais si vous voulez accéder aux données pour les variables, vérifiez $data. Voici comment glm diffère de lm. glm renvoie beaucoup plus de choses que lm, y compris l'argument data. Remarque: lm ne renvoie pas data.


Un peu plus sur model.frame

Presque toujours, model.frame est la meilleure procédure. Mais utilisez-le avec un peu de soin.

dat <- mtcars 
fit <- glm(mpg ~ qsec + factor(am) + wt + factor(gear), 
      data = dat, model = FALSE) 
rm(dat) 
model.frame(fit) 

Erreur dans is.data.frame (données): objet 'dat' not found

C'est ce que je l'ai expliqué dans un commentaire sous la question OP: Si $model n'est pas NULL, model.frame l'extrait simplement. Mais si c'est vraiment NULL, model.frame vise à le reconstruire. Mais pour le reconstruire, vous devez accéder au cadre de données original. Si le bloc de données original n'est pas disponible, vous n'obtenez rien (mais une erreur).

Pour comprendre cela, il faut savoir que model.frame est un (S3) fonction générique:

.S3methods("model.frame") 
#[1] model.frame.aovlist* model.frame.default model.frame.glm*  
#[4] model.frame.lm* 

model.frame.lm et model.frame.glm simple extrait $model de l'objet modèle (si $model est présent); sinon, il appelle model.frame.default pour construire la trame du modèle à partir de la formule du modèle et de la trame de données originale.

+0

Bien raisonné. Il semble que je n'ai jamais rencontré le scénario spécifique, et je n'avais pas réfléchi aux conséquences. Je défendrai toujours 'model.frame' simplement parce qu'il réussira toujours dans les cas où' model = FALSE' et vous avez accès à la trame de données; '$ model' renverra' NULL'.Cela ne fera aucune différence dans le contexte de cette question, mais dans d'autres contextes, cela ne le fera pas. – Benjamin

+0

attr (fit $ terms, "dataClasses") a résolu mon problème immédiat. J'apprécie les explications supplémentaires. Cela m'a aidé à clarifier un peu plus de choses. –