เหตุการณ์อคติการถดถอยโลจิสติกที่หายาก: วิธีจำลอง p ต่ำสุดด้วยตัวอย่างน้อยที่สุด?


19

CrossValidated มีหลายคำถามเกี่ยวกับเวลาและวิธีการที่จะใช้การแก้ไขเหตุการณ์อคติที่หายากโดยพระบาทสมเด็จพระเจ้าอยู่หัวและเซง (2001) ฉันกำลังมองหาสิ่งที่แตกต่าง: การสาธิตแบบจำลองขั้นต่ำที่มีอคติอยู่

โดยเฉพาะอย่างยิ่งราชาและเซงรัฐ

"... ในเหตุการณ์ที่หายากข้อมูลอคติในความน่าจะเป็นความหมายอย่างมีนัยสำคัญกับขนาดตัวอย่างเป็นพันและอยู่ในทิศทางที่สามารถคาดการณ์ได้: ความน่าจะเป็นของเหตุการณ์โดยประมาณนั้นเล็กเกินไป"

นี่คือความพยายามของฉันในการจำลองอคติดังกล่าวใน R:

# FUNCTIONS
do.one.sim = function(p){
    N = length(p)
    # Draw fake data based on probabilities p  
    y = rbinom(N, 1, p)  
    # Extract the fitted probability.
    #    If p is constant, glm does y ~ 1, the intercept-only model.
    #    If p is not constant, assume its smallest value is p[1]:
    glm(y ~ p, family = 'binomial')$fitted[1]
}
mean.of.K.estimates = function(p, K){
    mean(replicate(K, do.one.sim(p) ))
}

# MONTE CARLO
N = 100
p = rep(0.01, N)
reps = 100
# The following line may take about 30 seconds
sim = replicate(reps, mean.of.K.estimates(p, K=100))
# Z-score:
abs(p[1]-mean(sim))/(sd(sim)/sqrt(reps))
# Distribution of average probability estimates:
hist(sim)

เมื่อฉันทำสิ่งนี้ฉันมักจะได้คะแนน z น้อยมากและฮิสโตแกรมของการประมาณนั้นใกล้เคียงกับความจริงที่ p = 0.01 มาก

ฉันพลาดอะไรไป นั่นคือการจำลองของฉันไม่ใหญ่พอที่จะแสดงอคติที่แท้จริง (และเล็กมาก) ได้หรือไม่? อคติต้องการความแปรปรวนร่วม (รวมถึงการสกัดกั้น) หรือไม่?

อัปเดต 1: King และ Zeng มีการประมาณคร่าวๆสำหรับอคติของในสมการที่ 12 ของกระดาษ สังเกตในส่วนที่ผมลดลงอย่างมากที่จะเป็นอีกครั้งวิ่งจำลอง แต่ยังคงมีอคติในความน่าจะเป็นเหตุการณ์ที่คาดไม่เป็นที่เห็นได้ชัด (ฉันใช้สิ่งนี้เป็นแรงบันดาลใจเท่านั้นโปรดทราบว่าคำถามของฉันข้างต้นเกี่ยวกับความน่าจะเป็นเหตุการณ์โดยประมาณไม่ใช่ )β0NN5β^0

อัปเดต 2:ทำตามคำแนะนำในความคิดเห็นฉันรวมตัวแปรอิสระในการถดถอยนำไปสู่ผลลัพธ์ที่เทียบเท่า:

p.small = 0.01
p.large = 0.2
p = c(rep(p.small, round(N/2) ), rep(p.large, N- round(N/2) ) )
sim = replicate(reps, mean.of.K.estimates(p, K=100))

คำอธิบาย: ฉันใช้pตัวเองเป็นตัวแปรอิสระโดยที่pเป็นเวกเตอร์ที่มีการซ้ำของค่าขนาดเล็ก (0.01) และค่าที่มีขนาดใหญ่กว่า (0.2) ในที่สุดจัดsimเก็บเฉพาะความน่าจะเป็นโดยประมาณที่สอดคล้องกับและไม่มีสัญญาณของความลำเอียงพี=0.01

