如何绘制平滑函数的一阶导数?

laf*_*ras 13 r smoothing ggplot2

我有以下脚本模拟我拥有的数据结构类型和我想要做的分析,

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()
Run Code Online (Sandbox Code Playgroud)

除此之外,我想做的是绘制平滑函数的一阶导数以t反对因子c('a','b').任何建议如何去做这件事将不胜感激.

Jor*_*eys 12

你必须自己构建衍生物,有两种可能的方法.让我通过只使用一个组来说明:

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

然后,您可以diff(Y)/diff(X)根据预测值简单地定义导数,就像区分离散函数一样.如果你拿到足够的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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这样您就可以获得绘制导数的点数.你会从这里弄清楚如何将这个应用到两个级别并将这些点组合到你喜欢的情节.在此示例代码的下图中:

在此输入图像描述