library(stargazer)
library(AER)
library(dplyr)
library(sjPlot)
library(sjmisc)
library(sjlabelled)
library(knitr)

1 Data

## Load data 
load("~/Research/MMC_September_2020/hdata.houston.all.Rdata") # data.houston; all files 
rm(data.houston46)
load("df_hou_5.Rdata") # df_hou.s for structural analysis

# Load functions
source("MMC_functions_2020.R")

2 Descriptive Statistics

# Data set: data.houston 
summary.tab <- get.summary(dat= data.houston, 
                           var.fld = c("adr", "rating", "hi.sales", "room", "avmmc",
                                       "avmmc2"))

kable(summary.tab)
M Mean Std.Err Median Min. Max
adr 1880 85.8487 52.0007 68.3050 16.9900 400.75
rating 1880 1.7628 1.6594 1.0000 0.0000 6.00
hi.sales 1880 0.1376 0.1191 0.1003 0.0379 1.00
room 1880 111.6904 117.6942 80.0000 6.0000 1200.00
avmmc 1880 26.6886 29.2786 18.4714 0.0000 132.00
avmmc2 1880 1.1923 1.3344 0.8062 0.0000 9.00

3 Models for Market Definition

# functions
# get.avmmc
# get.avmmc.knn
# get.avmmc.cluster

3.1 Reduced Form

3.1.1 Models with AVMMC

# data set: data.houston
# OLS 
data.hou <- data.houston[data.houston$id.brand>1, ]
avmmc.ols0 <- lm(adr ~ avmmc, data= data.hou)
avmmc.ols1 <- lm(adr ~ avmmc + rating, data= data.hou)
avmmc.ols2 <- lm(adr ~ avmmc + rating + hi.sales, data= data.hou)
avmmc.ols3 <- lm(adr ~ avmmc + factor(chain), data= data.hou)
avmmc.ols4 <- lm(adr ~ avmmc + rating + factor(chain), data= data.hou)
avmmc.ols5 <- lm(adr ~ avmmc + rating + hi.sales + factor(chain), data= data.hou)


stargazer(avmmc.ols0, avmmc.ols1, avmmc.ols2, avmmc.ols3, avmmc.ols4, avmmc.ols5,
          type="html", omit =c("chain"), 
          add.lines = list(c("Chain FE", rep("No", 3), rep("Yes", 3))),
          title =  c("Results of OLS Models with AVMMC")
          )
Results of OLS Models with AVMMC
Dependent variable:
adr
(1) (2) (3) (4) (5) (6)
avmmc 0.059 0.089*** 0.088*** -0.149*** -0.064** -0.068**
(0.049) (0.029) (0.029) (0.037) (0.032) (0.032)
rating 28.886*** 28.679*** 24.046*** 24.054***
(0.583) (0.580) (1.135) (1.122)
hi.sales -29.174*** -33.394***
(6.679) (6.099)
Constant 97.336*** 21.011*** 25.308*** 143.851*** 48.595*** 52.545***
(2.380) (2.074) (2.282) (2.782) (5.089) (5.083)
Chain FE No No No Yes Yes Yes
Observations 1,274 1,274 1,274 1,274 1,274 1,274
R2 0.001 0.660 0.665 0.635 0.732 0.738
Adjusted R2 0.0003 0.659 0.664 0.628 0.726 0.733
Residual Std. Error 48.810 (df = 1272) 28.503 (df = 1271) 28.303 (df = 1270) 29.767 (df = 1249) 25.536 (df = 1248) 25.245 (df = 1247)
F Statistic 1.426 (df = 1; 1272) 1,231.605*** (df = 2; 1271) 839.110*** (df = 3; 1270) 90.625*** (df = 24; 1249) 136.175*** (df = 25; 1248) 135.130*** (df = 26; 1247)
Note: p<0.1; p<0.05; p<0.01
avmmc2.ols0 <- lm(adr ~ avmmc2, data= data.hou)
avmmc2.ols1 <- lm(adr ~ avmmc2 + rating, data= data.hou)
avmmc2.ols2 <- lm(adr ~ avmmc2 + rating + hi.sales, data= data.hou)
avmmc2.ols3 <- lm(adr ~ avmmc2 + factor(chain), data= data.hou)
avmmc2.ols4 <- lm(adr ~ avmmc2 + rating + factor(chain), data= data.hou)
avmmc2.ols5 <- lm(adr ~ avmmc2 + rating + hi.sales + factor(chain), data= data.hou)


