微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 我有以下脚本可以模拟我拥有的数据结构的类型以及我想对此进行的分析,
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()
除此之外,我还要绘制平滑函数
t
和因子
c(\'a\',\'b\')
的一阶导数。任何建议如何做到这一点将不胜感激。     

解决方法

        您将必须自己构造导数,并且有两种可能的方式。让我通过仅使用一组进行说明:
require(splines) #thx @Chase for the notice
lmdf <- mdf[mdf$variable==\"b\",]
model <- lm(value~ns(t,3),data=lmdf)
然后,您可以根据预测值将导数定义为
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,main=\"Derivative\") #check
如您所见,通过这种方式,您可以获得绘制导数的点。您将从这里弄清楚如何将其应用于两个级别并将这些点组合到所需的绘图中。在此示例代码的图下方:     ,        这是用ggplot进行绘制的一种方法。可能有一种更有效的方法,但这使用了@Joris进行的手动计算。我们将简单地使用所有X和Y值构造一个长的data.frame,同时还为图的“ facet”提供变量:
require(ggplot2)

originalData <- data.frame(X = X$t,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\")
    ,        如果使用
smooth.spline
对数据进行平滑处理,则可以使用
predict
中的参数the8ѭ指定预测数据的导数。来自@Joris的解决方案
lmdf <- mdf[mdf$variable == \"b\",]
model <- smooth.spline(x = lmdf$t,y = lmdf$value)
Y <- predict(model,x = seq(0.1,length=100),deriv = 1) # first derivative
plot(Y$x[,1],Y$y[,type = \'l\')
输出中的任何差异很可能归因于平滑差异。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。