シグモイド曲線の直線部分の勾配の推定


11

私はこの仕事を与えられて困惑しました。同僚から、次のグラフのx l o w e rを推定するように依頼されました。xupperxlower

ここに画像の説明を入力してください

曲線は実際には累積分布であり、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))

ここに画像の説明を入力してください


2
2次導関数が0または0に近い場合を判断できますか?
アレックス、2013年

3
公式化の問題は、おそらく「まっすぐな」カットが存在しないことです。強いレンズを手に取り、その領域を調べると、まだ滑らかなS字形であることに気付くでしょう。
ttnphns 2013年

@alexこのヒントをありがとう、私は私の袖をまくり上げて、いくつかの考えと試してみます。
Penguin_Knight 2013年

2
(カーネル密度推定、対数スプライン密度推定、またはいくつかのパラメトリックモデルによってさえ)ある密度に当てはまる場合、そのピークでの密度の高さはCDFの最大勾配の推定です。ピークの「幅」は、X値の範囲がどれほど広いかについて、その傾斜について一定であるかのように話すのが理にかなっていることを示しています。
Glen_b-2013

2
@Glen_bのコメントをフォローアップするための要点は、あなたが求めているものが十分な厳密さで定義されていないということです。「ショルダー」のx_lowerとx_upperは、PDFの最大値からどれだけ下に配置する必要がありますか?いくつかの定量的基準が必要です。
whuber

回答:


9

@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)

x

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

x

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))

ここに画像の説明を入力してください

cutoffy


これはすごい!例とコードをありがとう!私は私のデータでそれを試しました、そしてそれはかなりうまくいくようです。:)
Penguin_Knight 2013年

ありがとう!私も満足しています。丸太を取ることで魔法のようにそれが機能するのはおかしい。
Flounderer 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.