R을 사용하여 로지스틱 회귀 분석에서 계수 계산


18

다중 선형 회귀 분석에서 다음 공식의 계수를 찾을 수 있습니다.

=(엑스'엑스)1(엑스')와이

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()는 일부 범용 최적화 알고리즘을 제공 하는 함수 또는와 같은보다 특수화 된 패키지 중 하나를 사용하여 R에서 계산할 수 있습니다 optimx. 다양한 유형의 모델과 통계 기준 기능에 사용할 최적화 알고리즘을 아는 것이 중요합니다.

선형 회귀 잔차 제곱합

OLS 추정기는 잘 알려진 잔차 제곱합 함수의 최적화 프로그램으로 정의됩니다 :

β^=인수β(와이엑스β)'(와이엑스β)=(엑스'엑스)1엑스'와이

잔차 제곱합과 같이 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에 해당하는 기준 함수는 로그 우도 함수입니다.

로그(β)=나는=1(와이나는로그Λ(엑스나는'β)+(1와이나는)로그(1Λ(엑스나는'β)))
여기서 는 로지스틱 함수입니다. 모수 추정값은이 함수의 최적화 프로그램입니다. Λ(케이)=1/(1+특급(케이))
β^=인수최대β로그(β)

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와 Nelder의 책을 참고하면 물류 사례 (또는 다른 일반화 된 모델)에서 솔루션을 얻는 방법을 배울 수 있습니다. 실제로, 솔루션은 반복적으로 생성되며, 각 반복에는 가중 선형 회귀 분석이 포함됩니다. 가중치는 부분적으로 링크 기능에 따라 다릅니다.


2
또는 웹에서 "반복적으로 가중 된 최소 제곱"을 검색하십시오.
Ben Bolker

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.