3

我想将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

f并像做一个函数一样做其他 R 的东西。

4

2 回答 2

5

您可以使用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) )
于 2013-09-05T12:33:36.273 回答
0

D接受一个表达式,而不是一个函数作为它的第一个参数。它用于进行符号演算,而不是求数值的梯度。您可以使用数值计算bwrt的导数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

于 2013-09-05T12:33:22.773 回答