gpt4 book ai didi

r - 如何对R中特定范围内的函数求和?

转载 作者:行者123 更新时间:2023-12-01 01:05:26 25 4
gpt4 key购买 nike

以下是三列:

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 63.379
9 2 67.383
10 2 71.398
11 2 75.401
12 2 79.349
13 2 83.233
14 2 87.043
15 2 90.829
16 2 94.683
17 2 98.611
18 2 102.56
19 2 106.385
20 2 110.079
21 2 113.628
22 2 117.118
23 2 120.6
24 2 124.096
25 2 127.597
26 2 131.099
27 2 134.595
28 2 138.081
29 2 141.578
30 2 145.131
31 2 148.784
32 2 152.559
33 2 156.449
34 2 160.379
35 2 164.277
36 2 168.15
37 2 172.044
38 2 176
39 2 179.959
40 2 183.862
41 2 187.716
42 2 191.561
43 2 195.455
44 2 199.414
45 2 203.417
46 2 207.43
47 2 211.431
48 2 215.428
49 2 219.427
50 2 223.462
51 2 227.422
52 2 231.231
53 2 235.001
54 2 238.909
55 2 242.958
56 2 247.137
57 2 251.247
58 2 255.292
59 2 259.31
60 2 263.372
61 2 267.54
62 2 271.842
63 2 276.256
64 2 280.724
65 2 285.172

我想通过应用以下公式创建一个名为“Smoothed Y”的新列:
enter image description here

D=15, delta (三角形符号) = 5, i = indx, x_alpha(tk) = LocalY, x_alpha(ti) = 平滑值

我曾尝试使用以下代码来首先计算 Z :(下面的内核表示 exp 函数)
t <- 0.5
dt <- 0.1
delta <- t/dt
d <- 3*delta
indx <- a$indx
for (i in indx) {
initial <- i-d
end <- i+d
k <- c(initial:end)
for (n in k) {
kernel <- exp(-abs(i-n)/delta)
z <- sum(kernel)
}
}
a$z <- z
print (a)

注意:'a' 是包含上述三列的导入数据框。

尽管计算函数的值很好,但它不会对变量 z 中的值求和。如何对每个 indx 值 i 在 i-d 到 i+d 范围内求和?

最佳答案

您可以使用 convolve 函数。您需要决定的一件事是,对于比卷积核的宽度更接近数组任一端的索引,该怎么做。一种选择是简单地使用部分内核,重新缩放以使权重总和仍为 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
}

将数组设为 y ,结果如下:
> 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

当然,这样做的问题是内核最终不在边缘处居中。这是一个众所周知的问题,有办法处理它,但它使问题复杂化。绘制数据将向您显示这种非居中的影响:
plot(y)
lines(yy)

enter image description here

关于r - 如何对R中特定范围内的函数求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19236949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com