Estimando a inclinação da parte reta de uma curva sigmóide

11

Eu recebi essa tarefa e fiquei perplexo. Um colega me pediu para estimar a e x l o w e r do quadro a seguir:xupperxlower

insira a descrição da imagem aqui

A curva é na verdade uma distribuição cumulativa ex é algum tipo de medida. Ele está interessado em saber quais são os valores correspondentes em x quando a função cumulativa começou a se tornar reta e se desviar de ser reta.

Entendo que podemos usar a diferenciação para encontrar a inclinação em um ponto, mas não tenho muita certeza de como determinar quando podemos chamar a linha reta. Qualquer sugestão em relação a alguma abordagem / literatura já existente será muito apreciada.

Sei que R também conhece pacotes ou exemplos relevantes sobre esse tipo de investigação.

Muito obrigado.


ATUALIZAR

Graças ao Flounderer, fui capaz de expandir ainda mais o trabalho, montar uma estrutura e ajustar os parâmetros aqui e ali. Para fins de aprendizado, aqui estão meu código atual e uma saída 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))

insira a descrição da imagem aqui

Penguin_Knight
fonte
2
Você pode tentar determinar quando a segunda derivada é 0 ou próximo de 0?
9133 alex
3
O problema da formulação pode ser que - muito provavelmente - o corte "reto" não existe. Se você pegar uma lente forte e inspecionar a região, poderá notar que ela ainda está em forma de S.
ttnphns
@alex Obrigado por esta dica, vou arregaçar as mangas e dar alguns pensamentos e tentar.
Penguin_Knight
2
Se alguém se ajustasse a alguma densidade (digamos, por estimativa de densidade de kernel, estimativa de densidade log-spline ou mesmo por algum modelo paramétrico), a altura da densidade em seu pico é uma estimativa da inclinação máxima do CDF. A 'amplitude' do pico indica algo sobre a extensão da faixa dos valores-x, onde faz algum sentido falar sobre essa inclinação como se fosse constante.
Glen_b -Reinstala Monica 10/10
2
Para acompanhar o comentário de @ Glen_b, o ponto principal é que o que você está pedindo não foi definido com rigor suficiente. Quão abaixo do máximo do PDF os "ombros" x_lower e x_upper devem estar localizados? É necessário algum critério quantitativo.
whuber

Respostas:

9

Aqui está uma idéia rápida e suja, com base na sugestão de @ alex.

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

Parece um pouco com seus dados. A idéia agora é examinar a derivada e tentar ver onde ela é maior. Essa deve ser a parte da sua curva onde ela é mais reta, por ser em 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))

insira a descrição da imagem aqui

cutoffy

Solha
fonte
Isso é incrível! Obrigado pelo exemplo e código! Eu tentei com meus dados e parece funcionar muito bem. :)
Penguin_Knight 10/10
Obrigado! Também estou satisfeito com isso. Engraçado como tomar logs magicamente fazia com que funcionasse.
quer