How to sum a function over a specific range in R?

前端 未结 1 1322
庸人自扰
庸人自扰 2021-01-19 23:22

Here are three columns:

indx    vehID   LocalY
1   2   35.381
2   2   39.381
3   2   43.381
4   2   47.38
5   2   51.381
6   2   55.381
7   2   59.381
8   2          


        
1条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-19 23:57

    You can use the convolve function. One thing you need to decide is what to do for indices closer to either end of the array than width of the convolution kernel. One option is to simply use the partial kernel, rescaled so the weights still sum to 1.

    smooth<-function(x,D,delta){
      z<-exp(-abs(-D:D)/delta)
      r<-convolve(x,z,type="open")/convolve(rep(1,length(x)),z,type="open")  
      r<-head(tail(r,-D),-D)
      r
    }
    

    With your array as y, the result is this:

    > yy<-smooth(y,15,5)
    > yy
     [1]  50.70804  52.10837  54.04788  56.33651  58.87682  61.61121  64.50214
     [8]  67.52265  70.65186  73.87197  77.16683  80.52193  83.92574  87.36969
    [15]  90.84850  94.35809  98.15750 101.93317 105.67833 109.38989 113.06889
    [22] 116.72139 120.35510 123.97707 127.59293 131.20786 134.82720 138.45720
    [29] 142.10507 145.77820 149.48224 153.21934 156.98794 160.78322 164.60057
    [36] 168.43699 172.29076 176.15989 180.04104 183.93127 187.83046 191.74004
    [43] 195.66223 199.59781 203.54565 207.50342 211.46888 215.44064 219.41764
    [50] 223.39908 227.05822 230.66813 234.22890 237.74176 241.20236 244.60039
    [57] 247.91917 251.14346 254.25876 257.24891 260.09121 262.74910 265.16057
    [64] 267.21598 268.70276
    

    Of course, the problem with this is that the kernel ends up non-centered at the edges. This is a well-known problem, and there are ways to deal with it but it complicates the problem. Plotting the data will show you the effects of this non-centering:

    plot(y)
    lines(yy) 
    

    enter image description here

    0 讨论(0)
提交回复
热议问题