stargazer(avmmc2.ols0, avmmc2.ols1, avmmc2.ols2, avmmc2.ols3, avmmc2.ols4, avmmc2.ols5,
          type="html", omit =c("chain"), 
          add.lines = list(c("Chain FE", rep("No", 3), rep("Yes", 3))),
          title =  c("Results of OLS Models with AVMMC2")
          )
Results of OLS Models with AVMMC2
Dependent variable:
adr
(1) (2) (3) (4) (5) (6)
avmmc2 0.520 2.593*** 2.788*** -2.466*** -0.451 -0.213
(1.072) (0.625) (0.622) (0.847) (0.731) (0.724)
rating 29.008*** 28.799*** 24.236*** 24.311***
(0.582) (0.579) (1.137) (1.124)
hi.sales -31.318*** -32.949***
(6.666) (6.120)
Constant 98.746*** 19.642*** 23.842*** 141.441*** 45.586*** 48.504***
(2.330) (2.087) (2.255) (2.708) (5.059) (5.033)
Chain FE No No No Yes Yes Yes
Observations 1,274 1,274 1,274 1,274 1,274 1,274
R2 0.0002 0.662 0.667 0.633 0.731 0.737
Adjusted R2 -0.001 0.661 0.667 0.626 0.726 0.732
Residual Std. Error 48.833 (df = 1272) 28.418 (df = 1271) 28.186 (df = 1270) 29.856 (df = 1249) 25.572 (df = 1248) 25.290 (df = 1247)
F Statistic 0.236 (df = 1; 1272) 1,242.781*** (df = 2; 1271) 849.615*** (df = 3; 1270) 89.775*** (df = 24; 1249) 135.652*** (df = 25; 1248) 134.475*** (df = 26; 1247)
Note: p<0.1; p<0.05; p<0.01

3.1.2 Reduced Form with AVMMC.KNN

# starting data set: data.houston
avmmc.knn <- get.avmmc.knn(mkt.id.fld = "qtr", id.brand.fld = "id.brand", 
                           id.chain.fld = "id.chain" , price.fld = "adr", 
                           ocu.fld ="ocu", room.fld = "room", 
                           rating.fld = "rating",lat.fld = "lat", 
                           lon.fld = "lon", knn = 4, data= data.houston)

data.houston1 <- data.houston
for (var in names(avmmc.knn)){
  # print(var)
  temp <- avmmc.knn[[var]]
  temp <- as.data.frame(temp)
  if(length(grep("knn", var))==1){
    colnames(temp) <- var
  } else{
    colnames(temp) <- paste0(var, ".knn")
  }
  data.houston1[,colnames(temp)] <- temp
}


# data frame: data.houston1
# data set: data.houston
# OLS 
data.hou1 <- data.houston1[data.houston1$id.brand>1, ]
avmmc.knn.ols0 <- lm(adr ~ avmmc.knn , data= data.hou1)
avmmc.knn.ols1 <- lm(adr ~ avmmc.knn + rating, data= data.hou1)
avmmc.knn.ols2 <- lm(adr ~ avmmc.knn + rating + hi.sales, data= data.hou1)
avmmc.knn.ols3 <- lm(adr ~ avmmc.knn + factor(chain), data= data.hou1)
avmmc.knn.ols4 <- lm(adr ~ avmmc.knn + rating + factor(chain), data= data.hou1)
avmmc.knn.ols5 <- lm(adr ~ avmmc.knn + rating + hi.sales + factor(chain), data= data.hou1)


stargazer(avmmc.knn.ols0, avmmc.knn.ols1, avmmc.knn.ols2, avmmc.knn.ols3, avmmc.knn.ols4, avmmc.knn.ols5,
          type="html", omit =c("chain"), 
          add.lines = list(c("Chain FE", rep("No", 3), rep("Yes", 3))),
          title =  c("Results of OLS Models with AVMMC.KNN")
          )