อัปเดต 3 (5 พฤษภาคม 2559): สิ่งนี้ไม่ได้เปลี่ยนผลลัพธ์อย่างเห็นได้ชัด แต่ฟังก์ชั่นการจำลองภายในใหม่ของฉันคือ

do.one.sim = function(p){
    N = length(p)
    # Draw fake data based on probabilities p  
    y = rbinom(N, 1, p)
    if(sum(y) == 0){ # then the glm MLE = minus infinity to get p = 0
        return(0)
    }else{
        # Extract the fitted probability.
        #    If p is constant, glm does y ~ 1, the intercept only model.
        #    If p is not constant, assume its smallest value is p[1]:
        return(glm(y ~ p, family = 'binomial')$fitted[1])
    }
}

คำอธิบาย: MLE เมื่อ y เป็นศูนย์เหมือนกันไม่มีอยู่ ( ขอบคุณสำหรับความคิดเห็นที่นี่เพื่อเตือนความจำ ) R ล้มเหลวในการส่งคำเตือนเนื่องจาก " การยอมรับการบรรจบกันในเชิงบวก " ของมันได้รับความพึงพอใจจริง ๆ พูดอย่างเสรีมากขึ้น MLE มีอยู่และเป็นลบอนันต์ซึ่งสอดคล้องกับ ; ดังนั้นการปรับปรุงฟังก์ชั่นของฉัน สิ่งเดียวที่เชื่อมโยงกันอื่น ๆ ที่ฉันสามารถคิดได้คือการทิ้งสิ่งที่จำลองไว้ซึ่ง y เป็นศูนย์เหมือนกัน แต่สิ่งนี้จะนำไปสู่ผลลัพธ์ที่ชัดเจนยิ่งกว่าการโต้แย้งกับการอ้างสิทธิ์เริ่มแรกว่าพี=0


3
ฉันดีใจที่คุณทำงานนี้และหวังว่าจะได้รับความคิดเห็นของผู้อื่น แม้ว่าจะมีอคติการแก้ไขอคติอาจเพิ่มความแปรปรวนได้มากพอที่จะเพิ่มความคลาดเคลื่อนกำลังสองเฉลี่ยของการประมาณ
Frank Harrell

3
@ FrankHarrell, King และ Zeng ยังยืนยันด้วยว่า "เราอยู่ในสถานการณ์ที่มีความสุขที่การลดอคติยังช่วยลดความแปรปรวน"
zkurtz

1
ดี. ยังคงที่จะเห็นว่าจำนวนอคตินั้นใหญ่พอที่จะต้องกังวลหรือไม่
Frank Harrell

"หายาก" สำหรับคุณคืออะไร ตัวอย่างเช่นอัตราเริ่มต้น 0.001% ต่อปีเกี่ยวข้องกับการจัดอันดับเครดิต AAA มันหายากพอสำหรับคุณหรือเปล่า
Aksakal

1
@ อักษะกัลตัวเลือกที่ฉันชอบ "หายาก" คือสิ่งที่แสดงให้เห็นถึงอคติที่กษัตริย์และเซงเขียนไว้อย่างชัดเจนที่สุด
zkurtz

คำตอบ:


4

นี่เป็นคำถามที่น่าสนใจ - ฉันทำแบบจำลองสองสามข้อที่ฉันโพสต์ไว้ด้านล่างด้วยความหวังว่าสิ่งนี้จะกระตุ้นการสนทนาต่อไป

