簡體   English   中英

用 R 中的應用替換循環的滾動平均值

[英]Replacing a rolling average for loop with apply in R

我想測試不同長度的移動平均值與因變量之間的相關性。 我寫了一個 for 循環來完成工作,但顯然 for 循環不是理想的解決方案。 我想知道是否有人可以給我一些關於如何將這個 for 循環的功能替換為更優雅的解決方案的指示? 我已經提供了代碼和測試數據。

library(zoo)

# a function that calculates the correlation between moving averages for 
different lengths of window
# the input functions are "independent": the variable over which to apply the 
moving function
# "dependent": the output column, "startLength": the shortest window length, 
"endLength" the longest window length
# "functionType": the function to apply (mean, sd, etc.)

MovingAverageCorrelation <- function(indepedent, depedent, startLength, endLength, functionType) {
# declare an matrix for the different rolling functions and a correlation vector
avgMat <- matrix(nrow = length(depedent), ncol = (endLength-startLength+1)) 
corVector <- rep(NA, ncol(avgMat))
# run the rollapply function over the data and calculate the corresponding correlations
for (i in startLength:endLength) {
   avgMat[, i] <- rollapply(indepedent, width = i, FUN = functionType, 
                         na.rm = T, fill = NA, align = "right")
   corVector[i] <- cor(avgMat[, i], depedent, use = "complete.obs")
  }
return(corVector)
}

# set test data

set.seed(100)
indVector <- runif(1000)
depVector <- runif(1000)

# run the function over the data

cor <- MovingAverageCorrelation(indVector, depVector, 1, 100, "mean")

謝謝!

嘗試sapply

sapply(1:100, function(i) cor(rollapplyr(indVector, i, mean, na.rm = TRUE, fill = NA), 
        depVector, use = "complete.obs"))

如果您的輸入中沒有 NA,這將起作用並且速度要快得多:

sapply(1:100, function(i) cor(rollmeanr(indVector, i, fill = NA), depVector, use = "comp"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM