Import

library(readxl)
library(ggplot2)
library(readr)
library(dplyr)
library(stringr)
library(plm)
library(lmtest)
library(synthdid)

RENT.merge<-read_xlsx("MSA-RENT merge All.xlsx")
RENT.merge$treat<-ifelse(RENT.merge$state=="LA",1,0)
colnames(RENT.merge)
##  [1] "FirstNAME"           "AREANAME"            "RENT_0"             
##  [4] "RENT_1"              "RENT_2"              "RENT_3"             
##  [7] "RENT_4"              "YEAR"                "NAME.x"             
## [10] "state"               "Unemployee.Rate"     "Personal.Income"    
## [13] "Resident.Population" "nyear"               "MSA"                
## [16] "MSA.Code"            "Price"               "Change"             
## [19] "NAME.y"              "treat"
# Remove NA
RENT.merge<-RENT.merge%>%
  group_by(MSA)%>%
  filter(!any(is.na(Unemployee.Rate)))

dloop<-data.frame(YEAR=unique(RENT.merge$YEAR))

## YEAR DUMMY
for (i in 1:nrow(dloop)) {
  RENT.merge[paste0("d.", 
                    dloop$YEAR[i])] <- as.numeric(RENT.merge$YEAR == unique(RENT.merge$YEAR)[i])
}

#KEEP NEW ORLEAN


RENT.merge1<-RENT.merge
RENT.merge1$NS<-paste0(RENT.merge1$FirstNAME,RENT.merge1$state)
RENT.NEWLA<-RENT.merge1%>%
  filter(NS=="newLA")

RENTUS<-RENT.merge1%>%
  filter(state!="LA")
RENT.merge1<-RENT.merge1%>%
  filter(NS!="newLA")

## WITH NEW ORLEAN ONLY
RENT.merge2<-rbind(RENT.NEWLA,RENTUS)
RENT.merge2$YEAR<-as.numeric(RENT.merge2$YEAR)

RENT 0

RENT.merge2$s.treat<-ifelse(RENT.merge2$state=="LA" &
                            RENT.merge2$YEAR>2005,1,0)

##BALLANCE BY NS
unq<-data.frame(NS=rep(unique(RENT.merge2$NS),15))
unq<-arrange(unq,NS)

unq$YEAR<-rep(2001:2015,length(unique(RENT.merge2$NS)))

Ballance.RENT<-left_join(unq,RENT.merge2,by=c("YEAR","NS"))


Ballance.RENT<-Ballance.RENT%>%
  group_by(NS)%>%
  filter(!any(is.na(RENT_0)))

Ballance.RENT$lg<-log(Ballance.RENT$RENT_0)

#Ballance.RENT$NS<-factor(Ballance.RENT$NS)
Ballance.RENT<-data.frame(Ballance.RENT)

panelp<-panel.matrices(Ballance.RENT,unit = "NS",time = "YEAR",
                       outcome = "lg",treatment = "s.treat")

## SDID Estimate
r0<-synthdid_estimate(Y=panelp$Y,N0 = panelp$N0,T0 = panelp$T0)

plot(r0,overlay=1)+theme(legend.position = "bottom",
                            legend.direction = "horizontal",
                            legend.box.background = element_blank())+
  ylab("RENT 0")+xlab("Year")

## Sc estimate
sc0<-sc_estimate(Y=panelp$Y,N0 = panelp$N0,T0 = panelp$T0)

plot(sc0)+theme(legend.position = "bottom",
                            legend.direction = "horizontal",
                            legend.box.background = element_blank())+
  ylab("RENT 0")+xlab("Year")

Dot

weights = attr(r0, "weights")
Y = panelp$Y
T0 = panelp$T0; T1 = ncol(Y) - T0
N0 = panelp$N0; N1 = nrow(Y) - N0
#omega.synth = c(weights$omega, rep(0, N1))
omega.synth = c(weights$omega, rep(0, N1))
omega.target = c(rep(0, N0), rep(1 / N1, N1))
lambda.synth = c(weights$lambda, rep(0, T1)) #lambda sdid
lambda.target = c(rep(0, T0), rep(1 / T1, T1))
#over = attr(r0, 'overlay')
over=1
intercept.offset = over * c((omega.target - omega.synth) %*% Y %*% lambda.synth)
obs.trajectory = as.numeric(omega.target %*% Y) #Ytr Treat
#syn.trajectory.i = as.numeric(omega.synth %*% Y) + intercept.offset
syn.trajectory=as.numeric(omega.synth %*% Y) #Yco



