Linear Model using Adstock in R Part 1
Parag Verma
27th June, 2022
Introduction
In the previous blog on basics of Adstockhttps://www.aimlmadeeasy.com/2022/06/adstock-analysis-in-r.html,we learnt about how to apply the decay effect of adstock using logistic function.In this blog, we will build a regression model and estimate a relationship between sales and advertisement. For our analysis, we will be using the cheese data set from bayesm library.
To understand implementation in R, we will look at how we can apply adstock transformation for a simple case
package.name<-c("dplyr","data.table","stats","bayesm","ggplot2")
for(i in package.name){
if(!require(i,character.only = T)){
install.packages(i)
}
library(i,character.only = T)
}
Step 1: Creating a Simple Illustration
Importing the cheese dataset
data("cheese")
test.df<-cheese
head(test.df)
RETAILER VOLUME DISP PRICE
1 LOS ANGELES - LUCKY 21374 0.16200000 2.578460
2 LOS ANGELES - RALPHS 6427 0.12411257 3.727867
3 LOS ANGELES - VONS 17302 0.10200000 2.711421
4 CHICAGO - DOMINICK 13561 0.02759109 2.651206
5 CHICAGO - JEWEL 42774 0.09061273 1.986674
6 CHICAGO - OMNI 4498 0.00000000 2.386616
The attributes are as follows:
- RETAILER:List of Retailers
- VOLUME:Number of units sold
- DISP:A Measure of advertising display activity
- PRICE:Unit Price in Dollars
For each retailer, the data captures weekly sales of cheese. Here the dependent variable \(y_t\) is the units sold or VOLUME. DISP is the \(x1_t\) and PRICE is \(x2_t\). For sake of explanation, lets look at regression model for only one of the retailers such as ATLANTA - KROGER CO.
Step 2: Defining Adstock Function
Lets define the adstock function using filter function from the stats library
adstockTransform <- function(x){
stats::filter( 1/(1+exp(-2*x)), 0.25, method = "recursive")
}
- First part of the argument is an expression in x.It is normally a time series
- Filter coefficient for Auto regressive (AR) or Moving Average Term
- Method = “recursive” indicates that an auto regressive (AR) term is used
Step 3: Applying Adstock Transformation
Since this a time series data, we need to also check for stationarity.For our case, lets assume that the weekly time series is stationary in nature. With this assumption, we can apply linear model.
test.df2<-test.df%>%
filter(RETAILER=="ATLANTA - KROGER CO")%>%
mutate(Volume_Log=log(VOLUME),
Price_Log=log(PRICE))%>%
mutate(Disp_Adstock=adstockTransform(DISP))%>%
select(-DISP,-VOLUME,-PRICE)
head(test.df2)
RETAILER Volume_Log Price_Log Disp_Adstock
27 ATLANTA - KROGER CO 8.318498 1.0623441 0.5118027
114 ATLANTA - KROGER CO 8.444838 1.0880211 0.6279507
201 ATLANTA - KROGER CO 8.316300 1.0798555 0.6724189
288 ATLANTA - KROGER CO 8.996652 0.8667424 0.6809895
375 ATLANTA - KROGER CO 9.106867 0.8791677 0.7032240
462 ATLANTA - KROGER CO 9.103200 0.8521204 0.7997878
Step 4: Applying Linear Model
fit <- lm(Volume_Log ~ Disp_Adstock + Price_Log, data=test.df2)
summary(fit)
Call:
lm(formula = Volume_Log ~ Disp_Adstock + Price_Log, data = test.df2)
Residuals:
Min 1Q Median 3Q Max
-0.25070 -0.07254 -0.01011 0.05973 0.33558
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.4147 0.3564 26.417 < 2e-16 ***
Disp_Adstock 1.2312 0.4110 2.996 0.00402 **
Price_Log -1.7167 0.1208 -14.211 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.115 on 58 degrees of freedom
Multiple R-squared: 0.8436, Adjusted R-squared: 0.8382
F-statistic: 156.4 on 2 and 58 DF, p-value: < 2.2e-16
We can see that the regression model is significant with an \(R^2\) of = 0.83. Effect of Price as well as Adstock variable is significant.Since this is log-log model of Sales on Price, we can see that the elasticity is -1.71 which makes sense as increasing the price reduces the units sold.