2010-06-25 3 views
2

J'ai lu le code utilisé par R pour adapter un modèle linéaire généralisé (GLM), puisque le code source de R est disponible gratuitement. L'algorithme utilisé est appelé itérativement repondéré moindres carrés (IRLS), qui est un algorithme assez documenté. Pour chaque itération, il existe un appel à une fonction Fortran pour résoudre le problème des moindres carrés pondérés.Comment l'interception est-elle calculée dans le GLM?

Du point de vue de l'utilisateur final, pour une régression logistique par exemple, un appel en R ressemble à ceci:

y <- rbinom(100, 1, 0.5) 
x <- rnorm(100) 
glm(y~x, family=binomial)$coefficients 

Et si vous ne voulez pas utiliser une interception, l'une de ces appels est correct:

glm(y~x-1, family=binomial)$coefficients 
glm(y~x+0, family=binomial)$coefficients 

Cependant, je ne parviens pas à comprendre comment la formule , à savoir y~x ou y~x-1, fait sens dans le code et étant compris comme pour utiliser ou non une interception. Je cherchais une partie du code où une colonne d'un serait liée à x, mais il semble qu'il n'y en ait aucune.

Merci. PS: Autant que j'ai lu, l'interception booléenne qui apparaît dans la fonction appelée glm.fit n'est pas la même que l'intercept dont je parle. Et il en est de même pour le offset. La documentation sur glm et glm.fit est here.

Répondre

6

Vous cherchez probablement au mauvais endroit. Habituellement, model.matrix() est appelé d'abord dans les fonctions de montage:

> D <- data.frame(x1=1:4, x2=4:1) 
> model.matrix(~ x1 + x2, D) 
    (Intercept) x1 x2 
1   1 1 4 
2   1 2 3 
3   1 3 2 
4   1 4 1 
attr(,"assign") 
[1] 0 1 2 
> model.matrix(~ x1 + x2 -1 , D) 
    x1 x2 
1 1 4 
2 2 3 
3 3 2 
4 4 1 
attr(,"assign") 
[1] 1 2 
> 

et est la sortie de model.matrix() qui est transmis à Fortran. C'est le cas pour lm() et d'autres modélistes.

Pour glm(), il est différent et que model.frame() est appelé qui n'a pas ajouter une colonne d'interception. Pourquoi cela a donc à faire avec la différence entre généralisée modèles linéaires et modèles linéaires standard et au-delà de la portée de cette publication.

+0

est le dernier paragraphe de cette réponse réellement correct? 'glm.fit' prend une matrice de modèle' x' qui est exactement la même que dans 'lm.fit' ... –

+0

Cela fait quelques années que je n'ai pas répondu à cette question, mais il me semble me souvenir d'avoir cherché dans le code. Je pourrais bien sûr me tromper sur n'importe quel aspect de celui-ci ... –

Questions connexes