ก่อนอื่นความเห็นทั่วไปไม่กี่:

  • กระดาษที่คุณอ้างถึงนั้นเกี่ยวกับอคติเหตุการณ์ที่หายาก สิ่งที่ไม่ชัดเจนสำหรับฉันก่อนหน้านี้ (ด้วยความเคารพต่อความคิดเห็นที่ทำไว้ด้านบน) คือถ้ามีอะไรพิเศษเกี่ยวกับกรณีที่คุณมี 10/10000 ตรงข้ามกับการสังเกต 10/30 อย่างไรก็ตามหลังจากการจำลองบางอย่างฉันก็เห็นด้วย

  • ปัญหาที่ฉันมีอยู่ในใจ (ฉันได้พบสิ่งนี้บ่อยครั้งและเมื่อไม่นานมานี้มีบทความเกี่ยวกับวิธีการทางนิเวศวิทยาและวิวัฒนาการเกี่ยวกับเรื่องนั้นฉันไม่สามารถหาข้อมูลอ้างอิงได้) คือคุณสามารถรับกรณีเลวลงด้วย GLMs ในข้อมูลขนาดเล็ก สถานการณ์ที่ MLE เป็น FAAAR ห่างจากความจริงหรือแม้แต่ที่ - / + ไม่มีที่สิ้นสุด (เนื่องจากลิงก์ที่ไม่ใช่เชิงเส้นที่ฉันคิดว่า) ยังไม่ชัดเจนสำหรับฉันว่าควรปฏิบัติต่อกรณีเหล่านี้อย่างไรในการประมาณค่าความเอนเอียง แต่จากการจำลองสถานการณ์ของฉัน สัญชาตญาณของฉันคือการลบพวกเขา แต่ก็ไม่ชัดเจนว่าพวกเขาจะต้องถูกลบออกไปไกลแค่ไหน บางทีสิ่งที่ต้องจำไว้สำหรับการแก้ไขอคติ

  • นอกจากนี้กรณีความเสื่อมเหล่านี้ดูเหมือนจะทำให้เกิดปัญหาเชิงตัวเลข (ฉันได้เพิ่มจำนวนสูงสุดในฟังก์ชัน glm แต่เราสามารถคิดเกี่ยวกับการเพิ่ม epsilon เช่นกันเพื่อให้แน่ใจว่าจริง ๆ แล้วรายงาน MLE จริง)

อย่างไรก็ตามนี่คือโค้ดบางส่วนที่คำนวณความแตกต่างระหว่างการประมาณและความจริงสำหรับการสกัดกั้นความชันและการทำนายในการถดถอยโลจิสติกก่อนอื่นสำหรับสถานการณ์ตัวอย่างขนาดต่ำ / สถานการณ์อุบัติการณ์ปานกลาง:

set.seed(123)
replicates = 1000
N= 40
slope = 2 # slope (linear scale)
intercept = - 1 # intercept (linear scale)

bias <- matrix(NA, nrow = replicates, ncol = 3)
incidencePredBias <- rep(NA, replicates)

for (i in 1:replicates){
  pred = runif(N,min=-1,max=1) 
  linearResponse = intercept + slope*pred
  data = rbinom(N, 1, plogis(linearResponse))  
  fit <- glm(data ~ pred, family = 'binomial', control = list(maxit = 300))
  bias[i,1:2] = fit$coefficients - c(intercept, slope)
  bias[i,3] = mean(predict(fit,type = "response")) - mean(plogis(linearResponse))
}

par(mfrow = c(1,3))
text = c("Bias intercept", "Bias slope", "Bias prediction")

for (i in 1:3){
  hist(bias[,i], breaks = 100, main = text[i])
  abline(v=mean(bias[,i]), col = "red", lwd = 3)  
}

apply(bias, 2, mean)
apply(bias, 2, sd) / sqrt(replicates)

อคติที่เกิดขึ้นและข้อผิดพลาดมาตรฐานสำหรับการสกัดกั้นความชันและการทำนายคือ

-0.120429315  0.296453122 -0.001619793
 0.016105833  0.032835468  0.002040664

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

ป้อนคำอธิบายรูปภาพที่นี่

