R ile lojistik regresyon katsayılarını hesaplama


18

Çoklu doğrusal regresyonda aşağıdaki formülle katsayıyı bulmak mümkündür.

b=(XX)1(X)Y

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

Örneğin:

> 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 

Lojistik regresyon için beta'yı aynı "manuel" şekilde nasıl hesaplayacağımı istiyorum. Nerede y 1 veya 0 olur. Binom ailesini bir logit link ile kullandığımı varsayarsak.


1
Aslında sorduğunuz soru zaten stats.stackexchange.com/questions/949/… adresinde sorulmuştur . Sormak istediğiniz anlaşılan soru buradaki yanıtlar tarafından ele alınmaktadır.
whuber

Yanıtlar:


26

Doğrusal regresyon modelindeki OLS tahmincisi, kapalı formda temsil edilebilme özelliğine sahip olması, yani bir fonksiyonun optimize edicisi olarak ifade edilmesine gerek olmaması bakımından oldukça nadirdir. Bununla birlikte, bir işlevin optimize edicisidir - kareler işlevinin kalan toplamı - ve bu şekilde hesaplanabilir.

Lojistik regresyon modelindeki MLE aynı zamanda uygun şekilde tanımlanmış bir log-olasılık fonksiyonunun optimize edicisidir, ancak kapalı form ifadesinde bulunmadığından, bir optimizer olarak hesaplanmalıdır.

İstatistiksel tahmincilerin çoğu, ölçüt işlevleri olarak adlandırılan verilerin uygun şekilde yapılandırılmış işlevlerinin iyileştiricileri olarak ifade edilebilir. Bu gibi optimize ediciler, uygun sayısal optimizasyon algoritmalarının kullanılmasını gerektirir. Fonksiyon optim()optimizatörleri, bazı genel amaçlı optimizasyon algoritmaları sağlayan fonksiyon veya R gibi daha özel paketlerden biri kullanılarak R'de hesaplanabilir optimx. Farklı model ve istatistiksel kriter fonksiyonları için hangi optimizasyon algoritmasının kullanılacağını bilmek önemlidir.

Doğrusal regresyon artık kareler toplamı

OLS tahmincisi, kareler fonksiyonunun iyi bilinen artık toplamının optimize edici olarak tanımlanır:

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

Kalan kareler toplamı gibi iki farklılaşabilir, dışbükey bir fonksiyon olması durumunda, gradyan temelli optimizatörlerin çoğu iyi bir iş çıkarır. Bu durumda, BFGS algoritmasını kullanacağım.

#================================================
# 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)

Bu şu sonuçları verir:

> 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

Lojistik regresyon log olasılığı

Lojistik regresyon modelinde MLE'ye karşılık gelen kriter fonksiyonu, log-olasılık fonksiyonudur.

logLn(β)=i=1n(YilogΛ(Xiβ)+(1Yi)log(1Λ(Xiβ)))
Λ(k)=1/(1+exp(k))
β^=argmaxβlogLn(β)

Bir optim()kez daha BFGS algoritmasını kullanarak fonksiyonu kullanarak kriter fonksiyonunun nasıl oluşturulacağını ve optimize edileceğini göstereceğim .

#================================================
# 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)

Bu,

> 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

Bir uyarı olarak, sayısal optimizasyon algoritmalarının dikkatli bir şekilde kullanılması gerektiğini veya her türlü patolojik çözümle sonuçlanabileceğinizi unutmayın. Onları iyi anlayana kadar, tahminleri sayısal olarak nasıl hesaplayacağınız konusunda endişelenmek yerine, modeli belirlemeye konsantre olmanızı sağlayan mevcut paketlenmiş seçenekleri kullanmak en iyisidir.


1
Büyük iş @tchakravarty, günlük olabilirlik işlevi kullanılarak basitleştirilebilir-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal

11

Buradan oraya gidemezsin. Hem genel doğrusal modele hem de lojistik modele yönelik çözümler, ilgili maksimum olabilirlik denklemlerinin çözülmesinden kaynaklanır, ancak sadece doğrusal modelin kapalı bir form çözümü vardır.

McCullagh ve Nelder'in kitabına bakarsanız, lojistik durumda (veya başka bir genelleştirilmiş modelde) çözümlerin nasıl elde edildiğini öğrenebilirsiniz. Gerçekte, çözeltiler, her iterasyonun ağırlıklı bir lineer regresyonun çözülmesini içerdiği tekrarlamalı olarak üretilir. Ağırlıklar kısmen link fonksiyonuna bağlıdır.


2
veya "iteratively reweighted en küçük kareler" için web'de arama yapın ...
Ben Bolker

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.