Results of OLS Models with AVMMC.KNN
Dependent variable:
adr
(1) (2) (3) (4) (5) (6)
avmmc.knn -1.574*** -0.085 0.010 -0.967*** -0.516*** -0.419***
(0.163) (0.104) (0.105) (0.122) (0.108) (0.109)
rating 28.693*** 28.657*** 23.207*** 23.442***
(0.614) (0.610) (1.142) (1.134)
hi.sales -29.459*** -28.472***
(6.856) (6.190)
Constant 109.343*** 25.547*** 28.816*** 140.586*** 50.835*** 52.712***
(1.656) (2.056) (2.179) (2.071) (4.767) (4.746)
Chain FE No No No Yes Yes Yes
Observations 1,274 1,274 1,274 1,274 1,274 1,274
R2 0.069 0.657 0.662 0.648 0.736 0.740
Adjusted R2 0.068 0.657 0.661 0.641 0.730 0.735
Residual Std. Error 47.132 (df = 1272) 28.602 (df = 1271) 28.408 (df = 1270) 29.231 (df = 1249) 25.346 (df = 1248) 25.143 (df = 1247)
F Statistic 93.696*** (df = 1; 1272) 1,218.694*** (df = 2; 1271) 829.779*** (df = 3; 1270) 95.906*** (df = 24; 1249) 138.984*** (df = 25; 1248) 136.611*** (df = 26; 1247)
Note: p<0.1; p<0.05; p<0.01
avmmc.knn2.ols0 <- lm(adr ~ avmmc.knn2 , data= data.hou1)
avmmc.knn2.ols1 <- lm(adr ~ avmmc.knn2 + rating, data= data.hou1)
avmmc.knn2.ols2 <- lm(adr ~ avmmc.knn2 + rating + hi.sales.knn, data= data.hou1)
avmmc.knn2.ols3 <- lm(adr ~ avmmc.knn2 + factor(chain), data= data.hou1)
avmmc.knn2.ols4 <- lm(adr ~ avmmc.knn2 + rating + factor(chain), data= data.hou1)
avmmc.knn2.ols5 <- lm(adr ~ avmmc.knn2 + rating + hi.sales.knn + factor(chain), data= data.hou1)

stargazer(avmmc.knn2.ols0, avmmc.knn2.ols1, avmmc.knn2.ols2, avmmc.knn2.ols3, avmmc.knn2.ols4, avmmc.knn2.ols5,
          type="html", omit =c("chain"), 
          add.lines = list(c("Chain FE", rep("No", 3), rep("Yes", 3))),
          title =  c("Results of OLS Models with AVMMC.KNN2")
          )
Results of OLS Models with AVMMC.KNN2
Dependent variable:
adr
(1) (2) (3) (4) (5) (6)
avmmc.knn2 -6.265*** -0.414 -0.380 -4.093*** -2.286*** -2.276***
(0.680) (0.430) (0.432) (0.508) (0.449) (0.449)
rating 28.677*** 28.731*** 23.180*** 23.295***
(0.611) (0.614) (1.138) (1.140)
hi.sales.knn -9.189 -15.577
(10.883) (9.877)
Constant 108.144*** 25.626*** 28.073*** 140.050*** 50.747*** 54.699***
(1.613) (2.010) (3.527) (2.051) (4.733) (5.353)
Chain FE No No No Yes Yes Yes
Observations 1,274 1,274 1,274 1,274 1,274 1,274
R2 0.063 0.657 0.658 0.649 0.736 0.737
Adjusted R2 0.062 0.657 0.657 0.642 0.731 0.731
Residual Std. Error 47.285 (df = 1272) 28.600 (df = 1271) 28.603 (df = 1270) 29.206 (df = 1249) 25.315 (df = 1248) 25.299 (df = 1247)
F Statistic 84.910*** (df = 1; 1272) 1,219.067*** (df = 2; 1271) 812.765*** (df = 3; 1270) 96.150*** (df = 24; 1249) 139.450*** (df = 25; 1248) 134.342*** (df = 26; 1247)
Note: p<0.1; p<0.05; p<0.01

3.1.3 Reduced Form Model with AVMMC.CL

\(AVMMC.CL_j\) is the average measure of \(MMC_{jk} = \frac{\sum_m I_j^m*I_k^m}{\sum_m I_j}\) over all firms in market \(m\).

