Calcular coeficientes em uma regressão logística com R

18

Em uma regressão linear múltipla, é possível descobrir o coeficiente com a seguinte fórmula.

b=(XX)1(X)Y

beta = solve(t(X) %*% X) %*% (t(X) %*% Y) ; beta

Por exemplo:

> y <- c(9.3, 4.8, 8.9, 6.5, 4.2, 6.2, 7.4, 6, 7.6, 6.1)
> x0 <- c(1,1,1,1,1,1,1,1,1,1) 
> x1 <-  c(100,50,100,100,50,80,75,65,90,90)
> x2 <- c(4,3,4,2,2,2,3,4,3,2)
> Y <- as.matrix(y)
> X <- as.matrix(cbind(x0,x1,x2))

> beta = solve(t(X) %*% X) %*% (t(X) %*% Y);beta
         [,1]
x0 -0.8687015
x1  0.0611346
x2  0.9234254
> model <- lm(y~+x1+x2) ; model$coefficients
(Intercept)          x1          x2 
 -0.8687015   0.0611346   0.9234254 

Gostaria de calcular da mesma maneira "manual" o beta para uma regressão logística. Onde é claro que y seria 1 ou 0. Supondo que eu esteja usando a família binomial com um link de logit.

S12000
fonte
1
A pergunta que você realmente fez já foi feita em stats.stackexchange.com/questions/949/… . A pergunta que parece que você deseja fazer é abordada pelas respostas aqui.
whuber

Respostas:

26

O estimador OLS no modelo de regressão linear é bastante raro por ter a propriedade de poder ser representado de forma fechada, ou seja, sem precisar ser expresso como o otimizador de uma função. É, no entanto, um otimizador de uma função - a função residual da soma dos quadrados - e pode ser calculado como tal.

O MLE no modelo de regressão logística também é o otimizador de uma função de probabilidade de log definida adequadamente, mas como não está disponível em uma expressão de formulário fechado, deve ser computada como um otimizador.

A maioria dos estimadores estatísticos é expressável apenas como otimizadores de funções adequadamente construídas dos dados, chamadas funções de critério. Esses otimizadores requerem o uso de algoritmos de otimização numérica adequados. Otimizadores de funções podem ser calculados em R usando a optim()função que fornece alguns algoritmos de otimização de uso geral ou um dos pacotes mais especializados, como optimx. É essencial saber qual algoritmo de otimização usar para diferentes tipos de modelos e funções de critério estatístico.

Soma residual dos quadrados da regressão linear

Os OLS estimador é definido como o optimizador da soma residual bem conhecido dos quadrados

β^=argminβ(Y-Xβ)(Y-Xβ)=(XX)-1XY

No caso de uma função convexa duas vezes diferenciável, como a soma residual dos quadrados, a maioria dos otimizadores baseados em gradiente faz um bom trabalho. Nesse caso, usarei o algoritmo BFGS.

#================================================
# reading in the data & pre-processing
#================================================
urlSheatherData = "http://www.stat.tamu.edu/~sheather/book/docs/datasets/MichelinNY.csv"
dfSheather = as.data.frame(read.csv(urlSheatherData, header = TRUE))

# create the design matrices
vY = as.matrix(dfSheather['InMichelin'])
mX = as.matrix(dfSheather[c('Service','Decor', 'Food', 'Price')])

# add an intercept to the predictor variables
mX = cbind(1, mX)

# the number of variables and observations
iK = ncol(mX)
iN = nrow(mX)

#================================================
# compute the linear regression parameters as 
#   an optimal value
#================================================
# the residual sum of squares criterion function
fnRSS = function(vBeta, vY, mX) {
  return(sum((vY - mX %*% vBeta)^2))
}

# arbitrary starting values
vBeta0 = rep(0, ncol(mX))

# minimise the RSS function to get the parameter estimates
optimLinReg = optim(vBeta0, fnRSS,
                   mX = mX, vY = vY, method = 'BFGS', 
                   hessian=TRUE)