# [Yt(tr)-Yt(co)]-[Yb(tr)-Yb(co)] # Yt is ploted and Yb is Baseline
##USED after treatment data
dfw<-data.frame("lambda"=lambda.synth[5:15],
                "ytr"=obs.trajectory[5:15],
                "yco"=syn.trajectory[5:15])

dfw$aux=dfw$lambda*(dfw$ytr-dfw$yco)
head(dfw)
##      lambda      ytr      yco         aux
## 1 0.8310792 6.300786 6.316231 -0.01283596
## 2 0.0000000 6.645091 6.353434  0.00000000
## 3 0.0000000 6.684612 6.384448  0.00000000
## 4 0.0000000 6.694562 6.416096  0.00000000
## 5 0.0000000 6.656727 6.457127  0.00000000
## 6 0.0000000 6.690842 6.483999  0.00000000
meanpre_0<-dfw$aux[1]  ## Export Average pre treatment

differ<-data.frame("year"=2001:2015,"d"=obs.trajectory- syn.trajectory) #Ytr-Yco
differ$d<-differ$d- meanpre_0   #Equation 8

ggplot(differ,aes(x=year,y=d))+geom_point()+
  geom_line()+theme_bw()+
  ylab("RENT 0")

Loop

ltm<-Ballance.RENT%>%
  filter(NS!="newLA")

ltm<-unique(ltm$NS)

lno<-Ballance.RENT%>%
  filter(NS=="newLA")

lno<-unique(lno$NS)


#Number of sample
ns=round(length(ltm)*.8)
# Create Null Data Frame
dfs<-data.frame("Year"=2001:2015)

for (i in 1:100){ #Loop 100 times
  sa.c<-sample(x = ltm,size = ns)
  sa.c<-c(sa.c,lno)
  
  sa.Ballance<-Ballance.RENT%>%
    filter(NS %in% sa.c)
  sa.panel<-panel.matrices(sa.Ballance,
                           unit = "NS",
                           time = "YEAR",
                           outcome = "lg",
                           treatment = "s.treat")
  
  sa.sdid<-synthdid_estimate(Y = sa.panel$Y,
                             N0 = sa.panel$N0,
                             T0 = sa.panel$T0)
  
  
  weights = attr(sa.sdid, "weights")
  Y = sa.panel$Y
  T0 = sa.panel$T0; T1 = ncol(Y) - T0
  N0 = sa.panel$N0; N1 = nrow(Y) - N0
  #omega.synth = c(weights$omega, rep(0, N1))
  omega.synth = c(weights$omega, rep(0, N1))
  omega.target = c(rep(0, N0), rep(1 / N1, N1))
  lambda.synth = c(weights$lambda, rep(0, T1)) #lambda sdid
  lambda.target = c(rep(0, T0), rep(1 / T1, T1))
  #over = attr(sa.sdid, 'overlay')
  over=1
  intercept.offset = over * c((omega.target - omega.synth) %*% Y %*% lambda.synth)
  obs.trajectory = as.numeric(omega.target %*% Y) #Ytr Treat
  #syn.trajectory.i = as.numeric(omega.synth %*% Y) + intercept.offset
  syn.trajectory=as.numeric(omega.synth %*% Y) #Yco



  # [Yt(tr)-Yt(co)]-[Yb(tr)-Yb(co)] # Yt is ploted and Yb is Baseline
  ##USED after treatment data
  dfw<-data.frame("lambda"=lambda.synth[5:15],
                  "ytr"=obs.trajectory[5:15],
                  "yco"=syn.trajectory[5:15])

  dfw$aux=dfw$lambda*(dfw$ytr-dfw$yco)
  #head(dfw)
  meanpre_0=dfw$aux[1]  ## Export Average pre treatment
  dfs[,i+1]=(obs.trajectory- syn.trajectory)- meanpre_0 #Save Looping Output
  colnames(dfs)[i+1]=paste0("d",i) #Rename Looping output
  
}


dfs<-dfs%>%
  mutate(average=apply(dfs[,-1],1,FUN = mean),
         sd=apply(dfs[,-1],1,FUN = sd))%>%
  mutate(up=average + sd*qnorm(0.975), lo=average - sd*qnorm(0.975)) #95% Confident Interval

ggplot(dfs, aes(x = Year, y = average)) +
  geom_point(shape=23, fill="blue", size=1.5)+
  geom_line() + theme_bw()+ylab("RENT 0")+
  geom_ribbon(aes(ymin = lo, ymax = up), alpha = 0.2)