Rを使用してロジスティック回帰の係数を計算する


18

多重線形回帰では、次の式で係数を見つけることができます。

b=(XX)1(X)Y

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 

ロジスティック回帰のベータを同じ「手動」方法で計算する方法を教えてください。もちろん、yは1または0になります。ロジットリンクで二項族を使用していると仮定します。


1
あなたが実際に尋ねる質問は、すでにstats.stackexchange.com/questions/949/…で提起されています。あなたが尋ねたいと思われる質問は、ここの答えで対処されます。
whuber

回答:


26

線形回帰モデルのOLS推定器は、閉じた形式で表現できる、つまり関数のオプティマイザーとして表現する必要がないという性質を持つことは非常にまれです。ただし、これは関数のオプティマイザー(残差平方和関数)であり、そのように計算できます。

ロジスティック回帰モデルのMLEは、適切に定義された対数尤度関数のオプティマイザーでもありますが、閉形式の式では使用できないため、オプティマイザーとして計算する必要があります。

ほとんどの統計的推定量は、基準関数と呼ばれるデータの適切に構築された関数のオプティマイザーとしてのみ表現できます。このようなオプティマイザーには、適切な数値最適化アルゴリズムの使用が必要です。関数のオプティマイザーはoptim()、汎用の最適化アルゴリズムを提供する関数、またはなどのより特殊なパッケージの1つを使用して、Rで計算できますoptimx。さまざまなタイプのモデルと統計的基準関数に使用する最適化アルゴリズムを知ることが重要です。

線形回帰残差平方和

OLS推定器は、よく知られている残差平方和関数のオプティマイザーとして定義されます:

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

残差平方和のような2回微分可能な凸関数の場合、ほとんどの勾配ベースのオプティマイザーはうまく機能します。この場合、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Λ(Xiβ)+(1Yi)log(1Λ(Xiβ)))
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

警告として、数値最適化アルゴリズムは慎重に使用する必要があることに注意してください。それらを十分に理解するまで、推定値を数値的に計算する方法を心配するのではなく、モデルの指定に集中できる使用可能なパッケージオプションを使用するのが最善です。


1
@tchakravartyのすばらしい仕事です。対数尤度関数は次を使用して単純化できます。-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal

11

ここからは行けません。一般的な線形モデルとロジスティックモデルの両方の解は、それぞれの最尤方程式を解くことから生じますが、線形モデルのみが閉形式の解を持ちます。

McCullagh and Nelderの本を参照すると、ロジスティックケース(またはその他の一般化モデル)でソリューションがどのように取得されるかを知ることができます。実際には、ソリューションは反復的に生成され、各反復には重み付き線形回帰の解法が含まれます。重みは部分的にリンク関数に依存します。


2
または...「反復的に再重み付け最小二乗法」のためにウェブを検索
ベンBolker

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.