Вычислить скользящее среднее из циклических данных в r - PullRequest
0 голосов
/ 08 июня 2018

Я хочу вычислить средний угол в радианах (тета) из ряда углов (бета), которые хранятся в кадре данных, называемом «а»:

       time beta    theta           theta2
    1   0           na              na
    2   2.426551575 na              na 
    3   5.890842799 0.678069689     0.678069689
    4   0.530641823 0.854950297     0.854950297
    5   4.794960386 -0.449975202    5.833210105
    6   1.271620156 0.104679019     0.104679019
    7   5.789548201 -0.236747291    6.046438017
    8   1.053579352 0.610520801     0.610520801
    9   0.095112206 0.218351484     0.218351484
    10  6.108843722 0.324783324     0.324783324

бета-версии в радианах игенерируются как случайный рисунок из обернутого неуклюжего распределения.Я хочу вычислить тэты (на самом деле тэта2, в радианах).Я сделал это грубой силой, преобразовав радианы в положительные и отрицательные единицы с пи / -пи на 180 градусов, но искал более элегантный подход.

Я надеялся, что это сработает (используя как круговые, так ипакеты dplyr):

a$theta<-mean.circular(c(a$beta,lag(a$beta),lag(a$beta,2))

Но это только возвращает последнее значение беты.Я попытался установить подмножество, а также в цикле (у меня есть другое поле, называемое временем, которое является возрастающим целым числом)

    time    beta
    1   0
    2   2.426551575
    3   5.890842799
    4   0.530641823
    5   4.794960386
    6   1.271620156
    7   5.789548201
    8   1.053579352
    9   0.095112206
   10   6.108843722



theta<-0
bset<-c(0,0,0)
for (i in time){
  bset<-ifelse(i<3,bset,df$beta[(i-2):i])
  thetai<-mean.circular(bset)
  theta<-c(theta,ifelse(is.na(thetai),0,thetai))

theta<-theta[2:(length(time)+1)]
df<-cbind(df,theta)
}

Но это также не работает.Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

0 голосов
/ 08 июня 2018

Полагаю, если я вас правильно понял, вы пытаетесь вычислить скользящие средние данных, которые имеют циклический характер.Если это так, вы можете выбрать растровую функцию movingFun, чтобы получить скользящие средние.Поскольку среднее значение не является векторизованным по природе, оно всегда будет возвращать одно значение.

Было бы хорошо, если бы вы вставили желаемый результат.

Здесь я выбираю значение лага как 2 и круговоеприрода как Истина.

library(raster)
movingFun(x, n= 2, fun = mean, circular = TRUE)

Входные данные:

x <- c(0,2.426551575,
       5.890842799,
       0.530641823,
       4.794960386,
       1.271620156,
       5.789548201,
       1.053579352,
       0.095112206,
       6.108843722,
       1.240271853,
       5.350922943)

Выход :

> movingFun(x, n= 2, fun = mean, circular = T)
 [1] 2.6754615 1.2132758 4.1586972 3.2107423
 [5] 2.6628011 3.0332903 3.5305842 3.4215638
 [9] 0.5743458 3.1019780 3.6745578 3.2955974
...