线性回归模型中的 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
逻辑回归对数似然
Logistic回归模型中MLE对应的准则函数是对数似然函数。
logLn(β)=∑i=1n(YilogΛ(X′iβ)+(1−Yi)log(1−Λ(X′iβ)))
在哪里Λ(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
需要注意的是,请注意数值优化算法需要小心使用,否则您最终可能会遇到各种病态的解决方案。在您很好地理解它们之前,最好使用可用的打包选项,让您专注于指定模型,而不是担心如何数值计算估计值。