优化马尔可夫链转移矩阵计算?

时间:2013-08-14 22:30:44

标签: r markov-chains

作为中级R用户,我知道for循环通常可以通过使用apply等函数进行优化。但是,我不知道可以优化我的当前代码以生成马尔可夫链矩阵的函数,该矩阵运行速度非常慢。我是否最大限度地提高了速度,还是有我忽视的东西?我试图通过计算给定警报之前24小时时间段内发生的次数来找到马尔可夫链的转移矩阵。向量ids包含所有可能的id(约1700)。

原始矩阵看起来像这样,例如:

>matrix
      id      time
       1     1376084071
       1     1376084937
       1     1376023439
       2     1376084320
       2     1372983476
       3     1374789234
       3     1370234809

这是我的代码,试图解决这个问题:

matrixtimesort <- matrix[order(-matrix$time),]
frequency = 86400 #number of seconds in 1 day

# Initialize matrix that will contain probabilities
transprobs <- matrix(data=0, nrow=length(ids), ncol=length(ids))

# Loop through each type of event
for (i in 1:length(ids)){
localmatrix <- matrix[matrix$id==ids[i],]

# Loop through each row of the event
for(j in 1:nrow(localmatrix)) {
    localtime <- localmatrix[j,]$time
    # Find top and bottom row number defining the 1-day window
    indices <- which(matrixtimesort$time < localtime & matrixtimesort$time >= (localtime - frequency))
    # Find IDs that occur within the 1-day window
    positiveids <- unique(matrixtimesort[c(min(indices):max(indices)),]$id)
    # Add one to each cell in the matrix that corresponds to the occurrence of an event

            for (l in 1:length(positiveids)){
            k <- which(ids==positiveids[l])
            transprobs[i,k] <- transprobs[i,k] + 1
            }
    }

# Divide each row by total number of occurrences to determine probabilities
transprobs[i,] <- transprobs[i,]/nrow(localmatrix)
    }
  # Normalize rows so that row sums are equal to 1
  normalized <- transprobs/rowSums(transprobs)

有人可以提出任何建议来优化速度吗?

1 个答案:

答案 0 :(得分:0)

使用嵌套循环似乎是一个坏主意。您的代码可以进行矢量化以加快速度。

例如,为什么找到行号的顶部和底部?您可以简单地将时间值与“time_0 + frequency”进行比较:它是一个矢量化操作。

HTH。