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 β )= ( X′X )- 1X′Y
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( β )= ∑i = 1n( YEuregistroΛ ( X′Euβ ) + ( 1 - YEu) log( 1 - Λ ( X′Euβ ) ) )
Λ ( 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.