L'estimateur OLS dans le modèle de régression linéaire est assez rare pour avoir la propriété de pouvoir être représenté sous forme fermée, c'est-à-dire sans avoir besoin d'être exprimé comme l'optimiseur d'une fonction. Il s'agit cependant d'un optimiseur d'une fonction - la fonction de somme résiduelle des carrés - et peut être calculé comme tel.
Le MLE dans le modèle de régression logistique est également l'optimiseur d'une fonction de vraisemblance logarithmique convenablement définie, mais comme il n'est pas disponible dans une expression sous forme fermée, il doit être calculé en tant qu'optimiseur.
La plupart des estimateurs statistiques ne peuvent être exprimés que comme optimiseurs de fonctions des données correctement construites appelées fonctions critères. De tels optimiseurs nécessitent l'utilisation d'algorithmes d'optimisation numérique appropriés. Les optimiseurs de fonctions peuvent être calculés en R à l'aide de la optim()
fonction qui fournit des algorithmes d'optimisation à usage général, ou l'un des packages les plus spécialisés tels que optimx
. Il est essentiel de savoir quel algorithme d'optimisation utiliser pour différents types de modèles et de fonctions de critères statistiques.
Somme résiduelle de régression linéaire des carrés
β^= argminβ( O- X β )′( O- X β )= ( X′X )- 1X′Oui
Dans le cas d'une fonction convexe deux fois différentiable comme la somme résiduelle des carrés, la plupart des optimiseurs basés sur un gradient font du bon travail. Dans ce cas, j'utiliserai l'algorithme 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)
Cela donne:
> 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
Log-vraisemblance de régression logistique
La fonction critère correspondant au MLE dans le modèle de régression logistique est la fonction log-vraisemblance.
JournalLn( β )= ∑i = 1n( OjeJournalΛ ( X′jeβ ) + ( 1 - Yje) journal( 1 - Λ ( X′jeβ ) ) )
où est la fonction logistique. Les estimations des paramètres sont les optimiseurs de cette fonction
Λ ( k ) = 1 / ( 1 + exp( - k ) )β^= argmaxβJournalLn( β )
Je montre comment construire et optimiser la fonction critère en utilisant optim()
à nouveau la fonction en utilisant l'algorithme 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)
Cela donne
> 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
À titre de mise en garde, notez que les algorithmes d'optimisation numérique nécessitent une utilisation prudente ou vous pouvez vous retrouver avec toutes sortes de solutions pathologiques. Jusqu'à ce que vous les compreniez bien, il est préférable d'utiliser les options packagées disponibles qui vous permettent de vous concentrer sur la spécification du modèle plutôt que de vous soucier de la façon de calculer numériquement les estimations.