ใช้วิธีการทั่วไปของช่วงเวลา (GMM) ในการคำนวณพารามิเตอร์การถดถอยโลจิสติก


13

ฉันต้องการคำนวณค่าสัมประสิทธิ์การถดถอยที่คล้ายกับการถดถอยแบบลอจิสติก (จริง ๆ แล้วการถดถอยแบบโลจิสติกที่มีสัมประสิทธิ์อื่น: เมื่อได้รับ ) ฉันคิดว่าจะใช้ GMM เพื่อคำนวณค่าสัมประสิทธิ์ แต่ฉันไม่แน่ใจว่าควรใช้เงื่อนไขใดในขณะนี้A

A1+e(b0+b1x1+b2x2+),
A

มีใครช่วยฉันได้บ้าง

ขอบคุณ!


เมื่อคุณพูดว่า " จะได้รับ" คุณหมายความว่ามันจะถูกระบุโดยผู้ใช้หรือมันเป็นที่คาดโดยรูปแบบ? A
มาโคร

ทางใดทางหนึ่ง ฉันสามารถใส่เป็นอินพุต (เช่น A = 0.25) หรือเป็นหนึ่งในค่าสัมประสิทธิ์ที่จะพบ
user5497

มันแตกต่างจากเรื่องไปยังเรื่อง (เช่นข้อมูล) หรือเป็นค่าคงที่ในทุกการสังเกต?
มาโคร

แก้ไขในการสังเกตทั้งหมด (เช่น b0, b1, ... )
user5497

2
ทำไมไม่ใช้โอกาสสูงสุดแทน GMM
มาโคร

คำตอบ:


6

สมมติว่าโมเดลนี้มีตัวแปรตอบกลับของ Bernoulliด้วยY iA1Yi

Pr(Yi=1)=A1+eXib,

ที่ (และอาจขึ้นอยู่กับว่ามันจะถือว่าเป็นค่าคงที่หรือพารามิเตอร์) เป็นค่าสัมประสิทธิ์การติดตั้งและเป็นข้อมูลสำหรับการสังเกตฉันฉันคิดว่าคำว่าดักจับถูกจัดการโดยการเพิ่มตัวแปรที่มีค่าคงที่ 1 ในเมทริกซ์ข้อมูลA X i ibAXii

เงื่อนไขขณะนี้คือ:

E[(YiA1+eXib)Xi]=0.

เราแทนที่สิ่งนี้ด้วยตัวอย่างคู่ของเงื่อนไขโดยสมมติว่ามีการสังเกต :N

m=1Ni=1N[(YiA1+eXib)Xi]=0

สิ่งนี้ได้รับการแก้ไขในทางปฏิบัติโดยการลดในค่าสัมประสิทธิ์ที่เป็นไปได้ทั้งหมด (ด้านล่างเราจะใช้Nelder-Mead simplexเพื่อทำการเพิ่มประสิทธิภาพนี้)mmb

การยืมตัวจากการสอน R-bloggers ที่ยอดเยี่ยมในหัวข้อนั้นมันค่อนข้างตรงไปตรงมาที่จะใช้มันใน R กับแพ็คเกจ gmm ตัวอย่างเช่นลองทำงานกับชุดข้อมูล iris โดยทำนายว่าม่านตามีสีหลายสีตามความยาวและความกว้าง sepal และความยาวกลีบดอกและความกว้าง ฉันจะถือว่าคงที่และเท่ากับ 1 ในกรณีนี้:A

dat <- as.matrix(cbind(data.frame(IsVersicolor = as.numeric(iris$Species == "versicolor"), Intercept=1), iris[,1:4]))
head(dat)
#      IsVersicolor Intercept Sepal.Length Sepal.Width Petal.Length Petal.Width
# [1,]            0         1          5.1         3.5          1.4         0.2
# [2,]            0         1          4.9         3.0          1.4         0.2
# [3,]            0         1          4.7         3.2          1.3         0.2
# [4,]            0         1          4.6         3.1          1.5         0.2
# [5,]            0         1          5.0         3.6          1.4         0.2
# [6,]            0         1          5.4         3.9          1.7         0.4

นี่คือสัมประสิทธิ์ที่เหมาะสมโดยใช้การถดถอยโลจิสติก:

summary(glm(IsVersicolor~., data=as.data.frame(dat[,-2]), family="binomial"))
# Coefficients:
#              Estimate Std. Error z value Pr(>|z|)    
# (Intercept)    7.3785     2.4993   2.952 0.003155 ** 
# Sepal.Length  -0.2454     0.6496  -0.378 0.705634    
# Sepal.Width   -2.7966     0.7835  -3.569 0.000358 ***
# Petal.Length   1.3136     0.6838   1.921 0.054713 .  
# Petal.Width   -2.7783     1.1731  -2.368 0.017868 *  

ชิ้นส่วนหลักที่เราจำเป็นต้องใช้ gmm เป็นฟังก์ชั่นที่ให้ผลตอบแทนเงื่อนไขช่วงเวลาคือแถวสำหรับแต่ละสังเกต :(YiA1+eXib)Xii

moments <- function(b, X) {
  A <- 1
  as.vector(X[,1] - A / (1 + exp(-(X[,-1] %*% cbind(b))))) * X[,-1]
}

ตอนนี้เราสามารถใส่ตัวเลขสัมประสิทธิ์โดยใช้สัมประสิทธิ์การถดถอยเชิงเส้นเป็นจุดเริ่มต้นที่สะดวก (ตามที่แนะนำในการสอนที่เชื่อมโยงด้านบน):b

init.coef <- lm(IsVersicolor~., data=as.data.frame(dat[,-2]))$coefficients
library(gmm)
fitted <- gmm(moments, x = dat, t0 = init.coef, type = "iterative", crit = 1e-19,
              wmatrix = "optimal", method = "Nelder-Mead",
              control = list(reltol = 1e-19, maxit = 20000))
fitted
#  (Intercept)  Sepal.Length   Sepal.Width  Petal.Length   Petal.Width  
#      7.37849      -0.24536      -2.79657       1.31364      -2.77834  
# 
# Convergence code =  0 

รหัสการบรรจบของ 0 หมายถึงขั้นตอนการรวมกันและพารามิเตอร์เหมือนกันกับการคืนค่าโดยการถดถอยโลจิสติก

ดูอย่างรวดเร็วที่แหล่งแพคเกจ gmm (ฟังก์ชั่นmomentEstim.baseGmm.iterativeและgmm:::.obj1พารามิเตอร์ที่ให้ไว้) แสดงให้เห็นว่าแพคเกจ gmm จะลดตามที่ระบุข้างต้น รหัสที่เทียบเท่าดังต่อไปนี้จะเรียกใช้ฟังก์ชันR โดยตรงโดยดำเนินการเพิ่มประสิทธิภาพเดียวกันกับที่เราได้รับด้านบนด้วยการเรียกไปที่:mmoptimgmm

gmm.objective <- function(theta, x, momentFun) {
  avg.moment <- colMeans(momentFun(theta, x))
  sum(avg.moment^2)
}
optim(init.coef, gmm.objective, x=dat, momentFun=moments,
      control = list(reltol = 1e-19, maxit = 20000))$par
#  (Intercept) Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#    7.3784866   -0.2453567   -2.7965681    1.3136433   -2.7783439 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.