Table 1: Descriptive Statistics
stargazer(zdata_reg[zdata_reg$PurchaseYear<2008,c("Purchase_price","adj_purch_price","Listing_price","Listing_premium",
"Selling_premium","Property_tax_last_year","Property_tax_rate_last_year",
"affected_by_prop_8","purchase_hpi","hpi_inflation","ownership_years",
"beds","baths","sqft","LotSizeSquareFeet","house_age","LTV_prev",
"avg_school_rating","avg_school_distance","totalpopulation","medianage","medianhouseholdincome","Renter_fraction")],type=output.type,summary.stat = c("mean","sd","p25","median","p75","n"),digits = 4)
##
## ===================================================================================================
## Statistic Mean St. Dev. Pctl(25) Median Pctl(75) N
## ---------------------------------------------------------------------------------------------------
## Purchase_price 510,230.6000 466,700.4000 253,500 403,500 627,000 22,487
## adj_purch_price 675,184.2000 636,420.8000 352,604.0000 528,036.0000 788,393.6000 22,487
## Listing_price 714,460.2000 665,120.6000 379,000 559,000 819,000 22,487
## Listing_premium 1.0735 0.1506 0.9643 1.0497 1.1596 22,487
## Selling_premium 1.0544 1.0508 0.9403 1.0211 1.1227 22,487
## Property_tax_last_year 6,228.2170 5,428.6750 3,236.0000 5,012.0000 7,515.7400 22,487
## Property_tax_rate_last_year 0.0097 0.0029 0.0079 0.0096 0.0112 22,487
## affected_by_prop_8 0.4608 0.4985 0.0000 0.0000 1.0000 22,026
## purchase_hpi 433,884.9000 278,683.8000 242,300 380,200 559,400 22,487
## hpi_inflation 1.4539 0.6303 0.9907 1.2514 1.7566 22,487
## ownership_years 12.6099 2.8492 11 12 14 22,487
## beds 3.4247 0.8780 3.0000 3.0000 4.0000 22,484
## baths 2.5144 1.0439 2.0000 2.0000 3.0000 22,394
## sqft 2,030.6010 895.3042 1,413.0000 1,829.0000 2,442.0000 22,460
## LotSizeSquareFeet 17,299.9000 135,446.4000 5,600.0000 7,196.0000 10,018.0000 21,291
## house_age 38.1602 22.9571 18 33 55 22,487
## LTV_prev 0.6190 0.3554 0.4642 0.7812 0.8000 22,458
## avg_school_rating 6.9516 2.0253 5.3333 7.3333 8.6667 22,463
## avg_school_distance 1.4524 1.2997 0.8000 1.1667 1.7000 22,469
## totalpopulation 5,881.6000 2,976.9320 4,081.0000 5,366.0000 6,801.0000 22,479
## medianage 40.3807 7.9782 34.7000 39.5000 45.1000 22,477
## medianhouseholdincome 82,688.1500 32,702.6400 58,540.5000 77,292.0000 101,590.0000 22,476
## Renter_fraction 0.3200 0.1710 0.1895 0.2912 0.4278 22,477
## ---------------------------------------------------------------------------------------------------
CA_all <- readRDS(file="C:/Users/dratnadiwakara2/Documents/OneDrive - Louisiana State University/Projects/Sunk Cost/Processed Data/perv_transactions/CA_prev_transaction_merged_2.rds")
CA_all[,House_age:=CA_all$Sale_year-CA_all$YearBuilt]
CA_all[,nominal_loss:=ifelse(CA_all$HPI_purchase>CA_all$HPI_sale,CA_all$Purchase_price-CA_all$Adj_purch_price,1)]
CA_all[,zip_sale_month:=paste(CA_all$zip,CA_all$Sale_month)]
CA_all[,Sale_price:=CA_all$SalesPriceAmount_sale]
IL <- readRDS(file="C:/Users/dratnadiwakara2/Documents/OneDrive - Louisiana State University/Projects/Sunk Cost/Processed Data/perv_transactions/IL_prev_transaction_merged.rds")
NY <- readRDS(file="C:/Users/dratnadiwakara2/Documents/OneDrive - Louisiana State University/Projects/Sunk Cost/Processed Data/perv_transactions/NY_prev_transaction_merged.rds")
prev_trans <- rbind(IL,NY)
prev_trans[,House_age:=prev_trans$Sale_year-prev_trans$YearBuilt]
prev_trans[,Sale_price:=prev_trans$SalesPriceAmount_sale]
prev_trans[,State:=sapply(prev_trans$FIPS, function(x) substr(as.character(x),1,nchar(x)-3))]
prev_trans[,zip_sale_month:=paste(prev_trans$zip,prev_trans$Sale_month)]
prev_trans[,nominal_loss:=ifelse(prev_trans$HPI_purchase>prev_trans$HPI_sale,prev_trans$Purchase_price-prev_trans$Adj_purch_price,1)]
rm(list=c("IL","AZ","NV","OR","FL","NY"))
CA <- readRDS(file="C:/Users/dratnadiwakara2/Documents/OneDrive - Louisiana State University/Projects/Sunk Cost/Processed Data/all_homes_prev/CA_all_homes_prev.rds")
IL <- readRDS(file="C:/Users/dratnadiwakara2/Documents/OneDrive - Louisiana State University/Projects/Sunk Cost/Processed Data/all_homes_prev/IL_all_homes_prev.rds")
NY <- readRDS(file="C:/Users/dratnadiwakara2/Documents/OneDrive - Louisiana State University/Projects/Sunk Cost/Processed Data/all_homes_prev/NY_all_homes_prev.rds")
all_homes_prev <- rbind(CA,IL)
# all_homes_prev <- rbind(all_homes_prev,IL)
all_homes_prev <- rbind(all_homes_prev,NY)
all_homes_prev[,Ownership_years:=2016-all_homes_prev$Purchase_year]
all_homes_prev <- all_homes_prev[all_homes_prev$Ownership_years>2]
all_homes_prev[,tax_rate_2014:=all_homes_prev$tax_2014/all_homes_prev$Adj_purch_price]
all_homes_prev[,tax_rate_2015:=all_homes_prev$tax_2015/all_homes_prev$Adj_purch_price]
all_homes_prev[,tax_rate_2016:=all_homes_prev$tax_2016/all_homes_prev$Adj_purch_price]
all_homes_prev<-all_homes_prev[(all_homes_prev$tax_rate_2015>0 & all_homes_prev$tax_rate_2015<0.1) | (all_homes_prev$tax_rate_2016>0 & all_homes_prev$tax_rate_2016<0.1)| (all_homes_prev$tax_rate_2014>0 & all_homes_prev$tax_rate_2014<0.1)]
all_homes_prev[,nominal_loss:=ifelse(all_homes_prev$HPI_purchase>all_homes_prev$HPI_asmt,all_homes_prev$SalesPriceAmount-all_homes_prev$Adj_purch_price,1)]
all_homes_prev[,House_age:=2016-all_homes_prev$YearBuilt]
rm(list=c("IL","AZ","NV","OR","FL","NY"))
Table 2: Effect of Years of ownership on Property tax rate (Regression)
Sample: All homes in CA, IL, and NY for which purchase transaction details and property tax amount paid in 2016 (or 2014 for IL) are available and purchase year is less than 2008. Intra-family transfers and forclosure sales were excluded.
all_homes_prev[,tax_rate:=ifelse(all_homes_prev$State %in% c("CA","NY"),all_homes_prev$tax_rate_2016,ifelse(all_homes_prev$State=="AZ",all_homes_prev$tax_rate_2015,ifelse(all_homes_prev$State %in% c("IL"),all_homes_prev$tax_rate_2014,NA)))]
regs <- list()
regs[[1]] <- felm(as.formula(paste("I(tax_rate*100)~Ownership_years+log(Adj_purch_price)+log(nominal_loss)+Bedrooms+Bathrooms+log(House_age)|zip|0|zip")),data=all_homes_prev[all_homes_prev$State=="CA" & all_homes_prev$Purchase_year<2008 & all_homes_prev$House_age>0])
regs[[2]] <- felm(as.formula(paste("I(tax_rate*100)~Ownership_years+log(Adj_purch_price)+log(nominal_loss)+Bedrooms+Bathrooms+log(House_age)|zip|0|zip")),data=all_homes_prev[all_homes_prev$State=="IL" & all_homes_prev$Purchase_year<2008])
regs[[3]] <- felm(as.formula(paste("I(tax_rate*100)~Ownership_years+log(Adj_purch_price)+log(nominal_loss)+log(House_age)|zip|0|zip")),data=all_homes_prev[all_homes_prev$State=="NY" & all_homes_prev$Purchase_year<2008 ])
printtable(regs,column.labels = c("CA","IL","NY"),note="",
lines=list(c("FE:","Zip","Zip","Zip"),c("Cluster:","Zip","Zip","Zip")))
##
## ==================================================
## Dependent variable:
## -----------------------------
## CA IL NY
## (1) (2) (3)
## --------------------------------------------------
## Ownership_years -0.053*** 0.004 -0.002
## (0.001) (0.002) (0.002)
## log(Adj_purch_price) -0.621*** -0.183*** -0.665***
## (0.017) (0.030) (0.051)
## log(nominal_loss) -0.0003 0.001 0.002*
## (0.001) (0.001) (0.001)
## Bedrooms 0.025*** 0.006
## (0.002) (0.010)
## Bathrooms 0.069*** 0.260***
## (0.003) (0.015)
## log(House_age) -0.203*** -0.079*** -0.250***
## (0.010) (0.015) (0.024)
## --------------------------------------------------
## FE: Zip Zip Zip
## Cluster: Zip Zip Zip
## Observations 1,722,228 532,796 99,191
## Adjusted R2 0.359 0.444 0.232
## ==================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##
Table 3: First Stage: Effect of Years of Ownership on Tax Rate
Using zillow sample.
regs <- list()
controls = "log(adj_purch_price)+log(nominal_loss)+beds+baths+log(sqft)+avg_school_rating+avg_school_distance+walk_score+log(house_age)+log(LotSizeSquareFeet)+LTV_prev"
fe = "|zip_list_month|"
cluster = "|zip"
instruments = "ownership_years" #
endo_var = "Property_tax_rate_last_year"
regs <- list()
regs[[1]] <- felm(as.formula(paste("I(prop_tax_rate*100)~ownership_years+",controls,fe,"0",cluster,sep="")),data=zdata_reg[zdata_reg$PurchaseYear<2008 ])
regs[[2]] <- felm(as.formula(paste("I(prop_tax_rate*100)~ownership_years+",controls,"+medianage+log(medianhouseholdincome)+Renter_fraction",fe,"0",cluster,sep="")),data=zdata_reg[zdata_reg$PurchaseYear<2008 ])
regs[[3]] <- felm(as.formula(paste("I(prop_tax_rate*100)~ownership_years+",controls,"|tract_list_month|","0",cluster,sep="")),data=zdata_reg[zdata_reg$PurchaseYear<2008 ])
printtable(regs,column.labels = c("1996-2007", "1996-2007","1996-2007","All"),note="",
lines=list(c("FE:","Zip x Month","Zip x Month","Tract x Month","Zip x Sale Month"),c("Cluster:","Zip","Zip","Zip","Zip")))
##
## ================================================================
## Dependent variable:
## -------------------------------------
## 1996-2007 1996-2007 1996-2007
## (1) (2) (3)
## ----------------------------------------------------------------
## ownership_years -0.054*** -0.054*** -0.052***
## (0.001) (0.001) (0.003)
## log(adj_purch_price) -0.286*** -0.299*** -0.416***
## (0.017) (0.018) (0.060)
## log(nominal_loss) -0.002** -0.002** -0.002
## (0.001) (0.001) (0.002)
## beds 0.029*** 0.030*** 0.025
## (0.004) (0.004) (0.016)
## baths 0.010* 0.010* 0.028*
## (0.006) (0.006) (0.014)
## log(sqft) 0.089*** 0.089*** 0.127
## (0.017) (0.017) (0.080)
## avg_school_rating 0.016*** 0.011*** 0.022
## (0.003) (0.003) (0.019)
## avg_school_distance 0.008* 0.008** 0.006
## (0.004) (0.004) (0.019)
## walk_score -0.0004*** -0.0001 -0.0003
## (0.0001) (0.0001) (0.001)
## log(house_age) -0.096*** -0.094*** -0.111***
## (0.008) (0.008) (0.029)
## log(LotSizeSquareFeet) 0.013** 0.013*** 0.023
## (0.005) (0.005) (0.022)
## LTV_prev 0.027*** 0.026*** 0.025
## (0.007) (0.006) (0.024)
## medianage 0.001
## (0.001)
## log(medianhouseholdincome) 0.099***
## (0.016)
## Renter_fraction 0.066**
## (0.031)
## ----------------------------------------------------------------
## FE: Zip x Month Zip x Month Tract x Month
## Cluster: Zip Zip Zip
## Observations 20,367 20,360 20,367
## Adjusted R2 0.590 0.593 0.607
## ================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##
Table 4: Panel A : Direct impact of Z (Years of Ownership) on Y (Quality): ZTRAX Data
This table is based on ZTRAX data. Samples consists of all homes sold in 2015 and 2016 and purchased before 2008. Sample is restricted to the homes for which both the sale details and purchase details are available. Intra-family transfers and foreclosure sales were excluded. If ‘years of ownership’ has a negative direct impact on the quality of the home we should see negative and significant coefficients for IL and NY. FL and TX were exceluded due to property tax system in FL is similar to CA and unavailability of transaction prices respectively.
To address ‘Ref 1: Comment 2’, the table was split in to two panels. Panel A uses data from IL and NY no restriction on year of purchase. Panel B illustrate the same point using CA data for 2009 to 2012 period. This period for CA was choosen since the house prices were stable during this period, we can isolate the direct effect of ownership years.
regs <- list()
regs[[1]] <- felm(as.formula(paste("log(Sale_price)~Ownership_years+","log(Adj_purch_price)+log(nominal_loss)+Bedrooms+Bathrooms+log(House_age)+BuildingAreaSqFt","|zip_sale_month|","0","|zip",sep="")),data=prev_trans[prev_trans$State %in% c("17") & House_age>0 & Ownership_years>=2 ])
regs[[2]] <- felm(as.formula(paste("log(Sale_price)~Ownership_years+","log(Adj_purch_price)+log(nominal_loss)+Bedrooms+Bathrooms+log(House_age)+BuildingAreaSqFt","|zip_sale_month|","0","|zip",sep="")),data=prev_trans[prev_trans$State=="36" & House_age>0 & Ownership_years>=2])
printtable(regs,column.labels = c("IL","NY"),note="",
lines=list(c("FE:","Zip x Month","Zip x Month","Zip x Month","Zip x Sale Month"),c("Cluster:","Zip","Zip","Zip","Zip")))
##
## =================================================
## Dependent variable:
## ----------------------------
## IL NY
## (1) (2)
## -------------------------------------------------
## Ownership_years -0.0004 -0.001
## (0.001) (0.002)
## log(Adj_purch_price) 0.435*** 0.058***
## (0.040) (0.004)
## log(nominal_loss) -0.002*** -0.0003
## (0.001) (0.003)
## Bedrooms 0.005 0.052***
## (0.007) (0.011)
## Bathrooms 0.058*** 0.186***
## (0.019) (0.015)
## log(House_age) -0.045*** -0.139***
## (0.009) (0.013)
## BuildingAreaSqFt 0.0002*** 0.0001***
## (0.0001) (0.00002)
## -------------------------------------------------
## FE: Zip x Month Zip x Month
## Cluster: Zip Zip
## Observations 132,814 278,266
## Adjusted R2 0.771 0.234
## =================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##
Table 4: Panel B: Direct impact of Z (Years of Ownership) on Y (List Price) CA (2009-2012): Zillow Sample
For the homes purchased between 2009 and 2012, there is no variation in the property tax rate in 2016. Therefore column (2) captures the direct impact of ‘years of ownership’ on listing price.
regs <- list()
controls = "log(adj_purch_price)+log(nominal_loss)+beds+baths+sqft+avg_school_rating+avg_school_distance+walk_score+log(house_age)+log(LotSizeSquareFeet)+LTV_prev"
fe = "|zip_list_month|"
cluster = "|zip"
instruments = "ownership_years" #
endo_var = "Property_tax_rate_last_year"
regs <- list()
regs[[1]] <- felm(as.formula(paste("log(Listing_price)~ownership_years+",controls,fe,"0",cluster,sep="")),data=zdata_reg[zdata_reg$PurchaseMonth>="2009-04-01" & zdata_reg$PurchaseMonth<="2012-09-01"])
regs[[2]] <- felm(as.formula(paste("log(SalesPriceAmount_sale)~Ownership_years+","log(Adj_purch_price)+log(nominal_loss)+Bedrooms+Bathrooms+log(House_age)+BuildingAreaSqFt","|zip_sale_month|","0","|zip",sep="")),data=CA_all[CA_all$Purchase_year>2008 & CA_all$Purchase_year<2013 & CA_all$Sale_year>2015 & CA_all$House_age>1 ])
printtable(regs,column.labels = c("log(Listing price)","log(Sales price)"),note="",
lines=list(c("FE:","Zip x Month","Zip x Month","Zip x Month","Zip x Sale Month"),c("Cluster:","Zip","Zip","Zip","Zip")))
##
## ==========================================================
## Dependent variable:
## -----------------------------------
## log(Listing price) log(Sales price)
## (1) (2)
## ----------------------------------------------------------
## ownership_years 0.003**
## (0.001)
## log(adj_purch_price) 0.625***
## (0.017)
## Ownership_years 0.002
## (0.002)
## log(Adj_purch_price) 0.436***
## (0.021)
## log(nominal_loss) 0.013 -0.005
## (0.009) (0.010)
## beds 0.003
## (0.004)
## baths 0.022***
## (0.005)
## sqft 0.0001***
## (0.00001)
## avg_school_rating 0.006***
## (0.002)
## avg_school_distance 0.001
## (0.002)
## walk_score -0.00001
## (0.0001)
## log(house_age) 0.025***
## (0.004)
## log(LotSizeSquareFeet) 0.031***
## (0.004)
## LTV_prev -0.015**
## (0.006)
## Bedrooms 0.018***
## (0.005)
## Bathrooms 0.012*
## (0.007)
## log(House_age) 0.018***
## (0.006)
## BuildingAreaSqFt 0.0002***
## (0.00001)
## ----------------------------------------------------------
## FE: Zip x Month Zip x Month
## Cluster: Zip Zip
## Observations 13,190 24,355
## Adjusted R2 0.977 0.828
## ==========================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##
Table 5: Effect on Listing price (Sample: Homes purchased before 2008)
controls = "log(adj_purch_price)+log(1+gainloss)*gain+beds+baths+sqft+avg_school_rating+avg_school_distance+walk_score+log(house_age)+log(LotSizeSquareFeet)+LTV_prev+medianage+log(medianhouseholdincome)+Renter_fraction"
fe = "|zip_list_month|"
cluster = "|zip"
instruments = "ownership_years" #
endo_var = "Property_tax_rate_last_year"
zd <- zdata_reg[zdata_reg$PurchaseYear<2008]
zd[,proptaxratebin:=ntile(Property_tax_rate_last_year,10)]
zd[,total_taxes_paid:=prop_tax_prev_year*ownership_years*0.9]
zd[,proptaxamountbin:=ntile(total_taxes_paid,10)]
zd <- zd[,gainloss:=abs(adj_purch_price-Purchase_price)]
zd <- zd[,gain:=ifelse(adj_purch_price>Purchase_price,1,0)]
Main Results
Added an additional column (1) to show that listing price increases monotonically with property tax rate. Bins are based on property tax rate deciles.
Perhaps we can add a figure showing the monotonic relationship?
Added census tract level controls to address ‘Ref 1: Comment 1 (c)’.
Added the difference between purchase price and adjusted purchase price interacted with a dummy indicating whether the seller is likely to sell for a gain or a loss instead of nominal loss.
regs <- list()
regs[[1]] <- felm(as.formula(paste("log(Listing_price)~factor(proptaxratebin)+",controls,fe,"0",cluster,sep="")),data=zd)
regs[[2]] <- felm(as.formula(paste("log(Listing_price)~Property_tax_rate_last_year+",controls,fe,"0",cluster,sep="")),data=zd)
regs[[3]] <- felm(as.formula(paste("log(Listing_price)~",controls,fe,"(",endo_var,"~",instruments,")",cluster,sep="")),data=zd)
regs[[4]] <- felm(as.formula(paste("log(Listing_price)~",controls,"|tract_list_month|","(",endo_var,"~",instruments,")","|GEOID",sep="")),data=zd)
condf <- list(
c("Cond. F. Stat","","",round(condfstat(regs[[3]])[[1]],2),round(condfstat(regs[[4]])[[1]],2)),
c("Fixed Effects","Zip X Month","Zip x Month","Zip x Month","Tract X Month"),
c("Cluster","Zip","Zip","zip","Tract")
)
.coef_plot_1reg(regs[[1]],"factor(proptaxratebin)",1)+labs(y="Coefficient on Tax Rate Decile",x="Tax Rate Decile")

