Calcular coeficientes en una regresión logística con R

18

En una regresión lineal múltiple es posible encontrar el coeficiente con la siguiente fórmula.

si=(XX)-1(X)Y

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

Por ejemplo:

> 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 

Me gustaría calcular de la misma manera "manual" la beta para una regresión logística. Donde, por supuesto, y sería 1 o 0. Suponiendo que estoy usando la familia binomial con un enlace logit.

S12000
fuente
1
La pregunta que realmente hace ya se ha planteado en stats.stackexchange.com/questions/949/… . La pregunta que parece que quería hacer se aborda en las respuestas aquí.
whuber

Respuestas:

26

El estimador OLS en el modelo de regresión lineal es bastante raro al tener la propiedad de que puede representarse en forma cerrada, es decir, sin necesidad de ser expresado como el optimizador de una función. Sin embargo, es un optimizador de una función, la función de suma de cuadrados residual, y puede calcularse como tal.

El MLE en el modelo de regresión logística también es el optimizador de una función de probabilidad de registro definida adecuadamente, pero como no está disponible en una expresión de forma cerrada, debe calcularse como un optimizador.

La mayoría de los estimadores estadísticos solo se pueden expresar como optimizadores de funciones construidas apropiadamente de los datos llamadas funciones de criterio. Dichos optimizadores requieren el uso de algoritmos de optimización numéricos apropiados. Los optimizadores de funciones se pueden calcular en R utilizando la optim()función que proporciona algunos algoritmos de optimización de propósito general, o uno de los paquetes más especializados como optimx. Saber qué algoritmo de optimización usar para diferentes tipos de modelos y funciones de criterio estadístico es clave.

Regresión lineal suma residual de cuadrados

Los OLS estimador se define como el optimizador de la suma residual conocido de cuadrados

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

En el caso de una función convexa dos veces diferenciable como la suma residual de cuadrados, la mayoría de los optimizadores basados ​​en gradiente hacen un buen trabajo. En este caso, usaré el 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)

Esto produce:

> 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

Regresión logística log-verosimilitud

La función de criterio correspondiente al MLE en el modelo de regresión logística es la función de log-verosimilitud.

logLn(β)=i=1n(YilogΛ(Xiβ)+(1Yi)log(1Λ(Xiβ)))
Λ(k)=1/(1+exp(k))
β^=argmaxβlogLn(β)

Muestro cómo construir y optimizar la función de criterio usando la optim()función una vez más empleando el 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)

Esto produce

> 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 advertencia, tenga en cuenta que los algoritmos de optimización numérica requieren un uso cuidadoso o puede terminar con todo tipo de soluciones patológicas. Hasta que los entienda bien, es mejor usar las opciones empaquetadas disponibles que le permiten concentrarse en especificar el modelo en lugar de preocuparse por cómo calcular numéricamente las estimaciones.

tchakravarty
fuente
1
Gran trabajo @tchakravarty, la función de log-verosimilitud se puede simplificar usando-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal
11

No puedes llegar desde aquí. Las soluciones tanto para el modelo lineal general como para el modelo logístico surgen de la resolución de las respectivas ecuaciones de máxima verosimilitud, pero solo el modelo lineal tiene una solución de forma cerrada.

Si consulta el libro de McCullagh y Nelder, puede aprender cómo se obtienen las soluciones en el caso logístico (u otro modelo generalizado). En efecto, las soluciones se producen de forma iterativa, donde cada iteración implica resolver una regresión lineal ponderada. Los pesos dependen en parte de la función de enlace.

Placidia
fuente
2
o busque en la web "mínimos cuadrados reponderados de forma iterativa" ...
Ben Bolker
O directamente aquí: stats.stackexchange.com/questions/236676/…
kjetil b halvorsen