Existe uma maneira de forçar uma relação entre coeficientes na regressão logística?

8

Gostaria de especificar um modelo de regressão logística em que possuo o seguinte relacionamento:

E[YEu|XEu]=f(βxEu1+β2xEu2) que é a função inversa de logit.f

Existe uma maneira "rápida" de fazer isso com funções R preexistentes ou existe um nome para um modelo como este? Sei que posso modificar o algoritmo de Newton-Raphson usado para regressão logística, mas isso é muito trabalho teórico e de codificação e estou procurando um atalho.

EDIT: obter estimativas de pontos para é muito fácil usando optim () ou algum outro otimizador em R para maximizar a probabilidade. Mas preciso de erros padrão nesses caras.β

TrynnaDoStat
fonte
1
Você pode explicar a situação em que você gostaria de fazer isso? Eu só estou curioso. Eu pessoalmente não vi isso e provavelmente teria que codificá-lo usando otimização restrita.
wolfsatthedoor
1
Eu não posso entrar em detalhes, mas a razão pela qual eu gostaria de fazer isso é basicamente pelo poder estatístico. Se eu acredito que esse relacionamento existe, forçar o modelo a ter esse relacionamento me aproximará do valor verdadeiro . Quanto à obtenção de estimativas de pontos em , é muito fácil usar optim () ou algum outro otimizador em R para maximizar a probabilidade. Mas preciso de erros padrão nesses caras. ββ
TrynnaDoStat
3
Este não é tão difícil quanto parece: é muito fácil obter o MLE a partir dos primeiros princípios, porque tudo que você tem é um único parâmetro. Anote a probabilidade do log e diferencie-a em relação a . Encontre o (s) zero (s). Isso seria feito numericamente. Se você tiver algum problema ao iniciar a pesquisa, ajuste o modelo usual de dois parâmetros e use (digamos) o coeficiente de como valor inicial. βx2
whuber
2
O procedimento NLIN no SAS pode ajustar uma fórmula de regressão não linear como essa e produzirá erros de coeficiente stnd. Você é casado com R ou existe alguma flexibilidade?
precisa saber é o seguinte
1
Obter as SEs não é mais difícil: este é o caso fácil da teoria padrão, onde há apenas um parâmetro. Mas, dada a natureza não linear de sua dependência dos parâmetros, eu relutaria em confiar na teoria aproximada ou na otimização numérica de força bruta: plote a função de probabilidade em si, pelo menos em alguns casos, para que você possa entender sua qualidade. comportamento próximo ao pico.
whuber

Respostas:

13

Isso é bastante fácil de fazer com a função optim em R. Meu entendimento é que você deseja executar uma regressão logística em que y é binário. Você simplesmente escreve a função e a coloca em otim. Abaixo está um código que não executei (pseudo-código).

#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

Observe que your.fun é o negativo de uma função de probabilidade de log. Portanto, o otim está maximizando a probabilidade do log (por padrão, o otim minimiza tudo o que levou a função a ser negativa). Se Y não for binário, vá para http://fisher.osu.edu/~schroeder.9/AMIS900/ch5.pdf para obter formulários multinomiais e de função condicional nos modelos de logit.

Zachary Blumenfeld
fonte
1
Aprecie a resposta Zachary! No entanto, isso não funcionará, pois preciso de erros padrão nas minhas estimativas. Estou pensando em combinar bootstrapping e optim (), mas realmente preferiria um método não bootstrapping, se possível. Modificar Newton-Raphson seria muito mais gratificante, mas muito mais difícil de implementar.
TrynnaDoStat
3
Talvez eu não entenda, o erro padrão da estimativa vem de uma função do hessian de probabilidade máxima avaliado nas estimativas. Do jeito que você escreveu sua função, você tem apenas um parâmetro. Você certamente pode inicializar o código acima para obter erros padrão também.
Zachary Blumenfeld
1
@ZacharyBlumenfeld Entendo o que você está dizendo agora! Fiquei confuso porque meu entendimento da teoria assintótica do MLE era que nossas observações deveriam ser iid (a média certamente varia aqui, portanto minhas observações não são iid). No entanto, vejo agora que as observações não precisam ser feitas sob certas condições de regularidade ( en.wikipedia.org/wiki/Maximum_likelihood#Asymptotic_normality ). Agora só preciso verificar se minha situação atende às condições de regularidade. Obrigado novamente!
TrynnaDoStat
1
Nota: Se então é que pode ser assumido iid, não necessariamente . Y=Xβ+ϵϵY
conjugateprior
2

A resposta acima está correta. Para referência, aqui estão alguns códigos R de trabalho elaborados para computá-lo. Eu tenho a liberdade de adicionar um intercepto, porque você provavelmente quer um deles.

## 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')

Agora construa uma função de probabilidade de log para maximizar, aqui usando dbinomporque está lá e somando os resultados

## 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))
}

e ajuste o modelo pela máxima probabilidade. Não me preocupei em oferecer um gradiente ou escolher um método de otimização, mas convém fazer as duas coisas.

## 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)

Agora dê uma olhada nos resultados. As estimativas do parâmetro ML e SEs assintóticas são:

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

qual deveria ser

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

ou há um erro (que é sempre possível).

As advertências usuais sobre erros padrão derivados de Hessian se aplicam.

conjugateprior
fonte