每个返回的密度值

Dan*_*ani 4 r kernel-density

我有一个像这样的数据框“foo”

Date       Return
1998-01-01  0.02
1998-01-02  0.04
1998-01-03 -0.02
1998-01-04 -0.01
1998-01-05  0.02
...
1998-02-01  0.1
1998-02-02 -0.2
1998-02-03 -0.1
etc.
Run Code Online (Sandbox Code Playgroud)

我想在这个数据框中添加一个新列,显示相应回报的密度值。我试过:

foo$density <- for(i in 1:length(foo$Return)) density(foo$Return, 
from = foo$Return[i], to = foo$Return[i], n = 1)$y
Run Code Online (Sandbox Code Playgroud)

但它没有用。我真的很难将“函数”应用于每一行。但也许还有另一种方法可以做到,而不是使用密度()?

我本质上想做的是将密度()中的拟合密度值提取到 foo 中的返回值。如果我只是做 plot(density(foo$Return)) 它会给我曲线,但是我希望将密度值附加到回报上。

@乔里斯:

foo$density <- density(foo$Return, n=nrow(foo$Return))$y 
Run Code Online (Sandbox Code Playgroud)

计算一些东西,但似乎返回错误的密度值。

谢谢你帮我解决!达尼

Jor*_*eys 5

转念一想,忘记密度函数,我突然意识到你想要做什么。大多数密度函数返回一个网格,所以不要给你精确点的评估。如果你想要,你可以使用这个sm包:

require(sm)
foo <- data.frame(Return=rpois(100,5))
foo$density <- sm.density(foo$Return,eval.points=foo$Return)$estimate
# the plot
id <- order(foo$Return)
hist(foo$Return,freq=F)
lines(foo$Return[id],foo$density[id],col="red")
Run Code Online (Sandbox Code Playgroud)

如果不同值的数量不是很大,您可以使用 ave() :

foo$counts <- ave(foo$Return,foo$Return,FUN=length)
Run Code Online (Sandbox Code Playgroud)

如果目的是绘制密度函数,则无需像您一样计算它。只需使用

plot(density(foo$Return))
Run Code Online (Sandbox Code Playgroud)

或者,在下方添加直方图(注意选项freq=F

hist(foo$Return,freq=F)
lines(density(foo$Return),col="red")
Run Code Online (Sandbox Code Playgroud)