具有不均匀采样数据的高斯滤波器

Gaussian filter with uneven sampled data

我有一个采样不均匀的时间序列,我想将其降采样到 20Hz。我通过在 0.05 秒时间 windows (20Hz) 内合并数据点并对其应用算术平均值来制作移动平均线。数据框如下所示:

          Time    Right     Left
1  0.000000000 18.21980 30.98789
2  0.009222031 22.15157 37.18590
3  0.022511959 25.63218 42.49231
4  0.029854059 28.43851 46.57811
5  0.039320946 30.43885 49.29414
6  0.052499056 31.60561 50.67852
7  0.059612036 32.01045 50.92879
8  0.076606989 31.80335 50.34975
9  0.082647085 31.18134 49.29151
10 0.090698957 30.35415 48.09110

我用于移动平均线的代码是这样的:

data$group_num <- floor(data$Time/0.05)

data2<-NULL

data2$Right = aggregate(data$Right,
                               list(group_num=data$group_num), mean)
data2$Left = aggregate(data$Left,
                                     list(group_num=data$group_num), mean)
data2$Time = aggregate(data$Time,
                                 list(group_num=data$group_num), mean)

但是,为了优化它,我想制作一个高斯滤波器,以便 bin 中间的数据点具有更大的权重。我找不到任何可以处理不均匀采样的函数。因此,我开始编写脚本,设法给它们赋予权重。

data$weight <- ((data$Time-data$group_num*0.05)*((data$group_num+1)*0.05-data$Time))^5

我必须通过它们自己的 bin 中的权重(例如)对这些权重进行归一化。通过尝试将这些权重归一化为它们自己组的平均值,我 运行 成为函数太慢的问题。有人可以帮助我吗??

终于如愿以偿了。帮助我克服这个问题的关键函数是 ave()。感谢上帝。所以这就是我基本上所做的:

data$weight <- (abs(data$Time-(data$group_num*0.05+0.025)))^(-1)

data$Norm<-ave(data$weight,data$group_num,FUN=function(x) x/sum(x))

data$Time2<- data$Time*data$Norm

data$Right2<- data$Right*data$Norm

data$Left2<- data$Left*data$Norm

data2$Time<- tapply(data$Time2, data$group_num, sum)

data2$Right<- tapply(data$Right2, data$group_num, sum)

data2$Left<- tapply(data$Left2, data$group_num, sum)

感谢 Marat Talipov 的帮助。从我在您的代码中看到的情况来看,这也可行。但因为它运行良好且速度足够快,所以我将继续使用它。