我想使用density()
对象的输出作为函数(做许多事情作为派生,在特定时间间隔上集成,在特定点评估,......)
要清楚,我们举一个例子:
a=c(1,3,10,-5,0,0,2, 1, 3, 8,2, -2)
b=density(a)
我希望对b
f=some_transformation(b) # transformation I don't know
is.function(f) # answer must be "TRUE"
这样我就可以在任何时候评估密度
f(1.2) # evaluate density at 1.2
计算其衍生物
Df=D(body(f), "x") # derivative of f
Df(1.2) # derivative at 1.2
并执行其他R内容,就像f
是函数一样。
答案 0 :(得分:4)
您可以使用approxfun
。
a <- c(1,3,10,-5,0,0,2, 1, 3, 8,2, -2)
b <- density(a)
f <- approxfun(b, rule=2)
is.function(f)
f(1.2)
由于它没有用公式定义,
你不能使用D
(象征性的区分)
计算其衍生物。
不过,你可以用数字来估计它。
library(numDeriv)
df <- function(x) grad(f,x)
curve( f(x), lwd=3, xlim=c(-10,10) )
curve( df(x), lwd=3, xlim=c(-10,10) )
答案 1 :(得分:0)
D
接受表达式,而不是函数作为其第一个参数。它用于进行符号演算,而不是找到数值的梯度。您可以使用数字计算b
wrt x
的导数。
with(b, diff(y) / diff(x))
以下是渐变的可视化,以举例说明如何使用它。
librray(ggplot2)
gradient_data <- with(
density(a),
{
data.frame(
dy_by_dx = diff(y) / diff(x),
x = x[-1] + x[-length(x)] / 2
)
}
)
(gradient_plot <- ggplot(gradient_data, aes(x, dy_by_dx)) +
geom_line()
)
如果您想在任何时候评估该功能,请使用approx
。
with(density(a), approx(x, y, xout = -8:13))
如果增加n
函数的density
参数,答案会更准确。