Schätzen der Steigung des geraden Teils einer Sigmoidkurve


11

Ich habe diese Aufgabe erhalten und war ratlos. Ein Kollege hat mich gebeten, die und x l o w e r der folgenden Tabelle zu schätzen :xupperxlÖwer

Geben Sie hier die Bildbeschreibung ein

Die Kurve ist tatsächlich eine kumulative Verteilung, und x ist eine Art von Messungen. Er ist daran interessiert zu wissen, was die entsprechenden Werte für x sind, als die kumulative Funktion anfing, gerade zu werden und von der Geradheit abzuweichen.

Ich verstehe, dass wir die Differenzierung verwenden können, um die Steigung an einem Punkt zu finden, aber ich bin mir nicht sicher, wie wir bestimmen können, wann wir die Linie gerade nennen können. Jeder Anstoß zu einem bereits existierenden Ansatz / einer Literatur wird sehr geschätzt.

Ich kenne R auch, wenn Sie relevante Pakete oder Beispiele für diese Art von Untersuchungen kennen.

Danke vielmals.


AKTUALISIEREN

Dank Flounderer konnte ich die Arbeit weiter ausbauen, ein Framework einrichten und hier und da die Parameter basteln. Zu Lernzwecken sind hier mein aktueller Code und eine grafische Ausgabe.

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

Geben Sie hier die Bildbeschreibung ein


2
Können Sie versuchen festzustellen, wann die zweite Ableitung 0 oder nahe 0 ist?
Alex

3
Das Problem der Formulierung kann sein, dass - sehr wahrscheinlich - der "gerade" Schnitt nicht existiert. Wenn Sie eine starke Linse nehmen und diesen Bereich untersuchen, stellen Sie möglicherweise fest, dass er immer noch glatt S-förmig ist.
ttnphns

@alex Danke für diesen Tipp, ich werde meine Ärmel hochkrempeln und ein paar Gedanken und einen Versuch machen.
Penguin_Knight

2
Wenn man eine Dichte anpassen würde (z. B. durch Kernel-Dichteschätzung, Log-Spline-Dichteschätzung oder sogar ein parametrisches Modell), ist die Höhe der Dichte an ihrem Peak eine Schätzung der maximalen Steigung des CDF. Die 'Breite' des Peaks sagt etwas darüber aus, wie weit der Bereich der x-Werte reicht, wenn es sinnvoll ist, über diese Steigung zu sprechen, als ob sie konstant wäre.
Glen_b -Reinstate Monica

2
Um den Kommentar von @ Glen_b weiterzuverfolgen, ist der Hauptpunkt, dass das, wonach Sie fragen, nicht mit ausreichender Genauigkeit definiert wurde. Wie weit unter dem Maximum des PDF sollten sich die "Schultern" x_lower und x_upper befinden? Einige quantitative Kriterien sind erforderlich.
whuber

Antworten:


9

Hier ist eine schnelle und schmutzige Idee, die auf dem Vorschlag von @ alex basiert.

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

Es sieht ein bisschen wie Ihre Daten aus. Die Idee ist nun, das Derivat zu betrachten und zu versuchen, herauszufinden, wo es am größten ist. Dies sollte der Teil Ihrer Kurve sein, an dem sie am geradesten ist, da sie eine S-Form hat.

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

Es ist wackelig, weil einige der xWerte sind sehr nahe beieinander. Das Erstellen von Protokollen hilft jedoch, und dann können Sie eine geglättete Version verwenden.

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

Jetzt könnten Sie versuchen, das zu finden xist so:

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

Geben Sie hier die Bildbeschreibung ein

Natürlich hängt das Ganze letztendlich von der Wahl cutoffund auch von der Wahl des Glättungsalgorithmus ab und davon, dass Protokolle erstellt werden, wenn wir eine andere Transformation hätten durchführen können. Auch für reale Daten zufällige Variation inykann auch bei dieser Methode Probleme verursachen. Derivate verhalten sich numerisch nicht gut. Bearbeiten: Bild der Ausgabe hinzugefügt.


Das ist ziemlich genial! Danke für das Beispiel und den Code! Ich habe es mit meinen Daten versucht und es scheint ganz gut zu funktionieren. :)
Penguin_Knight

Vielen Dank! Ich bin auch damit zufrieden. Komisch, wie das magische Aufnehmen von Protokollen funktioniert hat.
Flunder
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.