绘制函数和导数函数
Plotting a function and a derivative function
我想绘制数据框 (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")
到目前为止一切顺利。但我也想绘制的是拟合函数 fit
的一阶导数 data$Y'
。我感兴趣的是拟合函数的梯度。
我的问题:如何得到fit
的导函数?
我假设我可以 "predict" 之后绘制的绝对值。正确吗?
您可以通过先根据 X
对数据进行排序来近似导数,然后找出每对连续值之间的差异。
data <- d[order(d$X), ]
data$derivative = c(diff(d$fitted_values) / diff(d$X), NA)
(请注意我是如何在末尾添加一个 NA
的,因为取差会使它稍微短一些)。之后你可以绘制这个:
ggplot(data, aes(X, derivative)) + geom_line()
首先,我将创建一些测试数据,"kind of" 看起来像你的
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")
我们可以看到拐点对应于导数为零的地方。
据说quantchem包可以用导数函数做到。
Description
Calculate derivative of polynomial for given x.
Usage
derivative(obj, x)
Arguments
obj: an object of class 'lm', fitted in y ~ x + I(x^2) + I(x^3) + ...
way.
x: a vector of x values
Examples
x = 1:10 y = jitter(x+x^2)
fit = lm(y~x+I(x^2))
derivative(fit,1:10)
注意:综上所述,它对我和我的数据都不起作用。
我想绘制数据框 (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")
到目前为止一切顺利。但我也想绘制的是拟合函数 fit
的一阶导数 data$Y'
。我感兴趣的是拟合函数的梯度。
我的问题:如何得到fit
的导函数?
我假设我可以 "predict" 之后绘制的绝对值。正确吗?
您可以通过先根据 X
对数据进行排序来近似导数,然后找出每对连续值之间的差异。
data <- d[order(d$X), ]
data$derivative = c(diff(d$fitted_values) / diff(d$X), NA)
(请注意我是如何在末尾添加一个 NA
的,因为取差会使它稍微短一些)。之后你可以绘制这个:
ggplot(data, aes(X, derivative)) + geom_line()
首先,我将创建一些测试数据,"kind of" 看起来像你的
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")
我们可以看到拐点对应于导数为零的地方。
据说quantchem包可以用导数函数做到。
Description
Calculate derivative of polynomial for given x.
Usage
derivative(obj, x)
Arguments
obj: an object of class 'lm', fitted in y ~ x + I(x^2) + I(x^3) + ... way.
x: a vector of x values
Examples
x = 1:10 y = jitter(x+x^2)
fit = lm(y~x+I(x^2))
derivative(fit,1:10)
注意:综上所述,它对我和我的数据都不起作用。