Der OLS-Schätzer im linearen Regressionsmodell hat nur selten die Eigenschaft, dass er in geschlossener Form dargestellt werden kann, ohne dass er als Optimierer einer Funktion ausgedrückt werden muss. Es ist jedoch ein Optimierer einer Funktion - die Restfunktion der Quadrate - und kann als solche berechnet werden.
Das MLE im logistischen Regressionsmodell ist auch der Optimierer einer geeignet definierten Log-Likelihood-Funktion, da es jedoch nicht in einem geschlossenen Ausdruck verfügbar ist, muss es als Optimierer berechnet werden.
Die meisten statistischen Schätzer können nur als Optimierer für entsprechend konstruierte Funktionen der Daten ausgedrückt werden, die als Kriteriumsfunktionen bezeichnet werden. Solche Optimierer erfordern die Verwendung geeigneter numerischer Optimierungsalgorithmen. Optimierer von Funktionen können in R unter Verwendung der optim()
Funktion berechnet werden , die einige allgemeine Optimierungsalgorithmen oder eines der spezialisierteren Pakete wie z optimx
. Es ist entscheidend zu wissen, welcher Optimierungsalgorithmus für verschiedene Modelltypen und statistische Kriterienfunktionen verwendet werden muss.
Restquadratsumme der linearen Regression
Die OLS Schätzer als Optimierer des bekannten Restquadratsumme definiert ist
β^= argMindestβ( Y- X β )′( Y- X β )= ( X′X )- 1X′Y.
Bei einer doppelt differenzierbaren, konvexen Funktion wie der Restsumme der Quadrate leisten die meisten gradientenbasierten Optimierer gute Arbeit. In diesem Fall verwende ich den BFGS-Algorithmus.
#================================================
# 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)
Dies ergibt:
> 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
Logistische Regressionslog-Wahrscheinlichkeit
Die dem MLE im logistischen Regressionsmodell entsprechende Kriteriumsfunktion ist die Log-Likelihood-Funktion.
LogLn( β)= ∑ich = 1n(YichLogΛ ( X′ichβ ) + ( 1 - Yich) log( 1 - Λ ( X′ichβ ) ) )
Λ ( k ) = 1 / ( 1 + exp( - k ) )β^= argmaxβLogLn( β )
Ich zeige, wie man die Kriteriumsfunktion mit der optim()
Funktion wieder unter Verwendung des BFGS-Algorithmus konstruiert und optimiert .
#================================================
# 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)
Dies ergibt
> 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
Beachten Sie als Einschränkung, dass numerische Optimierungsalgorithmen eine sorgfältige Verwendung erfordern oder dass Sie am Ende alle möglichen pathologischen Lösungen haben. Bis Sie sie gut verstanden haben, sollten Sie die verfügbaren Paketoptionen verwenden, mit denen Sie sich auf die Angabe des Modells konzentrieren können, anstatt sich Gedanken darüber zu machen, wie die Schätzungen numerisch berechnet werden.