Реализация волны синуса или косинуса (с вероятностью) - PullRequest
0 голосов
/ 29 октября 2018

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

A=  runif(500,1,3)
phi=rnorm(500, 0, 1)
C=  runif(500,0,1)
Nt= rnorm(500,0,0.05)
t=  seq(1,50,length=500)
xt1= A*cos(t+phi)+C+Nt
xt2= A*sin(t+phi)+C+Nt

Я хотел бы создать временной ряд xt, который принимает мгновенный $ t $, либо косинус с вероятностью 0,5, либо синус с вероятностью 0,5

РЕДАКТИРОВАТЬ: функция ниже enter image description here

1 Ответ

0 голосов
/ 29 октября 2018

Я думаю, что это достаточно обрабатывается с помощью векторизованной версии if / else:

ifelse(runif(length(t)) < 0.5, xt1, xt2)

Предостережение: это прекрасно работает в большинстве случаев. Тем не менее, ifelse может иметь побочные эффекты. Это работает нормально, сохраняя класс POSIXt:

Sys.time() + ifelse(runif(3) < 0.5, 0, 100)
# [1] "2018-10-29 12:54:08 PDT" "2018-10-29 12:54:08 PDT" "2018-10-29 12:54:08 PDT"

Но если вы работаете с векторами уже классов, этот класс может быть потерян:

ifelse(runif(3) < 0.5, Sys.time(), Sys.time() + 100)
# [1] 1540842742 1540842842 1540842842

Есть обходные пути для этого, но иногда их лучше классифицировать как «хаки». И вы не можете использовать их, если не понимаете, что вам нужно их искать. (Это обычно не имеет значения, если вектор просто numeric, integer, logical или character, и я уверен, что некоторые другие одинаково "хороши".)

...