2012-12-06 38 views
2

我目前使用下面的代碼來創建衰減率y的衰變(adstock)功能彙集模型:衰變函數(adstock)與R中

adstock <- function(x, decay=y) filter(x, decay, method = "recursive") 

這給出所需的結果。

但是,如果我有一組合並的數據,這樣每個區域按照時間順序組合在一起,第二個區域的起點就會從第一個區域的末端開始衰減。與第三個區域相似...

確保(n> 1)區域的第一次觀察仍然等於原始值的最佳方法是什麼?但是所有後續值都應用了衰減公式?

例如:

Weeks <- c("01/01/2012","08/01/2012","15/01/2012","22/01/2012","29/01/2012","01/01/2012","08/01/2012","15/01/2012","22/01/2012","29/01/2012","01/01/2012","08/01/2012","15/01/2012","22/01/2012","29/01/2012") 
Regions <- c("North","North","North","North","North","South","South","South","South","South","West","West","West","West","West") 
Variable <- c(5,6,4,8,6,19,20,5,7,8,0,5,4,6,7) 
exampledata <- data.frame(Weeks, Regions, Variable) 

新功能應該僅針對每個區域運行衰變函數。因此,對於「西部」地區,2011年1月1日第11行應始終爲零。

+1

嗨,你能再現一個你的數據的例子嗎? – agstudy

+0

對不起,上傳數據示例最簡單的方法是什麼?示例表格沒有正確顯示。 – user1882017

+0

你可以看到這個偉大的鏈接http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – agstudy

回答

1

請嘗試以下adstock功能:

adstock <-function(data_vector, decay, period, pool_vector=0){ 
data2<-data_vector 
l<-length(data_vector) 
#if no pool apply zero to vector 
if(length(pool_vector)==1)pool_vector<-rep(0,l) 
#outer loop: extract data to decay from observation i 
    for(i in 1:l){ 
    x<-data_vector[i] 
#inner loop: apply decay onto following observations after i 
    for(j in 1:min(period,l)){ 
     #constrain decay to same pool (if data is pooled) 
     if(pool_vector[i]==pool_vector[min(i+j,l)]){data2[(i+j)]<- data2[(i+j)]+(x*(1-decay)^j)} 
    } 
    } 
#reduce lenth of edited data to equal lenth of innitial data 
data2<-data2[1:l] 
    return(data2) 
} 

,如果你不使用週期衰退,只是將其作爲一個高數(較大然後觀察數) 所以如果你想有一個20%在你的例子中按期間衰減:

Variable_20D<-adstock(exampledata$Variable,.2,1000,exampledata$Regions)