He tenido algunos distribución normal de los datos:
mu <- 3
sigma <- 5
x <- rnorm(1e5, mu, sigma)
Me tomó un núcleo de estimación de la densidad bastante con un alto ancho de banda:
kernel_density_of_x <- density(x, bw = 5)
Entonces me diferenciadas:
differentiate <- function(x, y)
{
diffOfX <- diff(x)
data.frame(
x = x[-length(x)] + (diffOfX / 2),
dyByDx = diff(y) / diffOfX
)
}
first_derivative <- with(kernel_density_of_x, differentiate(x, y))
Esto parecía tan esperado:
library(ggplot2)
(p1 <- ggplot(first_derivative, aes(x, dyByDx)) + geom_line())
Cuando me diferenciadas de nuevo, me esperaba otra curva suave, pero vi a un extraño efecto cíclico.
second_derivative <- with(first_derivative, differentiate(x, dyByDx))
(p2 <- p1 %+% second_derivative + ylab("d2yByDx2"))
He intentado un par de opciones diferentes para la kernel
argumento, pero el ruido persiste.
Dejar caer el ancho de banda, por ejemplo, 0.5
dio una menor frecuencia de ruido que dominó la trama (lo que es absurdo).
Bajando el número de puntos de muestreo hacia abajo desde n = 512
a n = 32
parado el tema, pero que la causa de otros problemas.
¿Por qué este efecto produce? Es un artefacto de la density
función, o he hecho algo tonto?
Podemos dibujar el gráfico mediante la utilización de la función de densidad de probabilidad de la distribución normal que x
fue generado a partir de ver la forma que yo esperaba:
xx <- seq.int(-20, 20, 0.1)
pdf_of_xx <- dnorm(xx, mu, sigma)
first_derivative_of_xx <- differentiate(xx, pdf_of_xx)
second_derivative_of_xx<- with(first_derivative_of_xx, differentiate(x, dyByDx))
ggplot(second_derivative_of_xx, aes(x, dyByDx)) + geom_line()