2011-06-15 23 views
13

tengo la siguiente secuencia de comandos que emula el tipo de estructura de datos que tengo y análisis que quiero hacer en ella,¿Cómo grafico la primera derivada de la función de suavizado?

library(ggplot2) 
library(reshape2) 

n <- 10 
df <- data.frame(t=seq(n)*0.1, a =sort(rnorm(n)), b =sort(rnorm(n)), 
           a.1=sort(rnorm(n)), b.1=sort(rnorm(n)), 
           a.2=sort(rnorm(n)), b.2=sort(rnorm(n))) 
head(df) 

mdf <- melt(df, id=c('t')) 
## head(mdf) 

levels(mdf$variable) <- rep(c('a','b'),3) 

g <- ggplot(mdf,aes(t,value,group=variable,colour=variable)) 
g + 
stat_smooth(method='lm', formula = y ~ ns(x,3)) + 
geom_point() + 
facet_wrap(~variable) + 
opts() 

Lo que me gustaría hacer, además de esto es terreno de la primera derivada de la función de suavizado contra t y contra los factores, c('a','b'), también. Cualquier sugerencia sobre cómo hacer esto sería muy apreciada.

+0

1 para el código de ejemplo hermoso. –

Respuesta

12

Vas a tener que construir el derivado a sí mismo, y hay dos formas posibles para ello. Permítanme ilustrar mediante el uso de un solo grupo:

require(splines) #thx @Chase for the notice 
lmdf <- mdf[mdf$variable=="b",] 
model <- lm(value~ns(t,3),data=lmdf) 

A continuación, simplemente definir su derivado como diff(Y)/diff(X) en función de sus valores previstos, como lo haría para la diferenciación de una función discreta. Es una muy buena aproximación si toma suficientes puntos X.

X <- data.frame(t=seq(0.1,1.0,length=100)) # make an ordered sequence 
Y <- predict(model,newdata=X) # calculate predictions for that sequence 
plot(X$t,Y,type="l",main="Original fit") #check 

dY <- diff(Y)/diff(X$t) # the derivative of your function 
dX <- rowMeans(embed(X$t,2)) # centers the X values for plotting 
plot(dX,dY,type="l",main="Derivative") #check 

Como puede ver, de esta manera obtiene los puntos para trazar la derivada. A partir de aquí, descubrirá cómo aplicar esto a ambos niveles y combinar esos puntos con la trama que desee. Por debajo de las parcelas de este código de ejemplo:

enter image description here

+0

@Joris Meys: Disculpas, no quise decir literalmente "arriba", sino que además de mi análisis, también me gustaría trazar las primeras derivadas. Ver mi edición – lafras

+0

@lafrasu: ah, perdón por el malentendido. Respuesta editada como tal. –

+1

@Joris Meys: gracias por su respuesta. Entonces, si te entiendo correctamente, ¿es imposible hacer que ggplot2 haga esto por mí? – lafras

4

Aquí es un enfoque para el trazado de esto con ggplot. Puede haber una manera más eficiente de hacerlo, pero esto usa los cálculos manuales hechos por @Joris. Vamos a simplemente construimos un largo hoja.de.datos con todos los valores X e Y al mismo tiempo el suministro de una variable a "faceta" las parcelas:

require(ggplot2) 

originalData <- data.frame(X = X$t, Y, type = "Original") 
derivativeData <- data.frame(X = dX, Y = dY, type = "Derivative") 

plotData <- rbind(originalData, derivativeData) 

ggplot(plotData, aes(X,Y)) + 
    geom_line() + 
    facet_wrap(~type, scales = "free_y") 
1

Si los datos se alisa con smooth.spline, la derivada de los datos pronosticados puede se especifica utilizando el argumento deriv en predict. Siguiendo de @ solución de Joris

lmdf <- mdf[mdf$variable == "b",] 
model <- smooth.spline(x = lmdf$t, y = lmdf$value) 
Y <- predict(model, x = seq(0.1,1.0,length=100), deriv = 1) # first derivative 
plot(Y$x[, 1], Y$y[, 1], type = 'l') 

Cualquier disimilitud en la salida es más probable debido a las diferencias en el alisado.

Cuestiones relacionadas