หากฉันตั้งค่าพารามิเตอร์ให้เป็นสถานการณ์ที่ไม่ค่อยเกิดขึ้น

N= 4000
slope = 2 # slope (linear scale)
intercept = - 10 # intercept (linear scale)

ฉันได้รับอคติที่มีขนาดใหญ่กว่าสำหรับการสกัดกั้น แต่ยังไม่มีใครคาดการณ์ไว้

   -1.716144e+01  4.271145e-01 -3.793141e-06
    5.039331e-01  4.806615e-01  4.356062e-06

ในฮิสโตแกรมของค่าที่ประมาณไว้เราจะเห็นปรากฏการณ์ของการประมาณค่าพารามิเตอร์ที่เสื่อมลง (ถ้าเราเรียกมันว่าอย่างนั้น)

ป้อนคำอธิบายรูปภาพที่นี่

ลองลบแถวทั้งหมดที่การประมาณค่าสกัดกั้นอยู่ <20

apply(bias[bias[,1] > -20,], 2, mean)
apply(bias[bias[,1] > -20,], 2, sd) / sqrt(length(bias[,1] > -10))

ความเอนเอียงลดลงและสิ่งต่าง ๆ จะชัดเจนขึ้นในตัวเลข - การประมาณพารามิเตอร์จะไม่กระจายอย่างชัดเจน ฉันสงสัยว่านั่นหมายถึงความถูกต้องของ CIs ที่มีการรายงาน

-0.6694874106  1.9740437782  0.0002079945
1.329322e-01 1.619451e-01 3.242677e-06

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะสรุปว่าอคติของเหตุการณ์ที่เกิดขึ้นได้ยากในการสกัดกั้นนั้นเกิดจากเหตุการณ์ที่หายากเองนั่นคือการประมาณที่หายากและมีขนาดเล็กมาก ไม่แน่ใจว่าเราต้องการลบออกหรือไม่ไม่แน่ใจว่าเป็นทางลัด

สิ่งสำคัญที่ควรทราบก็คือว่าไม่ว่าด้วยวิธีใดดูเหมือนว่าจะไม่มีอคติในการคาดการณ์ในระดับการตอบสนอง - ฟังก์ชันลิงก์จะดูดซับค่าที่น้อยมากเหล่านี้


1
ใช่ยังคงสนใจ +1 สำหรับการสนทนาที่ดีและการค้นหาผลลัพธ์ที่คล้ายกับของฉัน (ไม่มีอคติการทำนายที่ชัดเจน) สมมติว่าเราทั้งคู่ถูกต้องในที่สุดฉันก็อยากจะเห็นลักษณะของสถานการณ์ที่สมควรได้รับความกังวลอย่างแท้จริงเกี่ยวกับการทำนายอคติ (เช่นอย่างน้อยก็ตัวอย่าง) หรือคำอธิบายจุดอ่อนในกระดาษคิงและเซงที่นำไปสู่ พวกเขาจะพูดเกินความสำคัญของการแก้ไขอคติ
zkurtz

±20

1

เหตุการณ์อคติหายากเกิดขึ้นเฉพาะเมื่อมีการถดถอย มันจะไม่เกิดขึ้นในรูปแบบการดักจับแบบเดียวอย่างที่จำลองไว้ที่นี่ ดูโพสต์นี้สำหรับรายละเอียด: http://statisticalhorizons.com/linear-vs-logistic#comment-276108


3
สวัสดีพอล มันจะดีกว่าถ้าคุณขยายคำตอบของคุณเพื่อให้เป็นแบบสแตนด์อโลนและไม่จำเป็นต้องเข้าถึงเว็บไซต์ภายนอก (เช่นอาจไม่สามารถใช้งานได้ในบางจุด)
Patrick Coulombe

โปรดทราบด้วยว่า "อัพเดต 2" ใน OP อคติก็ล้มเหลวที่จะปรากฏพร้อมกับ regressor เดียว
zkurtz

