Рассчитать коэффициенты в логистической регрессии с помощью R

18

В множественной линейной регрессии можно найти коэффициент по следующей формуле.

бзнак равно(Икс'Икс)-1(Икс')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 

Я хотел бы, как таким же «ручным» способом рассчитать бета-версию для логистической регрессии. Где, конечно, у будет 1 или 0. Предполагая, что я использую семейство биномов со ссылкой на логит.

S12000
источник
1
Вопрос, который вы фактически задаете, уже был задан по адресу stats.stackexchange.com/questions/949/… . Вопрос, который вы хотели задать, решается с помощью ответов здесь.
whuber

Ответы:

26

Оценщик OLS в модели линейной регрессии довольно редко обладает тем свойством, что он может быть представлен в закрытой форме, то есть без необходимости выражать его как оптимизатор функции. Однако он является оптимизатором функции - функции остаточной суммы квадратов - и может быть вычислен как таковой.

MLE в модели логистической регрессии также является оптимизатором надлежащим образом определенной логарифмической функции правдоподобия, но, поскольку она недоступна в выражении закрытой формы, она должна быть вычислена как оптимизатор.

Большинство статистических оценок могут быть выражены только как оптимизаторы правильно сконструированных функций данных, называемых критериальными функциями. Такие оптимизаторы требуют использования соответствующих алгоритмов численной оптимизации. Оптимизаторы функций могут быть вычислены в R с использованием optim()функции, которая предоставляет некоторые алгоритмы оптимизации общего назначения, или одного из более специализированных пакетов, таких как optimx. Знание того, какой алгоритм оптимизации использовать для различных типов моделей и статистических критериальных функций, является ключевым.

Линейная регрессия остаточной суммы квадратов

Оценщик OLS определяется как оптимизатор известной функции остаточной суммы квадратов:

β^знак равноArgминβ(Y-Иксβ)'(Y-Иксβ)знак равно(Икс'Икс)-1Икс'Y

В случае дважды дифференцируемой выпуклой функции, такой как остаточная сумма квадратов, большинство оптимизаторов на основе градиента делают хорошую работу. В этом случае я буду использовать алгоритм 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 в модели логистической регрессии, является функция логарифмического правдоподобия.

журналLN(β)знак равноΣязнак равно1N(YяжурналΛ(Икся'β)+(1-Yя)журнал(1-Λ(Икся'β)))
где - логистическая функция. Оценки параметров являются оптимизаторами этой функции Λ(К)знак равно1/(1+ехр(-К))
β^знак равноArgМаксимумβжурналLN(β)

Я покажу, как построить и оптимизировать функцию критерия, используя 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

В качестве предостережения отметим, что алгоритмы численной оптимизации требуют осторожного использования, иначе вы можете получить всевозможные патологические решения. Пока вы их не понимаете, лучше всего использовать доступные пакетные опции, которые позволяют вам сконцентрироваться на определении модели, а не беспокоиться о том, как вычислить числовые оценки.

tchakravarty
источник
1
Отличная работа @tchakravarty, функция логарифмического правдоподобия может быть упрощена с помощью-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal
11

Вы не можете добраться отсюда. Решения как общей линейной модели, так и логистической модели возникают из решения соответствующих уравнений максимального правдоподобия, но только линейная модель имеет решение в замкнутой форме.

Если вы обратитесь к книге МакКаллаха и Нелдера, вы сможете узнать, как получаются решения в логистическом случае (или другой обобщенной модели). По сути, решения создаются итеративно, где каждая итерация включает решение взвешенной линейной регрессии. Весовые коэффициенты частично зависят от функции связи.

Placidia
источник
2
или
поищите
Или прямо здесь: stats.stackexchange.com/questions/236676/…
kjetil b halvorsen