Regression

具有實際概率的邏輯回歸∈(𝑎,𝑏)∈(a,b)in(a,b)在哪裡0<𝑎<𝑏<10<a<b<10<a<b`<1

  • February 12, 2020

使用邏輯回歸對概率建模時 1 ,擬合概率的範圍是 (0,1) . 邏輯函數 2 漸近線 01 ,所以這是一個很好的匹配。然而,在某些應用中,實際範圍 3 的概率可以是 (a,b)0<a<b<1 ,導致尾部出現(潛在的大量)不匹配。

例如,考慮一個所有人都工作並獲得報酬的人群。付款取決於技能、努力和其他我們衡量的東西。每個人還參與抽獎,其貨幣結果正態分佈,期望值為零。個人的收入是工作收入和抽獎結果的總和。對於任何給定的常數 c , 條件概率 p 個人收入大於 c , 以技巧、努力和其他東西為條件,而不是彩票的結果,將滿足 0<a<p<b<1 . (我相信那裡有更好的例子,但這是首先想到的。)

問題:

  1. 如何調整邏輯回歸模型 ab 給出?(或者不需要調整?)
  2. 如何調整邏輯回歸模型 ab 沒有給出,但我們知道 0<a<b<1 ?

1 或者就此而言,一個概率模型

2 或者就此而言,標準的普通 CDF

2 感興趣人群中個體的範圍

什麼時候 ab 沒有給出,只需使用通常的邏輯模型(或任何合適的),因為(如果它使用合適的鏈接函數)保證擬合概率不小於下限 0 並且上限不大於 1. 這些界限給出了區間估計 ab.


有趣的問題是什麼時候 ab 是已知的。 您正在娛樂的那種模型似乎如下。您想到了一個單參數分佈系列 F=Fθ 在哪裡 θ 對應於一些“概率”參數。例如, Fθ 可能是伯努利 (θ) 響應時的分佈 Y 是二進制的。

對於與解釋變量向量相關的觀察 x, 響應模型 Yx 然後採取形式

YxFθ(x);θ(x)=g(xβ)

對於一些“反向鏈接函數” g 我們必須指定:它是模型的一部分。例如,在邏輯回歸中, g 經常被認為是由定義的邏輯函數

g(x)=11+exp(x).

無論細節如何,製作時 n 獨立觀察 yi (每個都與一個向量相關聯 xi ) 假設符合這個模型,他們的可能性是

L(β)=ni=1Pr(Yxi=yiθ(xi)=g(xiβ))

你可以像往常一樣繼續最大化它。(豎筆僅表示它後面的參數值決定使用哪個概率函數:它不是條件概率。)

ˆβ 是相關的參數估計。的預測條件分佈 Yi 因此是

YiFˆθ(xi);ˆθ(xi)=g(xiˆβ).

當圖像 g 包含在區間內 [a,b], 那麼顯然每個 ˆθ(x) 無論如何,也在那個區間 x 也許。(也就是說,這個結論既適用於 x 在數據集中並用於外推到其他 x. )

一個有吸引力的選擇 g 簡單地重新調整通常的邏輯函數,

g(x;a,b)=g(x)aba.

**將此視為出發點:**像往常一樣,探索性分析和擬合優度測試將幫助您確定這是否適合 g.

供以後使用,**請注意 gg(;a,b) 有一個比看起來更複雜的關係,**因為最終它們被用來確定 ˆβ 通過他們的論點 xβ. 因此,這種關係的特徵在於函數 xy 取決於

g(x)=g(y;a,b)=g(y)aba,

有溶液(如果 g 是可逆的,通常是這樣)

y=g1((ba)g(x)+a).

除非 g 最初是線性的,這通常是非線性的。


**為了解決此線程中其他地方表達的問題,**讓我們比較使用獲得的解決方案 gg(;a,b). 考慮最簡單的情況 n=1 觀察和需要估計參數向量的標量解釋變量 β=(β1). 認為 F 是二項式的家庭 (10,θ) 分佈,讓 x1=(1), 並想像 Yi=9 被觀察到。寫作 θ 為了 θ(x1), 可能性是

L(β)=(109)θ9(1θ)1;θ=g((1)(β1))=g(β1).

L 最大化時 g(β1)=θ=9/10, 用獨特的解決方案ˆβ=g1(9/10)=log(9/10/(1/10))=log(9)2.20.

現在讓我們假設 a=0b=1/2: 也就是說,我們假設 θ1/2 不管什麼價值 x 可能有。隨著縮放版本 g 我們和以前一樣計算,只是代入 g(;a,b) 為了 g:

L(β;0,1/2)=(109)θ9(1θ)1;θ=g((1)(β1);0,1/2)=g(β1;0,1/2).

這不再最大化 θ=9/10, 因為這是不可能的 g(θ;0,1/2) 超過 1/2, 按設計。 L(β;0,1/2) 被最大化的任何 β 那會讓 θ 盡可能接近 9/10; 這發生在 β 任意變大。那麼,使用受限反向鏈接函數的估計是

ˆβ=.

顯然兩者都沒有 ˆθ 或者 ˆβ 是原始(無限制)估計的任何簡單函數;特別是,它們與任何重新縮放無關。

**這個簡單的例子暴露了整個程序的一個危險:**當我們假設什麼 ab (以及關於模型的所有其他內容)與數據不一致,我們可能會得到模型參數的奇怪估計 β. 這就是我們付出的代價。

但是,如果我們的假設是正確的,或者至少是合理的呢? 讓我們用 b=0.95 代替 b=1/2. 這次, ˆθ=9/10 確實最大化似然性,由此估計 β 滿足

910=g(ˆβ;0,0.95)=g(ˆβ)00.950,

所以

g(ˆβ)=0.95×910=0.855,

蘊涵

ˆβ=log(0.855/(10.855))1.77.

在這種情況下, ˆθ 不變但_ ˆβ 發生了複雜的變化1.77 不是重新縮放的版本 2.20 ).


在這些例子中, ˆθ 當原始估計不在區間內時必須更改 [a,b]. 在更複雜的例子中,它可能必須改變才能改變其他觀察值的估計值 x. 這是效果之一 [a,b] 限制。另一個影響是,即使限制改變了估計的概率, ˆθ, 原始反向鏈接之間的非線性關係 g 和受限鏈接 g(;a,b) 在參數估計中引起非線性(並且可能是複雜的)變化 ˆβ.


**為了說明,**我根據這個模型創建了數據 β=(4,7) 和限制 a=1/10b=1/2 為了 n 解釋值的等距值 x 之間 01 包含,然後使用普通邏輯回歸(無約束)擬合它們一次,並使用縮放反向鏈接方法再次使用已知約束。

以下是結果 n=12 二項式 (8,θ(x)) 觀察結果(實際上反映了 12×8=96 獨立的二進制結果):

圖1

這已經提供了洞察力:模型(左圖)預測接近上限的概率 b=1/2 對於小 x. 隨機變化導致某些觀測值的頻率大於 1/2. 在沒有任何限制的情況下,邏輯回歸(中圖)傾向於預測更高的概率。類似的現象發生在大 x.

受限模型極大地改變了估計的斜率 3.4521.7 為了使預測保持在 [a,b]. 發生這種情況的部分原因是它是一個小數據集。

*直觀地說,*更大的數據集應該產生更接近底層(真實)數據生成過程的結果。人們也可能期望不受限制的模型運行良好。可以?為了檢查,我創建了一個大一千倍的數據集: n=1200 二項式的觀察 (80,θ(x)) 回复。

圖 2

當然,正確的模型(右面板)現在非常適合。然而,觀察到的頻率的隨機變化仍然導致普通邏輯模型超出限制。

顯然,當假定值 ab 是(接近)正確的並且鏈接函數的形狀大致正確,最大似然效果很好 - 但它絕對不會產生與邏輯回歸相同的結果。


為了提供完整的文檔,這裡是R生成第一個圖的代碼。更改1212008生成80第二個圖形。

#
# Binomial negative log likelihood.
#
logistic.ab <- function(x, a=0, b=1) {
 a + (b - a) / (1 + exp(-x))
}
predict.ab <- function(beta, x, invlink=logistic.ab) {
 invlink(cbind(1, x) %*% beta)
}
Lambda <- function(beta, n, k, x, invlink=logistic.ab, tol=1e-9) {
 p <- predict.ab(beta, x, invlink)
 p <- (1-2*tol) * p + tol                 # Prevents numerical problems
 - sum((k * log(p) + (n-k) * log(1-p)))
}
#
# Simulate data.
#
N <- 12                       # Number of binomial observations
x <- seq(0, 1, length.out=N)  # Explanatory values
n <- rep(8, length(x))        # Binomial counts per observation
beta <- c(4, -7)              # True parameter
a <- 1/10                     # Lower limit
b <- 1/2                      # Upper limit

set.seed(17)
p <- predict.ab(beta, x, function(x) logistic.ab(x, a, b))
X <- data.frame(x = x, p = p, n = n, k = rbinom(length(x), n, p))
#
# Create a data frame for plotting predicted and true values.
#
Y <- with(X, data.frame(x = seq(min(x), max(x), length.out=101)))
Y$p <-with(Y, predict.ab(beta, x, function(x) logistic.ab(x, a, b)))
#
# Plot the data.
#
par(mfrow=c(1,3))
col <- hsv(0,0,max(0, min(1, 1 - 200/N)))
with(X, plot(x, k / n, ylim=0:1, col=col, main="Data with True Curve"))
with(Y, lines(x, p))
abline(h = c(a,b), lty=3)
#
# Reference fit: ordinary logistic regression.
#
fit <- glm(cbind(k, n-k) ~ x, data=X, family=binomial(link = "logit"),
          control=list(epsilon=1e-12))
#
# Fit two models: ordinary logistic and constrained.
#
for (ab in list(c(a=0, b=1), c(a=a, b=b))) {
 #
 # MLE.
 #
 g <- function(x) logistic.ab(x, ab[1], ab[2])
 beta.hat <- c(0, 1)
 fit.logistic <- with(X, nlm(Lambda, beta.hat, n=n, k=k, x=x, invlink=g,
                             iterlim=1e3, steptol=1e-9, gradtol=1e-12))
 if (fit.logistic$code > 3) stop("Check the fit.")
 beta.hat <- fit.logistic$estimate

 # Check:
 print(rbind(Reference=coefficients(fit), Constrained=beta.hat))

 # Plot:
 Y$p.hat <- with(Y, predict.ab(beta.hat, x, invlink=g))
 with(X, plot(x, k / n, ylim=0:1,, col=col,
              main=paste0("Fit with a=", signif(ab[1], 2),
                          " and b=", signif(ab[2], 2))))
 with(Y, lines(x, p.hat, col = "Red", lwd=2))
 with(Y, lines(x, p))
 abline(h = c(a, b), lty=3)
}
par(mfrow=c(1,1))

引用自:https://stats.stackexchange.com/questions/449145