ตามสมการของ King & Zeng (16) และรูปที่ 7 ความเอนเอียงเป็นหน้าที่ของ regressors X ไม่มีอคติถ้า X มีขนาดเล็กซึ่งเป็นสถานการณ์ที่พิจารณาโดย OP ในการอัปเดต 2 ฉันขอแนะนำให้ดูที่ มีอคติเมื่อ X มีขนาดใหญ่ ฉันขอแนะนำให้ลองทำซ้ำการจำลองของ King & Zeng
พอลฟอน Hippel

นี่คือลิงค์ไปยังกระดาษ King-Zeng: gking.harvard.edu/files/0s.pdf
Paul von Hippel

1

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

n_grid = 40
x_grid = seq(0, 7, length.out = n_grid)
beta0 = -6
beta1 = 1

inverse_logit = function(x) 1/(1 + exp(-x))

do.one.sim = function(){
    N = 5000
    x = rnorm(N)
    p = inverse_logit(beta0 + beta1*x)
    # Draw fake data based on probabilities p
    y = rbinom(N, 1, p)
    if(sum(y) == 0){ # then the glm MLE = minus infinity to get p = 0
        return(rep(0, n_grid))
    }else{
        # Extract the error
        mod = glm(y ~ x, family = 'binomial')
        truth = inverse_logit(beta0 + beta1*x_grid)
        pred = predict(mod, newdata = data.frame(x = x_grid),
            type = 'response')
        return(pred - truth)
    }
}
mean.of.K.estimates = function(K){
    rowMeans(replicate(K, do.one.sim()))
}

set.seed(1)
bias = replicate(10, mean.of.K.estimates(100))
maxes = as.numeric(apply(bias, 1, max))
mins = as.numeric(apply(bias, 1, min))

par(mfrow = c(3, 1), mar = c(4,4,2,2))
plot(x_grid, rowMeans(bias), type = 'l',
    ylim = c(min(bias), max(bias)),
    xlab = 'x', ylab = 'bias')
lines(x_grid, maxes, lty = 2)
lines(x_grid, mins, lty = 2)
plot(x_grid, dnorm(x_grid), type = 'l',
    xlab = 'x', ylab = 'standard normal density')
plot(x_grid, inverse_logit(beta0 + beta1*x_grid),
    xlab = 'x', ylab = 'true simulation P(Y = 1)',
    type = 'l')

พล็อตแรกคือการจำลองแบบของพวกเขาในรูปที่ 7 ด้วยการเพิ่มของเส้นโค้งประที่เป็นตัวแทนของผลการทดสอบมากกว่า 10 ครั้ง

ตามที่กระดาษxนี่คือตัวแปรทำนายในการถดถอยมาจากมาตรฐานปกติ ดังนั้นดังที่แสดงไว้ในพล็อตที่สองความถี่สัมพัทธ์ของการสังเกตสำหรับx > 3(ที่อคติที่มองเห็นได้มากที่สุดเกิดขึ้นในพล็อตแรก) มีขนาดเล็กลง

พล็อตที่สามแสดงให้เห็นถึง "ความจริง" xความน่าจะเป็นในการจำลองกระบวนการผลิตเป็นหน้าที่ของ ปรากฏว่าอคติที่ยิ่งใหญ่ที่สุดเกิดขึ้นในที่ที่xหายากหรือไม่มีอยู่จริง

เมื่อนำมารวมกันสิ่งเหล่านี้ชี้ให้เห็นว่า OP ตีความผิดข้อเรียกร้องส่วนกลางทั้งหมดของกระดาษโดยทำให้เกิดความสับสน "เหตุการณ์ที่หายาก" (เช่นx > 3) กับ "เหตุการณ์ที่P(Y = 1)มีขนาดเล็กมาก" สันนิษฐานว่าเป็นกระดาษที่เกี่ยวข้องกับอดีตแทนหลัง

ป้อนคำอธิบายรูปภาพที่นี่

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