ทำไมการถดถอยโลจิสติกจึงไม่เสถียรเมื่อชั้นเรียนถูกแยกออกจากกัน คลาสที่แยกกันอย่างดีหมายถึงอะไร ฉันจะขอบคุณจริง ๆ ถ้ามีคนอธิบายตัวอย่างได้
ทำไมการถดถอยโลจิสติกจึงไม่เสถียรเมื่อชั้นเรียนถูกแยกออกจากกัน คลาสที่แยกกันอย่างดีหมายถึงอะไร ฉันจะขอบคุณจริง ๆ ถ้ามีคนอธิบายตัวอย่างได้
คำตอบ:
ไม่ถูกต้องที่การถดถอยโลจิสติกในตัวเองจะไม่เสถียรเมื่อมีการแยก การแยกหมายความว่ามีตัวแปรบางตัวที่เป็นตัวพยากรณ์ที่ดีมากซึ่งดีหรือการแยกอาจเป็นสิ่งประดิษฐ์ของการสังเกตการณ์น้อยเกินไป / ตัวแปรมากเกินไป หากเป็นกรณีนี้โซลูชันอาจได้รับข้อมูลเพิ่มเติม แต่การแยกตัวเองเป็นเพียงอาการและไม่ใช่ปัญหาในตัวเอง
ดังนั้นจึงมีหลายกรณีที่ต้องรับการรักษา ก่อนเป้าหมายของการวิเคราะห์คืออะไร? หากผลสุดท้ายของการวิเคราะห์เป็นการจำแนกประเภทของบางกรณีการแยกนั้นไม่มีปัญหาเลยหมายความว่ามีตัวแปรที่ดีมากที่ให้การจำแนกที่ดีมาก แต่ถ้าเป้าหมายคือการประเมินความเสี่ยงเราจำเป็นต้องมีการประมาณพารามิเตอร์และด้วยการแยกการประมาณการ mle ปกติ (ความน่าจะเป็นสูงสุด) ไม่มีอยู่จริง ดังนั้นเราต้องเปลี่ยนวิธีการประมาณบางที มีข้อเสนอหลายอย่างในวรรณคดีฉันจะกลับมาที่
จากนั้นก็มีสาเหตุที่แตกต่างกันสองอย่างที่เป็นไปได้สำหรับการแยก อาจมีการแยกในประชากรทั้งหมดหรือการแยกอาจเกิดจากกรณีที่สังเกตน้อย / ตัวแปรมากเกินไป
สิ่งที่แตกต่างจากการแยกกันคือขั้นตอนการประมาณค่าความน่าจะเป็นสูงสุด การประมาณพารามิเตอร์ mle (หรืออย่างน้อยก็บางส่วน) จะไม่มีที่สิ้นสุด ฉันพูดในรุ่นแรกของคำตอบนี้ว่าสามารถแก้ไขได้อย่างง่ายดายอาจมี bootstrapping แต่ไม่ทำงานเนื่องจากจะมีการแยกในแต่ละ bootstrap resample อย่างน้อยกับกรณีปกติ bootstrapping ขั้นตอน แต่การถดถอยโลจิสติกยังคงเป็นรูปแบบที่ถูกต้อง แต่เราต้องการขั้นตอนการประมาณค่าอื่น ๆ ข้อเสนอบางอย่างได้รับ:
หากคุณใช้ R จะมีแพ็คเกจบน CRAN SafeBinaryRegression
ซึ่งช่วยในการวินิจฉัยปัญหาการแยกโดยใช้วิธีการเพิ่มประสิทธิภาพทางคณิตศาสตร์เพื่อตรวจสอบว่ามีการแยกหรือการแยกชิ้นส่วนหรือไม่! ในต่อไปนี้ฉันจะให้ตัวอย่างที่จำลองโดยใช้แพ็คเกจนี้และelrm
แพคเกจสำหรับการถดถอยโลจิสติกแบบมีเงื่อนไขโดยประมาณ
ครั้งแรกเป็นตัวอย่างง่ายๆกับsafeBinaryRegression
แพคเกจ แพคเกจนี้เพิ่งกำหนดglm
ฟังก์ชันใหม่โดยการทดสอบการแยกโดยใช้วิธีการตั้งโปรแกรมเชิงเส้น หากตรวจพบการแยกออกจะมีเงื่อนไขข้อผิดพลาดแจ้งว่าไม่มี mle มิฉะนั้นมันก็วิ่งสามัญฟังก์ชั่นจากglm
stats
ตัวอย่างมาจากหน้าความช่วยเหลือ:
library(safeBinaryRegression) # Some testing of that package,
# based on its examples
# complete separation:
x <- c(-2, -1, 1, 2)
y <- c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x, family=binomial, separation="test")
stats::glm(y~ x, family=binomial)
# Quasicomplete separation:
x <- c(-2, 0, 0, 2)
y <- c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x, family=binomial, separation="test")
stats::glm(y~ x, family=binomial)
เอาต์พุตจากการรัน:
> # complete separation:
> x <- c(-2, -1, 1, 2)
> y <- c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) :
The following terms are causing separation among the sample points: (Intercept), x
> glm(y ~ x, family=binomial, separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") :
Separation exists among the sample points.
This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)
Call: stats::glm(formula = y ~ x, family = binomial)
Coefficients:
(Intercept) x
-9.031e-08 2.314e+01
Degrees of Freedom: 3 Total (i.e. Null); 2 Residual
Null Deviance: 5.545
Residual Deviance: 3.567e-10 AIC: 4
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred
> # Quasicomplete separation:
> x <- c(-2, 0, 0, 2)
> y <- c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) :
The following terms are causing separation among the sample points: x
> glm(y ~ x, family=binomial, separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") :
Separation exists among the sample points.
This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)
Call: stats::glm(formula = y ~ x, family = binomial)
Coefficients:
(Intercept) x
5.009e-17 9.783e+00
Degrees of Freedom: 3 Total (i.e. Null); 2 Residual
Null Deviance: 5.545
Residual Deviance: 2.773 AIC: 6.773
ตอนนี้เราจำลองจากแบบจำลองที่สามารถประมาณค่าได้อย่างใกล้ชิดโดยตัวแบบโลจิสติกยกเว้นด้านบนตัดความน่าจะเป็นเหตุการณ์ที่ 1.0 คิดเกี่ยวกับปัญหาทางชีวภาพ แต่เหนือการตัดพิษจะฆ่าทุกครั้ง:
pl <- function(a, b, x) 1/(1+exp(-a-b*x))
a <- 0
b <- 1.5
x_cutoff <- uniroot(function(x) pl(0,1.5,x)-0.98,lower=1,upper=3.5)$root
### circa 2.6
pltrue <- function(a, b, x) ifelse(x < x_cutoff, pl(a, b, x), 1.0)
x <- -3:3
### Let us simulate many times from this model, and try to estimate it
### with safeBinaryRegression::glm That way we can estimate the probability
### of separation from this model
set.seed(31415926) ### May I have a large container of coffee
replications <- 1000
p <- pltrue(a, b, x)
err <- 0
good <- 0
for (i in 1:replications) {
y <- rbinom(length(x), 1, p)
res <- try(glm(y~x, family=binomial), silent=TRUE)
if (inherits(res,"try-error")) err <- err+1 else good <- good+1
}
P_separation <- err/replications
P_separation
เมื่อเรียกใช้รหัสนี้เราประเมินความน่าจะเป็นของการแยกเป็น 0.759 เรียกใช้รหัสด้วยตัวคุณเองมันรวดเร็ว!
จากนั้นเราจะขยายรหัสนี้เพื่อลองขั้นตอนการประมาณค่าต่าง ๆ mle และการถดถอยโลจิสติกตามเงื่อนไขโดยประมาณจาก elrm การรันการจำลองนี้ใช้เวลาประมาณ 40 นาทีบนคอมพิวเตอร์ของฉัน
library(elrm) # from CRAN
set.seed(31415926) ### May I have a large container of coffee
replications <- 1000
GOOD <- numeric(length=replications) ### will be set to one when MLE exists!
COEFS <- matrix(as.numeric(NA), replications, 2)
COEFS.elrm <- matrix(as.numeric(NA), replications, 2) # But we'll only use second col for x
p <- pltrue(a, b, x)
err <- 0
good <- 0
for (i in 1:replications) {
y <- rbinom(length(x), 1, p)
res <- try(glm(y~x, family=binomial), silent=TRUE)
if (inherits(res,"try-error")) err <- err+1 else{ good <- good+1
GOOD[i] <- 1 }
# Using stats::glm
mod <- stats::glm(y~x, family=binomial)
COEFS[i, ] <- coef(mod)
# Using elrm:
DATASET <- data.frame(x=x, y=y, n=1)
mod.elrm <- elrm(y/n ~ x, interest= ~ x -1, r=4, iter=10000, burnIn=1000,
dataset=DATASET)
COEFS.elrm[i, 2 ] <- mod.erlm$coeffs
}
### Now we can compare coefficient estimates of x,
### when there are separation, and when not:
non <- which(GOOD==1)
cof.mle.non <- COEFS[non, 2, drop=TRUE]
cof.mle.sep <- COEFS[-non, 2, drop=TRUE]
cof.elrm.non <- COEFS.elrm[non, 2, drop=TRUE]
cof.elrm.sep <- COEFS.elrm[-non, 2, drop=TRUE]
ตอนนี้เราต้องการพล็อตผลลัพธ์ แต่ก่อนหน้านี้โปรดทราบว่าการประมาณการตามเงื่อนไขทั้งหมดเท่ากัน! มันแปลกมากและควรต้องการคำอธิบาย ... ค่าทั่วไปคือ 0.9523975 แต่อย่างน้อยเราก็ได้การประมาณแบบ จำกัด ด้วยช่วงความเชื่อมั่นซึ่งมีค่าจริง (ไม่แสดงที่นี่) ดังนั้นฉันจะแสดงฮิสโตแกรมของการประมาณค่า mle ในกรณีที่ไม่มีการแยก:
hist(cof.mle.non, prob=TRUE)
[
สิ่งที่น่าทึ่งคือการประมาณการทั้งหมดนั้นน้อยกว่าค่าที่แท้จริง 1.5 ที่สามารถทำกับความจริงที่ว่าเราจำลองจากแบบจำลองที่ปรับเปลี่ยนแล้วจำเป็นต้องมีการตรวจสอบ
มีคำตอบที่ดีจาก @ sean501 และ @kjetilbhalvorsen คุณขอตัวอย่าง พิจารณารูปด้านล่าง คุณอาจเจอสถานการณ์บางอย่างในกระบวนการผลิตซึ่งข้อมูลเป็นเช่นเดียวกับที่ปรากฎในแผง ถ้าเป็นเช่นนั้นก็ค่อนข้างเป็นไปได้ว่าข้อมูลที่คุณจริงรวบรวมลักษณะเช่นผู้ที่อยู่ในแผงB ตอนนี้เมื่อคุณใช้ข้อมูลเพื่อสร้างแบบจำลองทางสถิติความคิดคือการกู้คืนกระบวนการสร้างข้อมูลจริงหรืออย่างน้อยก็เกิดการประมาณที่ใกล้พอสมควร ดังนั้นคำถามคือจะเหมาะสมกับการถดถอยโลจิสติกกับข้อมูลในBให้แบบจำลองที่ใกล้เคียงกับเส้นสีฟ้าในA ? ถ้าคุณดูที่แผงCคุณสามารถเห็นได้ว่าเส้นสีเทาดีกว่าประมาณข้อมูลมากกว่าฟังก์ชั่นที่แท้จริงดังนั้นในการค้นหาแบบที่ดีที่สุดการถดถอยโลจิสติกจะ 'ชอบ' เพื่อส่งกลับเส้นสีเทาแทนที่จะเป็นสีฟ้า มันไม่ได้หยุดอยู่แค่นั้น มองไปที่แผงDเส้นสีดำใกล้เคียงกับข้อมูลที่ดีกว่าสีเทาซึ่งอันที่จริงแล้วมันเป็นขนาดที่เหมาะสมที่สุดที่อาจเกิดขึ้นได้ นั่นคือบรรทัดที่โมเดลการถดถอยโลจิสติกกำลังดำเนินการ มันสอดคล้องกับการสกัดกั้นของอินฟินิตี้เชิงลบและความลาดชันของอินฟินิตี้ แน่นอนว่าอยู่ไกลจากความจริงที่คุณหวังว่าจะกู้คืน การแยกอย่างสมบูรณ์ยังอาจทำให้เกิดปัญหากับการคำนวณค่า p สำหรับตัวแปรของคุณที่มาพร้อมกับเอาต์พุตการถดถอยโลจิสติก (คำอธิบายมีความแตกต่างเล็กน้อยและซับซ้อนกว่า) ยิ่งไปกว่านั้นการพยายามผสมผสานความพอดีที่นี่เข้ากับความพยายามอื่น ๆ เช่นการวิเคราะห์เมตาจะทำให้การค้นพบอื่น ๆ นั้นแม่นยำน้อย
หมายความว่ามีไฮเปอร์เพลนดังกล่าวที่ด้านหนึ่งมีจุดบวกทั้งหมดและอีกด้านเป็นลบ วิธีแก้ปัญหาความน่าจะเป็นสูงสุดคือแบน 1 ในด้านหนึ่งและแบน 0 ในอีกด้านหนึ่งซึ่งเป็น 'บรรลุ' กับฟังก์ชันลอจิสติกโดยมีสัมประสิทธิ์ที่ไม่มีที่สิ้นสุด
สิ่งที่คุณกำลังเรียกว่า "การแยก" (ไม่ใช่ 'การแยก') ครอบคลุมสองสถานการณ์ที่แตกต่างกันซึ่งทำให้เกิดปัญหาเดียวกัน - ซึ่งฉันจะไม่เรียกอย่างไรก็ตามปัญหาของ "ความไม่แน่นอน" ในขณะที่คุณทำ
นั่นเป็นกรณีถ้าผู้โดยสารชั้นหนึ่งในTitanicรอดชีวิตจากซากปรักหักพังและไม่มีผู้โดยสารชั้นสองรอดชีวิตมาได้
นี้จะอธิบายได้ดีในเรนนีย์ 2016และZorn 2005
ในทั้งสองกรณีฟังก์ชันความน่าจะเป็นของโมเดลของคุณจะไม่สามารถหาค่าประมาณความน่าจะเป็นสูงสุด: เพียง แต่จะพบการประมาณค่านั้นโดยการเข้าใกล้แบบไม่แสดงอาการ
สิ่งที่คุณกำลังเรียกว่า "ความไม่แน่นอน"คือความจริงที่ว่าในกรณีของการแยกแบบสมบูรณ์หรือแบบกึ่งสมบูรณ์ก็ไม่มีโอกาสที่ จำกัด สำหรับโมเดลโลจิสติกในการเข้าถึง ฉันจะไม่ใช้คำว่าอย่างไรก็ตาม: ฟังก์ชันความน่าจะเป็นคือความสวย "คงที่" (monotonic) ในการกำหนดค่าสัมประสิทธิ์ต่ออนันต์
หมายเหตุ:ตัวอย่างของฉันคือตัวละคร การอยู่รอดบนเรือไททานิคไม่ได้ทำให้สมาชิกชั้นโดยสารเดือด ดูฮอลล์ (1986)