printtable(regs,column.labels = c("OLS","OLS","IV","IV","IV"),note="",lines=condf)
##
## ====================================================================================
## Dependent variable:
## -------------------------------------------------
## OLS OLS IV IV
## (1) (2) (3) (4)
## ------------------------------------------------------------------------------------
## factor(proptaxratebin)2 0.009**
## (0.005)
## factor(proptaxratebin)3 0.015***
## (0.005)
## factor(proptaxratebin)4 0.025***
## (0.005)
## factor(proptaxratebin)5 0.038***
## (0.005)
## factor(proptaxratebin)6 0.049***
## (0.005)
## factor(proptaxratebin)7 0.053***
## (0.005)
## factor(proptaxratebin)8 0.076***
## (0.006)
## factor(proptaxratebin)9 0.096***
## (0.006)
## factor(proptaxratebin)10 0.125***
## (0.007)
## Property_tax_rate_last_year 11.855***
## (0.674)
## log(adj_purch_price) 0.639*** 0.634*** 0.616*** 0.582***
## (0.014) (0.014) (0.015) (0.021)
## log(1 + gainloss) 0.012*** 0.012*** 0.012*** 0.013***
## (0.002) (0.002) (0.002) (0.003)
## gain 0.067** 0.088*** 0.146*** 0.129***
## (0.029) (0.028) (0.032) (0.043)
## beds 0.0003 0.001 0.002 0.004
## (0.002) (0.002) (0.002) (0.003)
## baths 0.003 0.003 0.003 0.001
## (0.002) (0.002) (0.002) (0.004)
## sqft 0.0001*** 0.0001*** 0.0001*** 0.0001***
## (0.00000) (0.00000) (0.00001) (0.00001)
## avg_school_rating 0.007*** 0.008*** 0.009*** 0.010**
## (0.002) (0.002) (0.002) (0.004)
## avg_school_distance -0.002 -0.002 -0.002 0.007
## (0.002) (0.002) (0.002) (0.004)
## walk_score -0.0002*** -0.0002*** -0.0002*** -0.001***
## (0.0001) (0.0001) (0.0001) (0.0002)
## log(house_age) 0.015*** 0.013*** 0.008* -0.002
## (0.004) (0.004) (0.004) (0.006)
## log(LotSizeSquareFeet) 0.029*** 0.029*** 0.029*** 0.033***
## (0.004) (0.004) (0.004) (0.006)
## LTV_prev -0.011*** -0.013*** -0.012*** -0.011**
## (0.004) (0.004) (0.004) (0.005)
## medianage 0.001*** 0.001*** 0.001***
## (0.0003) (0.0003) (0.0003) (0.000)
## log(medianhouseholdincome) 0.031*** 0.032*** 0.038***
## (0.008) (0.008) (0.009) (0.000)
## Renter_fraction 0.018 0.019 0.022
## (0.014) (0.014) (0.014) (0.000)
## log(1 + gainloss):gain -0.007*** -0.009*** -0.015*** -0.013***
## (0.003) (0.003) (0.003) (0.004)
## `Property_tax_rate_last_year(fit)` 6.441*** 9.967***
## (1.402) (2.389)
## ------------------------------------------------------------------------------------
## Cond. F. Stat 91.68 33.55
## Fixed Effects Zip X Month Zip x Month Zip x Month Tract X Month
## Cluster Zip Zip zip Tract
## Observations 20,360 20,360 20,360 20,360
## Adjusted R2 0.972 0.972 0.972 0.975
## ====================================================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##