How to find an optimal adstock decay factor for an independent variable in panel analysis in R?

1.3k views Asked by At

I'm working with a panel dataset (24 months of data for 210 DMAs). I'm trying to optimize the adstock decay factor for an independent variable by minimizing the standard error of a fixed effects model.

In this particular case, I want to get a decay factor that minimizes the SE of the adstock-transformed variable "SEM_Br_act_norm" in the model "Mkt_TRx_norm = b0 + b1*Mkt_TRx_norm_prev + b2*SEM+Br_act_norm_adstock".

So far, I've loaded the dataset in panel formal using plm and created a function to generate the adstock values. The function also runs a fixed effects model on the adstock values and returns the SE. I then use optimize() to find the best decay value within the bounds (0,1). While my code is returning an optimal value, I am worried something is wrong because it returns the same optimum (close to 1) on all other variables.

I've attached a sample of my data, as well as key parts of my code. I'd greatly appreciate if someone could take a look and see what is wrong.

Sample Data

# Set panel data structure

alldata <- plm.data (alldata, index = c("DMA", "Month_Num"))

alldata$var <- alldata$SEM_Br_act_norm +0

# Create 1 month time lag for TRx

alldata <- ddply( 
  alldata, .(DMA), transform,
  # This assumes that the data is sorted
  Mkt_TRx_norm_prev = c(NA,Mkt_TRx_norm[-length(Mkt_TRx_norm)]) 
)

# Create adstock function and obtain SE of regression

adstockreg <-function(decay, period, data_vector, pool_vector=0){  
  data_vector <-alldata$var
  pool_vector <- alldata$DMA
  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*(decay)^j)}
    }
  }
  #reduce length of edited data to equal length of initial data
  data2<-data2[1:l]

  #regression - excludes NA values
  alldata <- plm.data (alldata, index = c("DMA", "Month_Num"))
  var_fe <- plm(alldata$Mkt_TRx_norm ~ alldata$Mkt_TRx_norm_prev + data2, data = alldata , model = "within", na.action = na.exclude)
  se <- summary(var_fe)$coefficients["data2","Std. Error"]
  return(se)
}

# Optimize decay for adstock variable

result <- optimize(adstockreg, interval=c(0,1), period = 6)
print(result)
0

There are 0 answers