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 β )= ( X′X )- 1X′Y
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Λ(X′iβ)+(1−Yi)log(1−Λ(X′iβ)))
Λ(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.