这可能是非常基本的,但是,我正在尝试为变量Returns_Close_exp
创建一列标准差。这个变量实际上是一个数值向量。所以我想要的不是整个矢量的标准偏差,而是两个元素之间的标准差。
这是我创建矢量的方式及其外观:
Returns_Close_exp<-diff(log(Data_new$Close_exp), lag=1)
Returns_Close_exp<-append(Returns_Close_exp,"",0)
Returns_Close_exp<-as.numeric(Returns_Close_exp)
向量头:
dput(head(Returns_Close_exp))
c(NA, 0, 0.00121876921624686, -0.00121876921624686, -0.00122025634730871,
-0.00981602975444584)
我试图得到标准偏差的是:
vol_close_exp<-sapply(Returns_Close_exp,sd)
但是我得到了NA的专栏。 有谁知道哪里出了问题以及如何纠正? 谢谢
答案 0 :(得分:3)
您可以通过以下两种方法进行操作:在索引向量上使用sapply()
(本质上是作为循环),或使用某种滚动功能,例如使用RcppRoll::roll_sd
:
vec <- c(NA, 0, 0.00121876921624686, -0.00121876921624686, -0.00122025634730871,
-0.00981602975444584)
# Solution with base R
sapply(1:(length(vec)-1), function(i) sd(c(vec[i], vec[i+1])))
#> [1] NA 8.61800e-04 1.72360e-03 1.05156e-06 6.07813e-03
# Solution with RcppRoll (recommended when performance is key)
RcppRoll::roll_sd(vec, 2)
#> [1] NA 8.61800e-04 1.72360e-03 1.05156e-06 6.07813e-03
由reprex package(v0.2.1)于2018-10-25创建
您最初要做的是将函数sd()
应用于向量中的每个数字,单个数字的sd()
始终为NA
。
当性能很关键时,我建议使用RcppRoll
。让我们看看RcppRoll
解决方案的速度有多快:
vec <- c(NA, 0, 0.00121876921624686, -0.00121876921624686, -0.00122025634730871,
-0.00981602975444584)
# Benchmarks:
library(microbenchmark)
microbenchmark(base = sapply(1:(length(vec)-1), function(i) sd(c(vec[i], vec[i+1]))),
rcpproll = RcppRoll::roll_sd(vec, 2))
#> Unit: microseconds
#> expr min lq mean median uq max neval
#> base 1042.251 1083.269 1264.2698 1133.120 1287.4990 10036.937 100
#> rcpproll 124.930 133.654 161.4393 145.947 168.3785 286.695 100
#> cld
#> b
#> a
# Let's benchmark with bigger data:
set.seed(123)
vec <- rnorm(1e4)
microbenchmark(base = sapply(1:(length(vec)-1), function(i) sd(c(vec[i], vec[i+1]))),
rcpproll = RcppRoll::roll_sd(vec, 2))
#> Unit: milliseconds
#> expr min lq mean median uq
#> base 1966.86067 2063.439484 2141.24892 2134.337090 2198.671640
#> rcpproll 3.55177 3.701657 4.01187 3.786363 3.904616
#> max neval cld
#> 2525.95089 100 b
#> 20.71965 100 a
all.equal(sapply(1:(length(vec)-1), function(i) sd(c(vec[i], vec[i+1]))),
RcppRoll::roll_sd(vec, 2))
#> [1] TRUE
由reprex package(v0.2.1)于2018-10-25创建