【问题标题】:How do I plot the first derivative of the smoothing function?如何绘制平滑函数的一阶导数?
【发布时间】:2011-09-15 10:43:19
【问题描述】:

我有以下脚本来模拟我拥有的数据结构类型以及我想要对其进行的分析,

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') 的一阶导数。任何关于如何解决此问题的建议将不胜感激。

【问题讨论】:

  • +1 获取漂亮的示例代码。

标签: r ggplot2 smoothing


【解决方案1】:

您必须自己构造导数,有两种可能的方法。让我用一组来说明:

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,type="l",main="Derivative") #check

如您所见,通过这种方式您可以获得用于绘制导数的点。您将从这里弄清楚如何将其应用于两个级别并将这些点组合到您喜欢的情节中。在此示例代码的图表下方:

【讨论】:

  • @Joris Meys:抱歉,我的意思并不是字面上的“在上面”,而是除了我的分析之外,我还想绘制一阶导数。查看我的编辑。
  • @lafrasu :啊,很抱歉造成误解。答案如此编辑。
  • @Joris Meys:感谢您的回答。所以如果我理解正确的话,让ggplot2为我做这件事是不可能的?
  • @lafrasu :从技术上讲,您可以构建自己的函数并在 ggplot2 中使用它,或者您可以只绘制使用 ggplot2 获得的点而不再打扰。如果您想编写自定义函数以在 ggplot2 中获得它,您可能需要深入了解该包以找出它到底需要什么。所以我会去使用积分。我现在没有时间弄清楚,但也许其他人会插话。
  • @Joris Meys:我怀疑可能是这种情况。无论如何,谢谢,接受了。
【解决方案2】:

这是使用 ggplot 绘制此图的一种方法。可能有更有效的方法可以做到这一点,但这使用@Joris 完成的手动计算。我们将简单地构建一个包含所有 X 和 Y 值的长 data.frame,同时还提供一个变量来“刻面”图:

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")

【讨论】:

    【解决方案3】:

    如果使用smooth.spline 对数据进行平滑处理,则可以使用predict 中的参数deriv 指定预测数据的导数。遵循@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')
    

    输出中的任何差异很可能是由于平滑的差异造成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多