Please download and load data “Keywords_Bid.Rdata” from Canvas.

  • adrank: A variable based on the ad rank value which is defined as \(Bidding Price \times Quality Score\). This variable is the running variable which decides whether the adposition is first or second. The value of adrank variable = own adrank value - neighbor bidder ad rank value; If an advert is ranked first, then this value if positive. If an advert is ranked second, then this value is negative. These follow directly from the ladder auction setup of keywords bidding.
  • adposition: A factor of two levels which indicates the positions of ads (first and second). The relationship between adposition and adrank variable is like this: \(adposition = 1(adrank>0)\).
  • revenue: The revenue of the ad campaigns (in log scale)
load("Keywords_Bid.RData")
head(data)
## # A tibble: 6 x 3
##   adrank adposition      revenue
##    <dbl> <fct>             <dbl>
## 1 -0.220 Second Position   0.844
## 2  2.00  First Position    4.99 
## 3  0.278 First Position    5.85 
## 4  1.87  First Position    8.51 
## 5 -2.90  Second Position   0    
## 6  0.295 First Position    4.73

To visualize the relationship between the running variable (adrank) and the outcome (revenue)

Here we would like to check whether a “discontinuity” exists in the relationship between the running variable (adrank) and the outcome (revenue). To do so, we produce a scatter plot between adrank and revenue and separate into two groups by adposition.

library(ggplot2)
ggplot(data, aes(adrank, revenue, color = adposition)) + 
  geom_point() + stat_smooth(method = "loess",colour = "black",size = 1) + 
  geom_vline(xintercept=0, linetype="longdash")
## `geom_smooth()` using formula 'y ~ x'

Selecting the “optimal” bandwidth with cross-validation

  • Here we try to select the “optimal” bandwidth with the cross-validation method. As our data size is relatively small, we use a 2-fold cross validation. The optimal bandwidth is the one that has the smallest mean squared error (MSE) on the testing sample.
  • In general, a Jackknife or 10-fold CV is more appropriate. This practice is supposed to give you a taste of the RDD procedure.
  • To select the optimal bandwidth, we adopt a regression-based estimator of position effects. To be more specific, we estimate a regression equation like this: \(Revenue_i=Adposition_i+Adrank_i+Adposition_i\times Adrank_i+e_i\). The interaction term is included in case the slope of adrank on revenue changes in first vs. second position.
  • Note that other specs can be used, for example a local polynomial regression or the addition of higher order terms. These are usually added robustness checks, as the basic spec is easy to interpret.
  • In the code below, we test 4 bandwidths just as a show-and-tell. In practice, you should compare more bandwidths to select the “optimal” one. We use here the half of standard deviation of the running variable “adrank” with \(0.25\), \(0.50\), \(1.00\) and \(2.00\) times the \(SD(adrank)\).
#===== to split data into test and train set --------------------

# Set seeds for replication 
set.seed(12345) 

# Permutate the index
N <- dim(data)[1]
idx <- sample(1:N,N,replace = F)

# To obtain a random subsample as train and test data
train <- data[idx[1:(N/2)],]
test <- data[idx[(N/2+1):N],]

#===== To select optimal bandwidths ------------------------------
  # Here we test 4 bandwidths just as a show-and-tell. 
  # In practice, you should try finer grids. 

# standard deviation of adrank
H <- sd(data$adrank)
H <- rep(H,4)*c(.25,.5,1,2)

# a vector to store MSE 
H.fit <- rep(0,4)

# Loop over 4 bandwidths
for (i in 1:4) {
  
  # This is the model specified above. More complex method may be used here. 
  mdl <- lm(revenue~adrank*adposition,train[abs(train$adrank)<H[i],])
  
  # To obtain the predicted outcome for test data. 
  revenue.hat <- predict(mdl,newdata = test[abs(test$adrank)<H[i],])
  
  # To calcualte and store MSE
  H.fit[i] <- mean((test$revenue[abs(test$adrank)<H[i]]-revenue.hat)^2)
}

