Ограниченное обучение статистике, поэтому, возможно, я пытаюсь определить что-то, что является простой функцией, или почему я не могу найти существующий ответ.
Проблема состоит в том, чтобы вычислить средневзвешенное значение для временного ряда с большим весом для самых последних данных. Взвешивание должно следовать функции «одной стороны кривой Гаусса» («кривая S»?), максимальное значение начинается с самой последней (последней) точки. Я понимаю, что будет пара коэффициентов для определения градиента кривой, но предположим, что это «нормально».
Точки взвешивания вдоль кривой «S» в R
Кажется, это задает тот же вопрос, но единственный ответ немного переработан для того, что я ищу
Я могу создать линейное средневзвешенное значение следующим образом
# time series data
d <- c(7, 8, 10, 7, 8, 11, 9, 6, 13, 10, 11, 11)
# weight coefficients
w <- seq(1, length(d), 1)
w <- w / sum(w)
w
[1] 0.01282051 0.02564103 0.03846154 0.05128205 0.06410256 0.07692308 0.08974359 0.10256410
[9] 0.11538462 0.12820513 0.14102564 0.15384615
weighted.mean(d, w, na.rm = T)
[1] 9.846154
Как мне использовать «последовательность Гаусса» для w
вместо моей линейной?
спасибо @zephryl, я могу поэкспериментировать и с тем, и с другим. пока начальный и конечный градиент менее крутой, чем средний
Вы можете получить веса, соответствующие левой части нормального распределения, следующим образом:
w <- dnorm(seq(-3, 0, length = length(d)))
w <- w / sum(w)
Таким образом, веса выглядят примерно так:
plot(w)
Если вы хотите, чтобы кривая была круче, вы можете установить аргумент sd
dnorm
меньше 1, а если вы хотите, чтобы она была более плавной, увеличьте ее значение. На данный момент пример показывает значение по умолчанию с sd = 1.
РЕДАКТИРОВАТЬ
Альтернативой, которая может обеспечить лучший контроль, может быть логистическая кривая:
w <- plogis(seq(-1, 1, length = length(d)), scale = 0.3)
w <- w / sum(w)
plot(w)
w <- plogis(seq(-1, 1, length = length(d)), scale = 0.15)
w <- w / sum(w)
plot(w)
Все верно. Но решение также предполагает, что наблюдения равномерно распределены. Это мая не может быть истинным в общем случае. Чтобы использовать распределение, отличное от нормального, замените dnorm
соответствующей функцией dxxxx
. У каждого будет свой набор параметров для управления крутизной склона. Кроме того, не забудьте нормализовать веса, чтобы их сумма равнялась 1, чтобы получить действительное средневзвешенное значение.
@Limey хорошие моменты. Я обновил, чтобы специально нормализовать веса, как они были в вопросе ОП. В ОП упоминалось, что это временной ряд, поэтому для целей этого ответа я подумал, что можно предположить регулярный интервал (собственный класс ts
допускает только регулярный интервал, хотя я знаю, что временные ряды с неравномерным интервалом можно использовать в пакетах расширения) . Логистическая кривая может быть лучшим вариантом, и я включу ее в свой ответ. Спасибо.
Спасибо обоим. Это именно то, что я искал. Я использовал w <- dnorm(seq(-3, 0, length = length(d))); w <- w / sum(w)
после моего линейного ответа, чтобы нормализовать коэффициенты. вместо деления на dnorm(0)
Чтобы запустить средневзвешенное значение временного ряда, я бы рекомендовал использовать convolve
из соображений эффективности, а не пытаться реализовать его повторно. Например:
d <- c(7, 8, 10, 7, 8, 11, 9, 6, 13, 10, 11, 11)
k <- dnorm(seq(-2,2, length.out = 5))
convolve(d, k/sum(k), type = "filter")
[1] 9.466427 7.427122 8.213693 10.465371 8.894341 7.066883 11.933909
[8] 10.425011
Для S-образной кривой вам может понадобиться что-то вроде логистического распределения, а не гауссовского (колоколообразного).