r - 是否可以在 R 中使用向量数学进行涉及区间的求和?
问题描述
标题有点粗糙,欢迎提出改进建议。
我正在尝试计算 500 长度向量的时间平均协方差。
我希望的结果是一个向量,其中 k 的条目从 0 到 500(0 只是整个集合的方差)。
我从这样的事情开始,但我知道我还需要在第一个均值比较中引用差距 (i):
x <- rnorm(500)
xMean <-mean(x)
i <- seq(1, 500)
dfGam <- data.frame(i)
dfGam$gamma <- (1/(500-dfGam$i))*(sum((x-xMean)*(x[-dfGam$i]-xMean)))
是否可以使用矢量数学来做到这一点,还是我需要使用某种for
循环?
这for
是我为解决方案提出的循环:
gamma_func <- function(input_vec) {
output_vec <- c()
input_mean <- mean(input_vec)
iter <- seq(1, length(input_vec)-1)
for(val in iter){
iter2 <- seq((val+1), length(input_vec))
gamma_sum <- 0
for(val2 in iter2){
gamma_sum <- gamma_sum + (input_vec[val2]-input_mean)*(input_vec[val2-val]-input_mean)
}
output_vec[val] <- (1/length(iter2))*gamma_sum
}
return(output_vec)
}
谢谢
解决方案
使用data.table
, 主要用于生成shift
x_{t - k} 的函数,您可以这样做:
library(data.table)
gammabar <- function(k, x){
xbar <- mean(x)
n <- length(x)
df <- data.table(xt = x, xtk = shift(x, k))[!is.na(xtk)]
df[, sum((xt - xbar)*(xtk - xbar))/n]
}
gammabar(k = 10, x)
# [1] -0.1553118
过滤器[!is.na(xtk)]
在 t = k + 1 处开始求和,因为 xtk 对于前 k 个索引将是 NA,因为移动了 k。
可重现x
x <- c(0.376972124936433, 0.301548373935665, -1.0980231706536, -1.13040590360378,
-2.79653431987176, 0.720573498411587, 0.93912102300901, -0.229377746707471,
1.75913134696347, 0.117366786802848, -0.853122822287008, 0.909259181618213,
1.19637295955276, -0.371583903741348, -0.123260233287436, 1.80004311672545,
1.70399587729432, -3.03876460529759, -2.28897494991878, 0.0583034949929225,
2.17436525195634, 1.09818265352131, 0.318220322390854, -0.0731475581637693,
0.834268741278827, 0.198750636733429, 1.29784138432631, 0.936718306241348,
-0.147433193833294, 0.110431994640128, -0.812504663900505, -0.743702167768748,
1.09534507180741, 2.43537370755095, 0.38811846676708, 0.290627670295127,
-0.285598287083935, 0.0760147178373681, -0.560298603759627, 0.447188372143361,
0.908501134499943, -0.505059597708343, -0.301004012157305, -0.726035976548133,
-1.18007702699501, 0.253074712637114, -0.370711296884049, 0.0221795637601637,
0.660044122429767, 0.48879363533552)
推荐阅读
- rust - Borrow 和 AsRef 实现的区别
- excel - vba 框架、图像和表格控制测量单位
- android - Apk 大小超过 100mb,适合游戏商店和私人商店的解决方案吗?
- php - Laravel如何使关系的隐藏属性可见
- node.js - 节点进程重启上传到s3,无需配置
- c - 来自简单 printf() 的奇怪垃圾输出
- struct - Rust:即使使用了作用域,多次借用结构实例作为可变对象也会失败
- npm - 在远程服务器上构建 React 项目是否安全
- docker - 詹金斯:无法从詹金斯执行码头命令
- c - 将字符串传递给 kernel_sendmsg 时应该遵循什么格式?