Memperkirakan kemiringan bagian lurus dari kurva sigmoid

11

Saya telah diberi tugas ini dan bingung. Seorang kolega meminta saya untuk memperkirakan dan dari bagan berikut: x l o w e rxkamuhalhalerxlHaiwer

masukkan deskripsi gambar di sini

Kurva sebenarnya adalah distribusi kumulatif, dan x adalah semacam pengukuran. Dia tertarik untuk mengetahui apa nilai yang sesuai pada x ketika fungsi kumulatif mulai menjadi lurus dan menyimpang dari menjadi lurus.

Saya mengerti bahwa kita dapat menggunakan diferensiasi untuk menemukan kemiringan pada suatu titik, tetapi saya tidak terlalu yakin bagaimana menentukan kapan kita dapat memanggil garis lurus. Setiap dorongan terhadap beberapa pendekatan / literatur yang sudah ada akan sangat dihargai.

Saya tahu R juga jika Anda mengetahui ada paket atau contoh yang relevan tentang investigasi semacam ini.

Terima kasih banyak.


MEMPERBARUI

Berkat Flounderer saya bisa memperluas pekerjaan lebih lanjut, membuat kerangka kerja, dan mengotak-atik parameter di sana-sini. Untuk tujuan belajar di sini adalah kode saya saat ini dan output grafis.

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

masukkan deskripsi gambar di sini

Penguin_Knight
sumber
2
Bisakah Anda mencoba menentukan kapan turunan kedua adalah 0 atau mendekati 0?
alex
3
Masalah formulasi dapat berupa - kemungkinan besar - potongan "lurus" tidak ada. Jika Anda mengambil lensa yang kuat dan memeriksa wilayah itu, Anda mungkin memperhatikan bahwa itu masih berbentuk S.
ttnphns
@ alex Terima kasih atas tip ini, saya akan menyingsingkan lengan baju saya dan memberikan beberapa pemikiran dan mencoba.
Penguin_Knight
2
Jika seseorang memenuhi kepadatan (katakanlah dengan estimasi kepadatan kernel, estimasi kepadatan log-spline, atau bahkan beberapa model parametrik), ketinggian kepadatan pada puncaknya adalah perkiraan kemiringan maksimum CDF. 'Luasnya' puncak memberi tahu Anda sesuatu tentang seberapa luas rentang nilai x di mana masuk akal untuk berbicara tentang lereng itu seolah-olah konstan.
Glen_b -Reinstate Monica
2
Untuk menindaklanjuti komentar @ Glen_b, poin utamanya adalah bahwa apa yang Anda minta belum didefinisikan dengan ketelitian yang memadai. Seberapa jauh di bawah maksimum PDF seharusnya "bahu" x_lower dan x_upper berada? Beberapa kriteria kuantitatif diperlukan.
whuber

Jawaban:

9

Ini adalah ide cepat dan kotor berdasarkan saran @ alex.

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

Itu terlihat sedikit seperti data Anda. Idenya adalah sekarang untuk melihat turunannya dan mencoba melihat di mana itu adalah yang terbesar. Ini harus menjadi bagian dari kurva Anda yang paling lurus, karena itu berbentuk 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))

masukkan deskripsi gambar di sini

cutoffy

Flounderer
sumber
Ini sangat luar biasa! Terima kasih untuk contoh dan kodenya! Saya mencobanya dengan data saya dan tampaknya berfungsi dengan baik. :)
Penguin_Knight
Terima kasih! Saya senang dengan itu juga. Lucu bagaimana mengambil log secara ajaib membuatnya bekerja.
Flounderer