我有以下数据:
我绘制了该数据的点,然后使用以下代码在图上对其进行平滑处理:
scatter.smooth(x=1:length(Ticker$ROIC[!is.na(Ticker$ROIC)]),
y=Ticker$ROIC[!is.na(Ticker$ROIC)],col = "#AAAAAA",
ylab = "ROIC Values", xlab = "Quarters since Feb 29th 2012 till Dec 31st 2016")
现在我想找到这条平滑曲线的逐点斜率。也适合趋势线到平滑图。我怎么能这样做?
答案 0 :(得分:3)
有一些有趣的R包实现了非参数导数估计。对Newell和Einbeck的简短回顾可能会有所帮助:http://maths.dur.ac.uk/~dma0je/Papers/newell_einbeck_iwsm07.pdf
在这里,我们考虑一个基于pspline
包的示例(平滑样条和对m阶导数的惩罚):
数据生成过程是带有加性噪声的负逻辑模型(因此y值都是负值,如@ForeverLearner的ROIC变量:
set.seed(1234)
x <- sort(runif(200, min=-5, max=5))
y = -1/(1+exp(-x))-1+0.1*rnorm(200)
我们开始绘制曲线的非参数估计(黑线是真曲线,红线是估计曲线):
library(pspline)
pspl <- smooth.Pspline(x, y, df=5, method=3)
f0 <- predict(pspl, x, nderiv=0)
然后,我们估计曲线的一阶导数:
f1 <- predict(pspl, x, nderiv=1)
curve(-exp(-x)/(1+exp(-x))^2,-5,5, lwd=2, ylim=c(-.3,0))
lines(x, f1, lwd=3, lty=2, col="red")
这里是二阶导数:
f2 <- predict(pspl, x, nderiv=2)
curve((exp(-x))/(1+exp(-x))^2-2*exp(-2*x)/(1+exp(-x))^3, -5, 5,
lwd=2, ylim=c(-.15,.15), ylab=)
lines(x, f2, lwd=3, lty=2, col="red")
答案 1 :(得分:1)
Subscriber