Есть ли способ написать функцию, которая будет сдвигать сумму функций по некоторому параметру? - PullRequest
1 голос
/ 30 апреля 2019

Я новичок в R, и недавно я столкнулся со следующей проблемой.

У меня есть функция x, f(x), которая сама является суммой других функций тех же данных, например, f(x) = 2 * f1(x) + 3 * f2(x). Я хочу, чтобы эти функции были сдвинуты на некоторый параметр a, что приводит к выражению f(x - a) = 2 * f1(x - a) + 3 * f2(x - a). Позже у меня есть некоторая итерационная процедура, и параметр a не остается неизменным на протяжении всего процесса, а это означает, что на следующем шаге должно быть f(x - a - b) = 2 * f1(x - a - b) + 3 * f2(x - a - b) и так далее, поэтому явное изменение аргумента функции невозможно.

Таким образом, у меня возникает следующий вопрос: есть ли способ написать функцию, которая, примененная к функции f(x), приведет к результату fun(f(x)) = 2 * f1(x - a) + 3 * f2(x - a)

Если нет, то как решить эту проблему с помощью R?

Я думал о циклах и применении функций, но мне не удалось преодолеть эту проблему. Также я не нашел ничего похожего на эту проблему в Интернете.

Я очень ценю любую помощь и буду рада прочитать ваши советы.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Если у вас есть функция

f <- function(x) x

и вы хотите версию, которая сдвинута, вы можете написать функцию shiftf

shiftf <- function(f, a) function(x) f(x-a)

Это функция, которая принимает функцию исмещение и возвращает новую функцию.Вы можете использовать его как

fnew <- shiftf(f, 2)

, а затем вы можете позвонить

x <- 1:10
f(x)
# [1]  1  2  3  4  5  6  7  8  9 10
fnew(x)
#  [1] -1  0  1  2  3  4  5  6  7  8
shiftf(f, 2)(x)
#  [1] -1  0  1  2  3  4  5  6  7  8
0 голосов
/ 30 апреля 2019

Нечто подобное может работать. если у вас есть фрейм данных со всеми значениями, которые вы хотите поместить в различные функции, вы можете передать формулу функции lambda_shift, и она вернет вывод. Если у вас есть результаты функции f () в столбце a, вы можете передать lamda_shift (.x, .y (a-b)), чтобы получить результаты. Столбец b содержит значения сдвига.

require(purrr)
lamda_shift<-as_mapper(~mutate(.x,
                                output =  2*(!!enquo(.y))+3*(!!enquo(.y))
                              )
                       )

df <- data.frame(a=rep(1:1),b=rep(6:10))
lamda_shift(.x=df,.y=a-b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...