Estimación de la pendiente de la porción recta de una curva sigmoidea

11

Me dieron esta tarea y me quedé perplejo. Un colega me pidió que calcule y de la siguiente tabla: x l o w e rxupperxlower

ingrese la descripción de la imagen aquí

La curva es en realidad una distribución acumulativa, y x es algún tipo de medidas. Le interesa saber cuáles son los valores correspondientes en x cuando la función acumulativa comenzó a ser recta y se desvió de ser recta.

Entiendo que podemos usar la diferenciación para encontrar la pendiente en un punto, pero no estoy muy seguro de cómo determinar cuándo podemos llamar a la línea recta. Cualquier empujón hacia algún enfoque / literatura ya existente será muy apreciado.

Sé R también si conoces algún paquete o ejemplo relevante sobre este tipo de investigaciones.

Muchas gracias.


ACTUALIZAR

Gracias a Flounderer pude ampliar aún más el trabajo, configurar un marco y modificar los parámetros aquí y allá. Para fines de aprendizaje, aquí están mi código actual y una salida gráfica.

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

ingrese la descripción de la imagen aquí

Penguin_Knight
fuente
2
¿Puedes intentar determinar cuándo la segunda derivada es 0 o cercana a 0?
alex
3
El problema de la formulación puede ser que, muy probablemente, el corte "recto" no existe. Si toma una lente fuerte e inspecciona esa región, puede notar que todavía tiene una forma suave de S.
ttnphns
@alex Gracias por este consejo, me remangaré y lo pensaré y lo intentaré.
Penguin_Knight
2
Si se ajustara alguna densidad (por ejemplo, mediante la estimación de la densidad del núcleo, la estimación de la densidad de la ranura de registro, o incluso algún modelo paramétrico), la altura de la densidad en su pico es una estimación de la pendiente máxima de la CDF. La 'amplitud' del pico le dice algo acerca de cuán amplio es el rango de los valores de x donde tiene algún sentido hablar de esa pendiente como si fuera constante.
Glen_b -Reinstalar Monica
2
Para seguir el comentario de @ Glen_b, el punto principal es que lo que está pidiendo no se ha definido con suficiente rigor. ¿Qué tan por debajo del máximo del PDF deben ubicarse los "hombros" x_lower y x_upper? Se necesita algún criterio cuantitativo.
whuber

Respuestas:

9

Aquí hay una idea rápida y sucia basada en la sugerencia de @ alex.

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

Se parece un poco a sus datos. La idea ahora es mirar la derivada e intentar ver dónde es más grande. Esta debería ser la parte de su curva donde es más recta, debido a que tiene forma de 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))

ingrese la descripción de la imagen aquí

cutoffy

Flounderer
fuente
¡Esto es asombroso! Gracias por el ejemplo y el código! Lo probé con mis datos y parece funcionar bastante bien. :)
Penguin_Knight
¡Gracias! Estoy satisfecho con eso también. Es curioso cómo tomar troncos mágicamente lo hizo funcionar.
Flounderer