คำนวณค่าสัมประสิทธิ์ในการถดถอยโลจิสติกกับ R


18

ในการถดถอยเชิงเส้นแบบหลายค่าสามารถหาค่าสัมประสิทธิ์ได้ด้วยสูตรต่อไปนี้

=(X'X)-1(X')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 

ฉันต้องการวิธีคำนวณด้วยวิธี "แบบแมนนวล" แบบเบต้าสำหรับการถดถอยโลจิสติก แน่นอนว่า y จะเท่ากับ 1 หรือ 0 สมมติว่าฉันใช้ตระกูลทวินามกับลิงค์ logit


1
คำถามที่คุณจริงขอให้ได้รับการโพสต์แล้วที่stats.stackexchange.com/questions/949/... คำถามที่ดูเหมือนว่าคุณต้องการถามตอบโดยคำตอบที่นี่
whuber

คำตอบ:


26

ตัวประมาณ OLS ในตัวแบบการถดถอยเชิงเส้นค่อนข้างหายากในการมีคุณสมบัติที่สามารถถูกแสดงในรูปแบบปิดซึ่งไม่จำเป็นต้องแสดงเป็นตัวเพิ่มประสิทธิภาพของฟังก์ชัน อย่างไรก็ตามมันเป็นตัวเพิ่มประสิทธิภาพของฟังก์ชั่น - ผลรวมที่เหลือของฟังก์ชันกำลังสอง - และสามารถคำนวณได้เช่นนี้

MLE ในรูปแบบการถดถอยโลจิสติกยังเป็นเครื่องมือเพิ่มประสิทธิภาพของฟังก์ชั่นบันทึกความน่าจะเป็นที่กำหนดอย่างเหมาะสม แต่เนื่องจากมันไม่สามารถใช้ได้ในการแสดงออกของรูปแบบปิดจึงต้องคำนวณเป็นเครื่องมือเพิ่มประสิทธิภาพ

ตัวประมาณค่าทางสถิติส่วนใหญ่สามารถแสดงผลได้เฉพาะเมื่อตัวเพิ่มประสิทธิภาพของฟังก์ชันที่สร้างขึ้นอย่างเหมาะสมของข้อมูลที่เรียกว่าฟังก์ชันเกณฑ์ เครื่องมือเพิ่มประสิทธิภาพดังกล่าวจำเป็นต้องใช้อัลกอริทึมการเพิ่มประสิทธิภาพเชิงตัวเลขที่เหมาะสม เพิ่มประสิทธิภาพของการทำงานสามารถคำนวณได้ในการวิจัยโดยใช้ฟังก์ชั่นที่ช่วยให้ขั้นตอนวิธีการเพิ่มประสิทธิภาพวัตถุประสงค์บางทั่วไปหรือหนึ่งในแพคเกจความเชี่ยวชาญมากขึ้นเช่นoptim() optimxการรู้ว่าอัลกอริธึมการปรับให้เหมาะสมแบบใดที่จะใช้สำหรับรุ่นต่างๆและฟังก์ชันเกณฑ์ทางสถิติเป็นกุญแจสำคัญ

การถดถอยเชิงเส้นผลรวมที่เหลือของกำลังสอง

ตัวประมาณ OLS ถูกกำหนดให้เป็นเครื่องมือเพิ่มประสิทธิภาพของผลรวมที่เหลือของฟังก์ชันกำลังสองที่รู้จักกันดี:

β^=หาเรื่องนาทีβ(Y-Xβ)'(Y-Xβ)=(X'X)-1X'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ผมเข้าสู่ระบบΛ(Xผม'β)+(1-Yผม)เข้าสู่ระบบ(1-Λ(Xผม'β)))
โดยที่เป็นฟังก์ชันลอจิสติก การประมาณพารามิเตอร์เป็นตัวเพิ่มประสิทธิภาพของฟังก์ชั่นนี้ Λ(k)=1/(1+ประสบการณ์(-k))
β^=หาเรื่องสูงสุดβเข้าสู่ระบบ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

ในฐานะข้อควรระวังโปรดทราบว่าอัลกอริธึมการเพิ่มประสิทธิภาพเชิงตัวเลขจำเป็นต้องใช้อย่างระมัดระวังหรือคุณสามารถจบลงด้วยการแก้ปัญหาทางพยาธิสภาพทุกประเภท จนกว่าคุณจะเข้าใจได้ดีแนะนำให้ใช้ตัวเลือกแพ็คเกจที่มีให้ซึ่งช่วยให้คุณมีสมาธิในการระบุรูปแบบแทนที่จะกังวลเกี่ยวกับวิธีคำนวณตัวเลข


1
Great work @tchakravarty ฟังก์ชัน log-likelihood สามารถลดความซับซ้อนลงได้โดยใช้-sum(vY%*%(mX%*%vBeta)-log(1+exp(mX%*%vBeta)))
Mamoun Benghezal

11

คุณไปไม่ได้จากที่นี่ คำตอบของทั้งตัวแบบเชิงเส้นทั่วไปและตัวแบบโลจิสติกเกิดขึ้นจากการแก้สมการความน่าจะเป็นสูงสุดตามลำดับ แต่เฉพาะตัวแบบเชิงเส้นเท่านั้นที่มีวิธีแก้ปัญหาแบบปิด

หากคุณอ่านหนังสือของ McCullagh และ Nelder คุณสามารถเรียนรู้วิธีการแก้ปัญหาในกรณีด้านโลจิสติกส์ (หรือโมเดลทั่วไปอื่น ๆ ) ผลที่ได้คือการแก้ปัญหาซ้ำแล้วซ้ำอีกซึ่งการทำซ้ำแต่ละครั้งจะเกี่ยวข้องกับการแก้ปัญหาการถดถอยเชิงเส้นแบบถ่วงน้ำหนัก น้ำหนักขึ้นอยู่กับส่วนของฟังก์ชั่นลิงค์


2
หรือค้นหาเว็บเพื่อหา "การลดน้ำหนักสแควร์สซ้ำอย่างซ้ำ ๆ ซ้ำ ๆ " ...
เบ็ลโบลเคอร์

หรือโดยตรงที่นี่: stats.stackexchange.com/questions/236676/ …
kjetil b halvorsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.