# To get the bandwidth of the one with mininum MSE
H <- H[H.fit==min(H.fit)]
print(c("The optimal bandwidth is",H))
## [1] "The optimal bandwidth is" "0.56198147093334"

Estimating the position effects with the optimal bandwidth

  • After having the optimal bandwidth \(H\), we rerun the model with the full data.
  • This gives us a “local average treatment effects” (LATE). An extension is to put in characteristics of ads and then obtain the heterogeneous LATE.
  • You can also extend to different positions such as “position 3 to 2” or “position 4 to 3”.
  • By doing so, you may obtain a \(V_i=\beta_{adposition}/Impressions\) for ad campaigns which will guide your bidding strategies. So you know the max bid you should put there.
#Rerun a model on full data with bandwidth set to H
mdl <- lm(revenue~adrank*adposition,data[abs(data$adrank)<H,])

# The position effect is measured by the coefficient of adposition.
# This let you if you boost your ad position from 2nd place and 1st place, how much increase you expect in your revenue. 
summary(mdl)
## 
## Call:
## lm(formula = revenue ~ adrank * adposition, data = data[abs(data$adrank) < 
##     H, ])
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0100 -0.6302  0.0005  0.6349  2.8303 
## 
## Coefficients:
##                                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      2.02533    0.08785  23.054  < 2e-16 ***
## adrank                           1.99824    0.32495   6.149 1.02e-09 ***
## adpositionFirst Position         2.42697    0.13604  17.840  < 2e-16 ***
## adrank:adpositionFirst Position  1.08011    0.42983   2.513   0.0121 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9282 on 1369 degrees of freedom
## Multiple R-squared:  0.826,  Adjusted R-squared:  0.8256 
## F-statistic:  2167 on 3 and 1369 DF,  p-value: < 2.2e-16
LS0tDQp0aXRsZTogJ0Nhc2UgVjogTWVhc3VyaW5nIFBvc2l0aW9uIEVmZmVjdHMgb2YgU2VhcmNoIEFkcycNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogdGliYmxlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KIyMjICoqUGxlYXNlIGRvd25sb2FkIGFuZCBsb2FkIGRhdGEgIktleXdvcmRzX0JpZC5SZGF0YSIgZnJvbSBDYW52YXMuKiogDQoqICoqYWRyYW5rKio6IEEgdmFyaWFibGUgYmFzZWQgb24gdGhlIGFkIHJhbmsgdmFsdWUgd2hpY2ggaXMgZGVmaW5lZCBhcyAkQmlkZGluZyBQcmljZSBcdGltZXMgUXVhbGl0eSBTY29yZSQuIFRoaXMgdmFyaWFibGUgaXMgdGhlIHJ1bm5pbmcgdmFyaWFibGUgd2hpY2ggZGVjaWRlcyB3aGV0aGVyIHRoZSBhZHBvc2l0aW9uIGlzIGZpcnN0IG9yIHNlY29uZC4gVGhlIHZhbHVlIG9mIGFkcmFuayB2YXJpYWJsZSA9IG93biBhZHJhbmsgdmFsdWUgLSBuZWlnaGJvciBiaWRkZXIgYWQgcmFuayB2YWx1ZTsgSWYgYW4gYWR2ZXJ0IGlzIHJhbmtlZCBmaXJzdCwgdGhlbiB0aGlzIHZhbHVlIGlmIHBvc2l0aXZlLiBJZiBhbiBhZHZlcnQgaXMgcmFua2VkIHNlY29uZCwgdGhlbiB0aGlzIHZhbHVlIGlzIG5lZ2F0aXZlLiBUaGVzZSBmb2xsb3cgZGlyZWN0bHkgZnJvbSB0aGUgbGFkZGVyIGF1Y3Rpb24gc2V0dXAgb2Yga2V5d29yZHMgYmlkZGluZy4gIA0KKiAqKmFkcG9zaXRpb24qKjogQSBmYWN0b3Igb2YgdHdvIGxldmVscyB3aGljaCBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9ucyBvZiBhZHMgKGZpcnN0IGFuZCBzZWNvbmQpLiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYWRwb3NpdGlvbiBhbmQgYWRyYW5rIHZhcmlhYmxlIGlzIGxpa2UgdGhpczogJGFkcG9zaXRpb24gPSAxKGFkcmFuaz4wKSQuIA0KKiAqKnJldmVudWUqKjogVGhlIHJldmVudWUgb2YgdGhlIGFkIGNhbXBhaWducyAoaW4gbG9nIHNjYWxlKQ0KDQpgYGB7cn0NCmxvYWQoIktleXdvcmRzX0JpZC5SRGF0YSIpDQpoZWFkKGRhdGEpDQpgYGANCg0KIyMjICoqVG8gdmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcnVubmluZyB2YXJpYWJsZSAoYWRyYW5rKSBhbmQgdGhlIG91dGNvbWUgKHJldmVudWUpKioNCkhlcmUgd2Ugd291bGQgbGlrZSB0byBjaGVjayB3aGV0aGVyIGEgImRpc2NvbnRpbnVpdHkiIGV4aXN0cyBpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJ1bm5pbmcgdmFyaWFibGUgKGFkcmFuaykgYW5kIHRoZSBvdXRjb21lIChyZXZlbnVlKS4gVG8gZG8gc28sIHdlIHByb2R1Y2UgYSBzY2F0dGVyIHBsb3QgYmV0d2VlbiBhZHJhbmsgYW5kIHJldmVudWUgYW5kIHNlcGFyYXRlIGludG8gdHdvIGdyb3VwcyBieSBhZHBvc2l0aW9uLiANClwNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRhdGEsIGFlcyhhZHJhbmssIHJldmVudWUsIGNvbG9yID0gYWRwb3NpdGlvbikpICsgDQogIGdlb21fcG9pbnQoKSArIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsY29sb3VyID0gImJsYWNrIixzaXplID0gMSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJsb25nZGFzaCIpDQpgYGANCg0KIyMjICoqU2VsZWN0aW5nIHRoZSAib3B0aW1hbCIgYmFuZHdpZHRoIHdpdGggY3Jvc3MtdmFsaWRhdGlvbioqDQoqIEhlcmUgd2UgdHJ5IHRvIHNlbGVjdCB0aGUgIm9wdGltYWwiIGJhbmR3aWR0aCB3aXRoIHRoZSBjcm9zcy12YWxpZGF0aW9uIG1ldGhvZC4gQXMgb3VyIGRhdGEgc2l6ZSBpcyByZWxhdGl2ZWx5IHNtYWxsLCB3ZSB1c2UgYSAyLWZvbGQgY3Jvc3MgdmFsaWRhdGlvbi4gVGhlIG9wdGltYWwgYmFuZHdpZHRoIGlzIHRoZSBvbmUgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IG1lYW4gc3F1YXJlZCBlcnJvciAoTVNFKSBvbiB0aGUgdGVzdGluZyBzYW1wbGUuIA0KKiBJbiBnZW5lcmFsLCBhIEphY2trbmlmZSBvciAxMC1mb2xkIENWIGlzIG1vcmUgYXBwcm9wcmlhdGUuIFRoaXMgcHJhY3RpY2UgaXMgc3VwcG9zZWQgdG8gZ2l2ZSB5b3UgYSB0YXN0ZSBvZiB0aGUgUkREIHByb2NlZHVyZS4gDQoqIFRvIHNlbGVjdCB0aGUgb3B0aW1hbCBiYW5kd2lkdGgsIHdlIGFkb3B0IGEgcmVncmVzc2lvbi1iYXNlZCBlc3RpbWF0b3Igb2YgcG9zaXRpb24gZWZmZWN0cy4gVG8gYmUgbW9yZSBzcGVjaWZpYywgd2UgZXN0aW1hdGUgYSByZWdyZXNzaW9uIGVxdWF0aW9uIGxpa2UgdGhpczogJFJldmVudWVfaT1BZHBvc2l0aW9uX2krQWRyYW5rX2krQWRwb3NpdGlvbl9pXHRpbWVzIEFkcmFua19pK2VfaSQuIFRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIGluY2x1ZGVkIGluIGNhc2UgdGhlIHNsb3BlIG9mIGFkcmFuayBvbiByZXZlbnVlIGNoYW5nZXMgaW4gZmlyc3QgdnMuIHNlY29uZCBwb3NpdGlvbi4gDQoqIE5vdGUgdGhhdCBvdGhlciBzcGVjcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUgYSBsb2NhbCBwb2x5bm9taWFsIHJlZ3Jlc3Npb24gb3IgdGhlIGFkZGl0aW9uIG9mIGhpZ2hlciBvcmRlciB0ZXJtcy4gVGhlc2UgYXJlIHVzdWFsbHkgYWRkZWQgcm9idXN0bmVzcyBjaGVja3MsIGFzIHRoZSBiYXNpYyBzcGVjIGlzIGVhc3kgdG8gaW50ZXJwcmV0LiANCiogSW4gdGhlIGNvZGUgYmVsb3csIHdlIHRlc3QgNCBiYW5kd2lkdGhzIGp1c3QgYXMgYSBzaG93LWFuZC10ZWxsLiBJbiBwcmFjdGljZSwgeW91IHNob3VsZCBjb21wYXJlIG1vcmUgYmFuZHdpZHRocyB0byBzZWxlY3QgdGhlICJvcHRpbWFsIiBvbmUuIFdlIHVzZSBoZXJlIHRoZSBoYWxmIG9mIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcnVubmluZyB2YXJpYWJsZSAiYWRyYW5rIiB3aXRoICQwLjI1JCwgJDAuNTAkLCAkMS4wMCQgYW5kICQyLjAwJCB0aW1lcyB0aGUgJFNEKGFkcmFuaykkLiANCg0KYGBge3J9DQojPT09PT0gdG8gc3BsaXQgZGF0YSBpbnRvIHRlc3QgYW5kIHRyYWluIHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIFNldCBzZWVkcyBmb3IgcmVwbGljYXRpb24gDQpzZXQuc2VlZCgxMjM0NSkgDQoNCiMgUGVybXV0YXRlIHRoZSBpbmRleA0KTiA8LSBkaW0oZGF0YSlbMV0NCmlkeCA8LSBzYW1wbGUoMTpOLE4scmVwbGFjZSA9IEYpDQoNCiMgVG8gb2J0YWluIGEgcmFuZG9tIHN1YnNhbXBsZSBhcyB0cmFpbiBhbmQgdGVzdCBkYXRhDQp0cmFpbiA8LSBkYXRhW2lkeFsxOihOLzIpXSxdDQp0ZXN0IDwtIGRhdGFbaWR4WyhOLzIrMSk6Tl0sXQ0KDQojPT09PT0gVG8gc2VsZWN0IG9wdGltYWwgYmFuZHdpZHRocyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgIyBIZXJlIHdlIHRlc3QgNCBiYW5kd2lkdGhzIGp1c3QgYXMgYSBzaG93LWFuZC10ZWxsLiANCiAgIyBJbiBwcmFjdGljZSwgeW91IHNob3VsZCB0cnkgZmluZXIgZ3JpZHMuIA0KDQojIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhZHJhbmsNCkggPC0gc2QoZGF0YSRhZHJhbmspDQpIIDwtIHJlcChILDQpKmMoLjI1LC41LDEsMikNCg0KIyBhIHZlY3RvciB0byBzdG9yZSBNU0UgDQpILmZpdCA8LSByZXAoMCw0KQ0KDQojIExvb3Agb3ZlciA0IGJhbmR3aWR0aHMNCmZvciAoaSBpbiAxOjQpIHsNCiAgDQogICMgVGhpcyBpcyB0aGUgbW9kZWwgc3BlY2lmaWVkIGFib3ZlLiBNb3JlIGNvbXBsZXggbWV0aG9kIG1heSBiZSB1c2VkIGhlcmUuIA0KICBtZGwgPC0gbG0ocmV2ZW51ZX5hZHJhbmsqYWRwb3NpdGlvbix0cmFpblthYnModHJhaW4kYWRyYW5rKTxIW2ldLF0pDQogIA0KICAjIFRvIG9idGFpbiB0aGUgcHJlZGljdGVkIG91dGNvbWUgZm9yIHRlc3QgZGF0YS4gDQogIHJldmVudWUuaGF0IDwtIHByZWRpY3QobWRsLG5ld2RhdGEgPSB0ZXN0W2Ficyh0ZXN0JGFkcmFuayk8SFtpXSxdKQ0KICANCiAgIyBUbyBjYWxjdWFsdGUgYW5kIHN0b3JlIE1TRQ0KICBILmZpdFtpXSA8LSBtZWFuKCh0ZXN0JHJldmVudWVbYWJzKHRlc3QkYWRyYW5rKTxIW2ldXS1yZXZlbnVlLmhhdCleMikNCn0NCg0KIyBUbyBnZXQgdGhlIGJhbmR3aWR0aCBvZiB0aGUgb25lIHdpdGggbWluaW51bSBNU0UNCkggPC0gSFtILmZpdD09bWluKEguZml0KV0NCnByaW50KGMoIlRoZSBvcHRpbWFsIGJhbmR3aWR0aCBpcyIsSCkpDQpgYGANCg0KIyMjICoqRXN0aW1hdGluZyB0aGUgcG9zaXRpb24gZWZmZWN0cyB3aXRoIHRoZSBvcHRpbWFsIGJhbmR3aWR0aCoqDQoNCiogQWZ0ZXIgaGF2aW5nIHRoZSBvcHRpbWFsIGJhbmR3aWR0aCAkSCQsIHdlIHJlcnVuIHRoZSBtb2RlbCB3aXRoIHRoZSBmdWxsIGRhdGEuIA0KKiBUaGlzIGdpdmVzIHVzIGEgImxvY2FsIGF2ZXJhZ2UgdHJlYXRtZW50IGVmZmVjdHMiIChMQVRFKS4gQW4gZXh0ZW5zaW9uIGlzIHRvIHB1dCBpbiBjaGFyYWN0ZXJpc3RpY3Mgb2YgYWRzIGFuZCB0aGVuIG9idGFpbiB0aGUgaGV0ZXJvZ2VuZW91cyBMQVRFLg0KKiBZb3UgY2FuIGFsc28gZXh0ZW5kIHRvIGRpZmZlcmVudCBwb3NpdGlvbnMgc3VjaCBhcyAicG9zaXRpb24gMyB0byAyIiBvciAicG9zaXRpb24gNCB0byAzIi4gDQoqIEJ5IGRvaW5nIHNvLCB5b3UgbWF5IG9idGFpbiBhICRWX2k9XGJldGFfe2FkcG9zaXRpb259L0ltcHJlc3Npb25zJCBmb3IgYWQgY2FtcGFpZ25zIHdoaWNoIHdpbGwgZ3VpZGUgeW91ciBiaWRkaW5nIHN0cmF0ZWdpZXMuIFNvIHlvdSBrbm93IHRoZSBtYXggYmlkIHlvdSBzaG91bGQgcHV0IHRoZXJlLiANCg0KYGBge3J9DQojUmVydW4gYSBtb2RlbCBvbiBmdWxsIGRhdGEgd2l0aCBiYW5kd2lkdGggc2V0IHRvIEgNCm1kbCA8LSBsbShyZXZlbnVlfmFkcmFuayphZHBvc2l0aW9uLGRhdGFbYWJzKGRhdGEkYWRyYW5rKTxILF0pDQoNCiMgVGhlIHBvc2l0aW9uIGVmZmVjdCBpcyBtZWFzdXJlZCBieSB0aGUgY29lZmZpY2llbnQgb2YgYWRwb3NpdGlvbi4NCiMgVGhpcyBsZXQgeW91IGlmIHlvdSBib29zdCB5b3VyIGFkIHBvc2l0aW9uIGZyb20gMm5kIHBsYWNlIGFuZCAxc3QgcGxhY2UsIGhvdyBtdWNoIGluY3JlYXNlIHlvdSBleHBlY3QgaW4geW91ciByZXZlbnVlLiANCnN1bW1hcnkobWRsKQ0KYGBgDQoNCg0KDQo=