| Unit Tests Status (click): |
This is the replication kit for The Effect of Homeownership on the Option Value of Regional Migration, forthcoming in Quantitative Economics.
juliaversion 0.6.x (not the latest version of julia) is needed to replicate all results from section 3 onwards in the paper.Rat least version3.5for results in chapter 2 and if you want to rebuild the data inputs to the julia package.git(optional, but useful. In general;-))
All results from the structural model are produced with the package mig, which is a sub-folder of this repository. Here is how to install it.
-
In order to use the code, you should clone this repository to your computer by typing in your terminal
# I refer to where you want this on your computer as MIGJL # `MIGJL` is only an example. cd MIGJL git clone https://github.com/floswald/migration.git
or you manually download the source code as a zip folder from here.
-
Go to where you cloned the package to, e.g.
MIGJL. -
We'll call
julia6the julia v0.6.x executable you installed above, in order to comply with the software requirements. Type this in your terminal:julia6 mig/install.jlto download all dependencies and precompile the package.
-
Given the non-standard structure of this repo, the above script tries to sym link directory
MIGJL/mig/into your standard julia package directory at~/.julia/v0.6with unix commandln -s. This may not work on a windows machine, but I found this for you to try yourself. -
Run
julia6 -e 'Pkg.test("mig")';to run the unit tests on your computer. -
Observe that the (green!) badge on top of this README indicates that the same tests run on MacOS and Linux on Travis-CI.
The easiest way to deal with dependencies is to directly install from github with this command issued in an R session:
library(devtools) # install `devtools` if not installed.
install_github("floswald/migR")Alternatively, you can install the package using RStudio, but you need to make sure yourself that all dependencies are installed. Download the migR_1.0.tar.gz package and install as described.
\newpage
This section describes how to replicate all results in the paper.
Results in the main text are numbered in standard latin (1,2,...) whereas results in the online appendix are prefixed by a section letter (A.1, A.2,...). There are several levels at which a replication exericse could start, related to how much of the input data one wants to take as given. The structure of this could be illustrated in the following way:
+-----------------------------------+
| |
| migR R package |
| |
+-----------------------------------+
| | |
| | |
uses and processes
| | |
| | |
<--------+ v +--------->
SIPP micro data FHFA Indices BEA Income Series Level 1
|
|
outputs
|
<-----------+----------->
Motivating Results Data Moments Level 2
chapter 2 |
|
v
+-------------------------+
| mig julia package |
+-------------------------+
|
|
|
v
Results chapters 3+ Level 3
As it is probably most relevant for many users, I will start at the highest Level 3, taking all input data as given, then move down the chain.
This level uses the pre-built input datasets in MIGJL/mig/in to run the structural model. The simplest interface is to use the run file which you can launch on your command line in directory MIGJL/mig as follows:
> cd MIGJL/mig
> julia6 run.jl --help
The Effect of Homeownership on the Option
Value of Regional Migration (Oswald, 2019)
| Welcome to the run file of my paper. Please
| see below how to run the code.
| Thanks,
| Florian
Usage:
run.jl -h | --help
run.jl --version
run.jl estim (bgp|grad|slices|stderrors) [--nworkers=<nw>] [--maxiter=<maxit>][--npoints=<npts>]
run.jl test
run.jl experiment (elasticity|ownersWTP|ownersWTP2|moneyMC|decomp) [--nworkers=<nw>] [--shock=<sh>] [--nosave] [--neg]
run.jl experiment moversWTP [--nworkers=<nw>] [--nosave] [--region=<reg>]
run.jl experiment noMove [--yshock=<ys>] [--pshock=<ps>] [--nosave] [--nworkers=<nw>]
Options:
-h --help Show this screen.
--nworkers=<nw> use <nw> of workers for task. [default: 1]
--npoints=<npts> number of points to use [default: 10].
--maxiter=<maxit> max number of iterations in estimation [default: 500].
--region=<reg> in which region to run experiment [default: 1].
--nosave don't save experiment output. If you set it, it doesn't save.
--neg perform negative elasticity shock. If you set it, it does negative.
--shock=<sh> type of shock to apply [default: q]
--yshock=<ys> shock applied to regional income [default: 1.0]
--pshock=<ps> shock applied to regional price [default: 1.0]
--version show version
You perform estimation of the model by running
julia6 run.jl estim grad
optionally specifying the number of workers desired. Standard errors are subsequently obtained by running
julia6 run.jl estim stderrors
The fit of the model is illustrated by comparing model and data moments. You can write a table to this extent to disk by running in a julia6 session
> julia6
_
_ _ _(_)_ | A fresh approach to technical computing
(_) | (_) (_) | Documentation: https://docs.julialang.org
_ _ _| |_ __ _ | Type "?help" for help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 0.6.2 (2017-12-13 18:08 UTC)
_/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release
|__/ | x86_64-apple-darwin14.5.0
julia> using mig
julia> runObj(printm = true)
The figures are then created with function plot_moment_fit in R package migR.
julia6 --color=yes run.jl experiment elasticity --nworkers=9
julia6 --color=yes run.jl experiment elasticity --nworkers=9 --shock=pUsers may find it helpful to refer to script MIGJL/replicate-AWS.sh to see how I ran this on an AWS cluster built with cfncluster.
Table 10 is created by running
julia6 --color=yes run.jl experiment decompTable 12 is created by running:
julia6 --color=yes run.jl experiment ownersWTP2 --nworkers=9Table 11 is created by running:
julia6 --color=yes run.jl experiment noMove --nworkers=9Version 2 and 3 of that experiment, i.e. tables E.11 and E.12 in the online appendix are similarly created with
julia6 --color=yes run.jl experiment noMove --nworkers=9 --yshock=0.99 --pshock=0.99
julia6 --color=yes run.jl experiment noMove --nworkers=9 --yshock=0.95 --pshock=0.9Figures 5 and 6, along with several other figures, can be created, after running the above experiments, by doing in a julia6 session
julia> using mig
julia> n = mig.read_noMove() # reads baseline version (table 11)
julia> mig.plot_noMove(n)
The tables in that section can be reproduced by running
julia6 run.jl experiment scenarios --nworkers=9This section is concerned with code in a different repository at https://github.com/floswald/migR.
This replication level is taking as given the input data in folder data/ of the migR package. The package help manual with function reference is available as a pdf at the root of the package or online as a searchable website.
You can obtain all code and prebuilt data on the commandline with
git clone https://github.com/floswald/migR.git
or by downloading the precompiled package as described above
To replicate, you would invoke R and load the package with
R version 3.5.1 (2018-07-02) -- "Feather Spray"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(migR)
> With the package loaded as above, you get table 2 with function CPS.distance
Function Sipp.SumStats.
Function SippProbitMove.
Function PlotSippMigrationRates.
Function correlograms.
To parametrize the structural model, several processes need to be estimated first. This section describes the functions in charge of this task.
This is produced by function Export.VAR
This is produced by function both_prices_output
Table and figure C.1 are produced by function Export.IncomeProcess
Figures C.2 and C.3 as well as Table C.2 is produced by Sipp.wage_residual_copulas
Function Sipp.moments returns a data.table with data moments.
Function Export.Julia writes all relevant data to disk in .rda format.
This is the lowest level i.e. it starts with SIPP data acquisition. I used code previously published at ajdamico/asdfree, but it has since evolved. I have a fork the previous version, however, and so the process starts with this:
git clone https://github.com/floswald/asdfreecd asdfree/SIPP- uncommenting as warranted, execute scripts
downxxxx.R.
Once the SIPP database is created locally, we can extract data from it. The function is Extract.wrap.
Functions get_BEA_persincome and download.FHFA get the macro data series. Notice that get_BEA_persincome depends on external package EconData