如何将密度对象转换为函数

时间:2013-09-05 12:02:30

标签: r statistics

我想使用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是函数一样。

2 个答案:

答案 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参数,答案会更准确。