Р: Как ускорить эту функцию? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть большой фрейм данных (названный z ), который выглядит следующим образом:

    RPos    M1
    1   -0.00020
    2   0.00010
    3   -0.00012
    4   -0.00035
    5   -0.00038 
...etc (about 300,000 observations)

По сути, это временной ряд (хотя на самом деле )фрейм данных, а не ts или zoo).Где RPos - это порядковый номер (явно хранится), а M1 - любая метрика.

У меня есть другой фрейм данных (с именем actionlist ) с около 30 000 * непоследовательных наблюдений.Каждое значение в столбце RPos в actionlist представляет последнюю из 34 последовательных точек.

Мой последний фрагмент данных - это один фрейм данных (с именем x ), состоящий всего из 34 последовательных наблюдений.

Моя цель - рассчитать коэффициенты корреляции между x и каждым наблюдением в списке действий (который, опять же, является конечной точкой 34 последовательных наблюдений).

Для этого я долженсгенерируйте эти 34-точечные последовательные сегменты временных рядов из z (большой фрейм данных).

В настоящее время я делаю это так:

n1<-33:0
for(i in 1:nrow(actionlist))
{
    crs[i,2]<-cor(z[actionlist$RPos[i]+n1,2],x[,2])  
}

Когдаглядя на показания Rprof вот что я получаю:

$by.self
              self.time self.pct total.time total.pct
[.data.frame       0.68    25.37       0.98     36.57
.Call              0.22     8.21       0.22      8.21
cor                0.16     5.97       2.30     85.82
...etc

Похоже, что [.data.frame занимает больше всего времени.В частности, я почти уверен, что именно эта часть: z[actionlist$RPos[i]+n1,2]

Как я могу ускорить (устранить необходимость?) Эту часть функции?

Я задавал подобный вопрос раньшеза исключением того, что вместо просмотра в ограниченном списке (actionlist) я просматривал все возможные последовательные 34 наблюдения в z .Ответ был опубликован здесь, , но я не могу понять, как адаптировать его к ограниченному списку.

Любая помощь будет очень признательна!

1 Ответ

4 голосов
/ 16 февраля 2012

Самое простое, наверное, построить матрица, содержащая данные, которые вы хотите вычислить корреляцию и вообще отказаться от цикла.

# Sample data
n <- 3e5
m <- 3e4
k <- 35
z <- data.frame(
  RPos = 1:n,
  M1   = rnorm(n)
)
actionlist <- sample( k:n, m )
x <- rnorm(k)

system.time( for (j in 1:10) {
  # Index of the observations we want
  i <- sapply( (k-1):0, function(u) actionlist - u )
  # Data we want to compute the correlation with
  y <- matrix( z$M1[i], nr=nrow(i) )
  # Computations
  result <- cor(t(y),x)
} ) # 150ms per iteration
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...