#================================================
# compare to the LM function
#================================================
linregSheather = lm(InMichelin ~ Service + Decor + Food + Price,
                    data = dfSheather)

Isso produz:

> print(cbind(coef(linregSheather), optimLinReg$par))
                    [,1]         [,2]
(Intercept) -1.492092490 -1.492093965
Service     -0.011176619 -0.011176583
Decor        0.044193000  0.044193023
Food         0.057733737  0.057733770
Price        0.001797941  0.001797934

Probabilidade de log de regressão logística

A função de critério correspondente ao MLE no modelo de regressão logística é a função de probabilidade de log.

registroeun(β)=Eu=1n(YEuregistroΛ(XEuβ)+(1-YEu)registro(1-Λ(XEuβ)))
Λ(k)=1/(1+exp(-k))
β^=argmaxβregistroeun(β)

Eu mostro como construir e otimizar a função de critério usando a optim()função novamente empregando o algoritmo BFGS.

#================================================
# compute the logistic regression parameters as 
#   an optimal value
#================================================
# define the logistic transformation
logit = function(mX, vBeta) {
  return(exp(mX %*% vBeta)/(1+ exp(mX %*% vBeta)) )
}

# stable parametrisation of the log-likelihood function
# Note: The negative of the log-likelihood is being returned, since we will be
# /minimising/ the function.
logLikelihoodLogitStable = function(vBeta, mX, vY) {
  return(-sum(
    vY*(mX %*% vBeta - log(1+exp(mX %*% vBeta)))
    + (1-vY)*(-log(1 + exp(mX %*% vBeta)))
    ) 
  ) 
}

# initial set of parameters
vBeta0 = c(10, -0.1, -0.3, 0.001, 0.01) # arbitrary starting parameters

# minimise the (negative) log-likelihood to get the logit fit
optimLogit = optim(vBeta0, logLikelihoodLogitStable,
                   mX = mX, vY = vY, method = 'BFGS', 
                   hessian=TRUE)

#================================================
# test against the implementation in R
# NOTE glm uses IRWLS: 
# http://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares
# rather than the BFGS algorithm that we have reported
#================================================
logitSheather = glm(InMichelin ~ Service + Decor + Food + Price,
                                  data = dfSheather, 
                         family = binomial, x = TRUE)

Isso gera

> print(cbind(coef(logitSheather), optimLogit$par))
                    [,1]         [,2]
(Intercept) -11.19745057 -11.19661798
Service      -0.19242411  -0.19249119
Decor         0.09997273   0.09992445
Food          0.40484706   0.40483753
Price         0.09171953   0.09175369

Como uma ressalva, observe que os algoritmos de otimização numérica requerem uso cuidadoso ou você pode acabar com todos os tipos de soluções patológicas. Até que você os entenda bem, é melhor usar as opções empacotadas disponíveis que permitem que você se concentre em especificar o modelo, em vez de se preocupar em como calcular numericamente as estimativas.

tchakravarty
fonte
1
Grande @tchakravarty trabalho, a função de log-verossimilhança pode ser simplificada usando-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal
11

Você não pode chegar lá daqui. As soluções para o modelo linear geral e o modelo logístico surgem da solução das respectivas equações de máxima verossimilhança, mas apenas o modelo linear tem uma solução de forma fechada.

Se você consultar o livro de McCullagh e Nelder, poderá aprender como as soluções são obtidas no caso logístico (ou outro modelo generalizado). Com efeito, as soluções são produzidas iterativamente, onde cada iteração envolve a solução de uma regressão linear ponderada. Os pesos dependem em parte da função de link.

Placidia
fonte
2
ou pesquisar na web para "mínimos quadrados iterativo reponderadas" ...
Ben Bolker
Ou diretamente aqui: stats.stackexchange.com/questions/236676/…
kjetil b halvorsen