# load new data set with variable cluster
load("~/Research/MMC_September_2020/data.houston.Rdata")

kable(table(data.houston$cluster), col.names = c("Cluster", "No. of Obs."),
      cpation ="Clusters in Houston, TX")
Cluster No.ย of Obs.
0 233
1 458
2 224
3 57
4 118
5 23
6 65
7 156
8 56
9 134
10 16
11 23
12 20
13 56
14 33
15 16
16 16
17 60
18 16
19 56
20 16
21 28
data.hou.cl <- data.houston[data.houston$cluster>0,]
data.hou.cl <- data.hou.cl[order(data.hou.cl$qtr, data.hou.cl$cluster),]
mmc.cl <- get.avmmc.cluster(mkt.id.fld ="id.msa.qtr",id.brand.fld="id.brand",                             id.chain.fld ="id.chain", price.fld ="adr", 
                            ocu.fld = "ocu", room.fld ="room", 
                            revpar.fld = "revpar", rating.fld ="rating",
                            cluster.fld ="cluster", data = data.hou.cl)

data.hou.cl1 <- data.hou.cl
mmc.cl$avmmc <- unlist(mmc.cl$avmmc)
for (var in names(mmc.cl)){
  # print(var)
  temp <- mmc.cl[[var]]
  temp <- as.data.frame(temp)
  if(length(grep("cl", var))==1){
    colnames(temp) <- var
  } else{
    colnames(temp) <- paste0(var, ".cl")
  }
  data.hou.cl1[,colnames(temp)] <- temp
}

data.hou.cl0 <- data.hou.cl1
data.hou.cl1 <- data.hou.cl0[data.hou.cl0$id.brand>1,]

avmmc.cl.ols0 <- lm(adr ~ avmmc.cl , data= data.hou.cl1)
avmmc.cl.ols1 <- lm(adr ~ avmmc.cl + rating, data= data.hou.cl1)
avmmc.cl.ols2 <- lm(adr ~ avmmc.cl + rating + hi.sales.cl, data= data.hou.cl1)
avmmc.cl.ols3 <- lm(adr ~ avmmc.cl + factor(chain), data= data.hou.cl1)
avmmc.cl.ols4 <- lm(adr ~ avmmc.cl + rating + factor(chain), data= data.hou.cl1)
avmmc.cl.ols5 <- lm(adr ~ avmmc.cl + rating + hi.sales.cl + factor(chain), data= data.hou.cl1)


stargazer(avmmc.cl.ols0, avmmc.cl.ols1, avmmc.cl.ols2, avmmc.cl.ols3, avmmc.cl.ols4, avmmc.cl.ols5,
          type="html", omit =c("chain"), 
          add.lines = list(c("Chain FE", rep("No", 3), rep("Yes", 3))),
          title =  c("Results of OLS Models with AVMMC.CL")
          )
Results of OLS Models with AVMMC.CL
Dependent variable:
adr
(1) (2) (3) (4) (5) (6)
avmmc.cl 4.374** 7.395*** 7.401*** 3.133** 5.015*** 5.007***
(2.077) (1.207) (1.207) (1.514) (1.284) (1.284)
rating 29.164*** 29.154*** 25.248*** 25.234***
(0.614) (0.614) (1.196) (1.196)
hi.sales.cl -12.229 -13.234
(13.216) (12.043)
Constant 97.447*** 16.918*** 17.997*** 131.937*** 34.531*** 35.754***
(2.550) (2.249) (2.534) (2.835) (5.201) (5.318)
Chain FE No No No Yes Yes Yes
Observations 1,148 1,148 1,148 1,148 1,148 1,148
R2 0.004 0.665 0.665 0.622 0.729 0.730
Adjusted R2 0.003 0.664 0.664 0.614 0.723 0.723
Residual Std. Error 49.272 (df = 1146) 28.589 (df = 1145) 28.591 (df = 1144) 30.662 (df = 1123) 25.952 (df = 1122) 25.950 (df = 1121)
F Statistic 4.436** (df = 1; 1146) 1,136.053*** (df = 2; 1145) 757.559*** (df = 3; 1144) 76.986*** (df = 24; 1123) 120.990*** (df = 25; 1122) 116.404*** (df = 26; 1121)
Note: p<0.1; p<0.05; p<0.01