2014-08-31 69 views
1

這裏是我試圖在R.計算公式如何求和範圍並計算R中的一個序列?

enter image description here

到目前爲止,這是用一個簡單的例子

t <- seq(1, 2, 0.1) 
expk <- function(k){exp(-2*pi*1i*t*k)} 

set.seed(123) 
dat <- ts(rnorm(100), start = c(1994,3), frequency = 12) 
arfit <- ar(dat, order = 4, aic = FALSE) # represent \phi in the formula 

tmp1 <- numeric(4) 

for (i in seq_along(arfit$ar)){ 
    ek <- expk(i) 
    arphi <- arfit$ar[i] 
    tmp1[i] <- ek * arphi 
    } 

tmp2 <- sum(tmp1) 

denom = abs(1-tmp2)^2 
s2 <- t/denom 

錯誤我的方法:警告消息: 在TMP1 [i] < - ek * arphi: 要替換的項目數不是替換長度的倍數

我試過了以避免使用for循環,並嘗試使用sapply,如解決方案question

denom2 <- abs(1- sapply(seq_along(arfit$ar), function(x)sum(arfit$ar[x]*expf(x))))^2 

但似乎不正確。問題是當它從另一個向量中獲取數值時(在指數k上),在這種情況下,t是分子中的數值。 任何解決方案?

對於測試數據集的任何建議,可能使用0和1來檢查此循環中的計算是否正確完成?

+0

你確定你的意思'代表(4 NA)'?由於您無法重複「NA」次數,因此會引發錯誤。也許你想'rep(NA,4)'? – 2014-08-31 21:35:39

+0

那就對了。錯字。 – Anusha 2014-08-31 21:36:51

+0

你給出的代碼還有一些東西阻止它正常工作......例如,'tmp1'是一個向量,'exp1'也是。你不能用向量來替換一個向量的單個元素,所以'tmp1 [i] < - exp1 * arphi'會引發一個錯誤。您可能需要'rm(list = ls())'並確保您的代碼正常工作。 – 2014-08-31 21:47:49

回答

1

鍵入在聊天中確定的答案。這是一個涉及vapply的解決方案。

首先正確expk到:

expk <- function(k){sum(exp(-2*pi*1i*t*k))} 

然後您可以創建這個功能,它vapply

myFun <- function(i) return(expk(i) * arfit$ar[i]) 
tmp2 <- sum(vapply(seq_along(arfit$ar), myFun, complex(1)))