指数平滑方法

时间:2016-04-06 07:01:32

标签: r

我正在尝试在r中创建一个指数平滑函数。

我已经能够使用公式在Excel中创建我需要的东西:

=(alpha*observed+(alpha - 1)*previous)

这很容易被拖下来并达到预期的效果。以下是alpha = 0.1的示例。

Score <- c(4,7,3,5,7,2,3)

Score   Exp Smooth      Calculation
4       #N/A            #N/A
7       4               4
3       4.3             0.1*7+0.9*4
5       4.17            0.1*3+0.9*4.3
7       4.253           0.1*5+0.9*4.17
2       4.5277          0.1*7+0.9*4.253
3       4.27493         0.1*2+0.9*4.5277

我确信必须有一种方法可以将此作为r中的函数重新创建。 此外,我需要此功能才能在多个字段上进行分组。这是另一个包含更多字段和所需指数平滑数字的示例。

Player <- c('Y','Z','Z','Z','Z','Y','Y','Y','Y','Z','Y','Y','Z','Y','Z','Y','Z','Z','Y','Y','Z','Y','Z','Y','Z','Z','Y')
Team <- c('A','B','A','A','B','A','B','B','A','A','B','B','A','A','A','A','A','A','A','B','B','B','B','A','A','A','A')
Score <- c(5,2,7,3,9,6,3,7,1,7,3,8,3,4,1,9,4,6,3,8,3,4,1,9,4,6,6)
data.frame(Player, Team, Score)

期望的结果:

Player  Team    Score   Exp Smooth
Y       A       5       #N/A            
Z       B       2       #N/A
Z       A       7       #N/A            
Z       A       3       7                
Z       B       9       2
Y       A       6       5
Y       B       3       #N/A
Y       B       7       3
Y       A       1       5.1
Z       A       7       6.6
Y       B       3       3.4
Y       B       8       3.36
Z       A       3       6.64
Y       A       4       4.69
Z       A       1       6.276
Y       A       9       4.621
Z       A       4       5.7484
Z       A       6       5.57356
Y       A       3       5.05890
Y       B       8       3.82400
Z       B       3       2.70000
Y       B       4       4.24160
Z       B       1       2.73000
Y       A       9       4.85301
Z       A       4       5.616204
Z       A       6       5.454584
Y       A       6       5.267709

我确信必须有办法在r中实现这一目标。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

您可以使用filter功能。但是,我们必须有点创意,因为它的递归过滤器意味着滞后0的系数为1。

fun <- function(x) {
  res <- stats::filter(x * c(1, rep(0.1, length(x) - 1)), 0.9, method = "recursive")
  c(NA, res[-length(res)])
}

Score <- c(4,7,3,5,7,2,3)
fun(Score)
#[1]      NA 4.00000 4.30000 4.17000 4.25300 4.52770 4.27493

Stack Overflow上有大量答案显示如何按组应用功能(&#34; split-apply-combine&#34;)。