Estimation

估計 S 形曲線直線部分的斜率

  • October 9, 2013

我被賦予了這個任務並且被難住了。同事讓我估計和下圖:

在此處輸入圖像描述

曲線實際上是一個累積分佈,x 是某種測量值。他有興趣知道當累積函數開始變直並偏離直線時,x 上的對應值是多少。

我知道我們可以使用微分來找到某個點的斜率,但我不太確定如何確定何時可以將直線稱為直線。任何對一些已經存在的方法/文獻的輕推將不勝感激。

如果您碰巧知道有關此類調查的任何相關軟件包或示例,我也知道 R。

非常感謝。


更新

感謝 Flounderer,我能夠進一步擴展工作,建立一個框架,並在這里和那裡修改參數。出於學習目的,這裡是我當前的代碼和圖形輸出。

library(ESPRESSO)

x <- skew.rnorm(800, 150, 5, 3)
x <- sort(x)
meanX <- mean(x)
sdX <- sd(x)
stdX <- (x-meanX)/sdX
y <- pnorm(stdX)

par(mfrow=c(2,2), mai=c(1,1,0.3,0.3))
hist(x, col="#03718750", border="white", main="")

nq <- diff(y)/diff(x)
plot.ts(nq, col="#6dc03480")

log.nq <- log(nq)
low <- lowess(log.nq)
cutoff <- .7
q <- quantile(low$y, cutoff)
plot.ts(log.nq, col="#6dc03480")
abline(h=q, col="#348d9e")

x.lower <- x[min(which(low$y > q))]
x.upper <- x[max(which(low$y > q))]
plot(x,y,pch=16,col="#03718750", axes=F)
axis(side=1)
axis(side=2)
abline(v=c(x.lower, x.upper),col="red")
text(x.lower, 1.0, round(x.lower,0))
text(x.upper, 1.0, round(x.upper,0))

在此處輸入圖像描述

這是基於@alex 建議的快速而骯髒的想法。

#simulated data
set.seed(100)
x <- sort(exp(rnorm(1000, sd=0.6)))
y <- ecdf(x)(x)

它看起來有點像你的數據。現在的想法是查看導數並嘗試查看它最大的位置。這應該是曲線中最直的部分,因為它是 S 形。

NQ <- diff(y)/diff(x)
plot.ts(NQ)

這是搖擺不定的,因為有些值恰好非常接近。但是,獲取日誌會有所幫助,然後您可以使用平滑版本。

log.NQ <- log(NQ)
low <- lowess(log.NQ)
cutoff <- 0.75
q <- quantile(low$y, cutoff)
plot.ts(log.NQ)
abline(h=q)

現在你可以嘗試找到是這樣的:

x.lower <- x[min(which(low$y > q))]
x.upper <- x[max(which(low$y > q))]
plot(x,y)
abline(v=c(x.lower, x.upper))

在此處輸入圖像描述

當然,整個事情最終對cutoff平滑算法的選擇和平滑算法的選擇以及對日誌的選擇都很敏感,當我們本可以進行一些其他轉換時。此外,對於真實數據,隨機變化也可能會導致此方法出現問題。導數在數值上表現不佳。編輯:添加了輸出圖片。

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

comments powered by Disqus