Szacowanie nachylenia prostej części krzywej esowatej

11

Dostałem to zadanie i byłem zakłopotany. Kolega poprosił mnie o oszacowanie i poniższej tabeli:xuppmirxlowmir

wprowadź opis zdjęcia tutaj

Krzywa jest w rzeczywistości rozkładem skumulowanym, a x jest rodzajem pomiaru. Jest zainteresowany, aby wiedzieć, jakie są odpowiednie wartości na x, gdy funkcja skumulowana zaczęła być prosta i odchylać się od bycia prostą.

Rozumiem, że możemy użyć różnicowania, aby znaleźć nachylenie w punkcie, ale nie jestem zbyt pewien, jak ustalić, kiedy możemy nazwać linię prostą. Wszelkie sugestie dotyczące już istniejącego podejścia / literatury będą mile widziane.

Znam też R, jeśli zdarzyło Ci się znać jakieś odpowiednie pakiety lub przykłady dotyczące tego rodzaju dochodzeń.

Wielkie dzięki.


AKTUALIZACJA

Dzięki Flounderer mogłem rozszerzyć pracę, skonfigurować ramy i majsterkować parametry tu i tam. Dla celów edukacyjnych tutaj jest mój obecny kod i grafika.

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

wprowadź opis zdjęcia tutaj

Penguin_Knight
źródło
2
Czy możesz spróbować ustalić, kiedy druga pochodna jest równa 0 lub bliska 0?
alex
3
Problemem formułowania może być to, że - całkiem prawdopodobne - „proste” cięcie nie istnieje. Jeśli weźmiesz mocną soczewkę i sprawdzisz ten obszar, możesz zauważyć, że nadal ma gładki kształt litery S.
ttnphns
@alex Dzięki za tę wskazówkę, zakręcę rękawy i dam jej kilka przemyśleń i spróbuję.
Penguin_Knight
2
Gdyby dopasować jakąś gęstość (powiedzmy przez szacowanie gęstości jądra, logarytmiczną gęstość splajnu, a nawet jakiś model parametryczny), wysokość gęstości na jej szczycie jest oszacowaniem maksymalnego nachylenia CDF. „Szerokość” szczytu mówi ci coś o tym, jak szeroki jest zakres wartości x, gdzie sensowne jest mówienie o tym nachyleniu, jakby było stałe.
Glen_b
2
Kontynuując komentarz @ Glen_b, najważniejsze jest to, że to, o co prosisz, nie zostało zdefiniowane z wystarczającą dokładnością. Jak daleko poniżej maksimum pliku PDF powinny znajdować się „ramiona” x_lower i x_upper? Potrzebne jest pewne kryterium ilościowe.
whuber

Odpowiedzi:

9

Oto szybki i brudny pomysł oparty na sugestii @ alex.

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

Wygląda trochę jak twoje dane. Chodzi teraz o przyjrzenie się pochodnej i sprawdzenie, gdzie jest ona największa. To powinna być część twojej krzywej, w której jest najprostsza, ponieważ ma kształt litery 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))

wprowadź opis zdjęcia tutaj

cutoffy

Flądrarz
źródło
To jest niesamowite! Dzięki za przykład i kod! Próbowałem z moimi danymi i wydaje się, że działa całkiem dobrze. :)
Penguin_Knight 10.10.13
Dzięki! Ja też jestem z tego zadowolony. Zabawne, jak magiczne logowanie sprawiło, że zadziałało.
Flądrowiec