我想绘制一个数据框(X,Y)data以及拟合函数和拟合函数的导数。

fit <- lm(data$Y ~ poly(data$X,32,raw=TRUE))
data$fitted_values <- predict(fit, data.frame(x=data$X))


据我了解,这为我提供了第32次多项式函数fit,可用于计算函数值并将其存储在data$fitted中。使用ggplot2绘制这些系列的工作就像一个魅力。

ggplot(data, aes(x=X)) +
    geom_line(aes(y = Y), colour="red") +
    geom_line(aes(y = predict), colour="blue")




到目前为止,一切都很好。但是我也想绘制的是拟合函数data$Y'的一阶导数fit。我感兴趣的是拟合函数的梯度。

我的问题:如何获得fit的导数函数?
我假设我可以“预测”绝对值,然后再绘图。正确?

最佳答案

首先,我将创建一些看起来像您的测试数据

set.seed(15)
rr<-density(faithful$eruptions)
dd<-data.frame(x=rr$x)
dd$y=rr$y+ runif(8,0,.05)

fit <- lm(y ~ poly(x,32,raw=TRUE), dd)
dd$fitted <- fitted(fit)

ggplot(dd, aes(x=x)) +
    geom_line(aes(y = y), colour="red") +
    geom_line(aes(y = fitted), colour="blue")




然后,由于您具有多项式的特殊形式,我们可以通过将每个系数乘以幂并将所有项向下移位来轻松地计算导数。这是一个用于计算新系数的辅助函数

deriv_coef<-function(x) {
    x <- coef(x)
    stopifnot(names(x)[1]=="(Intercept)")
    y <- x[-1]
    stopifnot(all(grepl("^poly", names(y))))
    px <- as.numeric(gsub("poly\\(.*\\)","",names(y)))
    rr <- setNames(c(y * px, 0), names(x))
    rr[is.na(rr)] <- 0
    rr
}


我们可以使用...

dd$slope <- model.matrix(fit) %*% matrix(deriv_coef(fit), ncol=1)


现在我可以绘图

ggplot(dd, aes(x=x)) +
    geom_line(aes(y = y), colour="red") +
    geom_line(aes(y = fitted), colour="blue") +
    geom_line(aes(y = slope), colour="green")




我们可以看到拐点对应于导数为零的位置

关于r - 绘制函数和导数函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29779342/

10-12 18:00
查看更多