Estimation de la pente de la partie droite d'une courbe sigmoïde

11

On m'a confié cette tâche et j'ai été perplexe. Un collègue m'a demandé d'estimer le et le x l o w e r du graphique suivant:xupperxlower

entrez la description de l'image ici

La courbe est en fait une distribution cumulative, et x est une sorte de mesure. Il souhaite savoir quelles sont les valeurs correspondantes sur x lorsque la fonction cumulative a commencé à devenir droite et à s'écarter de la droite.

Je comprends que nous pouvons utiliser la différenciation pour trouver la pente en un point, mais je ne sais pas trop comment déterminer quand pouvons-nous appeler la ligne droite. Tout coup de pouce vers une approche / littérature déjà existante sera grandement apprécié.

Je connais R aussi si vous connaissez des packages ou des exemples pertinents sur ce type d'enquêtes.

Merci beaucoup.


MISE À JOUR

Grâce à Flounderer, j'ai pu étendre davantage le travail, mettre en place un framework et bricoler les paramètres ici et là. À des fins d'apprentissage, voici mon code actuel et une sortie graphique.

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

entrez la description de l'image ici

Penguin_Knight
la source
2
Pouvez-vous essayer de déterminer quand la dérivée seconde est 0 ou proche de 0?
alex
3
Le problème de la formulation peut être que - très probablement - la coupe "droite" n'existe pas. Si vous prenez un objectif solide et inspectez cette région, vous remarquerez peut-être qu'elle est toujours en forme de S.
ttnphns
@alex Merci pour cette astuce, je vais retrousser mes manches et lui donner quelques réflexions et un essai.
Penguin_Knight
2
Si l'on devait ajuster une certaine densité (par exemple par estimation de densité de noyau, estimation de densité log-spline, ou même un modèle paramétrique), la hauteur de la densité à son pic est une estimation de la pente maximale du CDF. La «largeur» du pic vous indique quelque chose sur la largeur de la plage des valeurs x où il est logique de parler de cette pente comme si elle était constante.
Glen_b -Reinstate Monica
2
Pour faire suite au commentaire de @ Glen_b, l'essentiel est que ce que vous demandez n'a pas été défini avec une rigueur suffisante. À quelle distance au-dessous du maximum du PDF les «épaules» x_lower et x_upper doivent-elles être situées? Un critère quantitatif est nécessaire.
whuber

Réponses:

9

Voici une idée rapide et sale basée sur la suggestion de @ alex.

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

Cela ressemble un peu à vos données. L'idée est maintenant de regarder le dérivé et d'essayer de voir où il est le plus important. Cela devrait être la partie de votre courbe où elle est la plus droite, car il s'agit d'une forme en 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))

entrez la description de l'image ici

cutoffy

Flet
la source
C'est assez génial! Merci pour l'exemple et le code! Je l'ai essayé avec mes données et cela semble fonctionner très bien. :)
Penguin_Knight
Merci! J'en suis également satisfait. C'est marrant comme la prise de journaux par magie l'a fait fonctionner.
Flounderer