Calcola i coefficienti in una regressione logistica con R


18

In una regressione lineare multipla è possibile scoprire il coefficiente con la seguente formula.

b=(XX)1(X)Y

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

Per esempio:

> 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 

Vorrei calcolare nello stesso modo "manuale" la beta per una regressione logistica. Dove ovviamente y sarebbe 1 o 0. Supponendo che sto usando la famiglia binomiale con un collegamento logit.


1
La domanda che in realtà fai è già stata posta stats.stackexchange.com/questions/949/… . La domanda che sembra che tu abbia voluto porre è affrontata dalle risposte qui.
whuber

Risposte:


26

Lo stimatore OLS nel modello di regressione lineare è piuttosto raro nell'avere la proprietà che può essere rappresentato in forma chiusa, senza che sia necessario esprimerlo come ottimizzatore di una funzione. È, tuttavia, un ottimizzatore di una funzione - la somma residua della funzione dei quadrati - e può essere calcolato come tale.

L'MLE nel modello di regressione logistica è anche l'ottimizzatore di una funzione di verosimiglianza opportunamente definita, ma poiché non è disponibile in un'espressione di forma chiusa, deve essere calcolato come un ottimizzatore.

La maggior parte degli stimatori statistici è espressibile solo come ottimizzatore di funzioni costruite in modo appropriato dei dati chiamati funzioni di criterio. Tali ottimizzatori richiedono l'uso di appropriati algoritmi di ottimizzazione numerica. Gli ottimizzatori di funzioni possono essere calcolati in R usando la optim()funzione che fornisce alcuni algoritmi di ottimizzazione per scopi generici, o uno dei pacchetti più specializzati come optimx. È fondamentale sapere quale algoritmo di ottimizzazione utilizzare per diversi tipi di modelli e funzioni di criterio statistico.

Somma residua di regressione lineare dei quadrati

Lo stimatore OLS è definito come l'ottimizzatore della nota funzione residua di somma dei quadrati:

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

Nel caso di una funzione convessa due volte differenziabile come la somma residua dei quadrati, la maggior parte degli ottimizzatori basati sul gradiente fanno un buon lavoro. In questo caso, userò l'algoritmo 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)

Questo produce:

> 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

Log-verosimiglianza di regressione logistica

La funzione del criterio corrispondente all'MLE nel modello di regressione logistica è la funzione di verosimiglianza logaritmica.

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

Mostro come costruire e ottimizzare la funzione criterio usando il optim() funzione ancora una volta l'algoritmo 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)

Questo cede

> 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

Come avvertimento, nota che gli algoritmi di ottimizzazione numerica richiedono un uso attento o puoi finire con tutti i tipi di soluzioni patologiche. Fino a quando non li capisci bene, è meglio usare le opzioni a pacchetto disponibili che ti consentono di concentrarti sulla specifica del modello piuttosto che preoccuparti di come calcolare numericamente le stime.


1
Ottimo lavoro @tchakravarty, la funzione di verosimiglianza log può essere semplificata utilizzando-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal,

11

Non puoi arrivarci da qui. Le soluzioni sia al modello lineare generale che al modello logistico derivano dalla risoluzione delle rispettive equazioni di massima verosimiglianza, ma solo il modello lineare ha una soluzione in forma chiusa.

Se consulti il ​​libro di McCullagh e Nelder, puoi imparare come si ottengono le soluzioni nel caso logistico (o altro modello generalizzato). In effetti, le soluzioni sono prodotte in modo iterativo, dove ogni iterazione comporta la risoluzione di una regressione lineare ponderata. I pesi dipendono in parte dalla funzione di collegamento.


2
o cerca nel web "minimi quadrati
ripetutamente ripetuti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.