สมมติว่าโมเดลนี้มีตัวแปรตอบกลับของ Bernoulliด้วยY iA ≤ 1Yผม
Pr(Yi=1)=A1+e−X′ib,
ที่ (และอาจขึ้นอยู่กับว่ามันจะถือว่าเป็นค่าคงที่หรือพารามิเตอร์) เป็นค่าสัมประสิทธิ์การติดตั้งและเป็นข้อมูลสำหรับการสังเกตฉันฉันคิดว่าคำว่าดักจับถูกจัดการโดยการเพิ่มตัวแปรที่มีค่าคงที่ 1 ในเมทริกซ์ข้อมูลA X i ibAXii
เงื่อนไขขณะนี้คือ:
E[(Yi−A1+e−X′ib)Xi]=0.
เราแทนที่สิ่งนี้ด้วยตัวอย่างคู่ของเงื่อนไขโดยสมมติว่ามีการสังเกต :N
m=1N∑i=1N[(Yi−A1+e−X′ib)Xi]=0
สิ่งนี้ได้รับการแก้ไขในทางปฏิบัติโดยการลดในค่าสัมประสิทธิ์ที่เป็นไปได้ทั้งหมด (ด้านล่างเราจะใช้Nelder-Mead simplexเพื่อทำการเพิ่มประสิทธิภาพนี้)m′mb
การยืมตัวจากการสอน 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 เป็นฟังก์ชั่นที่ให้ผลตอบแทนเงื่อนไขช่วงเวลาคือแถวสำหรับแต่ละสังเกต :(Yi−A1+e−X′ib)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 โดยตรงโดยดำเนินการเพิ่มประสิทธิภาพเดียวกันกับที่เราได้รับด้านบนด้วยการเรียกไปที่:m′moptim
gmm
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