用R计算对数回归的系数


18

在多元线性回归中,可以通过以下公式找出系数。

b=XX-1个Xÿ

beta = solve(t(X) %*% X) %*% (t(X) %*% Y) ; beta

例如:

> y <- c(9.3, 4.8, 8.9, 6.5, 4.2, 6.2, 7.4, 6, 7.6, 6.1)
> x0 <- c(1,1,1,1,1,1,1,1,1,1) 
> x1 <-  c(100,50,100,100,50,80,75,65,90,90)
> x2 <- c(4,3,4,2,2,2,3,4,3,2)
> Y <- as.matrix(y)
> X <- as.matrix(cbind(x0,x1,x2))

> beta = solve(t(X) %*% X) %*% (t(X) %*% Y);beta
         [,1]
x0 -0.8687015
x1  0.0611346
x2  0.9234254
> model <- lm(y~+x1+x2) ; model$coefficients
(Intercept)          x1          x2 
 -0.8687015   0.0611346   0.9234254 

我想如何以相同的“手动”方式计算逻辑回归的beta。当然,y可以是1或0。假设我使用带logit链接的二项式族。


1
实际提出的问题已经在stats.stackexchange.com/questions/949/…中提出。这个问题似乎你想要问的是这里的答案解决。
ub

Answers:


26

线性回归模型中的OLS估计器非常罕见,因为它具有可以用闭合形式表示的属性,即无需表示为函数的优化器。但是,它是函数的优化程序(残差平方和函数),可以这样计算。

Logistic回归模型中的MLE还是适当定义的对数似然函数的优化器,但是由于它不能以闭合形式表示,因此必须将其作为优化器进行计算。

大多数统计估计量只能表示为数据的适当构造的函数(称为标准函数)的优化器。这样的优化器需要使用适当的数值优化算法。可以使用optim()提供一些通用优化算法的函数或更专业的软件包之一(例如)在R中计算函数的优化器optimx。知道针对不同类型的模型和统计准则函数使用哪种优化算法是关键。

线性回归残差平方和

OLS估计器定义为众所周知的残差平方和函数的优化器:

β^=argminβ(YXβ)(YXβ)=(XX)1XY

在二次可微的凸函数(例如残差平方和)的情况下,大多数基于梯度的优化器都表现出色。在这种情况下,我将使用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相对应的标准函数是对数似然函数。

日志大号ñβ=一世=1个ñÿ一世日志ΛX一世β+1个-ÿ一世日志1个-ΛX一世β
其中是逻辑函数。参数估计值是此函数的优化程序 Λķ=1个/1个+经验值-ķ
β^=精氨酸最高β日志大号ñβ

我将展示如何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

需要注意的是,数值优化算法需要谨慎使用,否则您可能会得到各种各样的病理学解决方案。在您完全理解它们之前,最好使用可用的打包选项,使您能够专注于指定模型,而不用担心如何用数字方式计算估计值。


1
伟大的工作@tchakravarty,可以使用-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal

11

您不能从这里到达那里。通用线性模型和逻辑模型的解决方案都来自求解各自的最大似然方程,但是只有线性模型具有封闭形式的解决方案。

如果您查阅McCullagh和Nelder的书,则可以了解如何在逻辑案例(或其他广义模型)中获得解决方案。实际上,解决方案是迭代生成的,其中每次迭代都涉及求解加权线性回归。权重部分取决于链接功能。


2
或在网上搜索“迭代加权最小二乘” ...
Ben Bolker 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.