R加权移动平均线与部分平均数
R Weighted moving average with partial averages
我正在尝试在 R 中编写一个(居中)加权移动平均函数,return我是一个与输入向量大小相同的向量。
下面的代码几乎给了我我想要的,但它不适用于我的向量的第一个和最后一个值
set.seed(0)
len=10
x=floor(l*runif(l))
weights=c(1,3,0,3,1)
weights=weights/sum(weights)
rollapply(x,width=length(weights), function(x) sum(x*weights),align="center")
na.omit(filter(x,sides=2,weights))
在 rollapply 函数中设置 partial=TRUE 是我想要做的。无论如何它不起作用,因为我的函数不支持改变大小的 x。
我可以使用后者并通过循环手动添加边计算。它会起作用,但我想找到一种更好(计算速度更快)的方法来做到这一点。
为了更严格地描述我的需求,这里有一个数学版本
r 是我的函数的向量 return
x 和权重 w 作为输入:
使用 Rcpp,您可以:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector roll_mean(const NumericVector& x,
const NumericVector& w) {
int n = x.size();
int w_size = w.size();
int size = (w_size - 1) / 2;
NumericVector res(n);
int i, ind_x, ind_w;
double w_sum = Rcpp::sum(w), tmp_wsum, tmp_xwsum, tmp_w;
// beginning
for (i = 0; i < size; i++) {
tmp_xwsum = tmp_wsum = 0;
for (ind_x = i + size, ind_w = w_size - 1; ind_x >= 0; ind_x--, ind_w--) {
tmp_w = w[ind_w];
tmp_wsum += tmp_w;
tmp_xwsum += x[ind_x] * tmp_w;
}
res[i] = tmp_xwsum / tmp_wsum;
}
// middle
int lim2 = n - size;
for (; i < lim2; i++) {
tmp_xwsum = 0;
for (ind_x = i - size, ind_w = 0; ind_w < w_size; ind_x++, ind_w++) {
tmp_xwsum += x[ind_x] * w[ind_w];
}
res[i] = tmp_xwsum / w_sum;
}
// end
for (; i < n; i++) {
tmp_xwsum = tmp_wsum = 0;
for (ind_x = i - size, ind_w = 0; ind_x < n; ind_x++, ind_w++) {
tmp_w = w[ind_w];
tmp_wsum += tmp_w;
tmp_xwsum += x[ind_x] * tmp_w;
}
res[i] = tmp_xwsum / tmp_wsum;
}
return res;
}
我在我的一个包中使用了这个功能。
只需将其放入 .cpp
文件中并使用 Rcpp::sourceCpp
获取它。
我正在尝试在 R 中编写一个(居中)加权移动平均函数,return我是一个与输入向量大小相同的向量。 下面的代码几乎给了我我想要的,但它不适用于我的向量的第一个和最后一个值
set.seed(0)
len=10
x=floor(l*runif(l))
weights=c(1,3,0,3,1)
weights=weights/sum(weights)
rollapply(x,width=length(weights), function(x) sum(x*weights),align="center")
na.omit(filter(x,sides=2,weights))
在 rollapply 函数中设置 partial=TRUE 是我想要做的。无论如何它不起作用,因为我的函数不支持改变大小的 x。
我可以使用后者并通过循环手动添加边计算。它会起作用,但我想找到一种更好(计算速度更快)的方法来做到这一点。
为了更严格地描述我的需求,这里有一个数学版本
r 是我的函数的向量 return
x 和权重 w 作为输入:
使用 Rcpp,您可以:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector roll_mean(const NumericVector& x,
const NumericVector& w) {
int n = x.size();
int w_size = w.size();
int size = (w_size - 1) / 2;
NumericVector res(n);
int i, ind_x, ind_w;
double w_sum = Rcpp::sum(w), tmp_wsum, tmp_xwsum, tmp_w;
// beginning
for (i = 0; i < size; i++) {
tmp_xwsum = tmp_wsum = 0;
for (ind_x = i + size, ind_w = w_size - 1; ind_x >= 0; ind_x--, ind_w--) {
tmp_w = w[ind_w];
tmp_wsum += tmp_w;
tmp_xwsum += x[ind_x] * tmp_w;
}
res[i] = tmp_xwsum / tmp_wsum;
}
// middle
int lim2 = n - size;
for (; i < lim2; i++) {
tmp_xwsum = 0;
for (ind_x = i - size, ind_w = 0; ind_w < w_size; ind_x++, ind_w++) {
tmp_xwsum += x[ind_x] * w[ind_w];
}
res[i] = tmp_xwsum / w_sum;
}
// end
for (; i < n; i++) {
tmp_xwsum = tmp_wsum = 0;
for (ind_x = i - size, ind_w = 0; ind_x < n; ind_x++, ind_w++) {
tmp_w = w[ind_w];
tmp_wsum += tmp_w;
tmp_xwsum += x[ind_x] * tmp_w;
}
res[i] = tmp_xwsum / tmp_wsum;
}
return res;
}
我在我的一个包中使用了这个功能。
只需将其放入 .cpp
文件中并使用 Rcpp::sourceCpp
获取它。