2013-10-11 23 views
0

我正在嘗試創建一個指示器變量,它將採用數據集中的日期字段並創建一個假日變量,將實際的假日日期和1分配給週末前的1到假期。我越來越接近,但我似乎無法超越我對這個問題的思維方式。
對於完整的上下文,我已經給出了假數據集的代碼和我正在處理的用戶定義函數。我有一個與此功能相同的早期文章,但卻是一個完全不同的問題。 我的問題:如何在用戶定義函數中創建一個指標變量,該函數可以讀取假期和該假期前的週末,併爲這些天分配1,非假期/假期週末天分配1。在用戶定義函數中定義假日週末指示器變量

創建的日期響應和廣告費的基本數據集

library(timeDate) 
library(lubridate) 
library(forecast) 
library(plyr) 


# setting up some fake data 
set.seed(31) 
foo <- function(myHour, myDate){ 
    rlnorm(1, meanlog=0,sdlog=1)*(myHour) + (150*myDate) 
} 
Hour <- 1:24 
Day <-1:1080 
dates <-seq(as.Date("2010-01-01"), by = "day", length.out= 1080) 
myData <- expand.grid(Day, Hour) 
names(myData) <- c("Date","Hour") 

myData$Adspend <- apply(myData, 1, function(x) foo(x[2], x[1])) 
myData$Date <-dates 

myData$Demand <-(rnorm(1,mean = 0, sd=1)+.75*myData$Adspend) 

myData$Hour<-as.factor(myData$Hour) 
AddCal <-function(DF,Date,Time,Seasonal=TRUE, Holiday=TRUE, Intraday = TRUE){ 
#Create variables of calendar effects from Date field 
DF$Date<-as.Date(DF[[Date]], format="%m/%d/%Y") 
DF[[Time]]<-factor(DF[[Time]], levels = c(1:24)) 
monthly <- months(DF[[Date]]) 
dow <-weekdays(DF[[Date]]) 
year1<-year(DF[[Date]]) 
quarter<-quarters(DF[[Date]]) 

協變量

hmatx <- model.matrix(~as.factor(DF[[Time]]))[,2:24] # Matrix of hours 
mmatx <- model.matrix(~as.factor(monthly))[,2:12] #Matrix of months 
dmatx <- model.matrix(~as.factor(dow))[,2:7] #matrix of days of week 
qmatx<-model.matrix(~as.factor(dow))[,1:3] #matrix of Quarters of the year 

創建假日指標創建的季節性指標矩陣兩個變量都是ho liday和週末假日標記,如果在2天內

LaborWkend<-ifelse(isWeekend(as.Date(USLaborDay(year1)+2)),1,0) 

回答

1

下面是一個簡單的函數,將日期的數組和最近週末追加到每個人,除非日期的土地上週三。

plusWeekends<-function(h){ 
    h<-as.Date(h) 
    w<-as.POSIXlt(h)$wday 
    sort(unique(c(h,h[w %in% 0:2]-1, 
     h[w %in% 1:2]-2, 
     h[w == 2]-3, 
     h[w ==4]+3, 
     h[w %in% 4:5]+2, 
     h[w %in% 4:6]+1))) 
} 

例如:

> plusWeekends(USLaborDay(2010:2012)) 
[1] "2010-09-04" "2010-09-05" "2010-09-06" "2011-09-03" "2011-09-04" "2011-09-05" 
[7] "2012-09-01" "2012-09-02" "2012-09-03" 
> plusWeekends(NewYearsDay(2010:2012)) 
[1] "2010-01-01" "2010-01-02" "2010-01-03" "2011-01-01" "2011-01-02" "2011-12-31" 
[7] "2012-01-01" 

要創建指標,你可以像

> indicator<-rep(0,length(dates)) 
> indicator[dates %in% plusWeekends(USLaborDay(2010:2012))]<-1 
> dates[indicator==1] 
[1] "2010-09-04" "2010-09-05" "2010-09-06" "2011-09-03" "2011-09-04" "2011-09-05" 
[7] "2012-09-01" "2012-09-02" "2012-09-03" 
+0

運行的東西太謝謝你了 –