Как вы работаете с векторами и выполняете дискретные вычисления для строк в кадре данных в R? - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь работать с библиотекой полиномов, а именно с функциями полинома (возвращает вектор, представляющий полиномиальное уравнение), и решаю (ожидается вектор, представляющий полиномиальное уравнение, и возвращает вектор корней)

В наборе данных, с которым я работаю, наблюдается тенденция к значительному увеличению значения, так что текущее значение обычно в 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 различных уравнений. Как мне написать это так, чтобы он правильно вычислялся для каждой отдельной строки?

1 Ответ

0 голосов
/ 06 апреля 2020

Предполагая, что вы имели в виду calcTrend, можно попробовать mapply

mapply(calcTrend,initValue=data$init,difference=data$diff)

Вывод

[1] 2.004883 2.026633 1.995416 1.999735 1.994085
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...