Оцінювач OLS в моделі лінійної регресії є досить рідкісним властивістю того, що він може бути представлений у закритому вигляді, тобто не потрібно виражати його як оптимізатор функції. Однак це оптимізатор функції - залишкова сума функції квадратів - і може бути обчислений як такий.
MLE в моделі логістичної регресії також є оптимізатором відповідно визначеної функції вірогідності журналу, але оскільки вона недоступна в виразі закритої форми, вона повинна бути обчислена як оптимізатор.
Більшість статистичних оцінювачів виражаються лише як оптимізатори належним чином побудованих функцій даних, що називаються критерійними функціями. Такі оптимізатори вимагають використання відповідних алгоритмів чисельної оптимізації. Оптимізатори функцій можуть бути обчислені в R за допомогою optim()
функції, яка забезпечує деякі алгоритми оптимізації загального призначення, або одного з більш спеціалізованих пакетів, таких як optimx
. Знання, який алгоритм оптимізації використовувати для різних типів моделей та функцій статистичного критерію є ключовим.
Лінійна регресія залишкова сума квадратів
Оцінювач OLS визначається як оптимізатор відомої функції залишкової суми квадратів:
β^=argminβ(Y−Xβ)′(Y−Xβ)=(X′X)−1X′Y
У разі подвійно диференційованої, опуклої функції, як залишкова сума квадратів, більшість оптимізаторів на основі градієнта добре справляються. У цьому випадку я буду використовувати алгоритм 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)
Це дає:
> 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
Логістична регресія лог-вірогідність
Критеріальною функцією, що відповідає MLE в моделі логістичної регресії, є функція вірогідності журналу.
logLn(β)=∑i=1n(YilogΛ(X′iβ)+(1−Yi)log(1−Λ(X′iβ)))
where - це логістична функція. Оцінки параметрів є оптимізаторами цієї функції
Λ(k)=1/(1+exp(−k))β^=argmaxβlogLn(β)
Я показую, як побудувати та оптимізувати функцію критерію, використовуючи optim()
функцію ще раз, використовуючи алгоритм 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)
Це дає
> 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
Зауважте, що алгоритми чисельної оптимізації потребують ретельного використання, або ви можете вирішити всілякі патологічні рішення. Поки ви їх добре не зрозумієте, найкраще скористатися наявними пакетованими опціями, які дозволять вам сконцентруватися на конкретизації моделі, а не перейматися питанням чисельного обчислення оцінок.