Existe-t-il un moyen de forcer une relation entre les coefficients de régression logistique?

8

Je voudrais spécifier un modèle de régression logistique où j'ai la relation suivante:

E[Yi|Xi]=f(βxi1+β2xi2) où est la fonction logit inverse.f

Existe-t-il un moyen "rapide" de le faire avec des fonctions R préexistantes ou existe-t-il un nom pour un modèle comme celui-ci? Je me rends compte que je peux modifier l'algorithme de Newton-Raphson utilisé pour la régression logistique, mais c'est beaucoup de travail théorique et de codage et je cherche un raccourci.

EDIT: obtenir des estimations ponctuelles pour est assez facile en utilisant optim () ou un autre optimiseur dans R pour maximiser la probabilité. Mais j'ai besoin d'erreurs standard sur ces gars-là.β

TrynnaDoStat
la source
1
Pouvez-vous expliquer la situation dans laquelle vous voudriez faire cela jamais? Je suis juste curieux. Personnellement, je ne l'ai pas vu et je devrais probablement le coder en utilisant une optimisation contrainte.
wolfsatthedoor
1
Je ne peux pas entrer dans les détails, mais la raison pour laquelle je voudrais le faire est essentiellement pour la puissance statistique. Si je crois que cette relation existe, alors forcer le modèle à avoir cette relation me rapprochera de la vraie valeur . Quant à obtenir des estimations ponctuelles sur , c'est assez facile en utilisant optim () ou un autre optimiseur dans R pour maximiser la probabilité. Mais j'ai besoin d'erreurs standard sur ces gars-là. ββ
TrynnaDoStat
3
Celui-ci n'est pas aussi difficile qu'il y paraît: il est assez facile d'obtenir le MLE à partir des premiers principes, car tout ce que vous avez est un seul paramètre. Notez la probabilité du journal et différenciez-la par rapport à . Trouvez le (s) zéro (s). Cela se ferait numériquement. Si vous avez du mal à démarrer la recherche, ajustez le modèle à deux paramètres habituel et utilisez (disons) le coefficient de comme valeur de départ. βx2
whuber
2
La procédure NLIN dans SAS peut s'adapter à une formule de régression non linéaire comme celle-ci et affichera des erreurs de coefficient stnd. Êtes-vous marié à R ou y a-t-il une certaine flexibilité?
RobertF
1
Obtenir les SE n'est pas plus difficile: c'est le cas facile de la théorie standard, où il n'y a qu'un seul paramètre. Mais étant donné la nature non linéaire de sa dépendance aux paramètres, je serais réticent à me reposer soit sur la théorie approximative, soit sur l'optimisation numérique par force brute: tracer la fonction de vraisemblance elle-même, au moins dans quelques cas, afin que vous puissiez comprendre sa qualité. comportement près du pic.
whuber

Réponses:

13

C'est assez facile à faire avec la fonction optim dans R. Je crois comprendre que vous voulez exécuter une régression logistique où y est binaire. Vous écrivez simplement la fonction, puis la collez dans optim. Vous trouverez ci-dessous un code que je n'ai pas exécuté (pseudo-code).

#d is your data frame and y is normalized to 0,1
your.fun=function(b)
{

    EXP=exp(d$x1*b +d$x2*b^2)

    VALS=( EXP/(1+EXP) )^(d$y)*( 1/(1+EXP) )^(1-d$y) 
    return(-sum(log(VALS)))
}

result=optim(0,your.fun,method="BFGS",hessian=TRUE)
# estimates 
 result$par
    #standard errors
    sqrt(diag(inv(result$hessian)))
# maximum log likelihood
-result$value

Notez que your.fun est le négatif d'une fonction de vraisemblance de journal. Donc, optim maximise la vraisemblance du journal (par défaut, optim minimise tout ce qui explique pourquoi j'ai rendu la fonction négative). Si Y n'est pas binaire, allez à http://fisher.osu.edu/~schroeder.9/AMIS900/ch5.pdf pour les formes de fonctions multinomiales et conditionnelles dans les modèles logit.

Zachary Blumenfeld
la source
1
Appréciez la réponse Zachary! Cependant, cela ne fonctionnera pas car j'ai besoin d'erreurs standard sur mes estimations. Je pense à combiner bootstrapping et optim () mais préférerais vraiment une méthode sans bootstrapping si possible. Modifier Newton-Raphson serait beaucoup plus satisfaisant mais beaucoup plus difficile à mettre en œuvre.
TrynnaDoStat
3
Peut-être que je ne comprends pas, l'erreur-type de l'estimation provient d'une fonction de la toile de jute de probabilité maximale évaluée aux estimations. La façon dont vous avez écrit votre fonction n'a qu'un seul paramètre. Vous pouvez certainement amorcer le code ci-dessus pour obtenir également des erreurs standard.
Zachary Blumenfeld
1
@ZacharyBlumenfeld Je comprends ce que vous dites maintenant! J'étais confus parce que ma compréhension de la théorie asymptotique de MLE était que nos observations doivent être iid (la moyenne varie certainement ici, donc mes observations ne sont pas iid). Cependant, je vois maintenant que les observations ne doivent pas être faites dans certaines conditions de régularité ( en.wikipedia.org/wiki/Maximum_likelihood#Asymptotic_normality ). Il ne me reste plus qu'à vérifier que ma situation remplit les conditions de régularité. Merci encore!
TrynnaDoStat
1
Remarque: Si alors il est qui pourrait être établie IID, pas nécessairement . Y=Xβ+ϵϵY
conjugateprior
2

La réponse ci-dessus est correcte. Pour référence, voici un code R élaboré élaboré pour le calculer. J'ai la liberté d'ajouter une interception, car vous en voulez probablement une.

## make some data
set.seed(1234)
N <- 2000
x1 <- rnorm(N)
x2 <- rnorm(N)
## create linear predictor
lpred <- 0.5 + 0.5 * x1 + 0.25 * x2
## apply inverse link function
ey <- 1/(1 + exp(-lpred))
## sample some dependent variable
y <- rbinom(N, prob=ey, size=rep(1,N))

dat <- matrix(c(x1, x2, y), nrow=N, ncol=3)
colnames(dat) <- c('x1', 'x2', 'y')

Construisez maintenant une fonction de vraisemblance logarithmique à maximiser, en l'utilisant ici dbinomparce qu'elle est là, et en additionnant les résultats

## the log likelihood function
log.like <- function(beta, dat){
  lpred <- beta[1] + dat[,'x1'] * beta[2] + dat[,'x2'] * beta[2]**2
  ey <- 1/(1 + exp(-lpred))
  sum(dbinom(dat[,'y'], prob=ey, size=rep(1,nrow(dat)), log=TRUE))
}

et ajuster le modèle par maximum de vraisemblance. Je n'ai pas pris la peine d'offrir un dégradé ou de choisir une méthode d'optimisation, mais vous voudrez peut-être faire les deux.

## fit
res <- optim(par=c(1,1), ## starting values 
             fn=log.like,
             control=list(fnscale=-1), ## maximise not minimise
             hessian=TRUE, ## for SEs
             dat=dat)

Jetez maintenant un œil aux résultats. Les estimations des paramètres ML et les SE asymptotiques sont:

## results
data.frame(coef=res$par,
           SE=sqrt(diag(solve(-res$hessian))))

qui devrait être

##        coef         SE
## 1 0.4731680 0.04828779
## 2 0.5799311 0.03363505

ou il y a un bug (ce qui est toujours possible).

Les mises en garde habituelles concernant les erreurs standard dérivées de la Hesse s'appliquent.

conjugateprior
la source