Berechnen Sie Koeffizienten in einer logistischen Regression mit R

18

Bei einer multiplen linearen Regression kann der Koeffizient mit der folgenden Formel ermittelt werden.

b=(XX)-1(X)Y.

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

Zum Beispiel:

> 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 

Ich würde gerne in der gleichen "manuellen" Weise die Beta für eine logistische Regression berechnen. Wobei das y natürlich 1 oder 0 ist. Angenommen, ich verwende die Binomialfamilie mit einem Logit-Link.

S12000
quelle
1
Die Frage, die Sie tatsächlich stellen, wurde bereits unter stats.stackexchange.com/questions/949/… gestellt . Die Frage, die Sie anscheinend stellen wollten , wird hier beantwortet.
Whuber

Antworten:

26

Der OLS-Schätzer im linearen Regressionsmodell hat nur selten die Eigenschaft, dass er in geschlossener Form dargestellt werden kann, ohne dass er als Optimierer einer Funktion ausgedrückt werden muss. Es ist jedoch ein Optimierer einer Funktion - die Restfunktion der Quadrate - und kann als solche berechnet werden.

Das MLE im logistischen Regressionsmodell ist auch der Optimierer einer geeignet definierten Log-Likelihood-Funktion, da es jedoch nicht in einem geschlossenen Ausdruck verfügbar ist, muss es als Optimierer berechnet werden.

Die meisten statistischen Schätzer können nur als Optimierer für entsprechend konstruierte Funktionen der Daten ausgedrückt werden, die als Kriteriumsfunktionen bezeichnet werden. Solche Optimierer erfordern die Verwendung geeigneter numerischer Optimierungsalgorithmen. Optimierer von Funktionen können in R unter Verwendung der optim()Funktion berechnet werden , die einige allgemeine Optimierungsalgorithmen oder eines der spezialisierteren Pakete wie z optimx. Es ist entscheidend zu wissen, welcher Optimierungsalgorithmus für verschiedene Modelltypen und statistische Kriterienfunktionen verwendet werden muss.

Restquadratsumme der linearen Regression

Die OLS Schätzer als Optimierer des bekannten Restquadratsumme definiert ist

β^=argMindestβ(Y.-Xβ)(Y.-Xβ)=(XX)-1XY.

Bei einer doppelt differenzierbaren, konvexen Funktion wie der Restsumme der Quadrate leisten die meisten gradientenbasierten Optimierer gute Arbeit. In diesem Fall verwende ich den BFGS-Algorithmus.

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

Dies ergibt:

> 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

Logistische Regressionslog-Wahrscheinlichkeit

Die dem MLE im logistischen Regressionsmodell entsprechende Kriteriumsfunktion ist die Log-Likelihood-Funktion.

LogLn(β)=ich=1n(Y.ichLogΛ(Xichβ)+(1-Y.ich)Log(1-Λ(Xichβ)))
Λ(k)=1/(1+exp(-k))
β^=argmaxβLogLn(β)

Ich zeige, wie man die Kriteriumsfunktion mit der optim()Funktion wieder unter Verwendung des BFGS-Algorithmus konstruiert und optimiert .

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

Dies ergibt

> 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

Beachten Sie als Einschränkung, dass numerische Optimierungsalgorithmen eine sorgfältige Verwendung erfordern oder dass Sie am Ende alle möglichen pathologischen Lösungen haben. Bis Sie sie gut verstanden haben, sollten Sie die verfügbaren Paketoptionen verwenden, mit denen Sie sich auf die Angabe des Modells konzentrieren können, anstatt sich Gedanken darüber zu machen, wie die Schätzungen numerisch berechnet werden.

tchakravarty
quelle
1
Großartige Arbeit @tchakravarty, die Log-Likelihood-Funktion kann durch die Verwendung von-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal
11

Sie können von hier nicht dorthin gelangen. Die Lösungen sowohl für das allgemeine lineare Modell als auch für das logistische Modell ergeben sich aus der Lösung der jeweiligen Maximum-Likelihood-Gleichungen, aber nur das lineare Modell hat eine geschlossene Lösung.

Wenn Sie das Buch von McCullagh und Nelder lesen, erfahren Sie, wie die Lösungen im logistischen Fall (oder einem anderen verallgemeinerten Modell) erzielt werden. Tatsächlich werden die Lösungen iterativ erstellt, wobei für jede Iteration eine gewichtete lineare Regression gelöst wird. Die Gewichte hängen zum Teil von der Verbindungsfunktion ab.

Placidia
quelle
2
Oder durchsuchen Sie das Web nach "iterativ neu gewichteten kleinsten Quadraten" ...
Ben Bolker
Oder direkt hier: stats.stackexchange.com/questions/236676/…
kjetil b halvorsen