Я пытаюсь работать с библиотекой полиномов, а именно с функциями полинома (возвращает вектор, представляющий полиномиальное уравнение), и решаю (ожидается вектор, представляющий полиномиальное уравнение, и возвращает вектор корней)
В наборе данных, с которым я работаю, наблюдается тенденция к значительному увеличению значения, так что текущее значение обычно в x раз превышает предыдущее значение, так как время идет, на x можно влиять, так что оно может колебаться. Я пытаюсь построить график тренда с течением времени, рассчитав, какой будет х для 7-дневного окна. Пример может быть проще объяснить:
x total(cumsum(x))
0 0
99 99
187 286
405 691
801 1492
1623 3115
3214 6329
6400 12729
12765 25494
25634 51128
51222 102350
102201 204551
Приведенные здесь данные показывают увеличение x в 2 раза каждый день. Я смотрю на график, как этот фактор меняется каждый день, давая окно 7 дней, чтобы рассчитать коэффициент. поэтому, если коэффициент равен y, я знаю, что итоговое значение для любого 7-дневного окна windows можно рассчитать как x + xy ^ 1 + xy ^ 2 + xy ^ 3 + xy ^ 4 + xy ^ 5 + xy ^ 6 = t, где x - начальное значение x в этом окне, а t - разница в итогах между последним днем окна и днем, предшествующим первому дню окна.
Чтобы помочь мне добавить следующее столбцы с библиотекой dplyr:
data$diff <- data$total - lag(data$total, n=7L, default = 0)
data$init <- lag(data$x, n=6L, default = 0)
Первые 6 дней будут отсутствовать либо дельта, либо начальные значения, поэтому я могу их игнорировать:
data <- data[data$init > 0, ]
Теперь у меня осталось следующее data
x total init diff
6400 12729 99 12729
12765 25494 187 25395
25634 51128 405 50842
51222 102350 801 101659
102201 204551 1623 203059
Я написал эту простую функцию для расчета тренда:
calcTrend <- function (initValue, difference) {
p <- polynomial(c(initValue - difference, initValue, initValue, initValue, initValue, initValue, initValue))
roots <- solve(p)
trend <- Re(roots[Im(roots) == 0 & Re(roots) > 0]) # discard imaginary and negative results. the remaining value is the sole value we need
return(trend)
}
Теперь, если я попробую это с простыми тестовыми значениями, они будут работать как положено:
calcTrend(100, 12700)
# returns the value 2 as expected
Однако, когда я запускаю его для данных с помощью:
data$trend <- calcTrend(data$init, data$diff)
, я получаю единственное неверное одинаковое значение (1.148392), возвращаемое для всех строк. Казалось бы, в функции значение p дает результаты для всех строк, и решение (p) затем вычисляется так, как будто это одно полиномиальное уравнение, а не 5 различных уравнений. Как мне написать это так, чтобы он правильно вычислялся для каждой отдельной строки?