From 615eedd0daba8f07e47f18e57abd8de2b68b974a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 7 Jun 2014 09:56:16 +0200 Subject: [PATCH 001/323] fix empty package error on install this fixes the empty package error when installing, it is done by removing the trailing comma in the Imports list, in the DESCRIPTION file --- RDDtools/DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RDDtools/DESCRIPTION b/RDDtools/DESCRIPTION index bb9c9d7..ae90716 100644 --- a/RDDtools/DESCRIPTION +++ b/RDDtools/DESCRIPTION @@ -15,7 +15,7 @@ Imports: lmtest, Formula, locpol, - methods, + methods Depends: AER Suggests: From f65e9d663382bea5d9c12e74c5a80c585686ee66 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 13 Jan 2015 10:31:04 +0100 Subject: [PATCH 002/323] restructure to remove subdir --- RDDtools/DESCRIPTION => DESCRIPTION | 0 RDDtools/NAMESPACE => NAMESPACE | 0 RDDtools/NEWS => NEWS | 0 {RDDtools/R => R}/Lee2008-data.R | 0 {RDDtools/R => R}/RDDcoef.R | 0 {RDDtools/R => R}/RDDdata.R | 0 {RDDtools/R => R}/RDDdata_methods.R | 0 {RDDtools/R => R}/RDDpred.R | 0 {RDDtools/R => R}/STAR_MHE-data.R | 0 {RDDtools/R => R}/Waldci.R | 0 {RDDtools/R => R}/as.npreg.R | 0 {RDDtools/R => R}/bw_IK.R | 0 {RDDtools/R => R}/bw_ROT.R | 0 {RDDtools/R => R}/clusterInf.R | 0 {RDDtools/R => R}/covarTests.R | 0 {RDDtools/R => R}/dens_test.R | 0 {RDDtools/R => R}/deprecated.R | 0 {RDDtools/R => R}/gen_MC_IK.R | 0 {RDDtools/R => R}/get_methods.R | 0 {RDDtools/R => R}/model.matrix.RDD.R | 0 {RDDtools/R => R}/myRDD-package.R | 0 {RDDtools/R => R}/placebo.R | 0 {RDDtools/R => R}/plotBin.R | 0 {RDDtools/R => R}/plotSensi.R | 0 {RDDtools/R => R}/qplot_experim.R | 0 {RDDtools/R => R}/reg_gen.R | 0 {RDDtools/R => R}/reg_lm.R | 0 {RDDtools/R => R}/reg_np.R | 0 {RDDtools/R => R}/var_estim.R | 0 {RDDtools/R => R}/various_code.R | 0 {RDDtools/data => data}/Lee2008.rda | Bin {RDDtools/data => data}/STAR_MHE.rda | Bin {RDDtools/inst => inst}/doc/RDDtools.pdf | Bin {RDDtools/man => man}/Lee2008.Rd | 0 {RDDtools/man => man}/RDDbw_IK.Rd | 0 {RDDtools/man => man}/RDDbw_RSW.Rd | 0 {RDDtools/man => man}/RDDcoef.Rd | 0 {RDDtools/man => man}/RDDdata.Rd | 0 {RDDtools/man => man}/RDDgenreg.Rd | 0 {RDDtools/man => man}/RDDpred.Rd | 0 {RDDtools/man => man}/RDDreg_lm.Rd | 0 {RDDtools/man => man}/RDDreg_np.Rd | 0 {RDDtools/man => man}/RDDtools-package.Rd | 0 {RDDtools/man => man}/ROT_bw.Rd | 0 {RDDtools/man => man}/STAR_MHE.Rd | 0 {RDDtools/man => man}/as.lm.Rd | 0 {RDDtools/man => man}/as.npregbw.Rd | 0 {RDDtools/man => man}/clusterInf.Rd | 0 {RDDtools/man => man}/covarTest_dis.Rd | 0 {RDDtools/man => man}/covarTest_mean.Rd | 0 {RDDtools/man => man}/dens_test.Rd | 0 {RDDtools/man => man}/gen_MC_IK.Rd | 0 {RDDtools/man => man}/plot.RDDdata.Rd | 0 {RDDtools/man => man}/plotBin.Rd | 0 {RDDtools/man => man}/plotPlacebo.Rd | 0 {RDDtools/man => man}/plotSensi.Rd | 0 {RDDtools/man => man}/vcovCluster.Rd | 0 {RDDtools/man => man}/waldci.Rd | 0 {RDDtools/misc => misc}/TODO | 0 {RDDtools/misc => misc}/locpoly.R | 0 {RDDtools/misc => misc}/locpoly.f | 0 {RDDtools/misc => misc}/test_RDest_t0_RDDreg.R | 0 {RDDtools/tests => tests}/RDDpred.R | 0 {RDDtools/tests => tests}/RDDpred.Rout.save | 0 {RDDtools/tests => tests}/RDDtools_vs_rdd.R | 0 {RDDtools/tests => tests}/RDDtools_vs_rdd.Rout.save | 0 {RDDtools/tests => tests}/packageDemo.R | 0 {RDDtools/tests => tests}/packageDemo.Rout.save | 0 {RDDtools/tests => tests}/simple_MC.R | 0 {RDDtools/tests => tests}/simple_MC.Rout.save | 0 {RDDtools/vignettes => vignettes}/RDD_refs.bib | 0 {RDDtools/vignettes => vignettes}/RDDtools.lyx | 0 {RDDtools/vignettes => vignettes}/RDDtools.pdf | Bin {RDDtools/vignettes => vignettes}/RDDtools.tex | 0 74 files changed, 0 insertions(+), 0 deletions(-) rename RDDtools/DESCRIPTION => DESCRIPTION (100%) rename RDDtools/NAMESPACE => NAMESPACE (100%) rename RDDtools/NEWS => NEWS (100%) rename {RDDtools/R => R}/Lee2008-data.R (100%) rename {RDDtools/R => R}/RDDcoef.R (100%) rename {RDDtools/R => R}/RDDdata.R (100%) rename {RDDtools/R => R}/RDDdata_methods.R (100%) rename {RDDtools/R => R}/RDDpred.R (100%) rename {RDDtools/R => R}/STAR_MHE-data.R (100%) rename {RDDtools/R => R}/Waldci.R (100%) rename {RDDtools/R => R}/as.npreg.R (100%) rename {RDDtools/R => R}/bw_IK.R (100%) rename {RDDtools/R => R}/bw_ROT.R (100%) rename {RDDtools/R => R}/clusterInf.R (100%) rename {RDDtools/R => R}/covarTests.R (100%) rename {RDDtools/R => R}/dens_test.R (100%) rename {RDDtools/R => R}/deprecated.R (100%) rename {RDDtools/R => R}/gen_MC_IK.R (100%) rename {RDDtools/R => R}/get_methods.R (100%) rename {RDDtools/R => R}/model.matrix.RDD.R (100%) rename {RDDtools/R => R}/myRDD-package.R (100%) rename {RDDtools/R => R}/placebo.R (100%) rename {RDDtools/R => R}/plotBin.R (100%) rename {RDDtools/R => R}/plotSensi.R (100%) rename {RDDtools/R => R}/qplot_experim.R (100%) rename {RDDtools/R => R}/reg_gen.R (100%) rename {RDDtools/R => R}/reg_lm.R (100%) rename {RDDtools/R => R}/reg_np.R (100%) rename {RDDtools/R => R}/var_estim.R (100%) rename {RDDtools/R => R}/various_code.R (100%) rename {RDDtools/data => data}/Lee2008.rda (100%) rename {RDDtools/data => data}/STAR_MHE.rda (100%) rename {RDDtools/inst => inst}/doc/RDDtools.pdf (100%) rename {RDDtools/man => man}/Lee2008.Rd (100%) rename {RDDtools/man => man}/RDDbw_IK.Rd (100%) rename {RDDtools/man => man}/RDDbw_RSW.Rd (100%) rename {RDDtools/man => man}/RDDcoef.Rd (100%) rename {RDDtools/man => man}/RDDdata.Rd (100%) rename {RDDtools/man => man}/RDDgenreg.Rd (100%) rename {RDDtools/man => man}/RDDpred.Rd (100%) rename {RDDtools/man => man}/RDDreg_lm.Rd (100%) rename {RDDtools/man => man}/RDDreg_np.Rd (100%) rename {RDDtools/man => man}/RDDtools-package.Rd (100%) rename {RDDtools/man => man}/ROT_bw.Rd (100%) rename {RDDtools/man => man}/STAR_MHE.Rd (100%) rename {RDDtools/man => man}/as.lm.Rd (100%) rename {RDDtools/man => man}/as.npregbw.Rd (100%) rename {RDDtools/man => man}/clusterInf.Rd (100%) rename {RDDtools/man => man}/covarTest_dis.Rd (100%) rename {RDDtools/man => man}/covarTest_mean.Rd (100%) rename {RDDtools/man => man}/dens_test.Rd (100%) rename {RDDtools/man => man}/gen_MC_IK.Rd (100%) rename {RDDtools/man => man}/plot.RDDdata.Rd (100%) rename {RDDtools/man => man}/plotBin.Rd (100%) rename {RDDtools/man => man}/plotPlacebo.Rd (100%) rename {RDDtools/man => man}/plotSensi.Rd (100%) rename {RDDtools/man => man}/vcovCluster.Rd (100%) rename {RDDtools/man => man}/waldci.Rd (100%) rename {RDDtools/misc => misc}/TODO (100%) rename {RDDtools/misc => misc}/locpoly.R (100%) rename {RDDtools/misc => misc}/locpoly.f (100%) rename {RDDtools/misc => misc}/test_RDest_t0_RDDreg.R (100%) rename {RDDtools/tests => tests}/RDDpred.R (100%) rename {RDDtools/tests => tests}/RDDpred.Rout.save (100%) rename {RDDtools/tests => tests}/RDDtools_vs_rdd.R (100%) rename {RDDtools/tests => tests}/RDDtools_vs_rdd.Rout.save (100%) rename {RDDtools/tests => tests}/packageDemo.R (100%) rename {RDDtools/tests => tests}/packageDemo.Rout.save (100%) rename {RDDtools/tests => tests}/simple_MC.R (100%) rename {RDDtools/tests => tests}/simple_MC.Rout.save (100%) rename {RDDtools/vignettes => vignettes}/RDD_refs.bib (100%) rename {RDDtools/vignettes => vignettes}/RDDtools.lyx (100%) rename {RDDtools/vignettes => vignettes}/RDDtools.pdf (100%) rename {RDDtools/vignettes => vignettes}/RDDtools.tex (100%) diff --git a/RDDtools/DESCRIPTION b/DESCRIPTION similarity index 100% rename from RDDtools/DESCRIPTION rename to DESCRIPTION diff --git a/RDDtools/NAMESPACE b/NAMESPACE similarity index 100% rename from RDDtools/NAMESPACE rename to NAMESPACE diff --git a/RDDtools/NEWS b/NEWS similarity index 100% rename from RDDtools/NEWS rename to NEWS diff --git a/RDDtools/R/Lee2008-data.R b/R/Lee2008-data.R similarity index 100% rename from RDDtools/R/Lee2008-data.R rename to R/Lee2008-data.R diff --git a/RDDtools/R/RDDcoef.R b/R/RDDcoef.R similarity index 100% rename from RDDtools/R/RDDcoef.R rename to R/RDDcoef.R diff --git a/RDDtools/R/RDDdata.R b/R/RDDdata.R similarity index 100% rename from RDDtools/R/RDDdata.R rename to R/RDDdata.R diff --git a/RDDtools/R/RDDdata_methods.R b/R/RDDdata_methods.R similarity index 100% rename from RDDtools/R/RDDdata_methods.R rename to R/RDDdata_methods.R diff --git a/RDDtools/R/RDDpred.R b/R/RDDpred.R similarity index 100% rename from RDDtools/R/RDDpred.R rename to R/RDDpred.R diff --git a/RDDtools/R/STAR_MHE-data.R b/R/STAR_MHE-data.R similarity index 100% rename from RDDtools/R/STAR_MHE-data.R rename to R/STAR_MHE-data.R diff --git a/RDDtools/R/Waldci.R b/R/Waldci.R similarity index 100% rename from RDDtools/R/Waldci.R rename to R/Waldci.R diff --git a/RDDtools/R/as.npreg.R b/R/as.npreg.R similarity index 100% rename from RDDtools/R/as.npreg.R rename to R/as.npreg.R diff --git a/RDDtools/R/bw_IK.R b/R/bw_IK.R similarity index 100% rename from RDDtools/R/bw_IK.R rename to R/bw_IK.R diff --git a/RDDtools/R/bw_ROT.R b/R/bw_ROT.R similarity index 100% rename from RDDtools/R/bw_ROT.R rename to R/bw_ROT.R diff --git a/RDDtools/R/clusterInf.R b/R/clusterInf.R similarity index 100% rename from RDDtools/R/clusterInf.R rename to R/clusterInf.R diff --git a/RDDtools/R/covarTests.R b/R/covarTests.R similarity index 100% rename from RDDtools/R/covarTests.R rename to R/covarTests.R diff --git a/RDDtools/R/dens_test.R b/R/dens_test.R similarity index 100% rename from RDDtools/R/dens_test.R rename to R/dens_test.R diff --git a/RDDtools/R/deprecated.R b/R/deprecated.R similarity index 100% rename from RDDtools/R/deprecated.R rename to R/deprecated.R diff --git a/RDDtools/R/gen_MC_IK.R b/R/gen_MC_IK.R similarity index 100% rename from RDDtools/R/gen_MC_IK.R rename to R/gen_MC_IK.R diff --git a/RDDtools/R/get_methods.R b/R/get_methods.R similarity index 100% rename from RDDtools/R/get_methods.R rename to R/get_methods.R diff --git a/RDDtools/R/model.matrix.RDD.R b/R/model.matrix.RDD.R similarity index 100% rename from RDDtools/R/model.matrix.RDD.R rename to R/model.matrix.RDD.R diff --git a/RDDtools/R/myRDD-package.R b/R/myRDD-package.R similarity index 100% rename from RDDtools/R/myRDD-package.R rename to R/myRDD-package.R diff --git a/RDDtools/R/placebo.R b/R/placebo.R similarity index 100% rename from RDDtools/R/placebo.R rename to R/placebo.R diff --git a/RDDtools/R/plotBin.R b/R/plotBin.R similarity index 100% rename from RDDtools/R/plotBin.R rename to R/plotBin.R diff --git a/RDDtools/R/plotSensi.R b/R/plotSensi.R similarity index 100% rename from RDDtools/R/plotSensi.R rename to R/plotSensi.R diff --git a/RDDtools/R/qplot_experim.R b/R/qplot_experim.R similarity index 100% rename from RDDtools/R/qplot_experim.R rename to R/qplot_experim.R diff --git a/RDDtools/R/reg_gen.R b/R/reg_gen.R similarity index 100% rename from RDDtools/R/reg_gen.R rename to R/reg_gen.R diff --git a/RDDtools/R/reg_lm.R b/R/reg_lm.R similarity index 100% rename from RDDtools/R/reg_lm.R rename to R/reg_lm.R diff --git a/RDDtools/R/reg_np.R b/R/reg_np.R similarity index 100% rename from RDDtools/R/reg_np.R rename to R/reg_np.R diff --git a/RDDtools/R/var_estim.R b/R/var_estim.R similarity index 100% rename from RDDtools/R/var_estim.R rename to R/var_estim.R diff --git a/RDDtools/R/various_code.R b/R/various_code.R similarity index 100% rename from RDDtools/R/various_code.R rename to R/various_code.R diff --git a/RDDtools/data/Lee2008.rda b/data/Lee2008.rda similarity index 100% rename from RDDtools/data/Lee2008.rda rename to data/Lee2008.rda diff --git a/RDDtools/data/STAR_MHE.rda b/data/STAR_MHE.rda similarity index 100% rename from RDDtools/data/STAR_MHE.rda rename to data/STAR_MHE.rda diff --git a/RDDtools/inst/doc/RDDtools.pdf b/inst/doc/RDDtools.pdf similarity index 100% rename from RDDtools/inst/doc/RDDtools.pdf rename to inst/doc/RDDtools.pdf diff --git a/RDDtools/man/Lee2008.Rd b/man/Lee2008.Rd similarity index 100% rename from RDDtools/man/Lee2008.Rd rename to man/Lee2008.Rd diff --git a/RDDtools/man/RDDbw_IK.Rd b/man/RDDbw_IK.Rd similarity index 100% rename from RDDtools/man/RDDbw_IK.Rd rename to man/RDDbw_IK.Rd diff --git a/RDDtools/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd similarity index 100% rename from RDDtools/man/RDDbw_RSW.Rd rename to man/RDDbw_RSW.Rd diff --git a/RDDtools/man/RDDcoef.Rd b/man/RDDcoef.Rd similarity index 100% rename from RDDtools/man/RDDcoef.Rd rename to man/RDDcoef.Rd diff --git a/RDDtools/man/RDDdata.Rd b/man/RDDdata.Rd similarity index 100% rename from RDDtools/man/RDDdata.Rd rename to man/RDDdata.Rd diff --git a/RDDtools/man/RDDgenreg.Rd b/man/RDDgenreg.Rd similarity index 100% rename from RDDtools/man/RDDgenreg.Rd rename to man/RDDgenreg.Rd diff --git a/RDDtools/man/RDDpred.Rd b/man/RDDpred.Rd similarity index 100% rename from RDDtools/man/RDDpred.Rd rename to man/RDDpred.Rd diff --git a/RDDtools/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd similarity index 100% rename from RDDtools/man/RDDreg_lm.Rd rename to man/RDDreg_lm.Rd diff --git a/RDDtools/man/RDDreg_np.Rd b/man/RDDreg_np.Rd similarity index 100% rename from RDDtools/man/RDDreg_np.Rd rename to man/RDDreg_np.Rd diff --git a/RDDtools/man/RDDtools-package.Rd b/man/RDDtools-package.Rd similarity index 100% rename from RDDtools/man/RDDtools-package.Rd rename to man/RDDtools-package.Rd diff --git a/RDDtools/man/ROT_bw.Rd b/man/ROT_bw.Rd similarity index 100% rename from RDDtools/man/ROT_bw.Rd rename to man/ROT_bw.Rd diff --git a/RDDtools/man/STAR_MHE.Rd b/man/STAR_MHE.Rd similarity index 100% rename from RDDtools/man/STAR_MHE.Rd rename to man/STAR_MHE.Rd diff --git a/RDDtools/man/as.lm.Rd b/man/as.lm.Rd similarity index 100% rename from RDDtools/man/as.lm.Rd rename to man/as.lm.Rd diff --git a/RDDtools/man/as.npregbw.Rd b/man/as.npregbw.Rd similarity index 100% rename from RDDtools/man/as.npregbw.Rd rename to man/as.npregbw.Rd diff --git a/RDDtools/man/clusterInf.Rd b/man/clusterInf.Rd similarity index 100% rename from RDDtools/man/clusterInf.Rd rename to man/clusterInf.Rd diff --git a/RDDtools/man/covarTest_dis.Rd b/man/covarTest_dis.Rd similarity index 100% rename from RDDtools/man/covarTest_dis.Rd rename to man/covarTest_dis.Rd diff --git a/RDDtools/man/covarTest_mean.Rd b/man/covarTest_mean.Rd similarity index 100% rename from RDDtools/man/covarTest_mean.Rd rename to man/covarTest_mean.Rd diff --git a/RDDtools/man/dens_test.Rd b/man/dens_test.Rd similarity index 100% rename from RDDtools/man/dens_test.Rd rename to man/dens_test.Rd diff --git a/RDDtools/man/gen_MC_IK.Rd b/man/gen_MC_IK.Rd similarity index 100% rename from RDDtools/man/gen_MC_IK.Rd rename to man/gen_MC_IK.Rd diff --git a/RDDtools/man/plot.RDDdata.Rd b/man/plot.RDDdata.Rd similarity index 100% rename from RDDtools/man/plot.RDDdata.Rd rename to man/plot.RDDdata.Rd diff --git a/RDDtools/man/plotBin.Rd b/man/plotBin.Rd similarity index 100% rename from RDDtools/man/plotBin.Rd rename to man/plotBin.Rd diff --git a/RDDtools/man/plotPlacebo.Rd b/man/plotPlacebo.Rd similarity index 100% rename from RDDtools/man/plotPlacebo.Rd rename to man/plotPlacebo.Rd diff --git a/RDDtools/man/plotSensi.Rd b/man/plotSensi.Rd similarity index 100% rename from RDDtools/man/plotSensi.Rd rename to man/plotSensi.Rd diff --git a/RDDtools/man/vcovCluster.Rd b/man/vcovCluster.Rd similarity index 100% rename from RDDtools/man/vcovCluster.Rd rename to man/vcovCluster.Rd diff --git a/RDDtools/man/waldci.Rd b/man/waldci.Rd similarity index 100% rename from RDDtools/man/waldci.Rd rename to man/waldci.Rd diff --git a/RDDtools/misc/TODO b/misc/TODO similarity index 100% rename from RDDtools/misc/TODO rename to misc/TODO diff --git a/RDDtools/misc/locpoly.R b/misc/locpoly.R similarity index 100% rename from RDDtools/misc/locpoly.R rename to misc/locpoly.R diff --git a/RDDtools/misc/locpoly.f b/misc/locpoly.f similarity index 100% rename from RDDtools/misc/locpoly.f rename to misc/locpoly.f diff --git a/RDDtools/misc/test_RDest_t0_RDDreg.R b/misc/test_RDest_t0_RDDreg.R similarity index 100% rename from RDDtools/misc/test_RDest_t0_RDDreg.R rename to misc/test_RDest_t0_RDDreg.R diff --git a/RDDtools/tests/RDDpred.R b/tests/RDDpred.R similarity index 100% rename from RDDtools/tests/RDDpred.R rename to tests/RDDpred.R diff --git a/RDDtools/tests/RDDpred.Rout.save b/tests/RDDpred.Rout.save similarity index 100% rename from RDDtools/tests/RDDpred.Rout.save rename to tests/RDDpred.Rout.save diff --git a/RDDtools/tests/RDDtools_vs_rdd.R b/tests/RDDtools_vs_rdd.R similarity index 100% rename from RDDtools/tests/RDDtools_vs_rdd.R rename to tests/RDDtools_vs_rdd.R diff --git a/RDDtools/tests/RDDtools_vs_rdd.Rout.save b/tests/RDDtools_vs_rdd.Rout.save similarity index 100% rename from RDDtools/tests/RDDtools_vs_rdd.Rout.save rename to tests/RDDtools_vs_rdd.Rout.save diff --git a/RDDtools/tests/packageDemo.R b/tests/packageDemo.R similarity index 100% rename from RDDtools/tests/packageDemo.R rename to tests/packageDemo.R diff --git a/RDDtools/tests/packageDemo.Rout.save b/tests/packageDemo.Rout.save similarity index 100% rename from RDDtools/tests/packageDemo.Rout.save rename to tests/packageDemo.Rout.save diff --git a/RDDtools/tests/simple_MC.R b/tests/simple_MC.R similarity index 100% rename from RDDtools/tests/simple_MC.R rename to tests/simple_MC.R diff --git a/RDDtools/tests/simple_MC.Rout.save b/tests/simple_MC.Rout.save similarity index 100% rename from RDDtools/tests/simple_MC.Rout.save rename to tests/simple_MC.Rout.save diff --git a/RDDtools/vignettes/RDD_refs.bib b/vignettes/RDD_refs.bib similarity index 100% rename from RDDtools/vignettes/RDD_refs.bib rename to vignettes/RDD_refs.bib diff --git a/RDDtools/vignettes/RDDtools.lyx b/vignettes/RDDtools.lyx similarity index 100% rename from RDDtools/vignettes/RDDtools.lyx rename to vignettes/RDDtools.lyx diff --git a/RDDtools/vignettes/RDDtools.pdf b/vignettes/RDDtools.pdf similarity index 100% rename from RDDtools/vignettes/RDDtools.pdf rename to vignettes/RDDtools.pdf diff --git a/RDDtools/vignettes/RDDtools.tex b/vignettes/RDDtools.tex similarity index 100% rename from RDDtools/vignettes/RDDtools.tex rename to vignettes/RDDtools.tex From ef9a4d7351a385ccd94dfdb80a94e02c26edf18f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 13 Jan 2015 10:31:49 +0100 Subject: [PATCH 003/323] make RStudio project --- .gitignore | 3 +++ RDDtools.Rproj | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 .gitignore create mode 100644 RDDtools.Rproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..807ea25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.Rproj.user +.Rhistory +.RData diff --git a/RDDtools.Rproj b/RDDtools.Rproj new file mode 100644 index 0000000..b1ded45 --- /dev/null +++ b/RDDtools.Rproj @@ -0,0 +1,17 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: pdfLaTeX + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source From 8927c1d66900f1a050b3c2444ea8972f81986c8f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 13 Jan 2015 10:32:49 +0100 Subject: [PATCH 004/323] use new devtools api --- README.Rmd | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.Rmd b/README.Rmd index 3981194..fb7d76f 100644 --- a/README.Rmd +++ b/README.Rmd @@ -11,7 +11,7 @@ This github website hosts the source code. One of the easiest ways to install th ```{r eval=FALSE} library(devtools) -install_github(repo="RDDtools", username="MatthieuStigler", subdir="RDDtools") +install_github(repo="MatthieuStigler/RDDtools") ``` Note however the latest version of RDDtools only works with R 3.0, and that you might need to install [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. diff --git a/README.md b/README.md index 81662c0..d61f761 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This github website hosts the source code. One of the easiest ways to install th ```r library(devtools) -install_github(repo = "RDDtools", username = "MatthieuStigler", subdir = "RDDtools") +install_github(repo = "MatthieuStigler/RDDtools") ``` From 6eb577f13d2027ac85a719e6db8ca13b0a91cd06 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 13 Jan 2015 10:34:38 +0100 Subject: [PATCH 005/323] redocument --- DESCRIPTION | 28 ++++++++++++++++++++++++++++ RDDtools.Rproj | 1 + man/Lee2008.Rd | 3 ++- man/RDDbw_IK.Rd | 3 ++- man/RDDbw_RSW.Rd | 3 ++- man/RDDcoef.Rd | 3 ++- man/RDDdata.Rd | 11 ++++++----- man/RDDgenreg.Rd | 9 +++++---- man/RDDpred.Rd | 3 ++- man/RDDreg_lm.Rd | 9 +++++---- man/RDDreg_np.Rd | 7 ++++--- man/RDDtools-package.Rd | 3 ++- man/ROT_bw.Rd | 3 ++- man/STAR_MHE.Rd | 3 ++- man/as.lm.Rd | 3 ++- man/as.npregbw.Rd | 3 ++- man/clusterInf.Rd | 3 ++- man/covarTest_dis.Rd | 3 ++- man/covarTest_mean.Rd | 3 ++- man/dens_test.Rd | 3 ++- man/gen_MC_IK.Rd | 3 ++- man/plot.RDDdata.Rd | 3 ++- man/plotBin.Rd | 3 ++- man/plotPlacebo.Rd | 19 ++++++++++--------- man/plotSensi.Rd | 15 ++++++++------- man/vcovCluster.Rd | 3 ++- man/waldci.Rd | 3 ++- 27 files changed, 105 insertions(+), 51 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ae90716..48f2ca9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -24,3 +24,31 @@ Suggests: Description: Provides a set of functions for RDD, from data visualisation, estimation and testing. License: GPL (>= 2) +Collate: + 'Lee2008-data.R' + 'RDDcoef.R' + 'RDDdata.R' + 'RDDdata_methods.R' + 'RDDpred.R' + 'STAR_MHE-data.R' + 'Waldci.R' + 'as.npreg.R' + 'bw_IK.R' + 'plotBin.R' + 'bw_ROT.R' + 'clusterInf.R' + 'covarTests.R' + 'dens_test.R' + 'deprecated.R' + 'gen_MC_IK.R' + 'get_methods.R' + 'model.matrix.RDD.R' + 'myRDD-package.R' + 'placebo.R' + 'plotSensi.R' + 'qplot_experim.R' + 'reg_gen.R' + 'reg_lm.R' + 'reg_np.R' + 'var_estim.R' + 'various_code.R' diff --git a/RDDtools.Rproj b/RDDtools.Rproj index b1ded45..9f96499 100644 --- a/RDDtools.Rproj +++ b/RDDtools.Rproj @@ -15,3 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/man/Lee2008.Rd b/man/Lee2008.Rd index 52dd488..d2fb83b 100644 --- a/man/Lee2008.Rd +++ b/man/Lee2008.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/Lee2008-data.R \docType{data} \name{Lee2008} \alias{Lee2008} diff --git a/man/RDDbw_IK.Rd b/man/RDDbw_IK.Rd index cbda82d..5534f62 100644 --- a/man/RDDbw_IK.Rd +++ b/man/RDDbw_IK.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/bw_IK.R \name{RDDbw_IK} \alias{RDDbw_IK} \title{Imbens-Kalyanaraman Optimal Bandwidth Calculation} diff --git a/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd index 671c63f..4d83eb5 100644 --- a/man/RDDbw_RSW.Rd +++ b/man/RDDbw_RSW.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/bw_ROT.R \name{RDDbw_RSW} \alias{RDDbw_RSW} \title{Global bandwidth selector of Ruppert, Sheather and Wand (1995) from package \pkg{KernSmooth}} diff --git a/man/RDDcoef.Rd b/man/RDDcoef.Rd index ec712a3..6a2c3e0 100644 --- a/man/RDDcoef.Rd +++ b/man/RDDcoef.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/RDDcoef.R \name{RDDcoef} \alias{RDDcoef} \alias{RDDcoef.RDDreg_np} diff --git a/man/RDDdata.Rd b/man/RDDdata.Rd index 903eaab..b34aebd 100644 --- a/man/RDDdata.Rd +++ b/man/RDDdata.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/RDDdata.R \name{RDDdata} \alias{RDDdata} \title{Construct RDDdata} @@ -6,20 +7,20 @@ RDDdata(y, x, covar, cutpoint, z, labels, data) } \arguments{ -\item{x}{Forcing variable} - \item{y}{Output} +\item{x}{Forcing variable} + \item{covar}{Exogeneous variables} \item{cutpoint}{Cutpoint} +\item{z}{Assignment variable for the fuzzy case.} + \item{labels}{Additional labels to provide as list (with entries \code{x}, \code{y}, and eventually vector \code{covar}). Unused currently.} \item{data}{A data-frame for the \code{x} and \code{y} variables. If this is provided, the column names can be entered directly for argument \code{x} and \code{y}} - -\item{z}{Assignment variable for the fuzzy case.} } \value{ Object of class \code{RDDdata}, inheriting from \code{data.frame} diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd index 6c3750e..9be2d6f 100644 --- a/man/RDDgenreg.Rd +++ b/man/RDDgenreg.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/reg_gen.R \name{RDDgenreg} \alias{RDDgenreg} \title{General polynomial estimator of the regression discontinuity} @@ -10,19 +11,19 @@ RDDgenreg(RDDobject, fun = glm, covariates = NULL, order = 1, bw = NULL, \arguments{ \item{RDDobject}{Object of class RDDdata created by \code{\link{RDDdata}}} +\item{fun}{The function to estimate the parameters} + \item{covariates}{Formula to include covariates} \item{order}{Order of the polynomial regression.} \item{bw}{A bandwidth to specify the subset on which the kernel weighted regression is estimated} -\item{weights}{Optional weights to pass to the lm function. Note this cannot be entered together with \code{bw}} - \item{slope}{Whether slopes should be different on left or right (separate), or the same.} \item{covar.opt}{Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}).} -\item{fun}{The function to estimate the parameters} +\item{weights}{Optional weights to pass to the lm function. Note this cannot be entered together with \code{bw}} \item{\ldots}{Further arguments passed to fun. See the example.} } diff --git a/man/RDDpred.Rd b/man/RDDpred.Rd index 8137809..11cc9a5 100644 --- a/man/RDDpred.Rd +++ b/man/RDDpred.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/RDDpred.R \name{RDDpred} \alias{RDDpred} \title{RDD coefficient prediction} diff --git a/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd index 9d31a40..4c06c0e 100644 --- a/man/RDDreg_lm.Rd +++ b/man/RDDreg_lm.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/reg_lm.R \name{RDDreg_lm} \alias{RDDreg_lm} \title{Parametric polynomial estimator of the regression discontinuity} @@ -17,13 +18,13 @@ RDDreg_lm(RDDobject, covariates = NULL, order = 1, bw = NULL, \item{bw}{A bandwidth to specify the subset on which the parametric regression is estimated} -\item{covar.strat}{DEPRECATED, use covar.opt instead.} +\item{slope}{Whether slopes should be different on left or right (separate), or the same.} \item{covar.opt}{Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}).} -\item{weights}{Optional weights to pass to the lm function. Note this cannot be entered together with \code{bw}} +\item{covar.strat}{DEPRECATED, use covar.opt instead.} -\item{slope}{Whether slopes should be different on left or right (separate), or the same.} +\item{weights}{Optional weights to pass to the lm function. Note this cannot be entered together with \code{bw}} } \value{ An object of class RDDreg_lm and class lm, with specific print and plot methods diff --git a/man/RDDreg_np.Rd b/man/RDDreg_np.Rd index 8f4dcd0..d7279dd 100644 --- a/man/RDDreg_np.Rd +++ b/man/RDDreg_np.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/reg_np.R \name{RDDreg_np} \alias{RDDreg_np} \title{Parametric polynomial estimator of the regression discontinuity} @@ -14,10 +15,10 @@ RDDreg_np(RDDobject, covariates = NULL, bw = RDDbw_IK(RDDobject), \item{bw}{A bandwidth to specify the subset on which the parametric regression is estimated} -\item{inference}{Type of inference to conduct: non-parametric one (\code{np}) or standard (\code{lm}). See details.} - \item{slope}{Whether slopes should be different on left or right (separate), or the same.} +\item{inference}{Type of inference to conduct: non-parametric one (\code{np}) or standard (\code{lm}). See details.} + \item{covar.opt}{Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}).} } \value{ diff --git a/man/RDDtools-package.Rd b/man/RDDtools-package.Rd index 2f68ace..b38ebae 100644 --- a/man/RDDtools-package.Rd +++ b/man/RDDtools-package.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/myRDD-package.R \docType{package} \name{RDDtools-package} \alias{RDDtools} diff --git a/man/ROT_bw.Rd b/man/ROT_bw.Rd index 9ae13e0..6183c41 100644 --- a/man/ROT_bw.Rd +++ b/man/ROT_bw.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/bw_ROT.R \name{ROT_bw} \alias{ROT_bw} \title{Bandwidth selector} diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 36a1a38..6100e93 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/STAR_MHE-data.R \docType{data} \name{STAR_MHE} \alias{STAR_MHE} diff --git a/man/as.lm.Rd b/man/as.lm.Rd index 219a196..11183ac 100644 --- a/man/as.lm.Rd +++ b/man/as.lm.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/RDDdata_methods.R \name{as.lm} \alias{as.lm} \title{Convert a rdd object to lm} diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index 471b91e..7cd7ce4 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/as.npreg.R \name{as.npregbw} \alias{as.npreg} \alias{as.npregbw} diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index afe70c7..960ad6c 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/clusterInf.R \name{clusterInf} \alias{clusterInf} \title{Post-inference for clustered data} diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index 4d97d44..c427a1c 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/covarTests.R \name{covarTest_dis} \alias{covarTest_dis} \alias{covarTest_dis.RDDdata} diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index 983b84a..0388d66 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/covarTests.R \name{covarTest_mean} \alias{covarTest_mean} \alias{covarTest_mean.RDDdata} diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 027ccc8..37362d8 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/dens_test.R \name{dens_test} \alias{dens_test} \title{Run the McCracy test for manipulation of the forcing variable} diff --git a/man/gen_MC_IK.Rd b/man/gen_MC_IK.Rd index 74af276..86cf3b5 100644 --- a/man/gen_MC_IK.Rd +++ b/man/gen_MC_IK.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/gen_MC_IK.R \name{gen_MC_IK} \alias{gen_MC_IK} \title{Generate Monte Carlo simulations of Imbens and Kalyanaraman} diff --git a/man/plot.RDDdata.Rd b/man/plot.RDDdata.Rd index a684d24..8571f71 100644 --- a/man/plot.RDDdata.Rd +++ b/man/plot.RDDdata.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/RDDdata_methods.R \name{plot.RDDdata} \alias{plot.RDDdata} \title{Plot RDDdata} diff --git a/man/plotBin.Rd b/man/plotBin.Rd index 24ae2c1..4637185 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/plotBin.R \name{plotBin} \alias{plotBin} \title{Bin plotting} diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index f1f58ca..29a54ab 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/placebo.R \name{plotPlacebo} \alias{computePlacebo} \alias{plotPlacebo} @@ -27,14 +28,6 @@ computePlacebo(object, from = 0.25, to = 0.75, by = 0.1, level = 0.95, \item{device}{Whether to draw a base or a ggplot graph.} -\item{\ldots}{Further arguments passed to specific methods.} - -\item{vcov.}{Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}.} - -\item{plot}{Whether to actually plot the data.} - -\item{output}{Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object} - \item{from}{Starting point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint} \item{to}{Ending point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint} @@ -44,6 +37,14 @@ computePlacebo(object, from = 0.25, to = 0.75, by = 0.1, level = 0.95, \item{level}{Level of the confidence interval shown} \item{same_bw}{Whether to re-estimate the bandwidth at each point} + +\item{vcov.}{Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}.} + +\item{plot}{Whether to actually plot the data.} + +\item{output}{Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object} + +\item{\ldots}{Further arguments passed to specific methods.} } \value{ A data frame containing the cutpoints, their corresponding estimates and confidence intervals. diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index 162db17..e7b82e7 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/plotSensi.R \name{plotSensi} \alias{plotSensi} \alias{plotSensi.RDDreg_lm} @@ -27,19 +28,19 @@ plotSensi(RDDregobject, from, to, by = 0.01, level = 0.95, \item{level}{Level of the confidence interval} -\item{order}{For parametric models (from \code{\link{RDDreg_lm}}), the order of the polynomial.} +\item{output}{Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object} -\item{type}{For parametric models (from \code{\link{RDDreg_lm}}) whether different orders are represented as different colour or as different facets.} +\item{plot}{Whether to actually plot the data.} \item{device}{Whether to draw a base or a ggplot graph.} -\item{output}{Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object} +\item{vcov.}{Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}} -\item{plot}{Whether to actually plot the data.} +\item{order}{For parametric models (from \code{\link{RDDreg_lm}}), the order of the polynomial.} -\item{\ldots}{Further arguments passed to specific methods} +\item{type}{For parametric models (from \code{\link{RDDreg_lm}}) whether different orders are represented as different colour or as different facets.} -\item{vcov.}{Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}} +\item{\ldots}{Further arguments passed to specific methods} } \value{ A data frame containing the bandwidths and corresponding estimates and confidence intervals. diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index 4890057..a53680c 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/clusterInf.R \name{vcovCluster} \alias{vcovCluster} \alias{vcovCluster2} diff --git a/man/waldci.Rd b/man/waldci.Rd index d3defe7..4bd5e3a 100644 --- a/man/waldci.Rd +++ b/man/waldci.Rd @@ -1,4 +1,5 @@ -% Generated by roxygen2 (4.0.1): do not edit by hand +% Generated by roxygen2 (4.1.0): do not edit by hand +% Please edit documentation in R/Waldci.R \name{waldci} \alias{waldci} \title{Confint allowing vcov} From 74d9b37a27c27ec8a98625429bfa1cbaaf291288 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 13 Jan 2015 10:37:50 +0100 Subject: [PATCH 006/323] moved file added figures folder --- .Rbuildignore | 4 ++++ RDDtools/.Rbuildignore | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 .Rbuildignore delete mode 100644 RDDtools/.Rbuildignore diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..5db52e6 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,4 @@ +misc +figuresREADME +^.*\.Rproj$ +^\.Rproj\.user$ diff --git a/RDDtools/.Rbuildignore b/RDDtools/.Rbuildignore deleted file mode 100644 index b8752e7..0000000 --- a/RDDtools/.Rbuildignore +++ /dev/null @@ -1 +0,0 @@ -misc From f3eccfaa0e1ce5fa03dca500329d8ae38fc168ba Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 13 Jan 2015 10:41:43 +0100 Subject: [PATCH 007/323] update as well --- NAMESPACE | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index 6c8a163..da1e56e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,3 +1,5 @@ +# Generated by roxygen2 (4.1.0): do not edit by hand + S3method("[",RDDdata) S3method(RDDcoef,RDDreg_np) S3method(RDDcoef,RDDreg_npreg) From 154e2342a1bc5de6d82054d153de816c3be54718 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 14 Jan 2015 09:22:27 +0100 Subject: [PATCH 008/323] change roxygen2 S3method to export (roxygen2 v. 4). fix . separated function names to appear in namespace correctly --- .Rbuildignore | 1 + NAMESPACE | 56 +++++++++++++++++++------------------------- R/RDDcoef.R | 4 ++-- R/RDDdata.R | 8 +++---- R/RDDdata_methods.R | 8 +++---- R/as.npreg.R | 2 +- R/clusterInf.R | 8 +++---- R/covarTests.R | 8 +++---- R/get_methods.R | 2 +- R/model.matrix.RDD.R | 2 +- R/placebo.R | 8 +++---- R/plotSensi.R | 4 ++-- R/reg_lm.R | 4 ++-- R/reg_np.R | 10 ++++---- man/vcovCluster.Rd | 2 +- 15 files changed, 60 insertions(+), 67 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index 5db52e6..b67b153 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,4 +1,5 @@ misc figuresREADME +README.Rmd ^.*\.Rproj$ ^\.Rproj\.user$ diff --git a/NAMESPACE b/NAMESPACE index da1e56e..df5eb2d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,58 +1,50 @@ # Generated by roxygen2 (4.1.0): do not edit by hand -S3method("[",RDDdata) -S3method(RDDcoef,RDDreg_np) -S3method(RDDcoef,RDDreg_npreg) -S3method(RDDcoef,default) -S3method(as.data.frame,RDDdata) -S3method(as.lm,RDDreg) -S3method(as.lm,RDDreg_np) -S3method(bread,RDDreg_np) -S3method(covarTest_dis,RDDdata) -S3method(covarTest_dis,RDDreg) -S3method(covarTest_mean,RDDdata) -S3method(covarTest_mean,RDDreg) -S3method(estfun,RDDreg_np) -S3method(getCall,RDDreg) -S3method(model.frame,RDDreg_np) -S3method(model.matrix,RDDdata) -S3method(plot,RDDdata) -S3method(plot,RDDreg_lm) -S3method(plot,RDDreg_np) -S3method(plotPlacebo,PlaceboVals) -S3method(plotPlacebo,RDDreg) -S3method(plotPlaceboDens,PlaceboVals) -S3method(plotPlaceboDens,RDDreg) -S3method(plotSensi,RDDreg_lm) -S3method(plotSensi,RDDreg_np) -S3method(print,RDDreg_lm) -S3method(print,RDDreg_np) -S3method(print,summary.RDDreg_np) -S3method(subset,RDDdata) -S3method(summary,RDDdata) -S3method(summary,RDDreg_np) -S3method(vcov,RDDreg_np) export(RDDbw_IK) export(RDDbw_RSW) export(RDDcoef) +export(RDDcoef.RDDreg_npreg) export(RDDdata) export(RDDgenreg) export(RDDpred) export(RDDreg_lm) export(RDDreg_np) export(ROT_bw) +export(as.data.frame.RDDdata) export(as.lm) +export(as.lm.RDDreg) +export(as.lm.RDDreg_np) export(as.npreg) export(as.npregbw) +export(bread) export(clusterInf) export(computePlacebo) export(covarTest_dis) +export(covarTest_dis.RDDreg) export(covarTest_mean) +export(covarTest_mean.RDDreg) +export(default) export(dens_test) +export(estfun) export(gen_MC_IK) +export(getCall.RDDreg) +export(model.frame.RDDreg_np) +export(model.matrix.RDDdata) +export(plot) +export(plot.RDDdata) export(plotPlacebo) +export(plotPlacebo.PlaceboVals) +export(plotPlacebo.RDDreg) export(plotPlaceboDens) +export(plotPlaceboDens.PlaceboVals) +export(plotPlaceboDens.RDDreg) export(plotSensi) +export(print) +export(subset.RDDdata) +export(summary) +export(summary.RDDdata) +export(summary.RDDreg_np) +export(vcov) export(vcovCluster) export(vcovCluster2) import(Formula) diff --git a/R/RDDcoef.R b/R/RDDcoef.R index a275bb7..d7301c2 100644 --- a/R/RDDcoef.R +++ b/R/RDDcoef.R @@ -13,7 +13,7 @@ RDDcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) #' @rdname RDDcoef #' @method RDDcoef default -#' @S3method RDDcoef default +#' @export RDDcoef default RDDcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res <- coef(summary(object)) if(!allCo) res <- res["D",, drop=FALSE] @@ -23,7 +23,7 @@ RDDcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ #' @rdname RDDcoef #' @method RDDcoef RDDreg_np -#' @S3method RDDcoef RDDreg_np +#' @export RDDcoef RDDreg_np RDDcoef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res<- object$coefMat if(!allCo) res <- res["D",, drop=FALSE] diff --git a/R/RDDdata.R b/R/RDDdata.R index b1c2723..b561ed1 100644 --- a/R/RDDdata.R +++ b/R/RDDdata.R @@ -99,12 +99,12 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ ### Specific subsetting methods -##### @S3method as.data.frame RDDdata +##### @export as.data.frame.RDDdata # as.data.frame.RDDdata <- function(x) { # subset(x, y> # }as.data.frame.default(x) -#' @S3method "[" RDDdata +#' @export RDDdata '[.RDDdata' <- function(x,i,...){ attr_x <- attributes(x) r <- NextMethod("[", object=as.data.frame(x)) @@ -124,7 +124,7 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ r } -#' @S3method subset RDDdata +#' @export subset.RDDdata subset.RDDdata <- function (x, subset, select, drop = FALSE, ...) { attr_x <- attributes(x) @@ -160,7 +160,7 @@ subset.RDDdata <- function (x, subset, select, drop = FALSE, ...) { res } -#' @S3method as.data.frame RDDdata +#' @export as.data.frame.RDDdata as.data.frame.RDDdata <- function(x,...){ class(x) <- "data.frame" attr(x, "hasCovar") <- NULL diff --git a/R/RDDdata_methods.R b/R/RDDdata_methods.R index d82fb05..7a157e5 100644 --- a/R/RDDdata_methods.R +++ b/R/RDDdata_methods.R @@ -1,7 +1,7 @@ ### SUMMARY method -#' @S3method summary RDDdata +#' @export summary.RDDdata summary.RDDdata <- function(object, ...){ cutpoint <- getCutpoint(object) @@ -51,7 +51,7 @@ summary.RDDdata <- function(object, ...){ #' ## If the specified number of bins is odd, the larger number is given to side with largest range #' plot(Lee2008_rdd, nbins=21) #' @method plot RDDdata -#' @S3method plot RDDdata +#' @export plot.RDDdata ### PLOT method @@ -140,10 +140,10 @@ as.lm_RDD <- function(x){ x } -#' @S3method as.lm RDDreg_np +#' @export as.lm.RDDreg_np as.lm.RDDreg_np <- function(x) as.lm_RDD(x) -#' @S3method as.lm RDDreg +#' @export as.lm.RDDreg as.lm.RDDreg <- function(x) as.lm_RDD(x) diff --git a/R/as.npreg.R b/R/as.npreg.R index f4f7164..1403466 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -84,7 +84,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ } -#' @S3method RDDcoef RDDreg_npreg +#' @export RDDcoef.RDDreg_npreg RDDcoef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){ co <- diff(object$mean) diff --git a/R/clusterInf.R b/R/clusterInf.R index edbec7d..18bf110 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -44,14 +44,14 @@ clusterInf <- function(object, clusterVar, vcov. = NULL, type=c("df-adj", "HC"), return(res) } -#' @S3method estfun RDDreg_np +#' @export estfun RDDreg_np estfun.RDDreg_np <- function(x,...){ inf_met <- infType(x) ## def in Misc.R if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators") estfun(x$RDDslot$model) } -#' @S3method bread RDDreg_np +#' @export bread RDDreg_np bread.RDDreg_np <- function(x,...){ inf_met <- infType(x) ## def in Misc.R if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators") @@ -65,7 +65,7 @@ bread.RDDreg_np <- function(x,...){ # sandwich(x$RDDslot$model, bread.=bread., meat.=meat., ...) # } -#' @S3method model.frame RDDreg_np +#' @export model.frame.RDDreg_np model.frame.RDDreg_np <- function (formula, ...) model.frame(formula$RDDslot$model) @@ -79,7 +79,7 @@ model.frame.RDDreg_np <- function (formula, ...) #' @references Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway Clustering, #' \emph{Journal of Business and Economic Statistics}, vol. 29(2), pages 238-249. #' #' @references Wooldridge (2003) Cluster-sample methods in applied econometrics. -#' \emph{AmericanEconomic Review}, 93, p. 133-138 +#' \emph{American Economic Review}, 93, p. 133-138 #' @references Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http://people.su.se/~ma/clustering.pdf}. #' @export #' @seealso \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. diff --git a/R/covarTests.R b/R/covarTests.R index c6cb88e..0da8cb8 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -42,7 +42,7 @@ covarTest_mean <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p #' @rdname covarTest_mean #' @method covarTest_mean RDDdata -#' @S3method covarTest_mean RDDdata +#' @export covarTest_mean RDDdata covarTest_mean.RDDdata <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) @@ -56,7 +56,7 @@ covarTest_mean.RDDdata <- function(object, bw=NULL, paired = FALSE, var.equal = #' @rdname covarTest_mean #' @method covarTest_mean RDDreg -#' @S3method covarTest_mean RDDreg +#' @export covarTest_mean.RDDreg covarTest_mean.RDDreg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) @@ -140,7 +140,7 @@ covarTest_dis <- function(object, bw, exact=NULL, p.adjust=c("none", "holm", "B #' @rdname covarTest_dis #' @method covarTest_dis RDDdata -#' @S3method covarTest_dis RDDdata +#' @export covarTest_dis RDDdata covarTest_dis.RDDdata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) @@ -153,7 +153,7 @@ covarTest_dis.RDDdata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("n #' @rdname covarTest_dis #' @method covarTest_dis RDDreg -#' @S3method covarTest_dis RDDreg +#' @export covarTest_dis.RDDreg covarTest_dis.RDDreg <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) diff --git a/R/get_methods.R b/R/get_methods.R index 255bb5d..cec2134 100644 --- a/R/get_methods.R +++ b/R/get_methods.R @@ -135,7 +135,7 @@ getOriginalData.RDDreg <- function(object, na.rm=TRUE, classRDD=TRUE){ #' @importFrom stats getCall -#' @S3method getCall RDDreg +#' @export getCall.RDDreg getCall.RDDreg <- function(x,...) attr(x, "RDDcall") diff --git a/R/model.matrix.RDD.R b/R/model.matrix.RDD.R index 4a80b1d..14041a3 100644 --- a/R/model.matrix.RDD.R +++ b/R/model.matrix.RDD.R @@ -1,4 +1,4 @@ -#' @S3method model.matrix RDDdata +#' @export model.matrix.RDDdata model.matrix.RDDdata <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){ diff --git a/R/placebo.R b/R/placebo.R index a32971c..cc928b8 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -28,7 +28,7 @@ plotPlacebo <- function(object, device=c("ggplot", "base"), ...) #' @rdname plotPlacebo #' @method plotPlacebo RDDreg -#' @S3method plotPlacebo RDDreg +#' @export plotPlacebo.RDDreg #' @param from Starting point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint #' @param to Ending point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint #' @param by Increments of the from-to sequence @@ -51,7 +51,7 @@ plotPlacebo.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25, to -#' @S3method plotPlacebo PlaceboVals +#' @export plotPlacebo.PlaceboVals plotPlacebo.PlaceboVals <- function(object, device=c("ggplot", "base"),plot=TRUE, output=c("data", "ggplot"), ...){ device <- match.arg(device) @@ -124,7 +124,7 @@ plotPlaceboDens <- function(object, device=c("ggplot", "base"), ...) #' @rdname plotPlacebo #' @method plotPlaceboDens RDDreg -#' @S3method plotPlaceboDens RDDreg +#' @export plotPlaceboDens.RDDreg plotPlaceboDens.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, ...){ device <- match.arg(device) @@ -139,7 +139,7 @@ plotPlaceboDens.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25 } -#' @S3method plotPlaceboDens PlaceboVals +#' @export plotPlaceboDens.PlaceboVals plotPlaceboDens.PlaceboVals <- function(object, device=c("ggplot", "base"), ...){ device <- match.arg(device) diff --git a/R/plotSensi.R b/R/plotSensi.R index 01f4ac7..331f243 100644 --- a/R/plotSensi.R +++ b/R/plotSensi.R @@ -43,7 +43,7 @@ plotSensi <- function(RDDregobject, from, to, by=0.01, level=0.95, output=c("dat #' @rdname plotSensi #' @method plotSensi RDDreg_np -#' @S3method plotSensi RDDreg_np +#' @export plotSensi RDDreg_np #' @param vcov. Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}} plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, device=c("ggplot", "base"), vcov.=NULL, ...){ @@ -130,7 +130,7 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out #' @rdname plotSensi #' @method plotSensi RDDreg_lm -#' @S3method plotSensi RDDreg_lm +#' @export plotSensi RDDreg_lm plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, order, type=c("colour", "facet"), ...){ type <- match.arg(type) diff --git a/R/reg_lm.R b/R/reg_lm.R index 6503573..871af73 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -105,7 +105,7 @@ RDDreg_lm <- function(RDDobject, covariates=NULL, order=1, bw=NULL, slope=c("sep } -#' @S3method print RDDreg_lm +#' @export print RDDreg_lm print.RDDreg_lm <- function(x,...) { order <- getOrder(x) @@ -131,7 +131,7 @@ print.RDDreg_lm <- function(x,...) { } -#' @S3method plot RDDreg_lm +#' @export plot RDDreg_lm plot.RDDreg_lm <- function(x,...) { ## data diff --git a/R/reg_np.R b/R/reg_np.R index 4ae8405..17a45b7 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -83,7 +83,7 @@ RDDreg_np <- function(RDDobject, covariates=NULL, bw=RDDbw_IK(RDDobject), slope= } -#' @S3method print RDDreg_np +#' @export print RDDreg_np print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), ...) { RDDcall <- attr(x, "RDDcall") @@ -104,7 +104,7 @@ print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), .. } -#' @S3method summary RDDreg_np +#' @export summary RDDreg_np summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { x <- object @@ -133,7 +133,7 @@ summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), object } -#' @S3method print summary.RDDreg_np +#' @export print summary.RDDreg_np print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { bw <- getBW(x) @@ -155,7 +155,7 @@ print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3), } -#' @S3method plot RDDreg_np +#' @export plot RDDreg_np plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) { chart <- match.arg(chart) @@ -202,7 +202,7 @@ plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) { } } -#' @S3method vcov RDDreg_np +#' @export vcov RDDreg_np vcov.RDDreg_np <- function(object, ...){ infType <- infType(object) diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index a53680c..b58c01d 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -45,7 +45,7 @@ Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway C #' Wooldridge (2003) Cluster-sample methods in applied econometrics. -\emph{AmericanEconomic Review}, 93, p. 133-138 +\emph{American Economic Review}, 93, p. 133-138 Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http://people.su.se/~ma/clustering.pdf}. } From 66d547f892060f3a318897e3f6f59e833c68268a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 10 Mar 2015 15:57:49 +0100 Subject: [PATCH 009/323] fix roxygenisation documentation issues --- NAMESPACE | 2 +- R/RDDcoef.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index df5eb2d..ed4bb13 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ export(RDDbw_IK) export(RDDbw_RSW) export(RDDcoef) export(RDDcoef.RDDreg_npreg) +export(RDDcoef.default) export(RDDdata) export(RDDgenreg) export(RDDpred) @@ -23,7 +24,6 @@ export(covarTest_dis) export(covarTest_dis.RDDreg) export(covarTest_mean) export(covarTest_mean.RDDreg) -export(default) export(dens_test) export(estfun) export(gen_MC_IK) diff --git a/R/RDDcoef.R b/R/RDDcoef.R index d7301c2..6a73b04 100644 --- a/R/RDDcoef.R +++ b/R/RDDcoef.R @@ -13,7 +13,7 @@ RDDcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) #' @rdname RDDcoef #' @method RDDcoef default -#' @export RDDcoef default +#' @export RDDcoef RDDcoef.default RDDcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res <- coef(summary(object)) if(!allCo) res <- res["D",, drop=FALSE] From dfea581986a80f4edc9d96265108d9894a3b5761 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 10 Mar 2015 16:01:35 +0100 Subject: [PATCH 010/323] BUILD PASSING update info bump version --- DESCRIPTION | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 48f2ca9..3df1c67 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,11 +1,11 @@ Package: RDDtools Type: Package Title: A toolbox for regression discontinuity design (RDD) -Version: 0.22 -Date: 21/05/2014 -Authors@R: person("Matthieu", "Stigler", role = c("aut","cre"), - email="Matthieu.Stigler@iheid.ch") -Maintainer: Matthieu Stigler +Version: 0.2.3 +Date: 2015-3-10 +Authors@R: c( person("Bastiaan", "Quast", email = "bquast@gmail.com", role = + c("aut", "cre") ), person("Matthieu", "Stigler", role = "aut") ) +Maintainer: Bastiaan Quast Imports: KernSmooth, ggplot2, From c66b8db14f1d0626d83ef53802e49eeb180af4b8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 10 Mar 2015 16:07:10 +0100 Subject: [PATCH 011/323] further updates --- DESCRIPTION | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3df1c67..77027b2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,10 +1,11 @@ Package: RDDtools -Type: Package -Title: A toolbox for regression discontinuity design (RDD) Version: 0.2.3 Date: 2015-3-10 -Authors@R: c( person("Bastiaan", "Quast", email = "bquast@gmail.com", role = - c("aut", "cre") ), person("Matthieu", "Stigler", role = "aut") ) +Title: Toolbox for Regression Discontinuity Design (RDD) +Authors@R: c( + person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ), + person("Matthieu", "Stigler", role = "aut") + ) Maintainer: Bastiaan Quast Imports: KernSmooth, @@ -21,7 +22,7 @@ Depends: Suggests: stats4, car -Description: Provides a set of functions for RDD, from data visualisation, +Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, estimation and testing. License: GPL (>= 2) Collate: @@ -52,3 +53,5 @@ Collate: 'reg_np.R' 'var_estim.R' 'various_code.R' +URL: https://github.com/bquast/RDDtools +BugReports: https://github.com/bquast/RDDtools/issues From b658f9d25b5b07ab0594d316eb18e58d39c5f49e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 11 Mar 2015 15:05:23 +0100 Subject: [PATCH 012/323] trailing white space? and some other wrapping --- DESCRIPTION | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 77027b2..f74a2ce 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: RDDtools Version: 0.2.3 Date: 2015-3-10 Title: Toolbox for Regression Discontinuity Design (RDD) -Authors@R: c( +Authors@R: c( person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ), person("Matthieu", "Stigler", role = "aut") ) @@ -22,8 +22,8 @@ Depends: Suggests: stats4, car -Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, - estimation and testing. +Description: Set of functions for Regression Discontinuity Design (RDD), for + data visualisation, estimation and testing. License: GPL (>= 2) Collate: 'Lee2008-data.R' From a6a5aa41fb849f39f68aefa4afc45be98a23049b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 11 Mar 2015 15:29:30 +0100 Subject: [PATCH 013/323] change to onAttach for best practice, update message --- R/various_code.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/various_code.R b/R/various_code.R index 6ec771c..fb8e80a 100644 --- a/R/various_code.R +++ b/R/various_code.R @@ -12,6 +12,6 @@ Kernel_uni <- function(X, center, bw) { ifelse(abs(X - center) > bw, 0, 1) } -.onLoad <- function(libname, pkgname) - packageStartupMessage("\nRDDtools ", utils::packageVersion("RDDtools"), - "\nPLEASE NOTE THIS is currently only a development version. \nRun vignette('RDDtools') for the documentation") +.onAttach <- function(libname, pkgname) + packageStartupMessage("IMPORTANT, this is an ALPHA VERSION + many changes to the API will follow") From 2bc53a1b194762d3d1271f96aa7f90938798d5a8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 11 Mar 2015 15:29:46 +0100 Subject: [PATCH 014/323] add vignitte to roxygen docu list --- RDDtools.Rproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RDDtools.Rproj b/RDDtools.Rproj index 9f96499..6843888 100644 --- a/RDDtools.Rproj +++ b/RDDtools.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace +PackageRoxygenize: rd,collate,namespace,vignette From 1e73bf406f99f16c53eafcd8e4ced7ff7205146f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 11 Mar 2015 15:30:01 +0100 Subject: [PATCH 015/323] add dev version no. move desc. up --- DESCRIPTION | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f74a2ce..71093ab 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,9 @@ Package: RDDtools -Version: 0.2.3 -Date: 2015-3-10 +Version: 0.2.0.9000 +Date: 2015-3-11 Title: Toolbox for Regression Discontinuity Design (RDD) +Description: Set of functions for Regression Discontinuity Design (RDD), for + data visualisation, estimation and testing. Authors@R: c( person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ), person("Matthieu", "Stigler", role = "aut") @@ -22,8 +24,6 @@ Depends: Suggests: stats4, car -Description: Set of functions for Regression Discontinuity Design (RDD), for - data visualisation, estimation and testing. License: GPL (>= 2) Collate: 'Lee2008-data.R' From 119bbfd676133a154b1638723afaead4be2d523b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 11:47:24 +0100 Subject: [PATCH 016/323] remove vignette --- RDDtools.Rproj | 2 +- vignettes/RDD_refs.bib | 143 --- vignettes/RDDtools.lyx | 2394 ---------------------------------------- vignettes/RDDtools.pdf | Bin 416350 -> 0 bytes vignettes/RDDtools.tex | 887 --------------- 5 files changed, 1 insertion(+), 3425 deletions(-) delete mode 100644 vignettes/RDD_refs.bib delete mode 100644 vignettes/RDDtools.lyx delete mode 100644 vignettes/RDDtools.pdf delete mode 100644 vignettes/RDDtools.tex diff --git a/RDDtools.Rproj b/RDDtools.Rproj index 6843888..9f96499 100644 --- a/RDDtools.Rproj +++ b/RDDtools.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace,vignette +PackageRoxygenize: rd,collate,namespace diff --git a/vignettes/RDD_refs.bib b/vignettes/RDD_refs.bib deleted file mode 100644 index 448cca5..0000000 --- a/vignettes/RDD_refs.bib +++ /dev/null @@ -1,143 +0,0 @@ -% This file was created with JabRef 2.7b. -% Encoding: UTF-8 - -@TECHREPORT{CalonicoCattaneoEtAl2012, - author = {Sebastian Calonico and Matias D. Cattaneo and Rocio Titiunik}, - title = {Robust Nonparametric Bias-Corrected Inference in the Regression Discontinuity - Design}, - year = {2012}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@ARTICLE{ChengFanEtAl1997, - author = {Cheng, M.-Y. and Fan, J. and Marron, J. S.}, - title = {On Automatic Boundary Corrections}, - journal = {Annals of Statistics}, - year = {1997}, - volume = {25}, - pages = {1691-1708}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@BOOK{FanGijbels1996, - title = {Local Polynomial Modeling and its Implications}, - publisher = {Boca Raton: Chapman and Hall/CRC, Monographs on Statistics and Applied - Probability no. 66}, - year = {1996}, - author = {Fan, J. and Gijbels, I.}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@ARTICLE{FanGijbels1992, - author = {Fan, J. and Gijbels, I.}, - title = {Variable Bandwidth and Local Linear Regression Smoothers}, - journal = {Annals of Statistics}, - year = {1992}, - volume = {20}, - pages = {2008-2036}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@ARTICLE{ImbensKalyanaraman2012, - author = {Guido Imbens And Karthik Kalyanaraman}, - title = {Optimal Bandwidth Choice for the Regression Discontinuity Estimator}, - journal = {Review of Economic Studies}, - year = {2012}, - volume = {79}, - pages = {933-959}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@ARTICLE{ImbensLemieux2008, - author = {Imbens, Guido W. and Lemieux, Thomas}, - title = {Regression discontinuity designs: A guide to practice}, - journal = {Journal of Econometrics}, - year = {2008}, - volume = {142}, - pages = {615-635}, - number = {2}, - month = {February}, - abstract = {In Regression Discontinuity (RD) designs for evaluating causal effects - of interventions, assignment to a treatment is determined at least - partly by the value of an observed covariate lying on either side - of a fixed threshold. These designs were first introduced in the - evaluation literature by Thistlewaite and Campbell (1960). With the - exception of a few unpublished theoretical papers, these methods - did not attract much attention in the economics literature until - recently. Starting in the late 1990s, there has been a large number - of studies in economics applying and extending RD methods. In this - paper we review some of the practical and theoretical issues involved - in the implementation of RD methods.

(This abstract was borrowed - from another version of this item.)}, - owner = {matifou}, - timestamp = {2014.05.21}, - url = {http://ideas.repec.org/a/eee/econom/v142y2008i2p615-635.html} -} - -@ARTICLE{Lee2008, - author = {David S. Lee}, - title = {Randomized experiments from non-random selection in U.S. House elections}, - journal = {Journal of Econometrics}, - year = {2008}, - volume = {142}, - pages = {675-697}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@ARTICLE{LeeLemieux2010, - author = {Lee, David S. and Thomas Lemieux}, - title = {Regression Discontinuity Designs in Economics}, - journal = {Journal of Economic Literature}, - year = {2010}, - volume = {48(2)}, - pages = {281-355}, - owner = {mat}, - timestamp = {2012.11.19} -} - -@ARTICLE{McCrary2008, - author = {McCrary, Justin}, - title = {Manipulation of the Running Variable in the Regression Discontinuity - Design: A Density Test}, - journal = {Journal of Econometrics}, - year = {2008}, - volume = {142}, - pages = {698-714}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@TECHREPORT{Porter2003, - author = {Porter, Jack}, - title = {Estimation in the Regression Discontinuity Model}, - institution = {University of Wisconsin, Madison, Department of Economics}, - year = {2003}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@ARTICLE{RuppertSheatherEtAl1995, - author = {Ruppert, D. and Sheather, S. J. and Wand, M. P.}, - title = {An effective bandwidth selector for local least squares regression}, - journal = {Journal of the American Statistical Association}, - year = {1995}, - volume = {90}, - pages = {1257-1270}, - owner = {mat}, - timestamp = {2013.04.17} -} - -@comment{jabref-meta: selector_publisher:} - -@comment{jabref-meta: selector_author:} - -@comment{jabref-meta: selector_journal:} - -@comment{jabref-meta: selector_keywords:} - diff --git a/vignettes/RDDtools.lyx b/vignettes/RDDtools.lyx deleted file mode 100644 index 0f0cfce..0000000 --- a/vignettes/RDDtools.lyx +++ /dev/null @@ -1,2394 +0,0 @@ -#LyX 2.1 created this file. For more info see http://www.lyx.org/ -\lyxformat 474 -\begin_document -\begin_header -\textclass jss -\begin_preamble - -\usepackage{amsmath} -\usepackage{nameref} - -%the following commands are used only for articles and codesnippets - -\author{Matthieu Stigler\\Affiliation IHEID} -\title{\pkg{RDDtools}: an overview } - -% the same as above, without any formatting -\Plainauthor{Matthieu Stigler} -\Plaintitle{\pkg{RDDtools}: a toolbox to practice } -%if necessary, provide a short title -\Shorttitle{\pkg{RDDtools}: a toolbox to practice } - -\Abstract{\pkg{RDDtools} is a R package for sharp regression discontinuity design (RDD). It offers various estimators, tests and graphical procedures following the guidelines of \citet{ImbensLemieux2008} and \citet{LeeLemieux2010}. This note illustrate how to use the package, using the well-known dataset of \citet{Lee2008}. - - -NOTE THAT this is a preliminary note, on a preliminary package still under development. Changes of the function names, arguments and output are to be expected, as well as possible mistakes and inconsistencies. Please report any mistakes or suggestion to \email{Matthieu.Stigler@iheid.ch}} -%at least one keyword is needed -\Keywords{Regression discontinuity design, non-parametric analysis, \pkg{RDDtools}, \proglang{R}} -%the same as above, without any formatting -\Plainkeywords{Regression discontinuity design, non-parametric analysis,RDDtools, R} - -%the following commands are used only for book or software reviews - -%\Reviewer{Some Author\\University of Somewhere} -%\Plainreviewer{Some Author} - - -%without any formatting -%\Plaintitle{LyX and R: Secrets of the LyX Master} -%\Shorttitle{LyX and R} - - - -%The address of at least one author should be given in the following format -\Address{ - Matthieu Stigler\\ - Centre for Finance and development\\ - IHEID\\ - Geneva\\ - E-mail: \email{Matthieu.Stigler@iheid.ch} -} -%you can add a telephone and fax number before the e-mail in the format -%Telephone: +12/3/4567-89 -%Fax: +12/3/4567-89 - -%if you use Sweave, include the following line (with % symbols): -%% need no \usepackage{Sweave.sty} - -%% Arg min operator: -\DeclareMathOperator*{\argmi}{arg\,min} -\newcommand{\argmin}[1]{\underset{#1}{\argmi}} - -\DeclareMathOperator*{\Ker}{\mathcal{K}} -\end_preamble -\options nojss -\use_default_options false -\begin_modules -knitr -\end_modules -\maintain_unincluded_children false -\language english -\language_package default -\inputencoding auto -\fontencoding global -\font_roman default -\font_sans default -\font_typewriter default -\font_math auto -\font_default_family default -\use_non_tex_fonts false -\font_sc false -\font_osf false -\font_sf_scale 100 -\font_tt_scale 100 -\graphics default -\default_output_format default -\output_sync 0 -\bibtex_command default -\index_command default -\paperfontsize default -\spacing single -\use_hyperref false -\papersize default -\use_geometry false -\use_package amsmath 0 -\use_package amssymb 2 -\use_package cancel 0 -\use_package esint 0 -\use_package mathdots 1 -\use_package mathtools 0 -\use_package mhchem 1 -\use_package stackrel 0 -\use_package stmaryrd 0 -\use_package undertilde 0 -\cite_engine natbib -\cite_engine_type authoryear -\biblio_style plainnat -\use_bibtopic false -\use_indices false -\paperorientation portrait -\suppress_date false -\justification true -\use_refstyle 0 -\index Index -\shortcut idx -\color #008000 -\end_index -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\paragraph_indentation default -\quotes_language english -\papercolumns 1 -\papersides 1 -\paperpagestyle default -\tracking_changes false -\output_changes false -\html_math_output 0 -\html_css_as_file 0 -\html_be_strict false -\end_header - -\begin_body - -\begin_layout Standard -\begin_inset CommandInset toc -LatexCommand tableofcontents - -\end_inset - - -\end_layout - -\begin_layout Section -Introduction -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -addcontentsline{toc}{section}{Introduction} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Introduction to RDD -\end_layout - -\begin_layout Standard -\begin_inset Note Note -status open - -\begin_layout Plain Layout -The Regression Discontinuity Design (RDD) method is a method for impact - evaluation in situations where attribution of the programme cannot be assumed - to be random, yet is done based on a known selection rule. - Examples of such situations are scholarships attributed based on a score - (the seminal example due to -\begin_inset CommandInset citation -LatexCommand citealp -key "ThistlewaiteCampbell1960" - -\end_inset - -), a maximum number of children in a classroom -\begin_inset CommandInset citation -LatexCommand citep -key "AngristLavy1999" - -\end_inset - -, majority rules for election -\begin_inset CommandInset citation -LatexCommand citep -key "Lee2008" - -\end_inset - - or the choice of an HIV training programme targetting small schools -\begin_inset CommandInset citation -LatexCommand citep -key "ArcandWouabe2010" - -\end_inset - -. - The underlying idea is that, although -\end_layout - -\begin_layout Plain Layout -to exploit the discontinuies in the programme attribution introduced by - the rule to assume that around the discontinuity point. - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Introduction to RDDtools -\end_layout - -\begin_layout Standard -The R package -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{RDDtools} -\end_layout - -\end_inset - - aims at offering a complete a toolbox for regression discontinuity design, - following the step-by-step recommendations of -\begin_inset CommandInset citation -LatexCommand citet -key "ImbensLemieux2008" - -\end_inset - - and -\begin_inset CommandInset citation -LatexCommand citet -key "LeeLemieux2010" - -\end_inset - -. - Summarising the approaches advocated in the two papers, a RDD analysis - comprises of following steps: -\end_layout - -\begin_layout Enumerate -Graphical representation of the data -\end_layout - -\begin_layout Enumerate -Estimation -\end_layout - -\begin_layout Enumerate -Validity tests -\end_layout - -\begin_layout Standard -We add to this list a step that is too often forgotten, yet can be very - burdensome: data preparation. - Hence, this list is extended with the fundamental step 0, which involves - preparing the data in the right way. - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{RDDtools} -\end_layout - -\end_inset - - offers an object-oriented way to analysis, building on the R mechanism - of S3 methods and classes. - Concretely, this implies that the user has to specify the input data only - once, and that most of the functions can be called directly on the new - object of class -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDdata} -\end_layout - -\end_inset - -. -\end_layout - -\begin_layout Section -Step 0: data input -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -addcontentsline{toc}{section}{Step 0: data input} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -As first step of the analysis, the user has to specify the input data into - the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDdata} -\end_layout - -\end_inset - - function, which takes following arguments: -\end_layout - -\begin_layout Description -y The outcome variable -\end_layout - -\begin_layout Description -x The forcing variable -\end_layout - -\begin_layout Description -cutpoint The cutpoint/threshold (note only one cutpoint can be given) -\end_layout - -\begin_layout Description -covar Eventual covariates -\end_layout - -\begin_layout Standard -The RDDdata function returns an object of class -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDdata} -\end_layout - -\end_inset - -, as well as of the usual -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -proglang{R} -\end_layout - -\end_inset - - class -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{data.frame} -\end_layout - -\end_inset - -. - -\end_layout - -\begin_layout Standard -To illustrate this, we show how to use this with the benchmark dataset of - -\begin_inset CommandInset citation -LatexCommand citet -key "Lee2008" - -\end_inset - -, adding randomly generated covariates for the sake of illustration. - The dataset is shipped with the package, and is available under the name - -\emph on -Lee2008. - -\emph default -Using the R -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{head} -\end_layout - -\end_inset - - function, we look at the first rows of the dataset: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -library(RDDtools) -\end_layout - -\begin_layout Plain Layout - -data(Lee2008) -\end_layout - -\begin_layout Plain Layout - -head(Lee2008) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The data is already clean, so the only step required is to fit it into the - RDDdata function, adding however the information on the cutpoint. - For illustration purpose, we add also some random covariates as a matrix - Z: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -n_Lee <- nrow(Lee2008) -\end_layout - -\begin_layout Plain Layout - -Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), -\end_layout - -\begin_layout Plain Layout - -z3=sample(letters[1:3], size=n_Lee, replace=TRUE)) -\end_layout - -\begin_layout Plain Layout - -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -We now have an object -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{Lee2008_rdd} -\end_layout - -\end_inset - - of class -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDdata} -\end_layout - -\end_inset - - (and -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{data.frame} -\end_layout - -\end_inset - -). - It has a specific -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{summary} -\end_layout - -\end_inset - - method, which gives a few summary informations about the dataset: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -summary(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Another function for -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDdata} -\end_layout - -\end_inset - - objects is the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{plot()} -\end_layout - -\end_inset - - function, discussed in the next section. - -\end_layout - -\begin_layout Section -Step 1: Graphical representation -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -addcontentsline{toc}{section}{Step 1: Graphical representation} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Once the dataset has been formatted with the RDDdata function, it can be - used directly for simple illustration. - Indeed, as recommended by -\begin_inset CommandInset citation -LatexCommand citet -key "LeeLemieux2010" - -\end_inset - -, it is always good to show the raw data first, if ones wishes to convince - that there is a discontinuity. - This is simply done using the standard R plot() function, which has been - customised for RDDdata objects. - The function shows a scatter plot of the outcome variable against the forcing - variable. - Following -\begin_inset CommandInset citation -LatexCommand citet -key "LeeLemieux2010" - -\end_inset - -, not all single datapoints are shown: instead, a -\begin_inset Quotes eld -\end_inset - -binned -\begin_inset Quotes erd -\end_inset - - scatterplot is shown, using non-overlapping averages: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -plot(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The bandwidth for the bins (also called binwidth) can be set by the user - with the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{h} -\end_layout - -\end_inset - - argument. - If this it is not provided by the user, the function uses by default the - global bandwidth of -\begin_inset CommandInset citation -LatexCommand citet -key "RuppertSheatherEtAl1995" - -\end_inset - -, implemented in the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDbw_RSW()} -\end_layout - -\end_inset - - function. - -\end_layout - -\begin_layout Standard -Another argument that might be useful for the user is the option -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{nplot} -\end_layout - -\end_inset - -, which allows to plot multiple plots with different bandwidths: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -plot(Lee2008_rdd, nplot=3, h=c(0.02, 0.03, 0.04)) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Note however that experience shows that showing multiple plots have the - effect to shrink considerably the y axis, reducing the visual impression - of discontinuity. - -\end_layout - -\begin_layout Section -Step 2: Estimation -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -addcontentsline{toc}{section}{Step 2: Estimation} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -RDDtools offers currently two estimators: -\end_layout - -\begin_layout Itemize -the simple parametric estimator: function -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_lm()} -\end_layout - -\end_inset - -. - -\end_layout - -\begin_layout Itemize -the non-parametric local-linear estimator: function -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_np()} -\end_layout - -\end_inset - -. - -\end_layout - -\begin_layout Standard -These two functions share some common arguments, which are: -\end_layout - -\begin_layout Description -RDDobject: the input data as obtained with the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDdata()} -\end_layout - -\end_inset - - function -\end_layout - -\begin_layout Description -bw: the bandwidth. - -\end_layout - -\begin_layout Description -covariates: this will allow to add covariates in the analysis. - Note that it is presently NOT used. - -\end_layout - -\begin_layout Standard -The bandwidth argument has a different behaviour in the parametric and non-param -etric way: while the parametric estimation can be done without bandwidth, - the non-parametric estimator is by definition based on a bandwidth. - This means that the default behaviours are different: if no bandwidth is - given for the parametric model, the model will be simply estimated withut - bandwidth, that is covering the full sample on both sides of the cutpoint. - On the other side, if no bandwidth is provided in the non-parametric case, - a bandwidth will still be computed automatically using the method advocated - by -\begin_inset CommandInset citation -LatexCommand citet -key "ImbensKalyanaraman2012" - -\end_inset - -. - -\end_layout - -\begin_layout Subsection -Parametric -\end_layout - -\begin_layout Standard -The parametric estimator simply estimates a function over the whole sample - (hence called -\emph on -pooled regression -\emph default - by -\begin_inset CommandInset citation -LatexCommand citealp -key "LeeLemieux2010" - -\end_inset - -): -\end_layout - -\begin_layout Standard -\begin_inset Formula -\begin{equation} -Y=\alpha+\tau D+\beta(X-c)+\epsilon\label{eq:ParamStandard} -\end{equation} - -\end_inset - - -\end_layout - -\begin_layout Standard -where D is a dummy variable, indicating whether the observations are above - (or equal to) the cutoff point, i.e. - -\begin_inset Formula $D=I(X\geq c)$ -\end_inset - -. - The parameter of interest is -\begin_inset Formula $\tau$ -\end_inset - -, which represents the difference in intercepts -\begin_inset Formula $\alpha_{r}-\alpha_{l}$ -\end_inset - -, i.e. - the discontinuity. - Note that equation -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:ParamStandard" - -\end_inset - - imposes the slope to be equal on both sides of the cutoff point. - While such restriction should hold locally around the threshold (due to - the assumption of random assignment around the cutoff point), the parametric - regression is done by default using the whole sample, so the restriction - is unlikely to hold. - In this case, one should rather estimate: -\end_layout - -\begin_layout Standard -\begin_inset Formula -\begin{equation} -Y=\alpha+\tau D+\beta_{1}(X-c)+\beta_{2}D(X-c)+\epsilon\label{eq:Param2slopes} -\end{equation} - -\end_inset - - -\end_layout - -\begin_layout Standard -so that -\begin_inset Formula $\beta_{1}=\beta_{l}$ -\end_inset - -, and -\begin_inset Formula $\beta_{2}=\beta_{r}-\beta_{l}$ -\end_inset - -. - -\end_layout - -\begin_layout Standard -The two estimators are available with the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_lm()} -\end_layout - -\end_inset - - function, the choice between the specifications being made through the - -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{slope=c("separate", "same")} -\end_layout - -\end_inset - - argument: -\end_layout - -\begin_layout Description -separate: the default, estimates different slopes, i.e. - equation -\begin_inset space ~ -\end_inset - - -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:Param2slopes" - -\end_inset - -. -\end_layout - -\begin_layout Description -same: Estimates a common slope, i.e. - equation -\begin_inset space ~ -\end_inset - - -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:ParamStandard" - -\end_inset - -. -\end_layout - -\begin_layout Standard -Note that the order of X has been set as 1 in both cases. - If the function shows moderate non-linearity, this can be potentially captured - by adding further power of X, leading to (for the separate slope equation:) -\end_layout - -\begin_layout Standard -\begin_inset Formula -\begin{equation} -Y=\alpha+\tau D+\beta_{1}^{1}(X-c)+\beta_{2}^{1}D(X-c)+\ldots+\beta_{1}^{p}(X-c)^{p}+\beta_{2}^{p}D(X-c)^{p}+\epsilon\label{eq:ParamSlopesPowers} -\end{equation} - -\end_inset - - -\end_layout - -\begin_layout Standard -The order of the polynomial can be adjusted with the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{order} -\end_layout - -\end_inset - - argument. - -\end_layout - -\begin_layout Standard -Finally, the estimator can be restricted to a (symmetric) window around - the cutoff point, as is done usually in practice. - This is done using the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{bw} -\end_layout - -\end_inset - - option. - -\end_layout - -\begin_layout Standard -In summary, the function -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_lm()} -\end_layout - -\end_inset - - has three main options: -\end_layout - -\begin_layout Description -slope: Whether to use different slopes on each side of the cutoff (default) - or not. -\end_layout - -\begin_layout Description -order: Order of the polynomial in X. - Default to 1. -\end_layout - -\begin_layout Description -bw: Eventual window to estimate the data. - Default to full data. - -\end_layout - -\begin_layout Standard -We show now the different applications, still using the Lee dataset: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -reg_linear_1 <- RDDreg_lm(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -We now estimate different versions, first restricting the slope to be the - same, then changing the order, and finally using a smaller window: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -reg_linear_2 <- RDDreg_lm(Lee2008_rdd, slope="same") -\end_layout - -\begin_layout Plain Layout - -reg_linear_3 <- RDDreg_lm(Lee2008_rdd, order=3) -\end_layout - -\begin_layout Plain Layout - -reg_linear_4 <- RDDreg_lm(Lee2008_rdd, bw=0.4) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Model's output is shown with the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{print()} -\end_layout - -\end_inset - - and -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{summary()} -\end_layout - -\end_inset - - function: while the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{print()} -\end_layout - -\end_inset - - function just shows few informations and the LATE estimate, the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{summary()} -\end_layout - -\end_inset - - function shows the full output of the underlying regression model: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -reg_linear_1 -\end_layout - -\begin_layout Plain Layout - -summary(reg_linear_1) -\end_layout - -\begin_layout Plain Layout - -reg_linear_2 -\end_layout - -\begin_layout Plain Layout - -reg_linear_3 -\end_layout - -\begin_layout Plain Layout - -reg_linear_4 -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Finally, a -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{plot()} -\end_layout - -\end_inset - - function adds the estimated curve to the binned plot. - Here we show the difference between the model estimated with polynomial - of order 1 and order 3: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -par(mfrow=c(2,1)) -\end_layout - -\begin_layout Plain Layout - -plot(reg_linear_1) -\end_layout - -\begin_layout Plain Layout - -plot(reg_linear_3) -\end_layout - -\begin_layout Plain Layout - -par(mfrow=c(1,1)) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Non-parametric -\end_layout - -\begin_layout Standard -Although the parametric estimator is often used in practice, another estimator - has important appeal, in this context where one is interested in estimating - a regression just around a cutoff. - In this case, non-parametric estimators such as the local-linear kernel - regression of -\begin_inset CommandInset citation -LatexCommand citet -key "FanGijbels1992,FanGijbels1996" - -\end_inset - -, which aim at estimating a regression locally at each point, have interesting - features, as advocated by -\begin_inset CommandInset citation -LatexCommand citet -key "Porter2003" - -\end_inset - -. - A local linear regression amounts to do a simple weighted linear regression, - where the weights are given by a kernel function. - Formally, the local-linear estimator (LLE) is given by its estimating equation: -\end_layout - -\begin_layout Standard -\begin_inset Note Note -status open - -\begin_layout Plain Layout - -\backslash -hat{ -\backslash -alpha(c)}, -\backslash -hat{ -\backslash -beta(c)}, -\backslash -hat{ -\backslash -tau(c)} = -\backslash -argmin{ -\backslash -alpha, -\backslash -beta, -\backslash -tau} -\backslash -sum_{i=1}^n -\backslash -left(Y_i - -\backslash -alpha - -\backslash -tau D - -\backslash -beta (X_i-c) -\backslash -right )^2 K( -\backslash -frac{X_i-c}{h}) -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard - -\family roman -\series medium -\shape up -\size normal -\emph off -\bar no -\strikeout off -\uuline off -\uwave off -\noun off -\color none -\begin_inset Formula -\begin{equation} -\hat{\alpha}(c),\hat{\beta}(c),\hat{\tau}(c)=\argmin{\alpha,\beta,\tau}\sum_{i=1}^{n}\left(Y_{i}-\alpha-\tau D-\beta(X_{i}-c)\right)^{2}\mathcal{K}\left(\frac{X_{i}-c}{h}\right)\label{eq:LLEform} -\end{equation} - -\end_inset - - -\end_layout - -\begin_layout Standard -where -\begin_inset Formula $\mathcal{K}(\cdot)$ -\end_inset - - is a kernel function attributing weights to each point according to their - distance to the point c. - Note that the parameters -\begin_inset Formula $\alpha$ -\end_inset - -, -\begin_inset Formula $\beta$ -\end_inset - - and -\begin_inset Formula $\tau$ -\end_inset - - are written as of function of -\begin_inset Formula $c$ -\end_inset - - to emphasize the fact that these are -\emph on -local -\emph default - estimate, unlike in the parametric rate. - The kernel used in RDDtools here is the triangular kernel (also called - -\emph on -edge -\emph default - function sometimes): -\begin_inset Formula $K(x)=I(|x|\leq1)(1-|x|)$ -\end_inset - -. - This choice, which departs from the the suggestion of -\begin_inset CommandInset citation -LatexCommand citet -key "LeeLemieux2010" - -\end_inset - -, is driven by the fact that the triangular kernel was shown to be optimal - when one estimates a parameter at a boundary, which is precisely our case - here -\begin_inset CommandInset citation -LatexCommand citep -key "ChengFanEtAl1997" - -\end_inset - -. - Unlike the package -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{rdd} -\end_layout - -\end_inset - -, we do not offer other kernels in -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{RDDtools} -\end_layout - -\end_inset - -, since the kernel selected is optimal, and changing the kernel is found - to have little impact compared to changing the bandwidths. -\end_layout - -\begin_layout Standard -Note that using the LLE estimator reduces to do a weighted OLS (WOLS) at - each point -\begin_inset Foot -status open - -\begin_layout Plain Layout -See -\begin_inset CommandInset citation -LatexCommand citep -after "equ. 3.4, page 58" -key "FanGijbels1996" - -\end_inset - -. - -\end_layout - -\end_inset - -, which allows to use the usual regression function -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{lm()} -\end_layout - -\end_inset - - in R, specifying the weights as given by the kernel. - However, although this is a WOLS, the variance of the LLE is not the same - as that of the WOLS, unless one is ready to assume that the bandwidth used - is the true -\emph on -bandwidth -\emph default - -\begin_inset Foot -status collapsed - -\begin_layout Plain Layout -A second option is use a smaller bandwidth, in which case standard inference - can be applied. - This has however the drawback of using a sub-optimal bandwidth, with a - slower rate of convergence. - -\end_layout - -\end_inset - -. - However, most, if not all, papers in the literature do use the standard - WOLS inference, eventually adjusted for heteroskedasticity. - This is also done currently in the RDDtools package, although we intend - to do this following the work of -\begin_inset CommandInset citation -LatexCommand citet -key "CalonicoCattaneoEtAl2012" - -\end_inset - -. - -\end_layout - -\begin_layout Standard -Another question arises is the choice of the bandwidth, which is a crucial - question since this choice has a huge impact on the estimation. - Typically, decreasing the bandwidth will reduce the bias of the estimator, - but increase its variance. - One way of choosing the bandwidth is then to try to minimise the mean-squared - error (MSE) of the estimator, which allows to trade-off bias and variance. - This approach is pursued by -\begin_inset CommandInset citation -LatexCommand citet -key "ImbensKalyanaraman2012" - -\end_inset - -, and is available in -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{RDDtools} -\end_layout - -\end_inset - - with the function -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDbw_IK()} -\end_layout - -\end_inset - -. - This function takes simply a RDDdata object as input, and returns the optimal - value according to the MSE criterion. - -\end_layout - -\begin_layout Standard -As an illustration, we use now the non-parametric estimator for the Lee - dataset, estimating first the bandwidth and then the discontinuity with - -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_np()} -\end_layout - -\end_inset - -: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -bw_IK <- RDDbw_IK(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -bw_IK -\end_layout - -\begin_layout Plain Layout - -reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_IK) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The output, of class -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_np} -\end_layout - -\end_inset - -, has the usual -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{print()} -\end_layout - -\end_inset - -, -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{summary()} -\end_layout - -\end_inset - - and -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{plot()} -\end_layout - -\end_inset - - functions: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -reg_nonpara -\end_layout - -\begin_layout Plain Layout - -summary(reg_nonpara) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{plot()} -\end_layout - -\end_inset - - function shows the point estimates -\begin_inset Foot -status collapsed - -\begin_layout Plain Layout -Note that the estimates are obtained with the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{locpoly()} -\end_layout - -\end_inset - - function from package -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{KernSmooth} -\end_layout - -\end_inset - -. - This has however the disadvantage that it is not the same kernel used as - in the previously, since the locpoly function uses a gaussian kernel, while - we use a triangular one. - Since this is only for visual purpose, the difference should however not - be perceptible. - Furthermore, using the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{locpoly()} -\end_layout - -\end_inset - - function has the advantage that the algorithm is way faster, since the - authors did implement a fast binned implementation, see -\begin_inset CommandInset citation -LatexCommand citet -after "section 3.6" -key "FanGijbels1996" - -\end_inset - -. - -\end_layout - -\end_inset - - over a grid defined within the bandwidth range, i.e. - the parameter -\begin_inset Formula $\alpha(x)$ -\end_inset - - from equation -\begin_inset space ~ -\end_inset - - -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:LLEform" - -\end_inset - - such as -\begin_inset Formula $\alpha(x)\quad$ -\end_inset - - -\begin_inset Formula $\forall$ -\end_inset - - -\begin_inset Formula $[x-bw;x+bw]$ -\end_inset - -. - This should not be confused with the line drawn in the parametric plots, - which show the curve -\begin_inset Formula $y=f(x)=\hat{\alpha}+\hat{\beta}(x-c)+\hat{\tau}D$ -\end_inset - -. - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -plot(reg_nonpara) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Assessing the sensibility of the estimator -\end_layout - -\begin_layout Standard -Both the parametric and non-parametric estimators are dependent on the choice - of extra-parameters such as the polynomial order, or the bandwidth. - It is however known that this choice can have a big impact, especially - in the case of the bandwidth choice for the non-parametric case. - A simple way to assess the sensitivity of the results is to plot the value - of the estimate against multiple bandwidths. - This is the purpose of the function -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{plotSensi()} -\end_layout - -\end_inset - -, which work both on -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_lm()} -\end_layout - -\end_inset - - as well as -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_np()} -\end_layout - -\end_inset - -. - In the former case, the function will assess the sensitivity against the - polynomial order (eventually the bandwidth if it was specified), while - in the latter case against the bandwidth. - -\end_layout - -\begin_layout Standard -We illustrate this on the previous non-parametric estimator: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -plotSensi(reg_nonpara, device="ggplot") -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -and we illustrate it also on the parametric estimator where a bandwidth - was specified: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -plotSensi(reg_linear_4, device="ggplot") -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Step 3: Validity tests -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -addcontentsline{toc}{section}{Step 3: Validity tests} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Once the discontinuity estimated and its sensitivity against the bandwidth - choice assessed, the last step in the analysis is to proceed to a few validity - tests. - -\end_layout - -\begin_layout Subsection -Placebo tests -\end_layout - -\begin_layout Standard -A way to convince its readers that the discontinuity one has found is a - true one is to show that it is not the a spurious result one could have - obtained at a random cutoff. - Hence, as advocated by -\begin_inset CommandInset citation -LatexCommand citet -key "ImbensLemieux2008" - -\end_inset - -, one can run placebo tests, where one estimates a discontinuity but at - a different point than the true cutoff. - This is available through the -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{plotPlacebo()} -\end_layout - -\end_inset - - function, which works on -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_lm} -\end_layout - -\end_inset - - or -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -code{RDDreg_np} -\end_layout - -\end_inset - - objects. - An important question is on which point this should be tested. - The fact is that the sample should not contain the cutoff point (so that - the presence of a discontinuity at its point does not impact the estimates - at other points), and be far away from that cutoff (as well as from the - min and max of the whole distribution) so that it contains a fair amount - of points at both sides for estimation. - The default is then to run for points on the left within the first and - last quartiles of the left sample, and the same on the right. -\end_layout - -\begin_layout Standard -We illustrate this on the non-parametric estimator: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -plotPlacebo(reg_nonpara, device="ggplot") -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Forcing variable -\end_layout - -\begin_layout Standard -One of the cases where the assumptions underlying the RDD analysis might - be incorrect is when participants are allowed to manipulate the variable - that lead to treatment, i.e. - are able to affect whether they are treated or not. - This question is usually answered factually, looking at the context of - the experiment. - One can however also test whether the forcing variable itself shows a trace - of manipulation, which would result into a discontinuity of its density, - as suggested by -\begin_inset CommandInset citation -LatexCommand citet -key "McCrary2008" - -\end_inset - -. - -\end_layout - -\begin_layout Standard -The test was implemented by D Dimmery in package -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -pkg{rdd} -\end_layout - -\end_inset - -, and is simply wrapped by the function dens_test(), so that it works directly - on a RDDdata object: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -dens_test(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The test automatically returns a plot, showing the density estimates at - the left and right of the cutoff, together with the confidence intervals - of these estimates. - One rejects the null hypothesis of no discontinuity if visually the confidence - intervals do not overlap. - -\end_layout - -\begin_layout Subsection -Baseline Covariates -\end_layout - -\begin_layout Standard -Another crucial assumption in RDD is that treatment is randomly distributed - around the cutoff, so that individuals around are similar. - This can be easily tested, as is done in the Randomised Control Trial (RCT) - case, by running test for balanced covariates. - Two kinds of tests have been implemented, allowing to test equality in - means (t-test) or in distribution (Kolmogorov-Smirnov). - As this is a typical case of multiple testing, both functions offers the - possibility to adjust the p-values with various procedures such as the - Bonferoni, Holmes or the more recent Benjamini-Hochberg procedures. - -\end_layout - -\begin_layout Standard -We run here the equality in means test: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -covarTest_mean(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -as well as the equality in distribution test: -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -<<>>= -\end_layout - -\begin_layout Plain Layout - -covarTest_dis(Lee2008_rdd) -\end_layout - -\begin_layout Plain Layout - -@ -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Since the covariates were generated randomly with a single parameter, we - would expect that no equality test is rejected. - -\end_layout - -\begin_layout Section -Conclusion -\end_layout - -\begin_layout Standard -\begin_inset CommandInset bibtex -LatexCommand bibtex -bibfiles "RDD_refs" -options "bibtotoc,econometrica" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - -% -\backslash -addcontentsline{toc}{section}{ -\backslash -refname} -\end_layout - -\begin_layout Plain Layout - -% -\backslash -bibliography{./RDDrefs} -\end_layout - -\begin_layout Plain Layout - -% -\backslash -bibliography{/home/mat/Dropbox/Documents/Ordi/Bibtex/GeneralBiblio,/home/mat/Dro -pbox/Documents/Ordi/Bibtex/biblioFAO_mat} -\end_layout - -\end_inset - - -\end_layout - -\end_body -\end_document diff --git a/vignettes/RDDtools.pdf b/vignettes/RDDtools.pdf deleted file mode 100644 index c52136ad219cc4ae8ab91a45f1f647b206034094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416350 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%0Df`EpIe_=r&iB41Sbxx2+oGB;>7Kg|` zrid^Kj6ndj6h5s36X558GQa@j-`a}sgB5~!e8+!Ui~^2IQQ%QspUtBHoDKs3gE4?l zC4dxF=TCP*hu~y;3B zMM6m6XVLKY{Mix&;8VIGb1(q!481`asy4C=3|8Ru`jk}Q{wX>UIplo-a8kAa5K02S zk?Qw5s0pBIA=5L=czU`vo`DbqM7n@_|2;iZ=~U0+8Ni@I2oxeyK_p+DrotfT!~pc@ zUs9ML2=$%$2V4l$EP@#kKQIv>e^1l1ZH1u1fT({@g%KhbkoB)Agdd><7*2nLkyAKL zfm%VR79k-a(9?gN3WNOuA`Jf~MZrP9J^OzKbqvBFP6-8(E#y!HVEll%f`W))pB6y` zk$3*fD?Vfc@U2*YDHI44)PG7L0*I<-sCH^s133e19E91y2Y3dRL;e2GrhmXc3l~xP zPk(fzAYg8~|&YA0g8P5C%Ws0k9$gNFY36h486o8hX zwh#o-S`d&BEJ8knG!TG603<=s5(qRf9bjtr2@K!{A*LZj;gF7!=Y-1aJ{lh6*9(hTsn{2Ve*y2Eh+?G7LrFeVUJ#s5^Vb~e`oB&A4!{~a{r|74{`+g?}GnM}+JS$ZHC_Ph^A4p;3P*#g@@oFKrXNpfyw}+14Kinh|On!g}{>xAz=ie z!S{NA-we1Ic*#K1A+)Cu;CjHENJ%UVBnRjOsnHMsz*+`RU=YlS;CB&WBrw2*Kxznq zuT_D;BDm!2RR2T%4;9XUR0;nf{SEslIe|)%taOIcPB&%&Q3n_l%vA_6Y(c=XfQi9S z0qcWdi!ca45mNvg><}sNYk>Iym>Vnrq{u_5bs@0G5OqKsWNkt4oDV=kn7s%%pbW8i z_`n1Oks<+s1TanTMJ^!v0DTaUg^+glAu-xD*bKB z|MvH6TNGa)c?L;eBn%Mv0G21xxIu6V41ypHN?gH!0fUe^P(W^&FhcSOBlVF0z$CyS zQe+4Vh#<%cgqaY72vT(j^Fa}CP;)|B>xg?WASw|`10gU3g%Nm1s2*VMBaJPTd4RwO z;6NlS#9a`^Kq`Q<=^v;OK(Zdf8Wuu|BOvI20s#<_ObTLCh;qQaAcY}lgcv^*$=w2g zwNUkd#Shj8papmkDuk4<0$^;QHkboYf3_XaKrcY^|M~wj=>FX~IJ+27dDN0X z*`=uTRL&z71RqLPA;l|*3<1rGVogB=o54`z2lY;w0q6$IAa}?vHDfRzOL#vw3i=DOdr>m5%HV)#9`i z*%zt=Wsaj-{!tsHC7?(L2Ygi!tOnFtJgtWsD^l|yYo5XR@4l8W*m{5vFo;M1j2~gp zfG6`{L5To4CxF5O60iu;eiA}<1>r;fAgTx>5s#2Qz%)eWg^_k3%B=!c5il5$5(_D_ zA&A}5Ku;krP$>)uZNzR~q(glsF9C>II zLkV_Zs)?LJ5&_>i1VRp32LT_I6GGMyKpJxbK&b$M1oY)ud2qTP0_Z3ZRR=-a-zCWJ zz7G`Gm0%VC5)e*E&G`Q$MZr0n!jPWjS(vC27}6Yt0dWXu2t*x1kb`*v%NEQNwGNQ; zLe+zU@CINu!2K{FE&)CP_JGm=N)=ecC`c#|7TNx^2VhAetWe}CL-l~FiA+U+cm_S6 zDM6?ZV1=Gy0?CqRuyS@zsM!FU7Gc+(Vhxc))%m0BY#T%=KXRdf4^$$Q1ae$w@q(x! zz>l{kx<@_=Nu}DSwxgf0CmpT%lwtDn+i&Gvxi%BTA(t~sW1S5;{Yeu7J%ZGF zXMPbn_*9>Q(zE^*qNWH^l|cB;XnhnwREnr_s#1T?p>+Rgw`UAnMBP8#Lq^^Hfb-XZ z{nPc?{!w`p)c>_^ej^2n69Br;+Asgwx&hJe`}QR^&MTxCi~c)<2Ey-2%hJks)VrCWMK&M$HxRa00~4Q1b+10xS{=@3ygr1J(I86##W4D4s%q`?sG7KmaY%raC3MBDk zhLjMJyAdWA!Z|@c;6SM`g!2i^AEXh6ECHS_g9yUmKwcr_oY3z%gr5%B6$J~a4q-@R z8ezaAf|N+vgt|bbr!ETE42_8VAfE4_MCn;+B!C51W$K|&yg9swl^Dj5yJ}Sr7A{(X_x^cb2t*u*x zKQQ~aEz^IEsWmps)g70?-t#*vyyUJ zU3gR*mUi2Kh}}B8IFy}nl0Ea|wI^7UkzqAx=g=_DOJD_IZ43=8JlR& z%YVFbV!GZ$YZg)!&oP*}x*|aA9GHTO&%l61OdLy0{0uD!EtuiSUOhg^>P0kcnwxpF z(ldm9>A3lzvq2IfAt4?YaO@uN+jLaSr*Jd#DG9!=Y zrB6b9fpi%7p_#rXoLGt3%;5agPhD$sbKBj`*!#p&s|+0-xa+|$E~8fwvowv7n&IxL zQf1oCVC+8}y5{QtAW+CXcF4)feD;g zCy6Bo#yGx#^>&!VUhL~@&H?w~gjk{Qd*$dMBs_0~oaxy|(M^a#Wzh7Me-PaoXO|2l z7+tN%BEXOQuvxM3E~vrYehvR*bQC9(B^R@}l6em%!7@nuBT80MPS&)Z;}@LJRo7Df z!x-sLL-KuHPNiJ!o_OpVmN1Ge#PuP4yu34*+6a*polR|^gev_ zc=C|RL7WloX*F)s#BN3uTwxCb15J#b3cEN|SbAy?9_h~(HV6-0OIah_#z_iVwYrIh zc5uAE+cxc3vqJ2g)D_SU-%6a&(%p?rp%{3Lyq;3ySKz0UyvmbBxYS)5O7`{zr;zGfJJMrC zp*YiyB9m~tyIA{n&*n(@s^NY4FYH$nt`V-H9eR>vUB8kCYf__$!Vo(Vl!5>FWaLam zM)*yEA*()v8ciJy>wtc2tSTsNEuD1MDEB0f!E2zeEeMMBi+bIdBL&@YD6L4v?utKkX`QzFzdN0_gqxFD~)#?$5 zWECFhsVjGa8HKiYD_}C<8TQK5s{gM3(WQ~EO@ zl{@!+?aS3Wp7!st;UnzYYuBd|4964|#Bnm~R#GP3r)HRDLam@a;nervq=r+Kcu4Li z>&BFNjWN;c^#>o`zu41R>cKmBVIKBvlm&zIj{ z%6c|Ii94NgB0x+(uXSLn+N6DdzAcU`J~K!-YWD>MN zQa>~DW$Aov3e2s~`+}S=?*v1tXq`sFannYsacFCfSQeCBUiySTSQEY;&vs)QQ<9ym zL&?f|#JIi3D9Y&OOIJy{8dz9dE8~EMbE(x22ePK)J34+N_S~yR;`f?G^jyiG=C77i z%j+{PQl==`n1|L8-gjb~;A(2~aw2!-XiBNF+kG}<_ASKk;lhhJP4o3`R{o7m@2~ug zug1vGNsbGC*qks89&`54^WYqtDrO9)irWT9#AGthb#^?>sM&V2T&I9u9}9|!IQJIg zq-(hdp#PjyHjwly4G>~$G7qgvHZ-eZX)|eYBsyGW$Z9rIsxgt zk%*cr1(G~UK?+5SpNG)jUdw-}w4L%z?tOu>^W*1}n-Lk8MQ7}U%=DZusoUCd$Q(*g z$izt)NbLMj+E+Xr_FmXdKDLN0_BQK_b-NO=+`Jdi zAmPewSqTbn7cbn2G5U5(BvFx!S!w*WoaJ3hDBYaIaoLF)kB?62#l`PI*Vgoy@4Oys z=Ahf4EM4%5R;zPWBUq-Y=aSHZzWv;}Iv?qmHlaX&C5n>8B<2=86(aPtW{KU;=Hv%{IRpRM;6K6>brl!!>(mcsW@D4{W z6n5OKw|(r*lq~eLqE1;;KKGvDqp~5+`69X+v~<=(f~5eToBKbmz4-X*oKM5K=Q^^q zl%IS&Ap4)=x9{B9+Y2FeXtwcZpqP`?#JIO%RV6nJE6k#8xfpDv8G9>*Sb(xF6r%VV zzdrsN>xMev^fDiQl`g%7a7^^da`b#bow}KiTvPKdy54ZM{z6Ari9)IM;mY2$i}>X+ zo=ErCxbjDI26>@QpN6TwW|&wEg?Liwj20Q^I+$yUkzLrD@ptaOwWu}{XxW;Rhu;k+_j3ma+O*A7U5Hcd+Ww`TPYr)R~ z(jVDuKjWj=_Yx*KitM!p@VQDdsyhOAf6_8IwHI3~GTBwW{q|!l%9^y*_8}8Bz8pke zbZFdfE57*Bh^I0J?3?6ZY@$ciQ7LaqSfAw@r%62P=el|;Ns+^`F6p=1^H`j+S{7`g z;R^(+aWi+9UnW|GH(kvqwM^=_uUeLu%p|78N&KEsrTyq~W8CYy+ZmWPUOOvxo{Vwy z^TT(K95NCZYkT=pHCl>4mjr5-JqqQ?8@4uc>&a@{Mz3MtXHz_HFRlrd!nu8g`?{s-Be{)ZiBWvhnU}t- zA%ZfrQvL*x0Gf(+xK7UDu~JBcz{IzUkeKR>^_$-wUL0JyX4uXvE|PP#bYr`%+`gi7 z>wR604tfjehiuY@^zmRO#bv_h7)u61f;#s8@UJ)i2E z)tAg5^g%JSxG!54?~CVGSXFO){gXf`AwOCH&r6Ef<1oyk8t>)4kE^96esOS{*-FZv z;ab{04H<0CI+ROqe14KGvplyGH7ZcozVAM>NLse*m$r5;QjlUThqVHYIb45NC5n92 zwvme5pKUnu4Jl5@yRYD-5AyWxOF6jbcdJ;IIJ(EV?XeB8-%sWDdydJ-Ki6Z>M4 zDQty~UDt+sh;Rw3I%ynlr82NrS3A7uaNvFriiuVH>~?`x>G4htW_hND9OJapo$!EM zzp2Z<``t823`y1!{kuHdtZ%ldTEg?A=wf~(cd>PvyvhuT*%(Pp?{Fhuww0nG$D6G- zRk^))9%J>*P$xytc|F035Ajl44@$W@m%~Go?8;x26m{G=*tk>U`{rY&Q@4);$vyid z&lLWEpJ>`oP9ArN+9oKJsRy;Iso>r@ycz!U{c^Uc*u`Y{V(^@7aP8}Gex8l(q1gls zA_40r(GqvMmXQFrLCMlzMRMb0XkPaoNxir$%WNZhoi;0X|8N+6M>FC{WVvBSsGLmu zXe+wCf3{Akb)D-RY|8S@H%Iz=aPv+5i(lqLjgPV}<8E8ZF9}Q6u9&EBR~R`xo294W zS|BWg?C#`QY#MvE+hB(@;nzWws3d59JTK(BYKz8t=MrZ`6Q*!+*qv_?F*?2+Si1fg z<-2J+L;)8wIeQ6OO3AlYJ)$E{SVObwi?r#s%fMbfpFGZyX0FQ{Pqpe)wz$qn`GpaUe&~KZlPk}Ve&EKN-FI+YO3G!sti>IJ zNd7t5FF&8Yd7`Gz(Pto;qEgktcWu5c0&}iKoCrh0;JM`z>FNftw!_x+BW0TVk=wPr zBwgk#VKo*F&be0o?_%nvj<@Al_9b}qev&;VR}ShjtkWx=ql{E^E6O{BRt`$xc#2k` zZ4L-XgxVDbQ!XU%D_dPD!`SHc6|)+Um1PgA)nQ6~#_&M-Ilj(|!{)~&{nvdcoZ6*Z zxAq^EZ*;jOw@k!u4pxNT7<9xF+e`Mn-f)i7^7&2urJ-sjjF-BUYOq{89{pz(_b#}8 z%Y5Fu%jC7-PWUimn&ceTMyzImKU|Loi|f6x-mLC@?(UQehX>!Qrb^!XmAib~`@l(L z%BaIZ{S@*jBt=1`23z!o>{Cad0$wFujb9DiMyX_tl1!O7pGep8Ri|2-YBwuNIO*@p z`-z6Oz0jhMv8#=q(O^_Dv1#g$S!<}tH0q-yfwSEC@j&Sy1?xfhG@fELgH$VVbdPT_ z_X;KRPd{+P0jV37ac90v&m>Xl_e>TeA762*IcK5nH}Ke}{pPbq3u@6aU zm@8T$TBuuwAw#WoiY;EO?tKAS-Nxw_jWf?o)IHKJn%OJJ?Y_vrC-{`&bJom#dK135 zHxJA1$CdVyeRx#}_lWHlW#_UfQgv_GrdH|Vd413iE1>sKc%c1L`BJeX$*b!_J;uK@ zezA>oZGSmNA9yltT0X|M%#puXP4QhvxJBu_rKNJX&8EykVyNo1<+xp`;F6h^^U;J` zR^QCX;$H`TDNLsU;j;VQH<}I5Ke<*wJcnO;)>>b0|J9dsKvLCr-<*?xc0NlAYx(vX z_KbC}Ez?9UdAD#D45J4JEm%MEvzh==0nc zbqTI+<<@y=R~<#b=pIM!#V)A_x_4kP6koO^qW6^+PVyR;5?6Rk5byVK>$Yo&BsA!e z1)V0_P|uUDp7xaToyEt_zRHmFwope_#`6(+vB+M9QTei+v2|J&6w;k`jh> z-CjP_mSX!f#39J`g0#e)RGD^PV=AJ$`mixl$X?MF9rwL!Kml`GqkQ2z)<8PS^3GmX zYI!5B^w%_j96jpaXG1f%l=hNe@VFVyHs`4nHil()Yzzum*8i^sHLOaW{47yrg-8nIzw1nZ5AS_tH_ya4ZwEQ)6D~M$Us~u83+tGq4yRAda%;=gnl`h@?D`ke7vEb6rrYOY^^xE86t=k=H&Y+itj8$EalC2M2oTZqldeH;f7T44v#A zUD6%fjBfb4b?E#F>)H8%n%u)DqEMO@@}C9L2E`mVjqV;eqv zYj&f%He^(ijUj)mNBx*ft?c|IqPK_3%FC(w**Ln-pV|tP5j}hQA;H0ObBW*mJ!em} zHOEdRp=5+z1Z_;oEls|3Gm5JBxOlSRcXKT7XxFklc)G4(Kd2HTQuJ=`6)Wc*@pv8< zZbDVH480=&3E*8j*g41UmR(K6y|H`eQN%&sNi&=V6zl&dBd_kB(90=ni9qU zO;!~Sl37m6~g6FOswf6nn`PsMQ0rG0fiAMK#JHEm%d zEXp|F7Qdj~!`&UQ)puPd`oV?9xu^ub+$EEXQY#A<16M36Z{4$F8xQFA{o+|6{E+tw zH>_UXil^S7&}v%0lDgzq)VSIY*S-$X0<7rug*wNrM|J!)TfslRQ)w4k{9>Q8bZULt z_A}$v!-uvO7iEdQ(wFwO8sEsUXBKdwkW28&T|r+@&fiOr9Q@eUpY3N+TP!3vzK}!G z?f41s;_KP=zVJG)iap~>i5M0o(=8>9 z2oo)QnX4^T8_uJr9qvPS&;QBIJF%e@X5yWVqUJs7t2fK2257vWxH93emOcpEkl2ao z@!qF1>snXww;TS@#?z1Q5>tDg%f;)+Ud;$&MiYBAETFN!O_t2i!|P?NI5Fo+iFI%e z`D*|24Z-r9#-iGM{2%uYI_b@Qe^k9GNlLx(nALq@Yf2~Gt~!4vXBOAQC}c3!**nk1Q? zg+2H}&t=uX#8P#PCCwRBAIy7MAWJl%;6V^ax)EpMj+)DgA0cn~3#`gATDO9T`jr5W z;UyN<$j3uVKS_BGF0(fZCyiQBq3OpbrI4;)8x+WWxSMk2aUFhcXJcFJBNfH2iQH@T zCZ1DJ(T zdFj7jW;^=9?^Wb_r|e~{sg%#fiBA43YiLe0eoutc?2_8-7a~IYi`xO%dys*P9-FT| zw2W9q=OzT$e)1rmCUv-OdQ@&HGcmO2e~-|C)qI^H@L|v+0+0PNkNIMI$8u-)mE*5n zZ+H`9irj+=z7SaOW^`AW6`Q}l;b-esJ(lM#6{vCJsjzDbL@3PdQ=UUT|SLADl+no2HDPluXnc;>Kxmg5(8}q*DXtiPTm2DAmS+U4j@1uK-l&pD){3e=)6(O4Kyq%o2+W$b!ZCCFD{f4*KS?AL zrMd4Y$-FMbn88Nm7UYi3z?8iCMz~>^>L*Mt*h1!~Sl$N^^RDa~CV9!ra-lE{jY$93 ztu#@ZQ_a15wBedn)vJdUmx2V52AT}}k ztvPQ%c)3#byymCL?tA_*=6(W>Vr+XPT2yecfkOG+#>ubA#NCbaILXVag~4xCgPdrs zC56zIhvNtj!k!q~I5vfbMs~T!w`nbHJ|Hg`{vMpth55E#=NXp9WkZ|vZzl11=2KRC zf>x#(wHFnhIrk7IS?3hB^g4!9ko^37$My!?X2saTgc-Z`p~HQm)h|zr`+2iNeaImg zl}#RIbjmS-Qd-jlNltd}2mQ(7`EEvX?^DRUpNi)lOyY7}8==`q{z|JxqGPB@uRtk4 z#D7QgIV1Nh6YmSSjaT|yFnlz0_Tx&oR+$-hS;u&Cs7KcMwl_)RY6Zch$*Y^Sx9?^$ zTLk&>M27yvhc)sU2OC{6DPhC@=0-6KNvoV^E|n3(94_we>oL#3P14slfstVu@tBt? z*NN&co2iT2Wms-rt<~>Wpw@0_o5wUrdUQ-$x>$m9M95mT1jVjtlQ;h5?QE8zo$*6s zs0W?z*N=caanDyqzN)IM0TsD#aRl5?&SNjX!?c12e{ zi`;!ZbgU1)%9T4osT~~|HeP9NWR#P`QK-!=D5ZKX+9O!vt-=@y-73tVr9z)mda7`JlXm=&(4EXZk#?vevSzjm2kVy8`=H$ ziz>%l^itm4f?WM@u%&hTian{+_}GQW1e&8!C*A1Jmx!14aeiH~Un>kwh%oUY=h$%7 zK61v1aa`ShLFo1N(N0cCslmg_%Q*jb!5I-5OgBfpX}`(+m~L@I8owlNQuk3!=!gkm&^{cgqe!IAaI)gv!^y&u{VrWQFi)-`HIeP?B|Y(Y?!NPV^}>v53w!gAYmvVvNUMx7CAcSyr8zB|*s7bh)wYVcwN z+e(eSm}@@pU4CX)Kt@A!`JrvkU53&o{pM-(j~>uY63HQK*}pN`D*|b~*o; zi8=r)jbc_HFl|iWM_cSb*%u=2&2v%D<*rE9Q&L!Lxb{nx4*Iy&{223*OiBEn7VM%& z@)#%WL)V?3b?a-JCe-AlZg~!{3tM;0WtrdP#BZ?N=kfg*Lgn~`=7FZL>$!SK9)_S# zo%&9Y=zbcll1O~zD&=STEv0#Rl%cb+snKiH4||eQav61uaeSTd~byG*{oDRR4lv%sHBL*nGuWx&gT=-Gdv7&+GYgm-m&{I4TU@486a<^tq0eIi%qu8*}cr0uFz2vDf-f zB^U(IUCzIM$5}aLVL;tnXpx)H>YrTuZGqQ4yWWXRf`hz=dB*AM_qQIbM}5R8+7!O7 z)NGj^`-NdSZ)cQSvR^k;wm#(3A38XGTI!)&t?bnhtZ(n>ZF0;=a`M0qT|2~Lqr3N5 zJ}A`mm6teM!^rAxjAQ}x7}F$#>E!F8bh^(C+BVMJ{;ondrfrK@l>#j0BrSSg-w8|p z%rb(s$4ikOA0&?Ds&%^p4n#xX-dq-nCnMf!P^SjWk9~qm2OheIoS*K*SJ2(uxM^`z zu$BD4STw6!PfZNFXX$|>uC^|P^PJ}H!=?0jYPT1CUb$HIR$+Erp4^D$_#;hJhyW8dwS<*G0p`Tnw+)=0*OEfYe5 zs*vUWCwas=#JILJMwzm-M)Vs-x5@R}ZyQWL#KJ$)dhVnUHfZAC^5#QklsT~*%S`!8 z+@)>Fd2%<~c>frT+JpW(_R%6fwQf}*KiQP1px0PxL#FzbJ)b^1wzqpVF%g$mI{Foo zoT2=#Jhh&&>}Ox|Y=7bH@sw^En)|y0uSJu3LUQlxIg59cw-akKR(iIy5M9+sH*&MP zpk1WBR&`H@PwHyV3}lRTS0t_EvUf>_p%N22R(n8J<&NXcJ=Ib!U&VJlU%w^BFF@_m zV$06?^g+7nmbpu)vB4RvLwj}}MIWu*{RyOXq}kXE;5Tswvk8UA;b>}YqIS5nTh~_PbvR6E*zRhe`|x^Y(Z*S`Tb(cIOzt@n?^H7qN<`dz z+BTA7DlFK1>jz8r35I?aj^@v+i?imVKZKZc#jG5Izo}DPf9do2h7bq$kEk^NzKBKL z0UrS^wPRMyOR?_Ku|K;+piB)R-kmC0J4f;g(`t8j8>V)DX>OKylCjPCa0Gu_iCLwT zSY(dM+oA1Spr5~Ry7+ueHDN|d}H|Wu~ zJ#Sq@uDa|Az6TtOWlgX9z#&g~%S|>S?Y2OakoetPBa!yhLLnH1ivsRb&i6l>Vrs@R z_|tBP6NEHrcS?AKXk+a&eoamI9zf7}9>PiAYwz{ziF43lY4$rfQH+R})_*uA3GBZ6 z>oG})14861UCmu=o!y*V@OTl|YNigB47~ap8rPJSIj^b8Lcpdh1$$F#R|c?A3sFH< z*2#;(fE$40<_8)?CIBoO6TN^QGx#>7WAu3FGnVoi+k{)c_0|Qy0YH@9eyCyehmJ;7B72 zUQ1pZUVB~#UPoRhUKd_hUN`WSGQ_A9Yym9rJ`k9r#@Q2#gw7uE^V=RYem()v*Kd2! zAYgYX^ta2io6sQO1wzQb-GsJ{t#0_R96M@y^&*4b%aZ?T>(_{!D_lyj^3c+P)EuRuAL*Z>M>TtVtj~uqsiXCB6+MS*#5Ph%Pa?Hjk!9b^C;7)oD!%Y3bZ7HAq?~kmbptt;)aXp%{x{BRMaD)A>+r7#-fYtAE}NLoN$d% zF>t)V=kvGTgGpIyvT@>4S}Ry{jz|gfACt`2c3j-CGGh=E%dC9}ZJ^(dG!Q{ooj6== z+uC(@Sdm%X8HdZv>+D#~2Xynfx|?WJRJgcde~ExQZ1TwNDO#bsp*w?pn6CF+FasZ> zWrpWp>7hU0D^432aP{^HalPyMwg;LBTKj}8nqN_S(3;e_@y=#P>A;8aoZSP56H##a zb6i|#P)<$C!1LV=U+AVX7T3%&_l@`bPSkYh(2VAHx6RS{;2ZmE@h692$w4a)5^xCI zwdsZi)0eAJ1#SVFCvP>h$Y#;kttKb2_=;WlF!l6=htLhzi0a@p3-z>nM2Av2%FQ|f zy1Q>9_;=A3J2Y9b0+;ScM5>{STx_vYH12c_eaoM52R@)hx;G&6 zFxbB1)Oq}0xu_X%}}6waDuGTeOqPD16gk$UkH^$^3flev$CCZ$J|zD|$(>L>5xEC+nr z#c+UQPrR-;#I2)e?UBlHt?4NbpkJ)tTKgPwa$#s9O$Pqb|82(<{q}vn@LkFewcOoD z^!_Vc0V-)Hi9%n+9tOmkd0S5%-MkXOkV&&{>|hD@>cku#KH{&`6Geyj2hQgcGmGtZz}W|1smy=fBX%oMYC>*J zah?8Xfu4|f5nVuDF9kRGSE$}V=#f_*$tO?i!Bpa;oWY(OFHP6)xZL&hlMPbM%J0M* zcCI2-y0j`|FczCxM}CLZe?!vNHjuzcRm1WA&b~uZCV%ZfSh4W7sY&U&Ty|XsaeAPP zs@KHA=WmM4-8iM#HJS-b1K*y}$aBzdeyY9sa;>Zf?N2?I^W>k2VQ5myML|Bq868qjXABw7R7rH$|w@}l6wO22# zdcAeS&G|f|6QubSN3A?jed{!rR{-bZA!5DOsi*c-66!cl767{Qf8XQ<9%~JbadG{37T^g_TLWSd|IFl_;%w<@j zHrcOjRhW}h|CVHnu%#4cft*SU(~m9%$Sbiu8ns8H=Pa>TT{0HdgCBdP_DWSzM6oR` z4(HJD5nO_GzF9r&D$8vU93C$wy3*-4=o-7Q`;w)<{alfAB5c0oqk8bN$GcGt!q%kL z<8I5JI)bXCK3Qvq%XzW~{Mr&!$~%Y9^_qvp9CI7k`ih;#N(cO(l=$P}cVva?S4BdI z0$fvWeOt>GkTx%GCQ-YS(CJLw=~He>^Jz|dMAeZa;{$Ep0$w6dK>i9<%iCCXW`6pE zjlI~GJ>0@6QS!NxY%kInvSbB=Z!e2eReOt7pf9n4VsyQ8)#|iajUStFe`gahV_jtv z|E}`E_ML`ptmT`>-i$Kee?1Sjzns{^+qmlcuID~U`Q?bTh`6}c7b(>@xv~o6Sl%8J zhZeqjl)J|#)$(ZF{Db#<$qJl1Lj{Qe4;%<%+v-WayYq(ceUPxiyP5B5q7@7?I(Tnh zi_}4Xx#xug2pn_Fk%=yI1(FO+jg8bl~<#>+p(VT6wGAi-}i#e4VqV@$p-^HDBK= zM~|lu9$w1P7=_g9uDsb}mne>+Gbj}LV4OPWrqn;nz=U&E=V_9`=I7+|v3})Oa%RN2 z*;Yyd2V-{qYvgnN45g%0KBp=)W$S8>%bRjLehqk&nSEeo9GPpamHYNG?Zx){5v8^L z-y8og*6t}*l%UZ9^tNr=XWO=I+qP}n*4egg+qP|c&-w4%naNG&Ci5_zbf-J%m#(Mk z%BpW!M48Q642=4_5rS6)O>wD^zwiUUi2Yrdbu z{JMMSf)mlx>%O=Gg~bU$HGJW9ndmhMw+`<~ZA6ARVq8>tsa;YpYio&=EIaPG`7I7; zFV{O~w#-HUmXnX`&G$KqSZfA1{vuaE?Tl z#Bz;h#=>oN9&=jy?}m-PuxN=)ns_tgmqJ>e{eF);4SQK<(q%%`;z+dCafsPzHE?BT zydJ(?6gu^dr}oc8r6g26_YYU+<$FH~^rrMpNA z?bb*;ev18yNX z%E|9#SE>VpaQn+IXyZNhcIe?yb*CkSD6_mf^z-=I69GPly%=hxEo+@R-rA+K%pXIU zSlbVZ;hhI217Oo#LF}HB{*@&Phu?p(e){D<4xE|<+HAoQ7FC_?y|6i0V(-|zq7Q22 z`)pU0hQiPU`egz4R*_hbizq{3s7zCK_@wZ4sR>62LoOS9hOwYGfihM7~z4?Kja$E&7pW3=P)5n8{j=ROsFW1 z6>|a0WUfq?%&{Zyxj?3Oitw%Rp9=v#ScO!!uprLi_t4Xb(1C!G;AL9@VswCixi)yX z;ikq+Y@d<%Yb$sQdEzF@0DDY0MPzJX(7e(}qRZ@usP;@+r4zwPV?ZgH$6B z>l5{?0s(^M5I$?HM>4&G4A`)wVuY=WE_W0r?&DrQJ)rPiFF`i=;ux}q0|EQaC9WcD z2K^hjBLMSOo>iZB-Z3emmi<1j)_p93ZdKV7&3HlY9)d)GlXGjHlG@Jb)v~ukH zXBA^4D8c7Absaux;wZ^Y)p9>mV0AlqEwr8$w-vC{v^n4wEY`(MzWobX5fWL93&>%M zj_3#Y5XSrFAtIKEDmSPRAi7r8mIAf)Ir27w+oQ)0C9 z;jtn*7cLNVS|E7C(i2eYfFwA$X^BF%ZR@ZnrD81#T&2UkzU1^j(}N*RN^4sz$2uI^ zi4h7lLJR-mPbk* z3?6gmeVK##ao`Qo3L<}X(Vp`Yp~Jg9p4WR~51g$Uz?8fQhF!)?c7CDfp_D=3KKY%V z;ChM6OQOo~^m4~q!Og#SK|$w)U0UBx+6HfOb9ookJ$6P7E`0IdY`8|F^-z5g1xpD7 zTtM>kxN51JsBH_eWPi`Ra?_EMv%_zsVjQKE;qY5Tzds^>5Q*-~sj`r>h(?(K607Xz zYVVm0Etk$peawx;35KMN1=&;X6RD&|mPzPw>UN1E&LXd@^+h7RoN+GJ_kJ>X+Zop2 zb*~yI=Iyjh2Ho^IZd&9S}0s%s2s-&+&IaLlYmUf=5NA^m)dz$`G7R~MXgu(fnY2l zyq3wZ#wO7MpQk3}QT-J=k$dBd1FNhZyH^7C+!D2hS&oshT~>Y%e4|$6X7X0yD9@=U z^IAkHkpWpQ2rp4b+XdS+Wpp%`bO~Gn!v0h2Iee9m%cw)DONUQcnJ&k%CDn>{h$z&6 z%4v`|Z~2i}!F^2;>>!O`YFD{1=QBdn7TQ{p^~f&1;iCC$@%CeO1&Rx>ytiOY5^wHB z%);qgH&REJnM%0IMIN=#yyXEi#@G2Ca51FwSAXC)e72b2E}dmCT!$(^$9 z9fo$;piz-g)hM2xTL_G`Ga0?zTj6-5KaiB;K-QrmMI_B<@aL?zYJ`j;wye?N%g8YLAOFIJh;U7@<24yu-8m<@r)5t`%@!1#Qnn-Z)QS6vUPf&K#lzPOADp~72T3m;LK%=v$XqX?*kOC!B8z2~g_w+iXoXA|2@O+25j zV3QIJd7}H3p|EKhx2|pX6m};s_>p67sf|;v5&}WbVK_#SU+D(nq8u5_RO>})J=?Ep z%bYj_?U8MelbG8-DG{$O#pNg}sg3t|@>d?{Xk^&e7>6`V)+Jw~d=q4-{R4^F4=eL^ zf(m_K(60<+2iA?TtOn$UCr8%&d5w&L<4>ik1Z>}7Na0UJEston`t>P^GI6^i^H?I~ro6TRMjSkKO50}+~%Zd25@_S;{hxyx@ypt(YTfidXj`lOL6 ze@hU}P_XjAvrgX=bZlm797i=>5!tGj7Z^ifPGv=dEz1r<;7gfKBoEt~&tcsMx`f(8 zj2gETc(%v5~bmh(wBFF zNjKGW31tf#7Z}LNWBIs^Hhlb~yGQeCL%7~B(-=PE|JAjXfo8~j2n`Xao0nUE*}xYe ztqK`Jty3s;LFqJ>f2eX4WNx6byTHNTzwRPAf|>q7fz>HetF4%icKkNcqx5OR8QeZC z(*3tbE6;I^jfJQb^^p@z&*s{c9arPoc;Jgo$w*VJe}qd8T7oz@X5IV)!4a_^wH?l+ z{UV~k*S6k16*=J$=IVcxGMBFm{zV-2N7R* zsC>~3g&ZPLeee8@QZFd1f6C*o!q9$0{X;<{kR{FZo zzS#;z2#5W&E2Ll(86@zFw@kdS!-HT~F0@1-Hdy9ghSQ4+j3~Y9;TtdX)yFM!5`;bj z@ps0VKMt@)_^47`lMNLk3+RHrWL9%~2CJ@aX}@Fz6MNBLE0*+nJ!vJ7^1bkOlTmHB zo(dph7fNc?lVZK;R%B781_IB{ym&!K%E})`5DaAkH3nnVr8SbbHRMfZ#W~9@T{fkR zsSP$1E8g==U%LTN#FO)=N-jgQyP-PI#K~vn?*@V2zDI}co8>osW=X?c&aWZ3JW1>k1)g+yB;tr~yacRP6SZ~;|}G}$XEs#qG5MFEi8??@9qB|7{^WE|gO zRR{)bMXRlm7r$}DMR=^g*4m=dzqFAw9!7}97^~LGOxlqLeHsziH&!wxd`OQ2Piib@+@kCeCdm!4{@7}k575@5vz7y|PAJwX_D zQz)C0BAh{j`Pgl-(9SzJr%rmxAhS1-NSj-~P zrW3rb3;6RQZ>0T)DOlv3C(g6kHT16Hfp&$}@KpwuE$Ydv z`6DFP3Emw%wjsI5o;WEE*_l?>43w%jb0?IJPn(Z^A-y z9=DNWnI%+}+$cmG8(9jqe`}0AO7vK^1BOOpmL`mc4+>OkiwC=vqt)!d%pg;ISG!TD zN&eE{h{d|Y7)L<1c8`!yvP<7xj*K$OLHT$A!aWF_mErCVErz64oSkfPt3S!54)quq zfXf|{U<-x0CZ=)}Vk~7&>8&_hQ^WQz-h91`dhxh)@acRUD-BO>2A2RY1H7#|Ll~g(`j?$O z{)^q#!ny3o;dqlux6s-PJdWwG|82nLdNq?98;n@hbKSSKL(Ha#~) zj`MMo5t3GBu2cTmTQ|xcUaxBciqnj9F%~mx6$*23MHP@d^R>a|yTf>6;40~V{&c$` zHdbzt38U+6pC86OPXgnlz+aJfSx1StZOJzH&_2naC!g%dT8@8%n?cU&{Tq32Kzt_Fabs&cA=wdGYHfW1#$U!0KRkTLx@T<^#Bu@rSji=e8NVn!LDbouogJN5_Q0ZM5 z%LpE9I;4Iy`*H8^+*`Mnb7hTF3p3Z>AwZzA7ayx;E%s;f`KA@Xa0L@b(Tm-_-i|92 zkt?xbYmu&-&Sb%~1Tfi-KYITVCV@}R!@1mzS%(dqQ=0n5YP@+|()PsTkoKr^Z#{_Fi) zpM~ixEuyKxmUKm#a-J@cQ@&4=jEEA0rE{AOMcKM1<&sChqzpA8Uw&GMx9snxFDF?c z&f^3QzV8p68(nadYJn?P-QTbyO!e*^%kPKB^^_)0l74gQF_=SFU(~IUzJDoD0hTZ` zrEW5+0r4o@=&$yPPKX27M@rhn73wd4c$9=hK!L}VQ>~%m`tJ!UZ*6?c3YgilbJI-J;$D*+awC0uUQ|L z8zAeiPY8bQ!7`R&bPx_JH;%b)>LN^V?5qeEB_k*cK`Y_amv>oobr(yaVvk(ArSeF` zNzX%$f)Y>hd5@bhIq;i37;-ALxotc-`BA5a1uLW)VxT8o?swfGHFj@0*Qx`8FHR?yw@FGL=n|Lg1;+O(SFoP7rh`hzO3=v!efztKAO%HxoCUXmZhV%| zdZj%;z>4(+et6CVm%r_OKl<-(^fDs4wCTWoyjfXqFrmCQs1uSSRbYn(j_9>`!9(I_;Hs9|Ds~Zk_P4P(n z@)qkhtG>TUOfc~}^w;*tlB7Rp`%P}~#}-L;Q~#9`nTlK~V3AJ%|Csmnt;s>J{%cJG zW|bYKPxQ=or&W2|bC&c=Dj5Glu~)6H5t1`IfFabPvXx-Jhbo$pC(*%7<%+!Dk$L*D zQXum%#g|7qi?Ef}E3kr@CD7uN67IW~WlSSXXHjz+=8&?udII!EJpH@OywUu)qK{$Vq`c(m9a~ zb2NFY{D}M|Ug8t&3-r*V?1-kk|6ENyOz&?{nGlnDctIY9&zqQLC5Sn2VD~LPnN4Ht zOoyC%bdjG7H+iCFhG6cH8YdGRxV@%z5zolIdqHdy33+w)PDY$GAtGYY%jhVvT8;=|a59}!fZWPRjMBVA3`NvE9UyT8vM8Uw8 zKh=5ZuN?bUu|C?d*#|O%94#IC2iSf~HNG5yO-;e8>Grz|ai}5Hf10IIY8SwU^n9~V zE=i|mYRYygj~s!e;ic%$T}3R?P1Fz<5DM@jawP#uw-*{OB&k~3q5 z&EN%t%FTDlYb9B$B4)9kQpB84xXD)TFD^Ey%UT1qgZVQVCL^0B0mFKchfoS7(J%rp!>6cXJyPznu2OvqHAP0gFR!O9EsSgb(AAu|Y@>J4t8Xxb8GPAWSzHaM zd&RTiD2paI7h#3>GOa@=)NdjQj^CSn+tAA8=~dgyWR!Uluy>FcMHVP$OjDVNp6?Wv zS_;`znXdjMM!HmxE=DLzTd40AoU&+wcY-pZPrTI$KcfmhVXyMf;`M6HXlK?2`|T2w z>?(}5L+f6s5%X?F(4zLep}TPIUx2VTHANS)f78NfDltL?1swixo8&>EyGDXv{SiM9&@(IyV0l{LxZUG%r(9?<2nd7l)E?LjO$C?ssi zbT5Mt=wCn20MFZ%bRb1O?&yiHsO!h})T*B+eWL&q*^KX6MFFMt*kkaBw%F4JOeDl5 zwwPTy9A+beUN$@>c*VeN1Ig^iQBtDF6>B_D{(cDY6(usikvG*J5I~u(kv-y+D+v(D zA{qBI4O4+)S=!Zpi%;M+uIywjnb2{wk0lb~G>+}99rsm#nhZmE$1+L71Nx zk{&+~_l!Y|@CY0h<`9-EoJS+q6^ZGFGH)0U;mNQufpB^fkN=j7kztthZjdIAs_D#< zgEJfoUlB1q!_< zVG@p5JC`QQTvQUNGpVJeCuGK!-ZU^9V*srKjqvxD7GOEDQ35C3)GBzbo2ToB%F1@V zu`Qg&9X;{}&2P+29_=!F-fs&F@5u=@m445u8&hO2 zGzp2c2KGnx1QA!9Jj+MyqYf3oRBw`$MszqhEfn5!LRHo>=OV;*!D{W@Rt~x~t(MVs zZRWx0fDy%LR0H9-;wEkScDW3z7?7Q zP17!lxLMvy4^#y!$P9!kGPc%F+i@#_xCajb#zWiV=4Pp6^ zf()CRa*a*70HG78mI_u5ym6F;q@2z5g2}#h;`Q1L=#+v1*38Z@KqFbV@i|Uu%Z2+a zsDb@oE}rQ1m8*1Zx6dO?{OR=Mn;j$9<6x6twu zV*o}$Yes=BBtRiC&va43qsJ)S%9%{qx}Ei!(~pK7BiAUz7f>O3KzVbIx(z#wgMDKy zCI|*vPT`^A`k7NUXGaqFxi7pMl#7q!!z`6Cr`xu^x#|tCw=Uloi+P-f94WDG!-$W|K?RgpDx7Mm}yR-?@TbQaijng6poOxe$BG zmz6B^*VeShKL7!@2P40Y0TZW>cRHKtW6r`AKhKl!w=L#>S`TVc%i=j0j*(8H=Zk?= zLbr@)g<4)l{4459wS3=+5hNRhO}NeS^&0~HbX*(@W7KFZ()Ma#*`F3w+#b5wV0e;B z(ha25H7_Q^TDr#%G8*O$xr1H9<~14 z;@s_Z3Uok$7i9K`a9BsKh5O2N&vc0E<>-N|14&_3k*L-A8ThC9JZ;9;!5OXC3AUw0 zO$4o~M!cCY>ejat|3Jo0npl`Wk`^|X|EP`qOHW47y0Qepr2N^!nK0~I!y5Xi6J@nw zy(Z62Oa*$+!aEveR+6g2#*Px@jICgcisd!NNkQJvE6uwX7PYd-bz5FtOGps&PkU9T zQbE{bLe6d7Sv4e7qskCAQ*Hvk!1B%hL3>sYnuOi~^wv}*0Sk5Ep*E}L)3yW6iaX*R zb~ks_2CDS-La5wI0@i5*7V_jC(mREP58HlvXM{ECN`lA3rnkqaIb@YOy{8$-ti#&^ zT21E(={mP53S7(VxGlwEE!j77YdB!08k#MsQy~KJD5hLjRxwYrP=FjDk@V93B}?kT z&5di4?{i>Ti<$hM`#B7`DvfGkp}snF8VpV$nSpGhV&Xo$0}XT#N%V|s2vctE^gZE< zN>|lspiu+CPmXdzzRVk_beGe9V;twv&oBg7xdV`cvOO(QbW|jFd*7+Adz(Ci%=_KG zsQG?3g^RnN7@MhOY;mJcVSKoI!;ZiH<)5LuwswU#9ykl;65U{hnYF6>g5%m%W$>O& zEkG7Wea|Lq(q5tM=?5*IT0D;cCpa-4GlVvl(rxpu?q6jUU%(6aN?=Kr z{2g8zd^hNdbHp?UjjY*L2)H^ZL4GK6sUt$}YrNerqMM2G^7nY*R*YYz^TIq2bdewp z8LA*uAZTHE?q0w$E46fMdKi~4%AbTLAH$T(*CA06vD$1#JW9rwKPG=3M?N?;@JuKB zTXKk;bBl%RSunx|Wk^Yjg+UfP8#w;d>p8&Z;JDHoBt7LHz2Fg?y$$YTj_o*-oMXBA z6D)fjPn{)<^p_V~R@#Lk6_(p5);<3dkXAHm$YB>zDL-0*qJDqtF zAn)5~lbt`j5EISCB^Er@QMHEN+>3RGowz7`)nH{ zZXX&pLBoSSzbFz6{2VF0Fek8LS&kO<9WP>>e+tzZ{J~4iFhx9boz=9Wq`8TBnWG|+ z+s6T<;DnsZj(IGnD1=~6`!X|oI|wO0rzYMVj)bUf`BW(@m^Hi_1M@)8kiOiRdp^|z zU#6H{ms2AizWz`}hL4di(V7W|(PfNMxCsx%>K{VREfO#G!j3(;@JK>ty9MA$y$!P1 z#DsM4QPm}CmlyC{5vdo-hy~^=-56|;&%}#of=;bDf2MtC1va1uV(%ggO0i84i z+6sinH>0Gg`>~EL`T?WrPYMcy+4a^k=W0^)Yt&DJ!>R&hL!L|j`*ne_(;U3EHa2V>kHG0PEtE1;QY2!1W6_P- z7OuZpMFH>O5lAe>y>=NGgif{*O1fUu8mG4nao6-fZQ-C!u7VDU4zy1Yih8GEijnwQ zoD)~Uk|b2aF+kLT`+-LHWAJ4uGK-HwQEQQO_I`S54Rz%q9RYgiL2&QdtWC6NA|38wdc!Y*NRHRx=&t4CMt3(mBv~MVGwHM{R0%e z>13+fj^d%gtAb!)quQk+O3dkaBY=v_ERz2C9>pq9+#OH7_;bgZ>E%+A+7>*g=$4@oH z!E2iFcR@0E-m4P!V)&O?Y~E)gFvA$myK4%o9HTVBbATYE*+T;8o?K%MI9BK2NX#M9 zd~#8zPMt?crI>(_7NbcmL)%wKuhRj6w$VOIj)VoHyjiuHCMh!98<% zV{UZ<8czqH#&=`+AJVQ8?-c-@bc7s^3oBd zs6ufn$M4e#S1Ln8j?olQ1jh7z;B!AwXB#q` zvnW@23|) z0$Jm74{55O_x#{kEz+phhFmO`Y>-m@ zVg1~)zvc$Xr83d0mXkEX^zqCVp_?Id9Zt3x(s7^wc_4!am5cevX9x}}FK=c_70KcE z?dOA@nBCu&!oR$|6C0{B`8*sXPMfoCnkg0jB4zIKElCHLxuN^#^wP=3{)X^+2UDH` zzM99cQrd_7yjMHLQnJX2lmM7O910)55Z3ogN9Vj&e}Oz-I2c%cYt4&J>dNOAM+84J zEl`q0Bf+5mWg}obtuxae%q9khI?kQ+wZ=eUMh;cW9k03{R-Zid=Y*-=62YCukBfh?W;F}Wp_hay6%emJM+)6~D;Q{n zY))DMqpS~YA5JDEr@ZEJ$(f-xdZwg0Zt0{^ksK^;BUsaP-38)v4CGNsxL*88z{>)o zdPP(#$`Vm~?H$GD&-AZU7m*La7CB*oC!r~tI$5UL`>Izh2Sg#B^&HC_1SGu6 zz(%0|I4Fy@07u64sdtD)=G*$M*2l^H7d1p$fM+_*jvQfci&!Z;-HNAqzPnOzzPM{J z5qH(>DEL@AxGWsxrwx|7RZrhm0g4^Mj)TvbP{_bW*UKfzylYZ#Og`xsNo`Z`an+bG zrrjvs7`K=K#b0McVX};&$wTq-Q!{*ZYLXMMiW}$3kS*;75)|zeohNt%C=c214fj7= zTY>dgKCd)gpf4cMI7tk}09yHq2mxbd16_<;$L%mL%}IOAO+`LO>@mv?=bY&8;KiOTJ)tRi;*KyXD#+rVE#X*;ocYitHXA7dn+?3eGgF8otuxV4UY9)no-XveuhE1<9=uz`Sj($FK9SU2|7FtQX~)Sn=+-0FKyVMs!l+Q; zx^+djCXI#>P4+Xh9=2H}?=e9nM|5nyZBp!=C9Ff$?G>1;HCEhnsp4Kg)#W0n6_Sr}!GmI)*90+m%}*Nwx7{)GH7; zs;TJ)-?vR;nu_YDynWl!fC**ryUG^4A*!Rzs6jL-&=ZrOIHHh6Wa7B=5j#(-FZ>PY6Tc z6!lB)v({4Z5Qlok;YAj?KBL$}qQz!O10XjdE*>KK3!a_{ra#S|Mab!SdU{4>i<@*j)x%_ zh-PP_y`Yy)`5s10p*O0+u-nQQtt*K$5KDb|90`9J0l(`L$zH|qPkM$C-_=l)LT+SW zJS^K`FD;9+uU7=J)soY{UGy2pY1x%gET+wnX15^n#6yC6uc~oF9!yYkk}zDzV!$uq zmi6r8sB);#e}8Ndqz$KNODBU(N3KBDSKBcp7zKSI9j-eZdcb2Bb_>i&Yh|?q1>paX?3i=qcY=01 zf&#SVPe5QAE@N}`0isSk9Ll?8Nkq%1AtWl&zk^z|_qqA%kHA?T;t9k7=-O#Qsp0uF zocdyo=LM6(0|J*Aw$>)f>p7FFHig*&(5h0mkt`t&_ZM2hqZsr-R*;QZgxkNEH+>ax zt16Fw)yZoJ92#H9a0c6tDJCfY%b-l$J+0jM1Wsz$d@YgA8r2=mhEc5#SrhfxTHZ*L zH$$%lPmO$4(0v;C%8dK!tfb5o!9lxQcnb-3tz;TRKEr}AtS3TH>RC13qAR^(j0o#H zV7JP{9gO1xzHVZSGzV%d=c=1Dc_xleRUZuo<8HBmv&p`|GpMw0Xo*{2x8OUAa&W;L z!LQbvv=Ioc^saFI*g+`-UDWH>jAN(CT-^6;YZnJyXuO#ik}qHX@Nkwd=fNs_$X6| z)jIG`FTGAA;fot*nYTNgB&@U^ncf#@k^Zfh;4I}TV1=2{ik$8MlAd^V9(vF!Ax=-j zqBKjW3X=aA&rr#aD!V*=^X6?CR(^(3zEMhG?RiHdwv z8*Zc5Xp>K<_ajEupA+%DaSotj85|lLZ>@jLsawDtM|yrlm3|(+wiing zTl91;#2{BIQfo&{qGc7L=srD$&FowhFn!8d;YW0bwMRlD$$2Dr8(o*qUy#jW>vUra z;|q20#|uePE$L=Gea7>eBdF9?VeUL(-UX5fP*zEc2I@FU>!+kGQ4)#IM&$CA%$Bj#x# z_a|qSi;pk`LKPt+G%nWH52d(Nx-}@Z40?m&cDFCrx_-cLnDwAWXi%XfLh=zb+)@lD zBKR(o2kD~(5t3K@!7L->P{aqzWBX|@mN$<}3SA@&?0K#Z4TSAb^}Sj&IemGengkb0BAKMmr}E3SBr6FtkLr2nMJwc&1;X<%X(5 z){geNiJxfT^6WDh!o)RX0A2xUAT9PJmufSJB^#P=>{qSyyW!^~WC>fu6?~xlln+m4) zwT)0pR!Rn3Vj4kEk1Hll-e<;xs^Hs`)|Uy(_+gI91%PBNzE42_xR-xSUxoffvAHsf;1UR#r5KC_0kWe<9uu+@UwAJb{2 zVu65@(OpqJCx=pekN0w16{ z#NU^_*q=Rs({Pn!(Sq=}PMnt(SAWN^V>?ycWO?K2uv7KzxKoG{&YX-LM(3 z<@Pw3cDXD$mWJ{vLn~DKbI;Ag?mkUou-ndlC$a}zy|#z(8F4ijuCgSq8a|v*n3Q_# z4e9X0A`-}B!jmQ(Q4(EsWUE^+HMWNNHI!>%90n^~D0Hp}){C5YX<9@!-ULG!6=D&W6WIs0eT*Gyqvqdw(TJ?%7s}m-SJPE z=v>c1g64#0mUbx%TbasZ--dfCmfnVVwm4-0z`-PT65^M5`xxYQKH9+xDZb?J)#=J9 zaVls@o&vHRtH?CzpZT4ZvOi-m{5T40=O;)QhFBp+ab$=pX_D&Gr$@@xsmGA^@DFlc zl)HN+cNVJ8T{TR(!V|PZX?6`4%zJJnuD5%j(QlA%l0}+8yUKHODs#Tw?0cf*{9gx2 zS#04WXu8e6JgaGfsJ+G#a<82^;Zt?n!*R%8X6PwS5$#aYpFl0wYk0|MHug)Nv8~YD zJOpR5F;cNeKl0XJTx@A09{`Ay#M*`QBLGmAJS$cwxI7j7-Pas$J7Y;-pxrs+nipmc z6#Q45OzM+XVwip}&HcZ?6*agX|8LsEe>YnaaC1Y^DSO!eGadeS?LkaHK~YxeKiY%( z|HeJAu>Lpqz`**SuJ!*PxCe%R!o&ZwkH2{2)ln*dpdgqM-y9X6I18^^Um=< zB*lNh5l$wqCbo3Wbk63ECMI;wZgzAobgus*VeWJube?pcCXROhQK_1xPehqBGyZ*g{ux1G8A)LgkbMI~L*IG)UgUWG7<1DLCyMf zw6Zk>dbfU@Kj{68Ou*7KGTHzm1Wr<1YkXI?rt#~&cc1TE8lC{o89SSCn0-&Hr@e9? zx45R3c4mj~l%Ph)K^mgrlzX40OVZAeXo8V zKUx95#=os9kmm1pF4BG&#n)3;fLp(k2i=~(5<}PjoP+1v`U0@8TR5nf+iw^k`ELt9 z9x_+5q*uC=-&vu%*Ti4H?qBrDU#rhwJrSfDR#v~y@*mW@-$U>X%?%fjF60j~C# zVqEd@o%M%WXmI}7si7x7?^`A_!*Abm_TIeZUD~-%@$cKz16Q(_62ECYXfAMovm=nF zU=vR}dNfy8f40ZZ_{>1=pBozh;-H-F$xoy{FUKALCNJ`}UfJXz+&+r0v~#_1;6926 za0eg^kzWE@fWK?_|I`VTU%CThAbQC!fhhpdalUZWK8kPfZl{S~f!l1TUlHwFYDqr? zXn%!ccuzBh?|%@5@R^kJi{-zw^`jAov{~PPe^GH=vkiUj!o*X z|81nr58&=%{WoyN?(nbC^{3CE`ES@a&&zkr6Z~r@XBgkjD;8%LeEv6I!|$Jdzi>0( z)q^kccDK^UPo3w{@0q=a(eIx2s1W2c{AG8w(*xVzIM7@0;}7_^+^kK$y-wX%zWC#u z*~hqzS9QAh#onJeiG1xdNPTm8I-dBGn;SEQ#(&y` zF_O7~kDQS@^nbJo!@QI3mC0rG>`sRV zlIn&GGcNPj_h6m`*)G0&-dztl*~v{o;|tv?i@eD4SwMsMWT3J1S_o#3f|xlb7I3i2 zg*_V3{)Z_;(th#HSe5UTi^m~vE2Z%+hDg+HhJCHSBp|;APV)*jvn6&6NPx4# z-_GOGAX^C*Dd84{vrW$DOCDv(0baq}iYDtM;mXoif$v(Fm8OcmZX|iu`09OB0KiLHkluGuNAG8xNB*i z4R6~$T*mf zvj^27w1+au_q@cmYCvIY0ba$|1#gz1YNeo-9KLE%iEHoq8HDu_$6G6S#qG0TB0Xy| z)57uF+fH?zPs7N%7tDv1!BxlLzOP)0pf~FMx?U69_$Ofno8buPEhCsc(njg-O{s<_ zod%_;2Z|;j1rO(UA`a9hb(1wSCQAXc3!dHoRyL0q1C-o8xh&GiMeeCp3*fVk0*oRF zl8+oE{}0ygAxP9PO3-xLnKy0Qwr$(CZQHnM+qP}nwr%&Vs_BWEnC^~Q%=+Jbt3OVh z=e$-^;5~x0SI6c(&BhgHM9kjDKY-_Tvs3&HrKgaI> z`g*+JVG@5%m!;u&7taqD21buw_=oZAeCeq!56$Y+QMSeR;Jfw+l!=n4K7|9yc}!XQ zA?Tt(Ni)j(4K0Fd*@w0F`iXj#!OEWEBZV}{<{o%|)N{@!+zFi8grx{`2np0X_iLh5 z0q>kHv_Dh4b)r^FdG3Ki46XPtOX9o-LKoRN`gC_9nYF zDGLEj8s|3WHhUtQ#ZPwN%^WPjKfp|sz#j6i!IA!u(Hqqgl%4D5d%+vjM4d9WinC=~ zb8jY@O)P*I5o}+mJZa>ZteQt}mn+iVgp%QTwcdQr)lNswIP^~Ml5&(qJ&5K;vJuUP zPq)E>CdF2I8xZ%TZmB`=(_WY6ldzQt-1gUzG$Yx21n`y(&Q0j&3h?f$7w+{vLe5FN zt6(O<22?^Tzvt)K{)^NdjYuX;m58yy%u4-j2txb-K-OdnH*GqqI zuohb6W(yrHjM?R<^S`B^^2ptyUj5MKYb#1*A-_;#Gk1D*R>KY1FwL0x^2rKgxI^p9 zN`v!(Z!wx?BSlm22z)`z$W$4`noF<3Hfppd)L5Tui|KCjnA~r^~9_LyS8n8D#or<#wO2} zIwavYM)q0kHKOhncJq4ZmVhl{d8j)8qWW~)?O3V4e9*AYR{Fn?c)y~>nRX}We-YEn z`{mLwGRX1F_J^00nAQO|Hla)p`XbW`h*dgEZ@;;Gix_@F$(ap4Kr~=IQ&NY}ngJhKS6ryf7^E7qxL(dO4a7^Ed+R9DuKk=S={MP3qF|i)Hn)}-;4bh zWD#em*Jm`?!ym(fS}wQiTxjJ)`pj-GFW+u?Ic!Cjg1cc14c^|W+9yB98;r-<&)&mw z7d8Q%tA3g>D3~s1e0GQGHdxJ6b_f%pJeT1yfk&h*^Cs10kpjno^|*(hjxH6H+ly0Z zlZ`e`dpXj#B~dZD&gvV($P#a;I}Of4E#+2}jIi}5ZYogG|3xF$n~T)O4lQ{W9Tbk7 zfDpi>$9+p{$ObXm=q(GtXgy?I-`&3ZXan0R%&b&Xo=bF3@W7#$k*(NJ%o|5Raca+u zIjPAGHAClu;)9bAk9VREy(exZaPTGAJB*FskHeFiMEyK5h)_*0gVU$D-+DlE6cUZb zX~r`s8t|*tz-;Y+%8*YkmJch>E(PpxWPjG@S8MJlO=xoFEmv66fU1)+n-$F(@36KO z1)lWEayxQ#tn@o|Eaq)4WNuy8F=I2jC8dwD1{3M=mW}hAJ@6;DN$vFnUkgE5h){6( zCXMEr2$iY$HFf{p2i{JTm|{SM95@b&@u?TfL1zMqMLMk_u#Up+JlpjEJ$KPJ5lpf3 zRxpruGyL>*bPuHXtz-vv!lian7})kZ0~(UWsPwzmt6i*SmOY~f!R>5YQ$JHCVJ|}d z1A`%&5ieCx6xMecmd)JHPx0OL(noo&l?N8<#GhXO7t3r_hSM1Tj=+}GEPyeLxAEPm zPqZ&%$f&flt3cB`IjvE8ql{74>bo{a-|kFqHUP&GD_f?OIvJB4G8t-y&&)8lHsOnF zTqID9x}a8V{0{BB#TKODbrXoqsyDzz5|{esUySh3f=JNL zbF_jCLSkMt(daQi1nek}fo_E@>iM*LGD8g`F9G#tliCj%g6Z_;9b`Zp61Et>~QEkYAf`A_XpEZI(S!A_YhIpT`ZxO*2*i+efxga1CM zkPv}<^zm7*57Mz}b}H(&nGyD?7JGsPN?@0UShGJZH^LXR5`W(%m#mkKA|hlX-yu)Q zGh>5=S({0T`0TIC)-a&*jm^*fF|f^=Z}Vm>fhL7aZBEr^WQheoXvsO~iZQWEtCzrx zPSzq*^uT+Hd93OmC}R8CnJWb!XQsh8B#p}enSnN3GVYDmfZ=0bERa2V7yHJfx3-^| z!j!Kb{%{rN2Y04;X#%Nj&%ky1*cR0Fqv?-)G>p}b*QvWtCzRW9vuJh?XVIGS92+1P zrP~}|R^B^BxeYRjqR%ln^&keT>JHv_?udBK7ChNH6(i&-?9#K1LVsMM#u%?WkLWZm zGK0XDTiofT)7PDVYoWq=Cf>SPl4F6~>j1KzF&O8;cbUFCjh_{)X8(ec7ui3dUlB({ zf~~Ro`I%)=WZD{`jXQP+v4Uj za?w)lwaMPPVNA9)l0X1KbkdIo=C0Xvg~8i^5c|yN$Fvfqyxg+AkakcJ~J8EqH;^OwmiBfdgR>ttTlR?;s%0D4FJ~ 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
(bWOgx|=F_h`g&mi&k$$R#F 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

tU5+`@NYHWWi?B6-Pq|0D@( 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� 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 AUH||9 diff --git a/vignettes/RDDtools.tex b/vignettes/RDDtools.tex deleted file mode 100644 index 6a7a261..0000000 --- a/vignettes/RDDtools.tex +++ /dev/null @@ -1,887 +0,0 @@ -%% LyX 2.1.0 created this file. For more info, see http://www.lyx.org/. -%% Do not edit unless you really know what you are doing. -\documentclass[english,nojss]{jss}\usepackage[]{graphicx}\usepackage[]{color} -%% maxwidth is the original width if it is less than linewidth -%% otherwise use linewidth (to make sure the graphics do not exceed the margin) -\makeatletter -\def\maxwidth{ % - \ifdim\Gin@nat@width>\linewidth - \linewidth - \else - \Gin@nat@width - \fi -} -\makeatother - -\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345} -\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}% -\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}% -\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}% -\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}% -\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}% -\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}% -\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}% -\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}% -\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}% - -\usepackage{framed} -\makeatletter -\newenvironment{kframe}{% - \def\at@end@of@kframe{}% - \ifinner\ifhmode% - \def\at@end@of@kframe{\end{minipage}}% - \begin{minipage}{\columnwidth}% - \fi\fi% - \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep - \colorbox{shadecolor}{##1}\hskip-\fboxsep - % There is no \\@totalrightmargin, so: - \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% - \MakeFramed {\advance\hsize-\width - \@totalleftmargin\z@ \linewidth\hsize - \@setminipage}}% - {\par\unskip\endMakeFramed% - \at@end@of@kframe} -\makeatother - -\definecolor{shadecolor}{rgb}{.97, .97, .97} -\definecolor{messagecolor}{rgb}{0, 0, 0} -\definecolor{warningcolor}{rgb}{1, 0, 1} -\definecolor{errorcolor}{rgb}{1, 0, 0} -\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX - -\usepackage{alltt} -\usepackage[T1]{fontenc} -\usepackage[latin9]{inputenc} -\usepackage{amssymb} -\usepackage[authoryear]{natbib} - -\makeatletter -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands. - %\usepackage{Sweave} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. - -\usepackage{amsmath} -\usepackage{nameref} - -%the following commands are used only for articles and codesnippets - -\author{Matthieu Stigler\\Affiliation IHEID} -\title{\pkg{RDDtools}: an overview } - -% the same as above, without any formatting -\Plainauthor{Matthieu Stigler} -\Plaintitle{\pkg{RDDtools}: a toolbox to practice } -%if necessary, provide a short title -\Shorttitle{\pkg{RDDtools}: a toolbox to practice } - -\Abstract{\pkg{RDDtools} is a R package for sharp regression discontinuity design (RDD). It offers various estimators, tests and graphical procedures following the guidelines of \citet{ImbensLemieux2008} and \citet{LeeLemieux2010}. This note illustrate how to use the package, using the well-known dataset of \citet{Lee2008}. - - -NOTE THAT this is a preliminary note, on a preliminary package still under development. Changes of the function names, arguments and output are to be expected, as well as possible mistakes and inconsistencies. Please report any mistakes or suggestion to \email{Matthieu.Stigler@iheid.ch}} -%at least one keyword is needed -\Keywords{Regression discontinuity design, non-parametric analysis, \pkg{RDDtools}, \proglang{R}} -%the same as above, without any formatting -\Plainkeywords{Regression discontinuity design, non-parametric analysis,RDDtools, R} - -%the following commands are used only for book or software reviews - -%\Reviewer{Some Author\\University of Somewhere} -%\Plainreviewer{Some Author} - -%the following commands are used only for book reviews -%\Booktitle{LyX and \proglang{R}: Secrets of the LyX Master} -%\Bookauthor{Book Author} -%\Pubyear{2008} -%\ISBN{0-12345-678-9} -%\Pages{500} - -%the following command is used only for software reviews -%\Softwaretitle{\proglang{gretl 1.7.4}} - -%the following commands are used only for book or software reviews -%\Publisher{LyX Publishing Inc.} -%\Pubaddress{LyX City} -%\Price{USD 59.95 (P), USD 99.95 (H)} -%\URL{http://www.lyx.org/} - -%without any formatting -%\Plaintitle{LyX and R: Secrets of the LyX Master} -%\Shorttitle{LyX and R} - -%the following commands are used for articles, codesnippets, book reviews and software reviews - -%publication information -%do not use these commands before the article has been accepted -%\Volume{00} -%\Issue{0} -%\Month{Month} -%\Year{2000} -%\Submitdate{2000-00-00} -%\Acceptdate{2000-00-00} - -%The address of at least one author should be given in the following format -\Address{ - Matthieu Stigler\\ - Centre for Finance and development\\ - IHEID\\ - Geneva\\ - E-mail: \email{Matthieu.Stigler@iheid.ch} -} -%you can add a telephone and fax number before the e-mail in the format -%Telephone: +12/3/4567-89 -%Fax: +12/3/4567-89 - -%if you use Sweave, include the following line (with % symbols): -%% need no \usepackage{Sweave.sty} - -%% Arg min operator: -\DeclareMathOperator*{\argmi}{arg\,min} -\newcommand{\argmin}[1]{\underset{#1}{\argmi}} - -\DeclareMathOperator*{\Ker}{\mathcal{K}} - -\makeatother - -\usepackage{babel} -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -\begin{document} -\tableofcontents{} - - -\section{Introduction} - -\addcontentsline{toc}{section}{Introduction} - - -\subsection{Introduction to RDD} - - - - -\subsection{Introduction to RDDtools} - -The R package \pkg{RDDtools} aims at offering a complete a toolbox -for regression discontinuity design, following the step-by-step recommendations -of \citet{ImbensLemieux2008} and \citet{LeeLemieux2010}. Summarising -the approaches advocated in the two papers, a RDD analysis comprises -of following steps: -\begin{enumerate} -\item Graphical representation of the data -\item Estimation -\item Validity tests -\end{enumerate} -We add to this list a step that is too often forgotten, yet can be -very burdensome: data preparation. Hence, this list is extended with -the fundamental step 0, which involves preparing the data in the right -way. - -\pkg{RDDtools} offers an object-oriented way to analysis, building -on the R mechanism of S3 methods and classes. Concretely, this implies -that the user has to specify the input data only once, and that most -of the functions can be called directly on the new object of class -\code{RDDdata}. - - -\section{Step 0: data input} - -\addcontentsline{toc}{section}{Step 0: data input} - -As first step of the analysis, the user has to specify the input data -into the \code{RDDdata} function, which takes following arguments: -\begin{description} -\item [{y}] The outcome variable -\item [{x}] The forcing variable -\item [{cutpoint}] The cutpoint/threshold (note only one cutpoint can be -given) -\item [{covar}] Eventual covariates -\end{description} -The RDDdata function returns an object of class \code{RDDdata}, as -well as of the usual \proglang{R} class \code{data.frame}. - -To illustrate this, we show how to use this with the benchmark dataset -of \citet{Lee2008}, adding randomly generated covariates for the -sake of illustration. The dataset is shipped with the package, and -is available under the name \emph{Lee2008. }Using the R \code{head} -function, we look at the first rows of the dataset: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{library}\hlstd{(RDDtools)} -\hlkwd{data}\hlstd{(Lee2008)} -\hlkwd{head}\hlstd{(Lee2008)} -\end{alltt} -\begin{verbatim} -## x y -## 1 0.1049 0.5810 -## 2 0.1393 0.4611 -## 3 -0.0736 0.5434 -## 4 0.0868 0.5846 -## 5 0.3994 0.5803 -## 6 0.1681 0.6244 -\end{verbatim} -\end{kframe} -\end{knitrout} - - -The data is already clean, so the only step required is to fit it -into the RDDdata function, adding however the information on the cutpoint. -For illustration purpose, we add also some random covariates as a -matrix Z: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlstd{n_Lee} \hlkwb{<-} \hlkwd{nrow}\hlstd{(Lee2008)} -\hlstd{Z} \hlkwb{<-} \hlkwd{data.frame}\hlstd{(}\hlkwc{z1} \hlstd{=} \hlkwd{rnorm}\hlstd{(n_Lee),} \hlkwc{z2} \hlstd{=} \hlkwd{rnorm}\hlstd{(n_Lee,} \hlkwc{mean} \hlstd{=} \hlnum{20}\hlstd{,} \hlkwc{sd} \hlstd{=} \hlnum{2}\hlstd{),} \hlkwc{z3} \hlstd{=} \hlkwd{sample}\hlstd{(letters[}\hlnum{1}\hlopt{:}\hlnum{3}\hlstd{],} - \hlkwc{size} \hlstd{= n_Lee,} \hlkwc{replace} \hlstd{=} \hlnum{TRUE}\hlstd{))} -\hlstd{Lee2008_rdd} \hlkwb{<-} \hlkwd{RDDdata}\hlstd{(}\hlkwc{y} \hlstd{= Lee2008}\hlopt{$}\hlstd{y,} \hlkwc{x} \hlstd{= Lee2008}\hlopt{$}\hlstd{x,} \hlkwc{covar} \hlstd{= Z,} \hlkwc{cutpoint} \hlstd{=} \hlnum{0}\hlstd{)} -\end{alltt} -\end{kframe} -\end{knitrout} - - -We now have an object \code{Lee2008_rdd} of class \code{RDDdata} -(and \code{data.frame}). It has a specific \code{summary} method, -which gives a few summary informations about the dataset: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{summary}\hlstd{(Lee2008_rdd)} -\end{alltt} -\begin{verbatim} -## ### RDDdata object ### -## -## Cutpoint: 0 -## Sample size: -## -Full : 6558 -## -Left : 2740 -## -Right: 3818 -## Covariates: yes -\end{verbatim} -\end{kframe} -\end{knitrout} - - -Another function for \code{RDDdata} objects is the \code{plot()} -function, discussed in the next section. - - -\section{Step 1: Graphical representation} - -\addcontentsline{toc}{section}{Step 1: Graphical representation} - -Once the dataset has been formatted with the RDDdata function, it -can be used directly for simple illustration. Indeed, as recommended -by \citet{LeeLemieux2010}, it is always good to show the raw data -first, if ones wishes to convince that there is a discontinuity. This -is simply done using the standard R plot() function, which has been -customised for RDDdata objects. The function shows a scatter plot -of the outcome variable against the forcing variable. Following \citet{LeeLemieux2010}, -not all single datapoints are shown: instead, a ``binned'' scatterplot -is shown, using non-overlapping averages: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{plot}\hlstd{(Lee2008_rdd)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-4} - -\end{knitrout} - - -The bandwidth for the bins (also called binwidth) can be set by the -user with the \code{h} argument. If this it is not provided by the -user, the function uses by default the global bandwidth of \citet{RuppertSheatherEtAl1995}, -implemented in the \code{RDDbw_RSW()} function. - -Another argument that might be useful for the user is the option \code{nplot}, -which allows to plot multiple plots with different bandwidths: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{plot}\hlstd{(Lee2008_rdd,} \hlkwc{nplot} \hlstd{=} \hlnum{3}\hlstd{,} \hlkwc{h} \hlstd{=} \hlkwd{c}\hlstd{(}\hlnum{0.02}\hlstd{,} \hlnum{0.03}\hlstd{,} \hlnum{0.04}\hlstd{))} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-5} - -\end{knitrout} - - -Note however that experience shows that showing multiple plots have -the effect to shrink considerably the y axis, reducing the visual -impression of discontinuity. - - -\section{Step 2: Estimation} - -\addcontentsline{toc}{section}{Step 2: Estimation} - -RDDtools offers currently two estimators: -\begin{itemize} -\item the simple parametric estimator: function \code{RDDreg_lm()}. -\item the non-parametric local-linear estimator: function \code{RDDreg_np()}. -\end{itemize} -These two functions share some common arguments, which are: -\begin{description} -\item [{RDDobject:}] the input data as obtained with the \code{RDDdata()} -function -\item [{bw:}] the bandwidth. -\item [{covariates:}] this will allow to add covariates in the analysis. -Note that it is presently NOT used. -\end{description} -The bandwidth argument has a different behaviour in the parametric -and non-parametric way: while the parametric estimation can be done -without bandwidth, the non-parametric estimator is by definition based -on a bandwidth. This means that the default behaviours are different: -if no bandwidth is given for the parametric model, the model will -be simply estimated withut bandwidth, that is covering the full sample -on both sides of the cutpoint. On the other side, if no bandwidth -is provided in the non-parametric case, a bandwidth will still be -computed automatically using the method advocated by \citet{ImbensKalyanaraman2012}. - - -\subsection{Parametric} - -The parametric estimator simply estimates a function over the whole -sample (hence called \emph{pooled regression} by \citealp{LeeLemieux2010}): - -\begin{equation} -Y=\alpha+\tau D+\beta(X-c)+\epsilon\label{eq:ParamStandard} -\end{equation} - - -where D is a dummy variable, indicating whether the observations are -above (or equal to) the cutoff point, i.e. $D=I(X\geq c)$. The parameter -of interest is $\tau$, which represents the difference in intercepts -$\alpha_{r}-\alpha_{l}$, i.e. the discontinuity. Note that equation -\ref{eq:ParamStandard} imposes the slope to be equal on both sides -of the cutoff point. While such restriction should hold locally around -the threshold (due to the assumption of random assignment around the -cutoff point), the parametric regression is done by default using -the whole sample, so the restriction is unlikely to hold. In this -case, one should rather estimate: - -\begin{equation} -Y=\alpha+\tau D+\beta_{1}(X-c)+\beta_{2}D(X-c)+\epsilon\label{eq:Param2slopes} -\end{equation} - - -so that $\beta_{1}=\beta_{l}$, and $\beta_{2}=\beta_{r}-\beta_{l}$. - -The two estimators are available with the \code{RDDreg_lm()} function, -the choice between the specifications being made through the \code{slope=c("separate", "same")} -argument: -\begin{description} -\item [{separate:}] the default, estimates different slopes, i.e. equation~\ref{eq:Param2slopes}. -\item [{same:}] Estimates a common slope, i.e. equation~\ref{eq:ParamStandard}. -\end{description} -Note that the order of X has been set as 1 in both cases. If the function -shows moderate non-linearity, this can be potentially captured by -adding further power of X, leading to (for the separate slope equation:) - -\begin{equation} -Y=\alpha+\tau D+\beta_{1}^{1}(X-c)+\beta_{2}^{1}D(X-c)+\ldots+\beta_{1}^{p}(X-c)^{p}+\beta_{2}^{p}D(X-c)^{p}+\epsilon\label{eq:ParamSlopesPowers} -\end{equation} - - -The order of the polynomial can be adjusted with the \code{order} -argument. - -Finally, the estimator can be restricted to a (symmetric) window around -the cutoff point, as is done usually in practice. This is done using -the \code{bw} option. - -In summary, the function \code{RDDreg_lm()} has three main options: -\begin{description} -\item [{slope:}] Whether to use different slopes on each side of the cutoff -(default) or not. -\item [{order:}] Order of the polynomial in X. Default to 1. -\item [{bw:}] Eventual window to estimate the data. Default to full data. -\end{description} -We show now the different applications, still using the Lee dataset: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlstd{reg_linear_1} \hlkwb{<-} \hlkwd{RDDreg_lm}\hlstd{(Lee2008_rdd)} -\end{alltt} -\end{kframe} -\end{knitrout} - - -We now estimate different versions, first restricting the slope to -be the same, then changing the order, and finally using a smaller -window: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlstd{reg_linear_2} \hlkwb{<-} \hlkwd{RDDreg_lm}\hlstd{(Lee2008_rdd,} \hlkwc{slope} \hlstd{=} \hlstr{"same"}\hlstd{)} -\hlstd{reg_linear_3} \hlkwb{<-} \hlkwd{RDDreg_lm}\hlstd{(Lee2008_rdd,} \hlkwc{order} \hlstd{=} \hlnum{3}\hlstd{)} -\hlstd{reg_linear_4} \hlkwb{<-} \hlkwd{RDDreg_lm}\hlstd{(Lee2008_rdd,} \hlkwc{bw} \hlstd{=} \hlnum{0.4}\hlstd{)} -\end{alltt} -\end{kframe} -\end{knitrout} - - -Model's output is shown with the \code{print()} and \code{summary()} -function: while the \code{print()} function just shows few informations -and the LATE estimate, the \code{summary()} function shows the full -output of the underlying regression model: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlstd{reg_linear_1} -\end{alltt} -\begin{verbatim} -## ### RDD regression: parametric ### -## Polynomial order: 1 -## Slopes: separate -## Number of obs: 6558 (left: 2740, right: 3818) -## -## Coefficient: -## Estimate Std. Error t value Pr(>|t|) -## D 0.11823 0.00568 20.8 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -\end{verbatim} -\begin{alltt} -\hlkwd{summary}\hlstd{(reg_linear_1)} -\end{alltt} -\begin{verbatim} -## -## Call: -## lm(formula = y ~ ., data = dat_step1, weights = weights) -## -## Residuals: -## Min 1Q Median 3Q Max -## -0.8941 -0.0619 0.0023 0.0713 0.8640 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) 0.43295 0.00428 101.25 < 2e-16 *** -## D 0.11823 0.00568 20.82 < 2e-16 *** -## x 0.29691 0.01155 25.71 < 2e-16 *** -## x_right 0.04598 0.01350 3.41 0.00066 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 0.138 on 6554 degrees of freedom -## Multiple R-squared: 0.671, Adjusted R-squared: 0.671 -## F-statistic: 4.45e+03 on 3 and 6554 DF, p-value: <2e-16 -\end{verbatim} -\begin{alltt} -\hlstd{reg_linear_2} -\end{alltt} -\begin{verbatim} -## ### RDD regression: parametric ### -## Polynomial order: 1 -## Slopes: same -## Number of obs: 6558 (left: 2740, right: 3818) -## -## Coefficient: -## Estimate Std. Error t value Pr(>|t|) -## D 0.11373 0.00553 20.6 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -\end{verbatim} -\begin{alltt} -\hlstd{reg_linear_3} -\end{alltt} -\begin{verbatim} -## ### RDD regression: parametric ### -## Polynomial order: 3 -## Slopes: separate -## Number of obs: 6558 (left: 2740, right: 3818) -## -## Coefficient: -## Estimate Std. Error t value Pr(>|t|) -## D 0.1115 0.0107 10.5 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -\end{verbatim} -\begin{alltt} -\hlstd{reg_linear_4} -\end{alltt} -\begin{verbatim} -## ### RDD regression: parametric ### -## Polynomial order: 1 -## Slopes: separate -## Bandwidth: 0.4 -## Number of obs: 4169 (left: 2043, right: 2126) -## -## Coefficient: -## Estimate Std. Error t value Pr(>|t|) -## D 0.08863 0.00727 12.2 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -\end{verbatim} -\end{kframe} -\end{knitrout} - - -Finally, a \code{plot()} function adds the estimated curve to the -binned plot. Here we show the difference between the model estimated -with polynomial of order 1 and order 3: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{par}\hlstd{(}\hlkwc{mfrow} \hlstd{=} \hlkwd{c}\hlstd{(}\hlnum{2}\hlstd{,} \hlnum{1}\hlstd{))} -\hlkwd{plot}\hlstd{(reg_linear_1)} -\hlkwd{plot}\hlstd{(reg_linear_3)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-9} -\begin{kframe}\begin{alltt} -\hlkwd{par}\hlstd{(}\hlkwc{mfrow} \hlstd{=} \hlkwd{c}\hlstd{(}\hlnum{1}\hlstd{,} \hlnum{1}\hlstd{))} -\end{alltt} -\end{kframe} -\end{knitrout} - - - -\subsection{Non-parametric} - -Although the parametric estimator is often used in practice, another -estimator has important appeal, in this context where one is interested -in estimating a regression just around a cutoff. In this case, non-parametric -estimators such as the local-linear kernel regression of \citet{FanGijbels1992,FanGijbels1996}, -which aim at estimating a regression locally at each point, have interesting -features, as advocated by \citet{Porter2003}. A local linear regression -amounts to do a simple weighted linear regression, where the weights -are given by a kernel function. Formally, the local-linear estimator -(LLE) is given by its estimating equation: - - - -\begin{equation} -\hat{\alpha}(c),\hat{\beta}(c),\hat{\tau}(c)=\argmin{\alpha,\beta,\tau}\sum_{i=1}^{n}\left(Y_{i}-\alpha-\tau D-\beta(X_{i}-c)\right)^{2}\mathcal{K}\left(\frac{X_{i}-c}{h}\right)\label{eq:LLEform} -\end{equation} - - -where $\mathcal{K}(\cdot)$ is a kernel function attributing weights -to each point according to their distance to the point c. Note that -the parameters $\alpha$, $\beta$ and $\tau$ are written as of function -of $c$ to emphasize the fact that these are \emph{local} estimate, -unlike in the parametric rate. The kernel used in RDDtools here is -the triangular kernel (also called \emph{edge} function sometimes): -$K(x)=I(|x|\leq1)(1-|x|)$. This choice, which departs from the the -suggestion of \citet{LeeLemieux2010}, is driven by the fact that -the triangular kernel was shown to be optimal when one estimates a -parameter at a boundary, which is precisely our case here \citep{ChengFanEtAl1997}. -Unlike the package \pkg{rdd}, we do not offer other kernels in \pkg{RDDtools}, -since the kernel selected is optimal, and changing the kernel is found -to have little impact compared to changing the bandwidths. - -Note that using the LLE estimator reduces to do a weighted OLS (WOLS) -at each point% -\footnote{See \citep[equ. 3.4, page 58]{FanGijbels1996}. % -}, which allows to use the usual regression function \code{lm()} in -R, specifying the weights as given by the kernel. However, although -this is a WOLS, the variance of the LLE is not the same as that of -the WOLS, unless one is ready to assume that the bandwidth used is -the true \emph{bandwidth}% -\footnote{A second option is use a smaller bandwidth, in which case standard -inference can be applied. This has however the drawback of using a -sub-optimal bandwidth, with a slower rate of convergence. % -}. However, most, if not all, papers in the literature do use the standard -WOLS inference, eventually adjusted for heteroskedasticity. This is -also done currently in the RDDtools package, although we intend to -do this following the work of \citet{CalonicoCattaneoEtAl2012}. - -Another question arises is the choice of the bandwidth, which is a -crucial question since this choice has a huge impact on the estimation. -Typically, decreasing the bandwidth will reduce the bias of the estimator, -but increase its variance. One way of choosing the bandwidth is then -to try to minimise the mean-squared error (MSE) of the estimator, -which allows to trade-off bias and variance. This approach is pursued -by \citet{ImbensKalyanaraman2012}, and is available in \pkg{RDDtools} -with the function \code{RDDbw_IK()}. This function takes simply a -RDDdata object as input, and returns the optimal value according to -the MSE criterion. - -As an illustration, we use now the non-parametric estimator for the -Lee dataset, estimating first the bandwidth and then the discontinuity -with \code{RDDreg_np()}: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlstd{bw_IK} \hlkwb{<-} \hlkwd{RDDbw_IK}\hlstd{(Lee2008_rdd)} -\hlstd{bw_IK} -\end{alltt} -\begin{verbatim} -## h_opt -## 0.2939 -\end{verbatim} -\begin{alltt} -\hlstd{reg_nonpara} \hlkwb{<-} \hlkwd{RDDreg_np}\hlstd{(}\hlkwc{RDDobject} \hlstd{= Lee2008_rdd,} \hlkwc{bw} \hlstd{= bw_IK)} -\end{alltt} -\end{kframe} -\end{knitrout} - - -The output, of class \code{RDDreg_np}, has the usual \code{print()}, -\code{summary()} and \code{plot()} functions: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlstd{reg_nonpara} -\end{alltt} -\begin{verbatim} -## ### RDD regression: nonparametric local linear### -## Bandwidth: 0.2939 -## Number of obs: 3200 (left: 1594, right: 1606) -## -## Coefficient: -## Estimate Std. Error z value Pr(>|z|) -## D 0.07992 0.00946 8.44 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -\end{verbatim} -\begin{alltt} -\hlkwd{summary}\hlstd{(reg_nonpara)} -\end{alltt} -\begin{verbatim} -## ### RDD regression: nonparametric local linear### -## Bandwidth: 0.2939 -## Number of obs: 3200 (left: 1594, right: 1606) -## -## Weighted Residuals: -## Min 1Q Median 3Q Max -## -0.9775 -0.0672 -0.0050 0.0450 0.9376 -## -## Coefficient: -## Estimate Std. Error z value Pr(>|z|) -## D 0.07992 0.00946 8.44 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Local R squared: 0.356 -\end{verbatim} -\end{kframe} -\end{knitrout} - - -The \code{plot()} function shows the point estimates% -\footnote{Note that the estimates are obtained with the \code{locpoly()} function -from package \pkg{KernSmooth}. This has however the disadvantage -that it is not the same kernel used as in the previously, since the -locpoly function uses a gaussian kernel, while we use a triangular -one. Since this is only for visual purpose, the difference should -however not be perceptible. Furthermore, using the \code{locpoly()} -function has the advantage that the algorithm is way faster, since -the authors did implement a fast binned implementation, see \citet[section 3.6]{FanGijbels1996}. % -} over a grid defined within the bandwidth range, i.e. the parameter -$\alpha(x)$ from equation~\ref{eq:LLEform} such as $\alpha(x)\quad$$\forall$ -$[x-bw;x+bw]$. This should not be confused with the line drawn in -the parametric plots, which show the curve $y=f(x)=\hat{\alpha}+\hat{\beta}(x-c)+\hat{\tau}D$. - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{plot}\hlstd{(reg_nonpara)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-12} - -\end{knitrout} - - - -\subsection{Assessing the sensibility of the estimator} - -Both the parametric and non-parametric estimators are dependent on -the choice of extra-parameters such as the polynomial order, or the -bandwidth. It is however known that this choice can have a big impact, -especially in the case of the bandwidth choice for the non-parametric -case. A simple way to assess the sensitivity of the results is to -plot the value of the estimate against multiple bandwidths. This is -the purpose of the function \code{plotSensi()}, which work both on -\code{RDDreg_lm()} as well as \code{RDDreg_np()}. In the former -case, the function will assess the sensitivity against the polynomial -order (eventually the bandwidth if it was specified), while in the -latter case against the bandwidth. - -We illustrate this on the previous non-parametric estimator: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{plotSensi}\hlstd{(reg_nonpara,} \hlkwc{device} \hlstd{=} \hlstr{"ggplot"}\hlstd{)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-13} - -\end{knitrout} - - -and we illustrate it also on the parametric estimator where a bandwidth -was specified: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{plotSensi}\hlstd{(reg_linear_4,} \hlkwc{device} \hlstd{=} \hlstr{"ggplot"}\hlstd{)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-14} - -\end{knitrout} - - - -\section{Step 3: Validity tests} - -\addcontentsline{toc}{section}{Step 3: Validity tests} - -Once the discontinuity estimated and its sensitivity against the bandwidth -choice assessed, the last step in the analysis is to proceed to a -few validity tests. - - -\subsection{Placebo tests} - -A way to convince its readers that the discontinuity one has found -is a true one is to show that it is not the a spurious result one -could have obtained at a random cutoff. Hence, as advocated by \citet{ImbensLemieux2008}, -one can run placebo tests, where one estimates a discontinuity but -at a different point than the true cutoff. This is available through -the \code{plotPlacebo()} function, which works on \code{RDDreg_lm} -or \code{RDDreg_np} objects. An important question is on which point -this should be tested. The fact is that the sample should not contain -the cutoff point (so that the presence of a discontinuity at its point -does not impact the estimates at other points), and be far away from -that cutoff (as well as from the min and max of the whole distribution) -so that it contains a fair amount of points at both sides for estimation. -The default is then to run for points on the left within the first -and last quartiles of the left sample, and the same on the right. - -We illustrate this on the non-parametric estimator: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{plotPlacebo}\hlstd{(reg_nonpara,} \hlkwc{device} \hlstd{=} \hlstr{"ggplot"}\hlstd{)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-15} - -\end{knitrout} - - - -\subsection{Forcing variable} - -One of the cases where the assumptions underlying the RDD analysis -might be incorrect is when participants are allowed to manipulate -the variable that lead to treatment, i.e. are able to affect whether -they are treated or not. This question is usually answered factually, -looking at the context of the experiment. One can however also test -whether the forcing variable itself shows a trace of manipulation, -which would result into a discontinuity of its density, as suggested -by \citet{McCrary2008}. - -The test was implemented by D Dimmery in package \pkg{rdd}, and is -simply wrapped by the function dens\_test(), so that it works directly -on a RDDdata object: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{dens_test}\hlstd{(Lee2008_rdd)} -\end{alltt} -\end{kframe} -\includegraphics[width=\maxwidth]{figure/unnamed-chunk-16} -\begin{kframe}\begin{verbatim} -## -## McCrary Test for no discontinuity of density around cutpoint -## -## data: Lee2008_rdd -## z-val = 1.295, p-value = 0.1952 -## alternative hypothesis: Density is discontinuous around cutpoint -## sample estimates: -## Discontinuity -## 0.1035 -\end{verbatim} -\end{kframe} -\end{knitrout} - - -The test automatically returns a plot, showing the density estimates -at the left and right of the cutoff, together with the confidence -intervals of these estimates. One rejects the null hypothesis of no -discontinuity if visually the confidence intervals do not overlap. - - -\subsection{Baseline Covariates} - -Another crucial assumption in RDD is that treatment is randomly distributed -around the cutoff, so that individuals around are similar. This can -be easily tested, as is done in the Randomised Control Trial (RCT) -case, by running test for balanced covariates. Two kinds of tests -have been implemented, allowing to test equality in means (t-test) -or in distribution (Kolmogorov-Smirnov). As this is a typical case -of multiple testing, both functions offers the possibility to adjust -the p-values with various procedures such as the Bonferoni, Holmes -or the more recent Benjamini-Hochberg procedures. - -We run here the equality in means test: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{covarTest_mean}\hlstd{(Lee2008_rdd)} -\end{alltt} -\begin{verbatim} -## mean of x mean of y Difference statistic p.value -## z1 0.03658 0.01154 -0.02504 1.019 0.3082 -## z2 20.02 20 -0.02255 0.4549 0.6492 -## z3 2.008 2.009 0.001503 -0.07364 0.9413 -\end{verbatim} -\end{kframe} -\end{knitrout} - - -as well as the equality in distribution test: - -\begin{knitrout} -\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} -\begin{alltt} -\hlkwd{covarTest_dis}\hlstd{(Lee2008_rdd)} -\end{alltt} - - -{\ttfamily\noindent\color{warningcolor}{\#\# Warning: p-value will be approximate in the presence of ties}}\begin{verbatim} -## statistic p.value -## z1 0.02406 0.3145 -## z2 0.0157 0.8263 -## z3 0.004626 1 -\end{verbatim} -\end{kframe} -\end{knitrout} - - -Since the covariates were generated randomly with a single parameter, -we would expect that no equality test is rejected. - - -\section{Conclusion} - -\bibliographystyle{econometrica} -\addcontentsline{toc}{section}{\refname}\bibliography{RDD_refs} - - -%\addcontentsline{toc}{section}{\refname} -%\bibliography{./RDDrefs} -%\bibliography{/home/mat/Dropbox/Documents/Ordi/Bibtex/GeneralBiblio,/home/mat/Dropbox/Documents/Ordi/Bibtex/biblioFAO_mat} -\end{document} From f047f89e21528cf7fb8d0e307b4234ddaed61e8e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 11:48:51 +0100 Subject: [PATCH 017/323] remove another copy of the vignette --- inst/doc/RDDtools.pdf | Bin 416350 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 inst/doc/RDDtools.pdf diff --git a/inst/doc/RDDtools.pdf b/inst/doc/RDDtools.pdf deleted file mode 100644 index c52136ad219cc4ae8ab91a45f1f647b206034094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416350 zcmd3ObzGF$_dg-sEmA`XC@{>>h$11~-BLp+&CuPA(jg@&Ac%sbh)7DObR!@jph(y6 z0b_M{-QDkJ_mAJcUhDA8+&K51bI(2R6Az=Jm^d4RoePt(cd&T`69VD@*%;ly6chx3 zRX|_~8&w++SPaCh0yBnN*jTf3uuECP?QKjPzdS-%KsRn+!mLfs`fz>i%lu;#mT$ju z|6*i^uOt676yIMC#s7<;R2+@IkM=uCbvd{=;5KLfDvOD+Lw_V20{yeeKyVun(DXa` z5YB%xDdeZ^`Ds$Pjg6(l?`G!tiKP_OUe1%Pyx_yEx#{^^H=imZ8=;&E{E%9 z3Hb9Nxqc-9KO8eI;Fu{I+8bKI;Pw{AKT9{)cbWLD#dmtSeklvTonbC^2)n$EHJk0P zCiu?vpIiMl$**|)(+Z&M!VV5F2L}slvokq^o5RjN07-MOFtV_;fV-YO+L-?E8|(|G zZ0vttF!y&M`92^B7!CBpP#_!A^RK>-@SRrfzY`a(@8ZIFE-vbZmKG*ose=RKIsAOc zxqp@#P65!j4xsbazfJsilEeL@o;A4&R63`vseI_|8_S3<810E#M%%AFKoj$JZ_(K|xHg zEX>*rZVrO*Lij-E|6u|hEa5PFprfTB93}=cwlRTW0!D@d+#Y6Vh3PVut106!&V&DQ zRbx}KOAMWwL2_r1%Z@N#o+c_UkpWFS3nnL~M8b0IWOtH`K^n$dNsfntue-*+v)>?~ zEhgZ`*$+K|QeF2>TZn!W$8A97Ry<; zmlN4aRrP$$q(3vgyE)MYJoDib36w%lR>J!pHl?)0<#xFRq9Q`Fu9d#l9)Xm`PqmU) zH5U4=6AUTEfcCE(a2z<;tkGw?Q;-yHzK!iF6Un_r>RJ>JNnYL!w8WOUB^qBArOFQz zU%zIXk~HX#Y|yEOl#;$po%Fu++8b5%y_pw`N^*p;{>X;RJ_I-v{btyyFQZgw62rp^ ztb4t5(km+^%O^J}(lfPt!Re215?X8=$^}ch4VoA2Hk&S?tS#g=CZbK;Z{E66s)-)1 zATYG)7HQUmHid&7R|P1qF`p}LC*&Y$rp(xn!VL&xe?XNn?JF5`k+_IO z^Af|IjM-g3cu9y44?_5MDieI!-r=gd*}Je|-m32PB-&kmX(HrkN$6#PJGTOEIxDDa zZJNae%3k%-yC52Er*2vQsdGD`d-J;lOa;9_ zH#SE6f`SV%_tR2s8;MTZd8TD-Z0|feGBKp8_8PYpPQkc$XDW6IS1tFjF1|NujGjC~ zt1~qv0Xi3+^mNW<0e)rXorW~#C{Y+jx2Uc`M$C&l*FsabSyf+?hWp9P38{Z7u)Kwu zrWrTlltsb+{^64VO5*MNEseLImd%A+sBNBm#HhrzBFieZpRL@^CJRZ{r`K+SKbg+Z zT)!TMvnPF}`K5<4W%8bAh&pz59Zt35G3#pOvx+!Sizlb{h8fSY(E&cr$Mi1B2$oEI zM2mXNA~cuv1|*ij94GV{Mt#PD_p|b>e8Zwi{wvz0@K=;be4kvH%>C2o7)vqD{YCIJ zhKZ45<(P?JdX7dYceZqIv$(Yn`J?MVjX)m=;56lx{7BLigF?t72d$`034vCxFOj+t z>$~1ubZ_w=(X73`tm5y(i+KD(CL_!RW0o#OAx=i{q3bH`8iLMc9*veo)-}f3CaF7H zvfUWt2MvawQg;+6#U$vCKiEf-h015f4JwPy|24^>Vgu3G`-5@SHH`+s+ig$U5 zx!7#NF9*pjC5w|tBAR$p%hVAy7g8&py4OhWWcH(|fmgg?yTpd_wG5F1`B)BUhTf4_ z%k@Qyumq~09^_a@UFva8iLL?NSgHDK-)jrTj-q7hA}wVrN-Y=Xr55p`VRJ`0pQ)J8 z$}eE?nu|J5ikJm^hJkw%O{Ct$7B?MOzm<}ssJTwD5x>n++8OWQdhgx9{`yCiMwMy< zsewS*&lNo*C!qPL_b+dM=w%Zh6+tq-l=(QnsG#FBe%mGHO0B|AgQvT99$boF^^9e~ zV5?xQUvtTkxs1%);DbeLfbtZNhr6)45GjYBZY10Lt^bDch4y;LBn~2C2IrJ+ug&<5 zF9N=u|AUWVGtU~RTS0`{PZShRgrL29AT8^l^_&2do9^!LhBmi7bIylly^PccrU?9T zL&>@x1ysY1lFwXEy`e~>UHhwOz1UMGhMstf2J*Zu2ZzoYIr|T5uO56_nk$`I&4uU|=%qO6^ zu(h=fFrp5K@64i52F5uvca(t+Up~&PDB$VLW&l3UtOMZVYm+mpM;XL_J~4>@?Cu7h zzFhA7Uq<8qG7A5fQTV@%!vAFy{x75G0XI14+seOMH9xHUoIXr2V3xzrcS6>}`Yt9| z#KztPW`Djy4n43WSPCo(JOC5`D^vzR6iA1Qi<2G73F7ACVdn*`Z!TaTc+Z~sdD*%7 zAwV->V3MC58O9cH7`v2}5n$fS!mKP{jxJCR4!(1H=Qk3+?9b2K`Cn;-aPR`m;RSK? zasjmRgCJZy?0~UzMl%Qh8MFRJ8qaz6ACbt-!46RLjX+)~`Z(d@k_+%@zX3j~&YW8<(N{eC!Zju76A5S3~_j z*g+^4A3G;-Ho1AA>`*`rKzX>?xd4!M#&rl6*RSOe*ug(JA?MoRzuGzub{^pLey5Bd z%KmjH{};l(qO?D5*{{^enV$HfPQD*i2p2mq7Zd~>S9V@reh@blK&qUaK)bIR3Vf!Z zz`}xp;4{q)7Cv`|f>pq3%2H?lGg}z~7{*3G&JYea2UHAz+%3#3VfHsI%wZNL?8fFS z0G|0x+nnpx|8+0V6!LEhk^3v{zsyUqGa6>zI^177Iw zRB>~&b93_kB@4fJIewt(tIy^)-12}8@r^>@{sPR%e^238KiYq=huml457>`iDg4ISzuUvVyzwC% zKWYy#&^I>~SW`zm^A7t%lY5Akc3gP(ibpO5^1jGv{5DqBcANu{(WDpP( z3So!vK>yI|M=|{4T)*lCIkV8e$;KbMK>&M`8(94xmi8_DbL%$yt%b#>RGbsW8 zz#!Bs^2;C`L;Z903!kP0zN`OAwf94;194kU_?MTzMv4WIOI&2zhDutIIzor z+?-<FDsdS?aPKG^GiR9}OFW zom46ULpl4+@S)YD`F(tDWfrx9OEGmXypDHrC2n0&mLmO-$d@_W_24SW?B}kb4C^Q9 z^>4Lu)RYUPB`U)o4Jt*GNWsdMov7==yB35hyC9{XFy30LZfcK40wX< zG4^Kg%HG?LdGlp~7(J#I%5llp4ve63Dip)EZQ9OL#CEm5vs8FYo7)745%mZL8-`U+ z%V+w9As^i?dyRc8)plv{z z^GxJGU^KOHp|L5Bu0bnOg2FIJ5%ppyBq^(Nw#`4a5#_}NYZ1z}LuwW`o@CR)o7}Wb zI4cK?pHKwlp36Ne$6U~`p`NWZwwAOib6RDV5UB~;k&67_Crq025$8RbwU;gQW|Dl| z1ju4C{Nc@6w+AWacRn>O8kGz14``@0+q4#N9_XEIf5%q89m(&5;MVbwFVlQ%FM z7(OFQQFHTB5lw(&p^S|;Gg7lZ&8n3kJna#GN(437b;Hjw(8@BE}a~H!(x+W_L zueAbQc;|YlC#`T5(wJv1N-AP~$sF^DPYrgY;-4pUcSK7z&rJ)ltVPvi{O()CP8lY& zi90uTQbms}_|Rv&8?~L(1@TgcZzkQspjEk+JPbRyw5)B>D1{`%i+8C3o2BR)<}}sP6Jqq!=v0Hn3IByx zlztWIhHM}uZf zByo-&(zmi+!0^a0(7xcq%40OhR?B~&sI>3au;5CwAe-JiUJ*-B=u<(3!=XUv@5O)|) zeSs%e!gH)}j(ANH)|}4N9aOv$uC2MlBa7NOCRp2-I?CY}z%$X9L?;Gr;mGS{m9al` zJO~gF+4oC__J>-i$mh%$7sY6Y`^uy-(j}6t>=Lnv z<6tlp8Xwzx_2oU!SK;%^6l80Ut2DQ?i}e`i3O&U6IP97BRLMM_6Sv?^Ty!)Uc~gDj z5U}Q~+`a0Db(yW2G15EsMbllZlUuXaH_|k*FD%)_Xq3v8qBLv1NN8^h;$&v4!jTwm z=wMiq^t?d8>D$~p3s)A|f6qes@PbKte2cHg<@nc;YFQvW9HY7WI*%*(Xx3ma9lhKa zjZl(Os7y3UMfI_Z7IfA~S=em*>PJIFSmyVs^9@7%Z4NjpEv|lAkaLp6Z7VOuWMV%y zXH?Uzr-a8;HPzv^c&qK`AzFqItsfB2rprum-n6OJbC}u69F|ewgs;_D$WvJ8diB>v zT@m_NLXY%%eN^Kky(5EE(pZJlRoDZzEf*K3P=x(BrjN@1oMgUDzl_L*(&ecKF; z^vSddlDlIhB}@=zg$QrbV~yd;R$DzUx5F+?zP2mq;2UAZ3`xUHt!;t$Z|y!;&tWkz z%ULw$SRN$4-KCRR3G7$oR=L}rQ~FL(RFkgOS@=zo`|YT-7b{dAVY^RE((V%FvdhR4 z?}I;=Hz3_m7tL3iW!t56tbhd%$_`w*QZKYGmiZb1dXW?>pxbc>Zc z$9z&KsrK>-dz;+R+z!_}BaZk3Hrbt2uD!D8-R8`Ru;qKNp{ISw-nj}`?xj=8?Ijxs zjn0Y*7b#BFQtyDL_JMdwt>PT9-zBNKpeY4&3wp)pSZv+g3iMjG^Y`o*^~c1>8WIWd zaj|!Jz0@0Kg$`!H_Q_2`x~~OQ-sHa;W~NnolkZk|H&R-8YC!s~s5rZWirVP+5ZkluTb9MVY!zIIHqxhs8gA7)(=jz+jZSWHwRuI&s-NIE2pT_o z;^p3*p2B`YBl_NgvUxd<@tx+=(`Mf-ZHD1gF<*Opu6ll%d{QU%q9cW>y%txE_T3&) zk=#wR`lt9-fAqgYz9l&QfK-0(fIqkHes;j0=T7|#2R!6FQws3FL%;gRzu2J=z~6di zbwVIto_{tne>AoKua20XQ6C=%I|pDc^Kx^s^8u^-hN*aY&cVT-qUCd7`q!Z9d@bK> z^Z$lG2;i;c;sKoHK=uZZNyW z;AT!>L;n?hU%3C@Y#(5D}`@+4`A%y_v3~D?o;kRPWTfl{Xg`Be9H_y z*NMM@?4O`C;2t@P#GGj>05Ai%8u|@n|AfVV0@*(S^PjQ!Z;1PMSR4p7LOA~~SR9D0 z{l=beSez4xbpAsu{y}@yW}b)eG`(J=Y6^|~k(zRjet0e3?lQafXIpcgV5C|$%;p4| zx)Etc_t>@D)2`7mmc{es;}fJ+c+VK_@THRDnt4%b-?GDJ-W_1AH9M&GaD0elj;*hE zbi6Vbo~T7>PC`=H+b~2IGQbyxMPwpHN^%*aWU*m<^EMGx!nM88;u$j>jprG%k)e&l zBOy2)6qZ((g>*fSn`P3lH80S`>=9bLlq;IL9)~6msWm=Ts%)|rzI@}*E4>uW zVpOqj#=)NkFu)v5;x?|zBa?sXkb`Z zLDE>4k}r#t7`bE=x{Iho$wESSjIQ%ufP|L5+U)i9>!c&?Oo!-Z?x0dam`csPF<+F8 zr*ctMm(g_7Ffdncw5t(}S{M!xtmb(+p;|uWCp9d7{N~=;1feM|GExXlezY`pxObp% zF4B|E0b6;)yr#qmB)N_cj6sR0@7wv0ZrH9y_{moXPWL>_Wqw_;Skji;S}`>RuhWju z+WU|&9r~eXv+Q=Q@ZwP}6M_@|)bv%W(7^on*R7fC-V!*}$4lDnE4Vb=mH$}2@U}U< z=Dlr2?2NXJ5X}SAevg-=D~z8jcyx#OW+oZB8&{}~dG;ExSrOnR<5}V;yf9wU*xK4e zvUD@|r^FXAQ44O>r;gEKGg<7}$BdUIK%xy(? zr76y?2V@!MbJ90YtN1!~q%P$i;3ZWO-o$EI6nwD!ROt0KjvS!cgG%dP&8wQyE7eG< zCFo?!kusU5v^50|3CLLG#Rw+$_0V1@@T=r%Qm4!eT3zo9#hbc=jvIOjy;E3yn-J}O zglQRXPab76jn;T>j(?y|@kQ#16}OcBjar7S;b{$D@hmMi5u0@OwWoLAbSiSa7M>cI zIQAVPxX$xQn=pBqUNfRj8C@r;3hhFxIHboYu3{;oGDg!YP-QA)=UU=+b4%MvF(`)& z>6I7gx}8OfU0nVfThEFZyeVg2$xis|y~q~=IEvY$1pZges{>YrY&}OuCnUn&Ckf^o zb>7Q*_u@gnS;*ByKO4c8kC4ST13Mh0JuGUcvV&7Iy9z5V)4OY4t-O97ek0(!rJt$68A?UemM;zcr zxI`$#8q53TQe+%*KdW+qSj+=@vEiDYA&5nGC>3`CYkEJPa> zoC0~W_t6DN)V39&#FcBURzlPV)GhhKFHSxL#Tul(+gE}G(HyS^i(d3>p>)6*R>*38 z+`&zijhEmjKOAym2hEsui!pI}=CkcaobI~t7LidalLkMeP)+l>JBzZ?vCsYsTW+=z zUpuNbY<24cva~*ZxC>8gN}@pUQ0}8=arlE}_ui9S-{O?jS1DgRa+`dxEsao6>a{6% zDhm3@I~FZ@9sSngNYnsav3QO-a@GS|fLV9`%@dhP{{=XLN)?w`#FPGNS*6HO-$%%P zC8hSbIvvY|yt=G>ag8%tAx>!$av;~3G9oFlQsB776M4?j7y8Eq9T&M5Fd#9$tDrp$ zL6MoeIo>wHbr~TumiV(@Bw}b%EfHzUCF#H?o)0-?L~zz&;dCDFW;#CHxqj8PF1a&E z&T-sU3EQiJXka!yEd*lpz`~GzBKhXCf%|KcKHk|`&pLcr`Fh{R(}Xzcgm&9aG|*-m zASkLCl_njR1d}WVe-fRq1f7pzZC|j2#aH%r@Giuvd4RFW>KXW>-{h zA65N4fuEXf#H>+H)QdcmVxrnUgb|4Dx{yZM@2L{1i4>Ph5U5W-a9p=Jqexe0PM$W0 z^Ip@!vG=)#;mzwF!q+i|*`^ClWSR}f8U^97ea3m!V0DSC(xPVMO>6Rz_Jl{J$n^mm zFIa1O(t2KD&Dm=3j`%)OCt+Ce6B;V)cbEGuFWvVbWNJSc51bp#W*&vn`a50M5)0OG=6IMZj>*IK9Aynr3Q|9(w#CF zZYYskTCouH^44s8YLea~%cf}M3qtTMr9F-d1H(jyJSwGB4dV4wQtsmg<>53s39gG| zs&#fPg^QCMaIfeZ^S;1*NH(Pztsq9kLrz6?m`tqyJly<}RGAuNvC-?RG*(!Eq z#Wt$+THJfO2VYEMNIvH6|7;zDuo0x#;uzdx-UO3!XhAbHK61Isvzo@;%;UgHVzlb9KZv*l1PjsG<4l9TB2HD zEK7$1CUtU3RfAg&2>?qdZf&i#bK7DXy!5Gb7p&_!DXDB8+i|Lp(YGlt(+MH0!(30h z-+hfWw2M9Jw9;9`VK^)liy$$RN1s~--H5{{|(W*V_Pa_`Hbb?DI>A2g3Qq@caoLf2+;; z0m%RJJcXap9p_p41UL72WR3?gayj|=fz%WrS%wn`MMD2q`1xfO-|YB*hmW}cSa%kU zJc|OJQOE`5XXghpD*i2n|DB5g0#F2iAP5gHuw_8H0Fbo63#1D`&cWWFr+WN7g8#z! z|7HuJP{0WS1P8wn2;>m*0f|umlE7~zRp(N8hPlp9&flWZbMW+SU4Q5X#E5x0|1?JY z2T1wTbieKg`Bo_QJBarakoyVm{R+tavj8dJ!}$X!10u0p{}_~M$k>dFpA~!Hw*?|) zZQqbwhu*})n7F{=RzMFz<7GAvb<2!-q^z8Fa@c)WYD}Gwe6u+4>4NRj@rTaGkK^SC zsc1et%YSdTWtc-WB6}lZN=`y!LoWSdv9w-_NsXkRl*hW-`%fkU3f2RbN3esAp+iO7 zK-tB(H&~^@P+sF${o9T6=tblTsX_Ttyl8K?ogO_fYY!GId`YhGtTUH{nV)RCSm6QA zeP`LI*^eYBmP-gGyEiL_WM7m-KkA#7Jmomf$frj}Ty8R`sVJA$iS4Y&uD{8@r>irE zYhfhLI9hd3#r?*S^8n|BE=$P-DToQVV=1~~>WZ06kWoz*F$nfxO6}TSQe(|+dS8~3 zq~|x$wewtShefnh1vhs$1co=&8idhH*wgw@)8*x;H3wH;8W8*U9CJy=KDAFXf!b!tfFL95D7~a zGrT1xR`?z0DMiP*$EiR@{lmQom%W(@`M`3DzWTr8bK zA1~r!`t-*@Yb9v5PBaytY1wir(JTy#i-;g2-U78pR5fJoxR*qzuf14|Iu@HMVvnjY zQ>*1C%4ns{2Jf_`#Z3_2yR&yKdLm^o4t63Lf3gL@^{{|*3cXZz)WYTqSzwKmq$yRj%mAYFG?TxdA1?vaq9X7D|wxk;k(vy@)a$)h6 z%CUoXgE0BS5wu22!}^)EEBmk5wZIz4PQ#Pt*+nXaEjTi)DNY6jrYVep1lQ16v5W9- zJn&3?n>tb*#4AodImwzdo}Nlkqa3vaDi?nD&>#Qa#4Dx8y>GA`bTAkmbmMca9SirH z@5v4IQKFb@^eeh@uv9#9BBY4B74dl8CPz*%0(k=`pNe$ML+-f&Wty5C%P>rO-7vy>RB()Y&9S9L72lywFIsM-RC^{8<;4lRsx(;O70;Wdre!(B zu_#kfJrVC)`CkTzmB?wC(?HEqEBSFqsvS^3WDEZJHPP71q&wj z#wx!A$*0;vMZMw?gF0UKKl6)7Q@>-{9gBxLl#H77A!F~ITZ5X3ttvPYN7jK$$la?y zWs#=die|%hJZ-vrZsbEgm>4XE-i#$r&$3G{OMu6wu=E*IRsX3lC2%bN;iVqnc%!Qg1~1Cb0OQm@wZ;O@FWtes98@YpI`2nDgq@e`CU& zm(K#G3y?>8<}3TzWcg7melZ9%6^!lxIqlz5OabSbjlC664F~*t-U0&Tqp04}WCzOQ zVDdo0Er=OxZes-l10};?F?$cEHNY(b@qF6s`j`0LFKLf`YTZ&r8X{P8Md? zFgQ?(2sX7abF_zn9j&c_aZK2Z%^j`pvT?E7nwYYDo#bqTC4{ND znjO}Y;@El;w;|!|mq3O=_gvYYN%az=-$yC{_ulH0n;Rc#3zW(g<2wDGDn(}ovPf0!U-ZHnZVVs4?d?UJSbbncOJ7aSGhWjzriMH|{^yow)WVXk*QRhe(dx8diBS<57wwXelC%E1(pixee zA&6-nu0m*sp&MwA6^9b&OjiY(T*I}JyO}r9vt3-N5m<%esCeF4Y z;lNc`CHZg#y_=PR-?k%X#h168dr(Z9%AA2pX(x%r&96ww?*S2`!n=rq_nN+Q=HwM` z6CZSWYzF9yHeR~)mU7dwiDXlRQDA1If}Bm~3L_b%tWWxf$PJ5{lxu+za!bCvxhei) zxt)izgvmKGe%n{6T|N-gcdAmYvZsdfhk!67-rb6ei6Yy1#jPyklPEuh>%w^J9Z4V6 zHF;L0f_a^+{7+KuT}^RWW|Iy%tS&NnEBiaTwFgoteFAOLAjJefafaDtS6`7KB$ut? zYfgn+uVTX&Q7)M znBVSmH$!Qsk!0+Vi%izC-?04CmfX8TURCc(;e_{!=tv@~AE*N6E;6R2ee0XY$C}=%vr?A;Q%d|}Ol&!gT zxhuG5>C@BGl0}u83cL4ieF_s3J>jv>-N-S0tL^Q27FWpR^n6H9fr-;v#+rp5P@Kkf z_tl$L9)IrIy)hk!*dAGps5dw#3iHOFRFIx9ty&A(4IN#6$orTp!c5e^^)M>z1#j5Aeu{-P5=2LiuB*&#r52l(=QGMlsSSOCp) zMjBwgV}8+MXMdd$^hKqgX}KTt`Pr9%GCkMbKzbseKY>E=b4>`=HncSr1M1U_4B-wx z4tlN+{||#ge;ia2X6Xcj1Fz2jw5c^vMGcG(sLb=*=%+c(l<3(UI$$YL(KDJ%fM#d0 zHD$f;t2^)ZGa=u`{4(XYClFY}!de)3b;7qVFu`ILrr*lOflNv+Zm^YwwW9-wp9gH` zXak2?!c5QZ6fUrd4ZsNCH4I=gdqXD}*wEM!4g(uo*c&@qnOeeJz;Fvole6p2*xtq( zY-A4u+5lY)jg5g)H?WBXP?_#v;Q(d_D&0(AreJ$uxnN_UOwQ8M@cWm*MQ3Jc?`UOd z=m-bfnAupv?t+aC&&G2&yIRif=--z7HN1GvP~o$Zbn7$m0*k?%ER12m{R6NP#QFW+ zfpYWn{Qbp~mf)`^i#U9Kt!dds~5<{2JLK#DH5biipi&6xNdYkn5NnFx|>ngGikQr`L+h( z{*gb*YgtVUAMA&k#IsAyA(7!`255-bn+V932s5^2Wg?_|;z-Fz9wQN!$wYf(bv3x4 z{lhB*LJFhba~myWoecGNW<`pQjn ztY%k>CMI-c5Hs$wfR{H8GH|^`Z+rA8znt87XXvsO%NGNOi0boNo4VzRHMMom+3sU6 zW(4oipq)5UlM);;ybJ-y-4g4_lLg5pJlAO>3PDL03A(wLk+O%^c#<<(oe(;82Mo0`nCD5Qe+S)!q$HtQHC6{jTu7P07yKjfVg$YDu4%~DfmQBpgoA?2NZTKY0!Elgh8|AY= z&HEG!$S9%&ij;BajG`ivNF+B`GnF4v76z?6G+owNW`p2|fxjN0(3m(wpouBun@`|_Pau#L&Ot!> zT3jUBg#m+rw&*@#4wA*qvHR3HG}U2}(fMsU#HhD!K@?@i=tggQ9Wdt~@0C`$CySPT?gI=oTvSotLdT5h)qE`QmU1-=r`f*L$P!Y4>5lJC=#FwN%F~~I4sKh) zcUxCbKICeX+Kjd>ldXm=Q5E?M!YTZX2)yR4&5n<-J#h~_FLa@(3|eNQ2#k^dNs%jt zY!734#rb5aWL$(92)9Gzn{2aus)9771jPguC>dWeDoL6$@UZwY&|1-cU`nH#q^kqP zz7aRUvlrBoof5IWoIyLyRIikIMf1u9=1pSttAot&E4oT9c_A8Hs-IPLA16K0eCQ%( zC;72}Q2&i&XmOL0cCKnRT=jiWe>qfbRGeRxU(~hCKKv8PI|*Xe=8!qjS*0-MLuNB( zW7U8{1(-_ppyQzUiq;ArjwojyO0Tj-Zn=%Qe>n?DSXi2Lxpca8WV;;+3)Mr4KIG;1 zpP>ha2aX5V)Y#M%)LyP!9^x6gTKHsW@saDJk3-UfV?*MDQw5xZo`VB}l?BcP(*rjx zk}Lx5F5Fq`<16|I$F+*;pj=Ol;SXM#cpJdo#YNAhVZJ^<*_-;d|Lv!N_Wr_tf$VM7 z2PGdKrWMwS9tP~>;HtICNo1CZF6DF^2VpkGMt46l`3%W}b2}b8GS+O@_}6f{wYVv{ z1-gB3+x?7jzec4v9>Fit(R1u zR3scVoI;jxAU3(t5*DT1&*smD#a7Fjp+&CQtYcNSQh8u*Ws_z-Y3|t?WJF}HVm@HJ zRaBhJHeAuNGp74Vce=W0$*ITF+RVDOa@^Q?ApH)FQGLV9;S+!VZ2z{0U55RAuONL- z-+n|5Z^1OSGEH+9x#r4W>?E-G`R!I2G0?_Q~BU9t#KNQPvM+Q z6yYIZJiji#TMgG~Z6yubcJ9}1;VfY-IS2an`t*KyxcfSyF(J^CCJF-&>j{SUMMEMb z{Jwgh8iO}}2`EqK>gYP?HpG&}q_W(yNwSHu9%SEcb!m-jl{79k(rD2S8weq4a%?r8 z&z^rUmrr)UI#F#a*l^<^-|PY1{4LjTcGkC=sW12T2%8yG86^n&LLs4Sp&R@UQ&GD= z_xt2Nm&vcPTxVY=N=LInvx(Vg2QMiwR9}u~x-RV`HM2C4_oZY#-S%452`34= z)y&INW%+14WQ=))ugYRQuTYLg#)XkgrdZ~x^t8>Q^~=5ZE{*uxo?|iPu+q+lmObj7 z>a%ZG$0sVOm^IjYz%=93&*~h|j3wSgC04&_r;ab<)Cu<)^2GsM_G_-fEpBQX(xz!(Zqh<$%c_w-CA5!y(^X_A89zj=Qs21bQeN4bn?LW~v9U`t za9!O&_npfq#_P~5q73=PjMN+Pjw|oqFANyh$+&H#hF*6l2EVY`wCo+-TJq>gd%wFT z?s*w!q<)SLQt0A&mek73#HM%HSICHNAE6bY73Su*3KPjk+i4 zwWPKm`rD48XIGVmZKfovXzSk8?k}q!6fadeSoch5Igoi)E~NL@g&n5sQh0G4Kh;|S zUB9t%U0~Co!T*}^#8W0A*y(4l7t6H!hRp%pVq5g%60Mg#nZQE&doD*(Z)215n}x2P z>K=A3j5^o596>oqu5q8}em)v_^5FKP`jONAb=U@c3oSl__2PhHv4so+z-K&GoRI0 zrynpD2rOlFmhko^m+tJhU--^`D_4a8Me=`$t?&W$!v8e3Qmj61J)L`*}0!ntaiI+w_oH07}y^0{2Y|4WkoKK3)QiWyc zqvl4iY$nRWR?T;9h>w%eD~o-(QdE05+(U@sXKV6pu|(g~Kd%}Oj^Uu62Z^~0V%PP# z243YU{5W#`)AW8X-UIp;G?!+U*&W|utcdxUohShTHC~ZBsR@&i2Q8w_p0z%+OzK2! zvN?;F*(jx8{xWRqS^`==Ue*L{;jwZXe8r9n#o=c6>OGgRYuhD8607DM#PKi{tM%?R z+`ZRoIf2SGm~<^&?>QnaLiW4G?tP<8cimfUHzf>g!!LX|&S{KK%?mWM`*jfo2LO3=%bF_hG-cvx3G z`8)&JhPb>=&#|~P`LOhU2z24%a-~skeZZnNG2%%4k|$}?t-`oI=X*F$+ zy~bOjSx0J@AC{2vm2V=+x1Zp#SLT%G^iV@NjBFfw)ueW>eBAHje*7w$*g+ZOJy!+( zNYHB0BA0g>G|%?D-+Shw^`q{p_)*2gEyrbiwPm(!nVV9ImAIibCyVh?dTzt9SF9f$ z=j2FzIEb?Mc(U_+_4MUzfYYv6eFfY@ zi?W`^Hkkc4&47ZID0NKd@myiR`xnm6Q6P>B( zZ%M{Lipbx)ewuY;?&(+J=s9~e>%sewx*{c4s@pCLtAK7|0p3_yo4j4#Y55JN)h+WA=X8e$_UsNTDhdt- z1Hm+T8+p#W8Qw=*G%r*2yF@W2Wjh(u~cmU>eN`n`50 zacJYULgQ=6BWL@k6h+)R=d@Qz(43!tF4ba_XXO^D=|U~u58YnPZ7yczb$dUzQgTvu zHIwiz*|dWSZ)Hm-K6PDq>@TcS5l2ma{N3jEy^`Lu=c~hHzdRH1}I7>Lo|= z^EuQf8-MInBiVh4a-$tD>S@hdluFSsjSDJw z>R$xhFPlY-R$1TMq)DiJK;oyB#(iJ*V zdl34ZvWgB;R;&Aj_6E8}K?)MZ-dr+Pkv0M@h&^ERQPfSem*~p1Vl;Wqf1A+VY{p~00C zo5{pIE(mIFjtLXE)+`KOzf)_wA>PhM_ zFUuK0RmR!YUfwfT*g=`aQ>o5IdxQDorOj8n@}Y<2K4`eBkyX$HhgbfAO|(t!uly}H zlZL~|aDYLv3(J)sa<0`8*rcj8G)C3&iaS0B9dwo;1+725)PvP@HM@rNbfL4k^sV+Q zWU_qAmomVISqOBMaYpz}l}o@Ly30(N3K}nTIh~JBd@I{{U{q9V(N}!!E}=V3(^LZw z>`{rbyTqQRbO@FqPlyNt9)1haJ>p*G8QGfdjMWL=tO&G<1Ba-RB3CvUzDbm#`DI2xk(IMg$-X=HQ$h{!Qj9k3h?0H6*8Fhhf zql~cQ?$oYL{%%i)`QEzyXg`aM=Sx(C>I&~veLY;w2W;rNpTk?PRns6>>_9}03$DJu z`1JWbg2md;W|lN(e>o33KHj>BcRb{Q{Im^UhErpWKg;F z4&|71&UwT?z`=ulbt0TPy$e?Z+9)tuJ~ z+Ja%+ev9X6QS50e*;G;e;ZW`SL+_V|dx1H}mQUK~gjQ7Z(d#>Pc58>xJf@xW2Z{#n zywbQ)n!<#0z(_P5G#H|tPq#^^n(xM}6C&BJmdw4#Gv{jKhmPJai@)qEyUMQjiuiWM z4Icb~r#6>8Q+=}3I8okC{9lNRGq&ghby|u*Ug}oUNi;6+1*)vxpS4 zFVx*8si zx+gVLVNe8;kH;ww+f*r2Ua0U%v$mVR_)_u!J$qX*45JPf$1#>#(5s`wPDd*bGf~FB z@d~5UQv`0K$;9_z3w9fFZ$i!ZI)mrM-*o~@>p0D1N814jZ`*;p zTZ6ZeM%IsIfX~LKAI?7OWvg~+wuGX6)vrT(-55Qo;_p1e9LDN;Tv63GG@dp(o}IS8 z(y_>MAa?snz;=)1?Qo%)o~$QI+im^BkA^846jR^d9e=-CvxHWX>32Js8$7YDqQ~S9HDDB(?Q=sLe_u%jZ&+XXu6!TBG|T zkV|5drydM_iprV4&?Lr=nRioe{;p<_Ybhl;qhP4)+_+-cawb%*B%$m8XZh4$s8UGH$7#asdU`OO@1iH z6$7QC(oe^yc@;t1ZF}P_elA^Tw+n@jcP}E8xu~OA@dXY;D?~m_Zk}k}eP9|aM$Tr} z-QC36<y-g}2NxozvCDgq)+M5GfCDI&ciB`P9F6;V;? zO%#w`1%h{^Lhllg-b;WWJqa!SM%P|vt+n?$cdvc+dG7r^zi0DL@_jrr z-^k3IV~jc8Ip23N&HWa`E1bco@Z0wTGw_&Bgxt}zQ_Eyxr|t)n2U%dm{(-%!g3&Dh&<7|h#6p^ZyZk3 zun(NQ=1<*#0_w*c4gJX~{cq_1ZvglYO#RoZ|9kN9-%;-qdGh{)kN*cB{|`R?AAI~j z`1pVD@&DlC|G~%qgOC3QAOHUfAD8<58Py+9?oWv2pF+7m&y@ZOR{ujY;t@LHp-(yD zQMkXSbNR!O*ngp&*iQ`S*9ZOv9sl=7@BToWLeyLkBXYeE!HOTeE5viF|3zW?J3^Iz z1eJ-cenLNgmC;n@2hjAZk$(d?B*clP|NQ%>FvrZA!F&v~hRzQRZr_M!jB>kjEgW&$ z>zXj5p}|#^@|${BRdT<40hGLYB_yAY*^@WH##!yH?{d&k)7a{c#j*`ig@Tz8{nPWG zGkh_dI+JC_U_JMOe)FfoCOybLRnVo3f?5%f7BddGm zJtfv>H`&X9=S~ABruJbEm{*x+uZ~eOyDRQF_9m@{kKx{_g`HaTFx0f8G694Iy3d9! z@4a*7v5=U3*li9rXmyxq-?CSU<9E5G$R*M_OfLQ<*o`y5`(@>=S3+BZ8_Cgacd`=cP(HM7-R^F5dfO8BR*(c}X#s&n^*$#U8ElB{W z0MJ4Rd$45Ht&ZW>bA2h{s^)&oi(c}ZC&6qpM`CrkcMOj{ueomA&-653KV9H?$HE;Q zCzj587$@9tm%p@ADzCgrxixxs--TD?LyKbfy=BaB$h~u7K+m^d_(gRwC9UUt*= zaC&&xK^tXRb6OdDuPjG;$08MHID@!C zX;Z3^k5u}Yif~*$l&5smV$h(}X?-FZaE&sbA?7|;CZe?EnI022E7KbO1PpY`P0+P6EUq&Cw+% zdF0)~Ti&K$anQ_t1%+2`Lz9Iro8nCx&!Gat&}gCPiDhTB+ohIj9{ajTgtJ1R)1od@$E{kBQxkc|FJn72yaJ$SBy`ENyf)rP z?&box1o%kH?IB}n5jS1gk(2(TTy7-ryvk6FaHNen&;*{>B|RMdLw;WXR0q3+_PuMaN_<%r!pIVXB6R-puPwzQeShvzMw&9gSAO9OU_ zLBTBN5Sv$f8>f4vL+ZlZ-?~lRX==PscY5UdtwV1>#vFN>Sx;;+m{}o0A&0#GU0VR)$XS=+;B-81WVUoTRMF{y7>fM_ip5SII+6g5NBd&pZ@3 zcPDV7fYJZj=3NuxjD{DQoL<232qBwdlgcv(YYcC$hOOCP6o4WIr_04A%Kc3!16Tsx zFTFPB#l5N?yP)mLg$90bSLn+5vh?ZUdI<0Q-KS)0Z(jlDC0>(gElP-3zTvpyu6%h} zE$518mr(Nh;K_xgJA%2=R5_m^N@ zhb)Jiw@Q3@Uyg@9>f1v0K0Sl5)RIbG=Nb))@-?}1twUZeGB320jz43uv?7sZXZ-%P z4S{Zjz|g0lhhi74+;lf}Lu_*H%vqd53KXn7yy&r_vAz-+=cx5@ld1F?g|2cP8N;R0 zPghk7Wotb&n>Z%C%93Zi+q_D_5vP=IpKD-^ZnDn+q$F!(<*18ujfF_avEI_T-@)(v zRnhMD=UYx)>sPyn9$dtYQ>Wt_ z-d4Up>42gP23^HB8YKyQ5EiLaSO_j}j5ks%U)G20*i2+V7@s|7+uEC|r8$iPQ%C!JKE}Qa%;MV*qx{zUdNj8mxc=n8na=SC}*90x? zYw1+*p|L?R0Z1sRgPuhSZCYv6rQNX-Em+GsYfxxEn^C1wVGsI=dN&C|#}5 z`(&t8aykr*CB1aoj}V8irFx(q^Qhpq=mir;+IVKQ_R}?kkSZHkF7L3yXY*H@097Zq z%(G8qYp*^S)uPC)W%hS$TP*ghd=&iIy;pNz4oFu(E_A;!pBpKBe9?ObySK~Tl9E(r z)B06N*;Fd1!%L-2dpGf;@ zqQ||RJf*%+N{+uYe>PiCWco_JzD|B!E(D_1$Yg90l>@3Ddmu02=a(+Zf>QEms!Z5_ zBfQkxnis#(+dtVYsRJkc$iS&3UDiHrVykZ#z)yE#tnKx=T zm$|_=^y*IH!grhIpaZ@*3Y;~57Urd-t?GO} zpk3wm(Mxj=k&E7$VYoTOn5@T8ip9DFYM2Wm**dYZ@ zQ`$VmRQ2}l8#6vLqDjHxpgeCO(P!`;90EK~ia#kFaP;vk2+h5o`lcZ)N3Y&0gozbD zH#ydBRU!#DLgn0az2OrpYUA1yr6?usd*0(ryOy(ybFb5lz<3v$5qEbZ(GZRuOKAdE z%r-i6@JP0o;_2CvyFFVzymJ^^lB*_eV&i_90ao-P2Iga_&yRcf*v-;Lr5~Ms6JcGL z67F@Q>SdyvWOL8zhTyZt%U#Te#Yjs;D;UyMVk363`TYm?WX0BA&tlHb-rzwDR$ z`)ztZmr8%!ruS2^mw4-6+ot!MKA)KMFB^b~pF|j{a zC;C?m{e6ky-|JE$(JPS!m#BdyDkdyLv{;;|iS>h0;fHjWl*IqL5Ziw*W%tVf`QPbE zacLrD6H(ypzbusfA*c9nTljP6{!cCZG2DNXIU|a55r1u2BKsB5QsTyaNok^l98vB} zQi7;WCI07qXyxSg^N_eOk!$zwbO3*uP5(QlNyrj^P9hz~4}HBK^%@CTIbkUxQN<5| zKv{`D*M9n)Y5y=qepL$p-FD%>KAHd6Yd`eE#EFhXoXB`3Lp0ClKklE1DTxtJfBfc>|D}e% zpS^$9P?V^JMWm7Y`%0hKA4FRJq@e^+E=o#L@=qH6K6?B~Loqp`yCTMqe|X}rlJEbs z<0ZeV1pb{G(jR1wi2TrEL|MaMN{K`gIU@DhuNM-;i(f(uad$Ma$Ve0~`-h6-Upt-h z2ZhML6%xf{iLB0lwUGGi=?~^F&~X`OTIhY1>gjkxvX}nS?%|j2rFYzxMK>9#y_&fQIDPZ>)iJpO2Wv#jjn@!?Qe=-VU4TGqqm4t1Ohc4On_A%L5x~MN#o- z_Bnzjd;lH{rD}1-ol1(j+GBb-)z&0AP85>v#r#qlLFWXrTCv9@&d7GDj7#Yu+sWGR zx~2xmI+6`$`yFDX*wgEQDk^(4Orgq2fy~v9;S~lq`q(=_5}FyD5`?8v>VaFg?sG`N z_pVaIS~puEuLdIuh9fw5ZXkj!Dtvhn9=n!9FNXMOSwz^!5ghCp!v+*uJwtAdVKC~U zYVWMeDjM=KwNEBNmg3<>+2dYgyPgzuAy)U+TUbPZ4vmk3H2 zKI7XvcbuHcSs5~TpBe)&XgyZJs;>89*0Yizbzin+%|1=acf2>&x}U{u-=M#>vhl?l ze(?$0=qTSZHjS0%wb1QeUv0^btz`FH#gMmy6I4MHo^B8|XUa+i20^U^X2*2USdn@C@ zc#hY^4)|lfFtQ%Qd9TQ_rBzq6u^zTryH+0)WGa%IGQvDlOh1w2c0P}PjUrO{{N*%h zPo)m3b(mei%gdK4ox>fGK6htJpGZjraffB0453N>civr_jWT#9w)?{OrT@UGH{&-H z6&(A@cpT@IRWw#YhG()VCvogzI#-U*S+XhFu(#wM7!7Zl_GOsA*&?iqD&ATAq}Um_ zc^zp=+0K1gl@^`MVrMYUX8#bE$b3kZmMo;~Y+@>>fhF7{Ft2O$@+rB=Rm}y9KeWDK zY(L?8Id|E+;7Q)*VCR}j@P*5=8>95=cYt}?F)axWJ&)emOes7fJ&D$2Jfcc0Xfn$w z<(Lr_Dr!8X{zWk($8}&6-Ta}*R$FH(1#l!GNl|s-&fC~x0h#FUA0Oo?Fj0+mb|){t zws@T5bk6MHX#l0;)Yl!+F*YT;Z_&=pE7XaX;MwV?>OZ_lwD-hu=9?H8uAGf&GVF0) z`}(C+mrc7=H2RX1WZ=;#fb4NsA>YZPjvg<5ZN;NFn^3Du4{szz%sR54x@h6iK=W1C zVe_J`NuqO7njPPMdQf{>5v;qOV%#03lxN&Xp#tvdU4EYTv>n~*W^4wnjAQIxpA9{B zAq`F?HL)MBJk^q_HI__%{)@X!YWl;f$wSD(=dW@%0tn|$}?4O{Ml{Ft;y$j{HW8ZN$Ic`fL!dn%nSm7?z^CEGVO3ekO* zr)Rga^)z38z8`e&Y;#%bt4ZexZgJBKb`Rt-OZQp(Hrs^Fc^U9ms@;-@E9;VR48GBd zng}Dl)pUli+s}=mTfSc`hPm#*oByz^Y>%b?si`|1?=NnV^qt-e zg1;flw4iq_1<{9oShx%C#o(TN5Bbp_FjS&KirC*Y?*CeP^HcQxSDSxLZ+vHbvT%Yu&=WpcrVWU@d-&=NtD;9R$2i`B}^X3iij@DeY5!BQbfiYzwJqyNo6+ zrjM$6H!H6uRE#Bj_@Hv5S!=sIfmEzPlhXcNvS7*c?+Pd<>)en8*P8KaTZ6|J&FaVr z6sAX(3D<=yM|F+&A6Q=sIVTxX64aebAxbJ$lvOx&sk(h+P4lG=>kI5mhVG{-SQfR% zWAmrcvy7k-plfGqM<$hLppPuZFXB?=bW8&MBcegig!a1bT<6;Xg z5_j+DlEvlZKkDN=-@Vfk_VA`&{RC%z>|KnTJa;1Ng|Kkdo(QYtiP_KDw;Dr^LXnLe zyr<$4USFq=4crutJkq~%wHxr!n2Ge;{R~D~5$gCGc>-Jx#Cl>$=>fjLEvm&qez=d-eXAKF`?nzeZpsd zUey;1cgr8r6-URZWGX*7x-=uBcEl%4dw+;!15cm4b0bUDfSiQPNMF})raV^nl0JW% z{)U=)hqLTAwn)tOOWSWQp<%Su9{kfLhxd@-5SDvc7U~YLh0uvaCOnP@n0Q>l{MY~N--wk){uq9M6pPSpiZun*j zM7={|k2AXv=a_Ai_}+W2aLxy#wC2A-t4rIg#vUaQh>ZyC_5TNZlG?6i`CHer=W5Ro6C1P)5ew{^P?;gyUAF%Vt|Fc90E(g&%!{rl9M_a@$Te;M` zJ~~FTNw|N54U4ot2?A<*No(Utjb4?j{Yf++`o!Pd@}Eb8pI-2f(SW#5<%fI!t0mBX zj0QyUs^1>_BO3g)eQ_y7~HBJ8#{k* zM$tLZM~&TSO5sUXW(e#CP zKP5^jeD6U3KCh1UH$m$w z-zDYV85E6)i+ebwX=r-T8%p%uKCP7@5(&Y|PV*ekS-tkS?36&?1dP8MEoV!dG zs`3%jSytVHM_hYt)(h|O3C{*xlessRoj5CPKX-8NYN}0*$A=8k23^iL5BpCqGb+{U zOEnj0o552RtuzAxuXNO-7sW03$yy1e?8?!CSNu3>=)% z5i@66KW zc`^D%^U^zquqwXSp$5v-dg=PIq7meJiWBT0HtN1sfdVbzn=gbjO&&U?le|c@<&6rH zIM(&qw>r(l73-5Y$`0Pa?C{n?k+T;=Uji#qx#0<(RAyT&S zGXjA#$YKC{s;4!!TIJzR$yARUByXbjNr>`F>JYVlNI@~*VtGx=^~Mp?iU%&IQDKz? zkxsoqO)&Y1cm)9;^j1+vje4E{y3GN5RAWG2R<;P>RGa=YSNQu1;(y}`e-_k!&wwmO z6p{P4Tp>}9@9$mV4?F&XEBt+>^fy=d-|sa1w{l@|qQ=^99{bl^Sd>_<{foJ9$zvkP zzwCt;jQ&19NyY64AFc`yD@WJ|9F0`H!({8Ys=@#eJ! zVvHgG{^iRfljbuNjHb8CDa+}uYC|2SVCP7x!`oR;ErQ- z)Q2|V)jm_(Vm&>kEQJg}jKo2NGWYI7#I0u(!rq<}t3@w{v)3t$t5#Ls9?XSa^0?H3 z#@%L6&^KfY&tYebJ{**|_+ky+-JYl~npb}2;DI1QFp-qRAt&e|lu{sG97U;X$4INh zxkz;C>uGrO8sQAEMnH>eSq*V*+&5<)-LzV~Ln)->6`6DnuE?=uPTI)^4`)86K?6sm18uyN4DZcP%0@G5p9z z{*0MJkpgC*Tkr%pufHxv;Kf&*qsc4antg~vB zur>PB1GgI5FG%;hM!oe?jEMi4gBE*FT`3ANT)6 zx`?QY^Ycd_g6`I#Kr!W>HqKO01$2~#u?Pi@aA$jL{x!vPyG?5%rZ+sK421dU1=esCKa>lN;l-!f^qkoNM zUgQ0XIYnf1xE=3!+mb4e^}adlY&~I(KzYyOg~b6)aeQnfr%e3Q1^i}76YgjS;D^$2 zAe>Afd!9R#908s?Jl+nStbKq`Epq@992^L1I{*->3W$aI5nv8}m{5}%z-&#kA|4eA z9$y2WeC=CX#CG{L;Y{`%2+(9OKD~BlXAgAE!Osn|R|`(?>X`LAS%diD)*$%GxlYs} z7(8BU;zy7Mc{a}1F9Vc72S*bPxL)|t)*=`;u!t)r{@1$^y|w3u@&JR5Tq6NiN{S#m z+?I}YwqK30-0C4=uw1mb>B*Qwz5kb5JmT#axQUZf(WL7$n(Rz5c!x zvzU-oU|T!0!y0o;HaZS~vVyMX36Bz+BBFYli@rwf$qEaw7~$XUNu~=9xI!mhA+};B zO9V%$F?5T=%?k}{lJiW!8JVCmH-iFJF%1+N`pTdHiO2(~o+J&pg0`ICQ9VM*-@ z7wK9=^3!24=qO=52kG>J0d$^k-oV2ctA-|O#zirs6LF*NV;i09f~uVfmzEK;S?PlB zc2$5Q>d`Ni0YR_u7Cta|!~39DwKSM0j>(zx^zK`7Yph8QHSIx(hm(_lz3ZBTTsdahSKp1$p*TMLx3vvcql12u*1T-|i-L+O2 z8THuOEtn#m?ua!y9Z~|u8ic)@K2MK?pWOAUZE16LQkt0m)(;fEejs&Gln;k7@P)U6 zy)j?mWajmKfm>a*^VBOC_QT6ij=c+udoOAgR^T*nTy(RchuofrrZOl_kzf^^>97;V zxKDoa*cwoKT6(;j@U^5((*oT1{X2AxcVro5@D_waF^|{GBWLxCvO7lMaFH>k*=anS zd`-@w!eCWEW|rht!39wq{B^2U=7}Tj@~*~08Oh!xjNgfM)|GgNouS19JW2St5U5R9 zzcp?ka^MufS=-t1GV}HGOjyh!i*P8!fR*^AUjoy7BwDa_#vAiOQ47!S%B`jnwiXxgI)q8WEU*bTNx%T` z`wlzJ^gdQ+2;ZMz-P6Ax)u!8`Q6GK8Ec+cCz;cnBY>5uKSGGzRw)Z`Na6Wuz_6a?K z8G1^3Nhn89a*4l{xzgd~=)_~*DmPO|a2MagnPL$(r;fVdFxDAq{kslNKnYK#$jVt9 zjhgfMYQycPyQTBP8N7K{rj@w0J6zX8@OfRgA0|jVO{es?O3G04T(2}w^~B6xeywfj zvJ^J$&pm3wpR)? zq>B23!oQrd)?G`Awl`&5e4ZDd7yq^Gmb*by(~}zM&cB%@7LjVGuTf{UoG-Y3rCvvjmsWOJTEqylD9)9B*hOoC z7+X8;8-{fk%gv=N3+zc38zZg`WK*)bIgzjqrUC_fD}*>c(o!FHm&2k+*fj7rKo1j= zqnftUC0x$-?A%xvig!2)?@H)NR)}}=o$+>#a|p>a)HU8fP4u!uW-Ilz#8$ytz|ESe z%x!)@sb=wH*82;aHSyN{lan`qb*xV&Cy}+nMO&lb_++J5ZZUl?0P!Rlt7#D<94y@_ zth96B0)zPFJ=R4s|E>m5da2f3?^hP3qC<<8kF8S`LUa4-h@`o73#|3>bte04B)sx+ ztt99**G|i7FssKHEOVPxw$C4(3wd>E_CCjf7#cP~EsfwL_nJ=5)2@%YJJ2!^xpauN znOLgsdI53i?dvicM09iVWdZmhOJ&l0)Jp;Argtz;39s+oTPLhp5cMpai#9U3*`B@G z{88muuOkTSr22Xh&mnVc&j(tveb#i(>DdB zqAa<|H?M0fPU||cAA#YOh26)~bWVQ7jN6vnp@D%Jv5@=5iTLNM;{*&FZ(A6QDBRHz ztRVax<&U7k6+-MO?CYZ8_@I}-YDn~FtI8~o-t>D}Pz*Ns$+0!5Oa;5=8(m{n0$Z;) zFXY740$rR3r0JggbVBAXzEvzBLK2Ax=`T|r+|oA2x%6gRSZO?wJ4NdpKAV-SNQRlE zAm8mdQDidOUrg0SGbB ze9DnW;}Q+V+t^7_bepcIEU$%s^^H$2?U1K}vpT3|GK1Z=B3_^1+6`qbgZGZ(m0;uG zj2(y1ofb~q#2a!-njA}9H036aOJ1vdGS7W`%kDl!zS$kr=jEH~B}H5@X{yLohy=tt z%|Faq_NwmDwFKy)0zV_jR#m*&)KGjqq~vwQ__ri^pz29~>}%&ZawfQ&coyK6yXeeT z)Jrg>JrmGZ$$jWRbptd*358nrMqqs;`(jQcHSxFbGE}(nX*}6;gR1mLP61I(o0QQW zd~@Woy~d2(CT#4e=b{|c(aB014sT#gBA zp+fB5S?K%|67P;Zg{5$e7)P|!1>p%IjkyIjoh_m<3s5(7Bz3{$_Rdysir+jFbS;Xq zKKvDg;i%p72J;b9rlxllt~9#QdWsS?5*4)uBbCqcNYueBG9Ni7X2$}cJLjfZp3^u}mU-3Oox^*cu` zo9e}O01ZGVKedGeRr@%=mV}GQ5>@Rf~8o+Lh%f5_DRB49GMg z#?!0452g!T*_*0sae=Dunol*-I&IgtWgD$Ml@r|#KDluW$W!RlQ^j&TbMW@JRuZoV z_g7e3`euLx8lGT5VFDe{>y1MWGro!wi; z7ek_KyhdeyKPi2F(17ux|3{mQadn$6~rA7Cl#6-B!7yeV!vYlXqH4*vuDQ zRJ?li6_yv@W3P@Za(EsV65mYv5YGsOLXFIQyi7L(50y>)ZJqUS(dbwL=KP%qR=K`n zTqhafB@P{F0bw}gCY)PUO{vL}z=ir;mHuuk5Q8>vqWnw_w3^7aoFPGmPFcptcK~`l z%;S9*nTxP5Cd?H0;Xr{Oy0dU7deOpdl?xwvFJ_0lSI;v|Y64PzL3NXez zXJ5|P#i)Ml_aJ?xhxH4Ja;>1YZcJd)wtlLE)-L%G3EvZh+(8@K)0BJ0vac4QjKAH) zbja8j&kukanBpv*>zCRwS{V?pwd;w{MawA?=sfn&Ti#JoG@G{4KYdkdZ1U>j8(i9^ z$JpdU<9)Bh9dZK{mLJdzq8mK7>)SclbmS2+s_QuIf@WD` z_b)P^!Gk+zV+%F1X}lU%t-Tv1_L7_IbWWOgy8RKM{nnV}6Is!$howE5cfHtXLl4$G zWn)DiMujTx1Vfi8koc=I2|aKJP9>o8?ldQ$ry~~+b8m}AD~ib8H~xsd>C5Fktdxro z2TV(G5VzF1iSKm5C&raz7aC@Iq@Z4_fi5HzS+J8W8{nQ@EID%0ahjV4@&oMj9 zi%x3H=JC8KemVsl48;{&Z<~(wV5?qYJ3;=c#wg$PuT)Ljqq5nG7DN*gP%of+1vagF(>9?aj;b=mR*MDva=Sn3NFgUXin0KIS)b^qz21R& zj<}V?XZ4bO>~xxq9Ve^@v5zsqmBosVP1`oKY$EcAGS$1jy@WVaA^h0C6JOI;RMwR> z>C-J~?7phkjoN00dWkTy&1Ow6#4cLtdn+p?E2CW$*fvGjXo1$718`alcc>Exd*&FC zLB0#~tdS1bW|ZA&bAz?X*(I$`VriDjl8>YXi+B)We@Ygk`@4EL7~_-xP0uQ+j_Fgp7eGX91}E~ z^>R@FMYcWiFgp(v4f8)L#4X>g!zyUHYX`4@Ri0OTP)!d@@;Y(ucZz8f(f?#2M~S(p1Q7xHj*2e~*B1mm;} zOMMPjRBSayyTI4tt*&1k(@{j7=~1$p*y_MefSmC>GsK!}wB?%DOK?I{^`ewAAwj7P zeHF0d1)DY|UxBVlDN%R!ba{4p1rp%TP)ndWJsL+o5e!hgOul}lDP5?OX6X8mqKxCU zRT{5|P1cWKDx$TBOMTFfWgoGp^b-Le%lbLO5Jd-t&AX9^>)5bkDY9cmks6X1nBj7E z+A5j73UM5w40u>KZQ}|%{Iu4NUz?6Cl1)DaY|4DMfQIk1mWRsK+mVN0FPm5E==pXX z4<3!y>NBq$UO9qkdLOAv_s&Mm<(ed8t0yya9g>wSOg>Ms{=jw^f+1zy1DMN;?sLCR{k#tUHY>b1t{DVw>1ZZX=w0>Rl8p@C#y>vSm%!!hs}Uf`Wwt zgzG|hwf|!(NEen-B(j*un6Cey=GVEb%v0welbnD4lxPC_2 zjdc&}CWNm(wjIM5Z?(9Ji{tZRKU&}8)2Vx-!B9)WSNAR%X9SNx>gi*htNnVgb`|U? z$Hn+)^cHUjj%iPp;MyhMbFv!lz_$&V=AwnB4lL|xdh36uhuUV8>m;`Hp+AV=RA@fe z)~&2jD1*8oHwmaSquC|zuCH47P_JgkP z;HG;Rl>OGpO{|YR*2zUgx8-UmYj#@KTFd#6G4vt6A;ei{*=ua)FgXab0-yGk18aQ- zG$2wRVjTODKSBmP>h_NntU>ps4|P^atOqfHgK#D|A#&MoP-lRb&?K=F<&*2Egm2BX z)2H$_SCXGT*7OcpwI+aIZdl!wgIPH`950EqyGNgaN@#0<47RDxUBlPuBMV+0wg2`1s z;wV&5LGV09SSpDxcrdm3m{qc;9Lm+-R9dC9wj+9md!=;%)SWgAb>Lo%Rzb5(OK-J_ zo>w(s#bwz?k;y?L(N`2Klu-tBZ09I35nEMhB3_VB*y=Fjm9aw9$Z6B2OhZ~K%=F#T zy2bF6$?NsElx)p6LOl)BW{~n#xS6^YkZBU1FZzf=*(6@+KtEZ@j?ipao`+v3l?8XV z!7v`v#~H)4@S6SO#U-ES6s(^$vGr3;yo!%t2z>jUmmiOQZ=mOsI(+LfsmaQm#4P0s zY_-L@CX@>oiRdKt*oUB>DluQ%;oj!k)Pjt(Ox=yIR*IJ&hxei1&vTz99{!PbXnWb@#cpqB4XRUm40y zz!1A|l!04g@g$iaN{0vf=6WcO{+ zOHo*sU&q)97c|mhhvDVhl$eg$8Q5g#k?6+Eawm!ep&a4fg{>R#L=*Iuj- z8|~eCQ*;bGV~f-$`y{~y5G|mpa{(35rIDYR{o+8K^@M7)&&oDMrpj zrwjVfZw)Iu4p1b{P~=c-GF)z)a2s6?4qlCdXMB%&Q6_%S=Hr!xrSzhU(Mf?yfCwe& zXp)sfW{kfJXXmWN%T3;PxPsFc!UZ=6!+&f z$Ht5aU`%~mRmY|g8G#Ab446b#Kqz&@c9-PQ3369q|R)j2_QRPTN1)xp$#EBudL^ zS9X|@Anwtux3vm;qo@|Yu28MZjZ?H4-qOZ8PP?i2n?9i6S-wcTq-7ZmhI-n<&W}xg zAlWx#Erv20kr6LQs8XyuSoXXleJHa^PMqx_3ca)fN7k|s5!toZrn3^Ww208~Lkbw` zY{YDq97mUX+kw8C68icK=_tS>q$wpPyJ9C5M~^&gkbWkT)Rg5-v(bTF;+DwzaF7dT z+N%I9v%-+pRJc@HQ$pt|XBl4a5&(#(1VFB*G;Je$8Rm$K^g#sKbS-fW%;-_RYINki zWL5UwlQ>$4#n`=|EkM60^Vt0e zK*EUI)HD&)ClPQQcNM|457t6-&PIp|uxN_~t}SAvegI^IsPsF)^DW2v?NVXHOwOSq zP^X4m;O!`{E_486mu-ef19VOTLozXGvRq-UjC*1NwCDwXpvCmWDrHXQL*Dp>95BDo zNr6n>CzxVsP_qNXsMEbQeDXaGXr`0wb8wuw(>e@5V$u+dP>G>pc>Cc|I8v{f-?(7g zqb~#@yQn=a@sODCe6@g7d#G`A*Ai0!$Ck`WAk@Le#~h36Js>B(Yid{rnVy8gZ%DNm zIo|{f!e)6f+%2`#C?yD`98}6=1;rI1U-y>Yux|jM0I-Cg>S5@~O2%D>x^>`#*z@pL zye53U`;+gA#6fhGR;-~ugm+v1Tqex=g9vPZi+s61Gyx7eSZy-jh&b_XXTaZ5c$ERs z?}mgRy)s}CngxC~hGKjAIQF&L9b)zFrC;Z04OwN^PWTAuf{D)5fPbz@Jm^4V#pyc2 z8tLF1mk-3LlvV;)+zhB)oOr6hrb-L@@Fn(Rl04j%mTX5A+*?>lKX^}*a3!lY9QDeo z$^H?3Lm=h|Ow5P+RefGf0pXD^frFu}lZ+?0;F+}TP|vBf?c*U*G#CC0uP@ym%Ots{ zQom(jGu@)GS#RLUMB4VDcomLVy*hO7!pYGlS({I>!V%roWf%rx)dp2(TI2CKxi$nv z4RLu&g$X*)*Z}M#I2nJ_d+x=%j>H9MD2ifZPUgxN+fcZuzQp4mhFSj}|EI=rtXZlG zKw?t2s_FwY3sk%S)=AmnvdV5lf7mNmEW=fes2bx}t)q-r@DzMZ2)6^1EPa=L z(9$VdM1K#UJ^&X^F53y0DkV;DOe$~*cfp|_a0AgBc0i+?qqTx&L%*w9d zFtU!@Ui%HJ>`hsgi!HtUW$Gq1*#f>-0A9U*gMg6j0pgq;Z5brr$DMcRCnsBPjG^+b zKDxp>AmQXa6o?37!oP}3K5Dk?!9^aEpgi=N04V^OE@GafsD-$i4JaHu4C%%>SyOpS zEI^y|VW`^?7LWsSq(6Nr(W9g+f?E%0k)#>qnBD_MBuTPg!@*91D!Kw^;oDM=m8!X3 zL(<`=j4mg3^dW8EUTijs{K&;8IB@Nr$x$JfFFl&}`vCknEf z5YyD#cxzDmVN`(+_bPCm)o{_XeY-3LQX30iOvStQ&2ot#DNFT<>1xD|NIEw|0Q z6EIDYWvV@m+iBHG$8M+9-Y15X9>dKk~T+V%R)s|_6p z6Z-#Q?9Jnn%D*@8PdVi@S=2ZVnhV*Yl_f5jng~-)Iju~YsioplS!t*_gK$}{mwWCx&v~BbyxBU&-u?`i z#0~0!fwzqLB}hz9s@>YrY7mF5k*gU2Tm*0KiO^ni`E9Cg5OWzbQu>qWyzpT%qUDI{ zDAI2w@3|0BYF)@k!Q@yjgQ^osnAWRytf<|Jd3PVboC3hVF^q_@DCHuo7JR=}7a-D* zhAQh%?(f=e85%hY^ybcP0G%=(HlkirYA|hjMd1T+M356d0v(j9yBPq`ZzI~ z<|+vH&QR3CbXBd9@e{PmUvK~2|S6Q@!6E4a_Q;4k4yEH~0;rd46eVLTzsFrGNhFbv#+ zGz;M%k1V=G|4y`wg4HKo2Q01 zyW|dlFsYlYUC@K{fTf)=sO)7!nmJ*XYNA}bFfw_6mf^tuc#J4EO;fA`EX$6C*cDd1 zB5Fnb8(E`*#^3gh6@Eo(ZlqaA46R>=fvhh4$BV0%7YZ0rNdLuy^wzSUm1Mpgru=>x zB9o_T%A7J3jgXVl)PXiA zR3J<%YDe|NO+0k%b=px?XbW*1^idE&TDNF#E;GWv3X-8%M)l(&`&N|QK@cQ3{7=gh zKkviZ+#=IS1)iZOi{%ZoP9%)=90Z*2X1gg9wJ~MZllN5`Z|d0*H4+e%Gg;LcJw_kPjE+c8kn%Vc3>M?JL-F3TWt^Vnn~@LWe#Or#eVWj;W|P zP`^;ZojJDbgP8L0u8cc*m$TbzJp zq&aXZZ#6Gb`qtka{I&z43@j$A_N&dwXkA&R!kKiz+mh4D^B}ZQx{B8JXWUWw!{*e0 z*I-KuwF_(CA-~1S9E65=NY5RkpU2gWK}>ifeV@8f2N^93tghhGx{IN0MjHw5h+!>d z>SV$oD|R6TB%#M8Y75vzWSSXkT(vuwH|V8|lKwJ~VU($=ll>E(*xF^gM1T%R6LaM+ zjr3$O9P74Le8UvkLHMz@?LE)o8_`&4uxPde#U9GdM{{)8(kIAugmO>IVVLl7&x)km zfSCyoahy##gX%{`wvjSCrL=ggW7889JVI*y1hPb+I-d?PhO1{0ZO{m*8~2F#FB+ah z^g*(yb`sijYd)Uy;0E*bQ^M*gOO&+D1N7GM%O}(iJdBnbr5_!xV3nUnAq$!tmukk# z4QuWz@0;-;meeBMDQmT~ZG*&`A=M6X2tipaG~)O4(cwema0RjdgAufYaduIeIy6?I zs26)&W=5&bUq*99G`~^SB{bPllXK&%?Y}^o?h=nKB(xTa;}iiw*GcZAEuIuy%aeg- zz76=%+qUJ{A)Q8)33iqY3jd{4Y60GbuuOi9OoFwM)-t(Yqo}QNfB4Z9!VfLncGMOGio31?wH>zQh;ogzeb*d3{HR(t zl`K9&w5p-M6z+GfSGaNmHsYDBcf6-}l}mEJP`m_Rz@kOWAyBcZf68Ib1#K#G!l24a z)&u+DhS&(ce|hz7B=^-EtgUEiLek!raWtJ_{^7afcG8wn#!KM=rmo6~e!Brw;3CrM z10D0=n05F?e(x#CC_AL5wc?>->A?`vMWy#4po$4N3-Qyt&3mb7LwPRZOUN{0{W`)~ zS%o7@Z*iY+=QQ@jLG|*3ffZ5PT7aO$v|*eT!vKLk#x2;GSM)-71|9Ksz*NYH;yHZi zK4It?e4-Syp)_L_(Oa*)(ymxsBfjPHbfB4r5jfk2XvlTsQNFxw%3BT=qIAYrqbx3L zr|_k(F2$$@$mLD}qYy1=GGs%kdREaNC42@O+KLinMG4crz~0hGKMZh2J=L#Ot8g}b zXtf2!awtu@W`J=!Z`NW+n5#YTHs@A`vW#y1aUquV?PzOcRX4Ob_AnG;H6qFNg-@H} z8EEd~$;O;`7cFcS<#rbn_Tk3|;YZHP+E1LtSBw$Bns&K`(92B+!j8Jhd8$1^>};!w zZ>Xkwz~nyYKp}XwKV4a}9S61hyojcnRXq_?hic(CA)$rL;zE5!ed1mxj+O&f*{4 zv=U~K5z35Vm}SUV*mcq`$b~AqrVVcdTs*GTR(e)$y5w8gJQX(*<=`&X2e{r{eEX@X z{Ilq7uj)7aO5nTYY$ZRXh~dII(G**A;W}dt@{Oo20%lpMUJavP@N7yZvz5-~J+W;2 z?t;^cl)Bj5KOvTL+?5371@dTwm%zr8IuaigVI*|L>(1;BZ*zNzj#U?Xy+Z*Qv4=3r z+M_g3H7WjtJ@wd2FqG{F`PwF(vWv{Np`+5BgpJ8cd!#?Zbz@?yDMCEjV`S$|vEXo5 z5=G_C2fTRzaoOj^DtuEZ;^_#Za?{oTJZVp*`hT$B+(*qbl|>~)aR$=+lDNoRT5hB( z2%|q174@qAXK<1cFv{fL*@=wL))j>*6rc-eWojomenaI17s@)5X;p*jS#Tt` znm=&6xi3lFJGhitQU-A&)}C@ws_yP#y+p}J097>$i$K1Bx3V1As$J@n_P)I2TJ6Qn zLX5!++F(!$9z;d)h3)>VLfXou3w)q6?T8BuK9h1a|zljEK3k65Oj?WeS`n;3@NQ!mBZN7eD$;CcJaDKqqn)Y($y(2d~7~M@L2nbyj~^(;3G)$ij-KNF5#}RZ6o8S5`0M< zGrLR>5|yeP2aav~$OI`39~9h%HsE4WmyvMkkSduuzO}@WEj1^sUVPcf3POMPzWhGJ zoK&v-t|tqh&BlAn%4<{fr`HdY##hFMl0fA%Hh5vJCxvV*_VA6R6WXYCcq8MacW zbi>A59suQvM~%rD>!%~gq9yAXqPcVio`H{&d5S_2HCF})F2iM-(q_HtfFJ>6vNl`M z7@=N05_U!1BGE4!|X|?y6okn4f zh)Pyns5f>Fml+T=zDX#hjrSSB^qBsRY@HZd7rAUKbC`7x>Ik)c2g_uRtf~IL90Zy$ z%fW&+qbs-{0CeFTm)t#Hvg$+^e%eE%*FX8qxVf}MP&D|h7PfW_-bAV; zv%uH`PSy@6FmS68X08V%MRVC^D4-5zg6mOdbcub+p-K?Utr_80a5LqaBaONFqzrlx zq*h7w8!YNX24T7=27K!$V28xlyy!fOR_L^oX@a;3B%KOJzuI5*Nzm-UJnIo=G9n1Z z>k`-DAJ1nGqsKj2y^@3PEW_S$3e;YLP((-{>=nxuCWixL?Fg8-!2i5Pn|6`sb)rOE z=c95zEL2G%~Ki)|LUFgF~o1Lh|cvkhh%~#$n=M!86Kb5pW^;uB` zqqYk)_0gc~cag0O3NN5eO+i-ZUUQP`+{o8N^4-!5q!lIDt&5wF5^EIFC68fMP%`vG zvePKaSJU*vBz9WU6j66XOPU48bB;bGu2se_TLV=J1|8jvrgZ=)Ui}ZNa!gdG!E~E- zSi+~%8yPJdah9YyiTo^sgexYv&cbLU&yWUh8}BK8-8)}`H*5QboLGviR?(s(*ot{{ zO7%BAq+x?>E9ub&_FE!~d`ji43TXfdCK)PiytLA}1Esu?N>TldfRsAVNrZ!CWB;+3 zOi;^-VhP>L@&_+9R;lhzrk47to>3pAC2mvKTFV_K=fi7I+~b6^ zfQ7{QsD1uOgz!e&P8r~STqU_PA3aw+UeULs?i1lw^gtmua#Q**WT}oSlAf!$<+jRM zW!wY|20cmo$SFd>Yp&Cr734i6MpzWmo%!p6CjJt*ybhg{YD)haM^v3`ky!sk{wOI$ zr@-;y@QF@t7vHLvsH-mbw#;MRtp~V&7+p-T%zFuHKxVP}>950uy!4iXgM`peewyKe zef+_&HDtiAK+4iCUi9qH2@laRt??>L2O00vc(?o|ntP{xL}M>jbNLVvgm7Jik+gFi zK+1#E<0Kev;}{(G3y1pEb~wtHGK|J9!aQ@pzwYn2{iLea`bU7Oyx#@tX1Nf}if!Ov zrp*GCVWIzb9*d^dd}9Dgn`7DTu$6jjY?bm&ZQC+A(M+u2gq*gWA8&5{Y8t`d1dtX} zQ6o`jjD%T8(}SQq2rNh*^Xcd;72UdX9z>Gn2f@eqd>E08efS!k>d>JNz%(vE7W@h+ zrsi{p7^QjuyL_F3O>c)~sX~TKjTtBM9@G->@v#d`Jo`Z?iimk^jI(68&qt$&d{8YF z#<;?cd2p!`-sNp_QbzFuuPXfU2YuVJQ(Jve3gl)dwnvg%7V`w=s=Az!9KlAd?!|8f~c`? z@@O}p2N=hR!?Ap03*;ZAv6K*BtTCX(XbGmqNWF z9745ZS0>X2;WbVa6Ddylz=OU#&yLr^o)YW!komJ~VpJyb4JeCYa(iA7>I#eVK=mh_ zf1&MJ*UJ0;#y_jgjuH}3rVF^6uc#&TwQ?)siv`Eqq*!1++>Ns&zF0QgLsmBLM2UoV zo0m){ol5`4^0&HRx@^OC#>JnSlbS5-vNkehmpHJ-oU!U zdj$RPdweq=-K?xz!n6@J*qW2BHvz(J5qgyBs@fv!y*GmF&b#O6BGwv2T}CIhf*cjS zl758$tFUtKRg?^Q<(<_ZRO6YDm`KT)Q!J0h?GP^S<)u3iXys z{F@WwYpJf_&vu6u8YgT9bBTEm5GKEH-j=iGSY*%oR8!z+yL`TjY{s54(~@pNqcc?v zk+;rwWh~crdV=+Nq?W9M6IFzieE4MWd8y>tZuBP~w(={hM|FYWN9xX%IQ+acyW;qt ztcZD*3;t90380gOx0ci|~Aq-7MLj>_3;?MEFtMEsR00U;0>ZA2SlxQwUz_O`8 z47Oe(wFJ75n(*cy#`1ZW3yoQ%OKrS8)TX>ycni*jbcLpFTcBjJUcM$-sj_AI?Amrx zg2Y7q5J)w8sR3p9b|?9?c-yzU-PqMrmuvmnD2uLDXkFFuS!fS@3NB_WyZo3VyTd-0 z@>ib8^W1P(<5~?D53yQLmXc=VPlqN@1ge$8w3!S!l{gSFV5ja(68%k3TRIF^(|MVO zViIT7d29&*HSsqgAzVXzH7;C3=tZDxhX2@iK=6#`XvOhGuw{R{AaGG^d$)eBAMix3 zmFmGXr(?-EKC^+B+F55XE(8tn&0^*m6#H{B3baMfIv{QSLe1iVB(p}y8FR2dCTXTi| z_C}XbRnyE!?ynGpl~3ZOm5ga2wGmfCE56A((rfGcDNc_Pw9X()KR(!12ymZUj% zQCQIYih7K`O8Sgbz@UF#&Nw!94{su0!>N#MGo{2LkEqHHnfEX~wFrAbC+^9|vziv` zu3~DFXBpnjS9!H5LzIu;o#r139PcnDBYmF2{ALDTLX-|wZhErBTg~)XS^H#?x_T^`~f@$F583>GV{Mw91 zwk=~!u+oCaMF@Ils z$2l>EDjlp#W?HZoRtUU=^&DS?RYI&6zte|Ry3#CKLxhzYC+{_K>yqz8$2;otnCpL( zVbbu+%y}(oHYfajtcg^+E8=!TSw_227P(96$e{FBnaiz=2%Ob83!_j*qlQ~Q417yS z3fxLrztY-!hq|=lpwG&xCU+&z%D8N__Z*Nr_<8CQX zzGD>NwmBrFKQ@N3o0CDlP%Z6=LD9TIwuf7G>XWt|n3?}dW}o>-wMyzFfV4qV!xKQw z-*pbAly}z)reHFM$+!t}GHp4$1Ga$iI6XAQ3-SZ{%0S-UmD<`1|5e=;SMG}N@}Y3*tew2yMB z7pltu&LSU1$95DjXDI2BT&R1{&_+!$N6Ub-;;6-5Ho65p@)LV!E8TAB8 zOaZ)GhcnHd4L}T(Kl4DJ5_~BMZ7v-I z<#y}@s0bwciJ#uH4S@9?1%-Yr1$TEwKb4|{04`x;ImSW>4Q+m6i<#U;+U}ixU&_@8 zLv%$p(-@C|X$v|zpx5aA2xHm>TFbM$=Kv>`{+tixm;Ujl8nx5`!K%JZMvnjQ1cgp$ z0L|B1RhKaD&(=IQc_^q5cLB9kNw4F%?3)(RKotCyw@sR+CEX*lW#XRErh$mk>j#Y5 z?t2vV!dw%os-5QmUU{^z){=4XC&62i8Y_0D?R6D1tSMwOBhW5>jTPUVx_^ynf;(bw z0jy@IGq6eDiO5wgn81bo={0g#oBwA2kgyww zQE&FYDO$qkHz!xibtD=Uh<5Gd>Jvu8>-n<}t})I~fgDBD=~jF3u;v2L&Q~b?=q_6GrU>*^t3~FDUpbt;jzx(WzlS%LUIh-3 z_q<#wjdKi~CB!W^`DHxd_tW^#{fV-=AYLZ#Ns`FiO)(>2I=F#w?s-S*)PWqFwuYP} z`5;|BE|9oV{8buPR;NJ~>E=q@CQ-4d9dAXEV>4{!nI4ok`&C(wu$+lkW~fCM?>2ql0#EF`M6Oczj>cng?`zi8{4DRnE7x-|kzz%Dj|I;fw=#Xpj7J`B1zrPow8Dj>eMt?GUdO;Sw`U5{ zQq+Xsxu11R1Z=@%fb`g|*J*6Li6!gT=Aysp`f<*l=wCm(omHJ^uU4eRq1LHiOt!Dn zbQk?}M)EQcC5#u7P7N@K!5d(i`K2?j1U!GjkET7afq$R-cJEQ;BbcdYm4^Oc6OEB( zMwPFz?T2G8pvvG!5eI!6m5<)^?KQ;bqr|}(|f!@;M65Jix7Jnqoz-!3)O&9*bE7*m;Gy% z=L!PdyMvP?J2@5Z*($^A6L5j~yNh!D3~3>?)fgS@rbXBU!}zkSsuF6IcqSY4Wrls6Oy`Jvq zHT4Z?u3SB^ncS@_Fh=(6kw08W5!LmeUXTtWyNa&6kp99KpAsJdUB$3IFkw%?o2c!; zzE*OJRHyL`_6Sqi{{P)vqu~Oa>)R7uaVCzYNR!HprxrjGdS1sM*vOHW{vz&6IG%MCYt<6 zPD6j7ZdAsW?UK_8I*caqOz!bb;poB9&5|tnP7T7g*sP7?M1r?6x z+EH6c>9md55?~Ckxq^ff?u&M2fyvZn>88sr_yurzLZ2{K#P)8ztt(Bz zEZ)Bs3{c79=J{w~0?3{#s%2#I z9$((82Sn6Dr7pQl_3we^0`e#b45X8whrZ%iQVQF)0X3g&j3Tm%ox~Eb3lgxynzC8z z7jRePqR{3t#t9-|_?N?Hozx#d)cbw%NeT}?N-$OqVszo5-c3mp@D}t!IM_W`mhTs8 z`i+$k3;S@G*y5al(o>(-6<8U4ROF_T*&fG@WWrpB;qB95eKyFKz{Gf&1{^MD|A4O+ zM{qW7v;;W8TUoG+m}Al5PpiZJPDTu*9X~^}oA{sp2Yw_2I14E-P8R0L^N3pwAQS+N zu@UDwYx^IZt=Vr1URWn=AK<#CAXe?Hpt6V zU82>?{@xvD%JOOJl)Cxh_r^KzR*&h){0M@CGkM2gGD&w2^98w5!wJ<=ZF6SCdf}ny zbDSuxyWw!%Xhx!djOpCop162C`lro%00VoNRi| zNO{a$0Gsq^j65sYWvO91&aQ<4q*Za(e$Wteo@d-&vl z=FLpT5+c5Rjc7aly@}kP{w>64DoF|;)@3ZPi(%eCt3=NQVKMa2@JtoWx)WmA+398v z4A?&9Zm~!c+?~PBOEB3;O9|j|8K*=QBx7%zQqv_xTz?JmUwg)N6Sb95mZB4Y#J%u# z9g#1x|K!i^u5slua93$}yX|u2H(#RU%LXYHl>|v&A_?lc(UgRkQbps)uBSt7?63{jn0K6 z3)n&SJ75lU5jk)g6-9T3B;7QWc|zE%u(;pF_pGOPrX)rf#k%`gK-*e2`AJ$qxLFu4;JX7zL*w@ zc9rv8sfO_7v_NzE#0|pCEh}~!_$L3Lc&f164taLXB8Yoa{kh;`Fy;lW{Hg2?Sj5=5 zJmJSQ4Q6&;5xv%vZ)dTPD0N;xq$x~n5#1}~BQL>{BvJhQYY50JnT6ZZ9l!S!+kq=Y z500~pu~#X^*g;iHM*wazLcb03tYxGw(&bwOt^qjz-YLDT!0?zaJj3xS&!GbUp3%Ef z$IlYZ7xMMwYmR@z8~2Ubd6O;;>(5`@m%_A7@`lq;oxevSYZ3ihlMrmnu zFPC(ch%wFem3N94&gjj2Sw*HNXD z;2_74zXw1*rdZg$O6nzW{$W3X${@{9xks(n?12yW_5u86lx2^il z*u4o_?Q`KTL2Yy|QH7%fpQ5>73p|uI=U9)x6rIRnp`IVvmbcy9?qBu4$}g0#Ng_wx zA|2oEL`-6pio5wwgr7`L;=*WCcr;fdvr}b2GMqPtbgAn3EBal6`85@U?F`gJl=#n7 zQXSD)YAAa-S3uy)D;^G;3BnrX3rBc7{jmTRKM3L^wIiwfiJVby=(&Tp1!WX5RTMoh0n$==w0#69aDxSM69H2izFG(@1v?unWbf(RIvKg)--sE~86jyMqEoO|!dM0WiBBVhjdYh{fW? zxYq4L$;Dh~&-&@GXknChFT(<6=a2eXSz}~QBE1j5IN_ukiZ<#%QIpPG#aUi!I1TQ-tdg(O?+7kt zZiP&qYL%$t!iYWD%fZFLQw808*@J7aG~#<^F4jx*1*uEyW+Jn z1fgnsui5J2BL86BF%P=G!*tdLcF|ZcgI^~!fZJ1g<@1KTU}yl66*_j|i+skA=K>8- z;TzUW`77B8zGydTZw6bR8y?A^g-hkR4%F)PMm?tI=wK8K?IruJCkVmMxx;(pxCF5~ptRFelS>-~v^x0VT4?9@xgBI;>rcu_w zPBdI|V;M(p{JCsk<*nqc1J^&2C3`TSu&wdt{}x`h0Ht#u&_K#jb`?wh+B?+RN?REXBx?dSOc%4Ia{ z2@oyb+jg^->31Q^1LLxYR>{!uT`YN9FLj<+WjY-O!~Tby4mXxM*ZNdtd?^LUKv(8p zn_o1n*{^Z1dp(J>dU_>26EjDca;qVv_@a_X5t!-+f)7o+`bY{0fdWYeQ&)VMm;rRL ze9|jb6bL&AtHOzqtTYfj#sw z87b@Md6Rd2-oxLRQbHc8beXM%d`|8_#B)hWFiqf43wN|rV;chTU*x?S+{e&b2zdNO z-UBa-j^}tN(L86$&jC8yt)vuuCnFLSIZpWgTtd;5Q0EBTC}C~<7{(}qQnjOXzMcgY zsRZMAt{#{Z9xx38h*FoT`P0`hUxsRt{NHQCjqE6&W(eGRDS0fw$c|S$L*Qrw&*Ce_ zF}e?cqsH)l=+WjCWgC!v=IXE>JF}=8X|Ri_Z23Cdrx|{|Wc=-OL(~DFACVou(Y*v( zgBpAvu%$%Rq-;E$#h~ouay7UYp|varI~16?j^`6Yh^aXgNH;o_ExLLga}zX8$&4fu zf|sC-0OIWfXVxcy3%8Ktp1A2P+Pr`*>VIW|VN)X6`M?mA&9fLh7QVd11Yl1s;Ea~w(_U#n4a>0ThGM|U{ww8lRwblt{F&__9pH|O&4h}DCcV7D;sW> zL4;{{LegAo)wYLa-?9CeUP=mU;JGS+2Sc&#F|QR!F~?s0Dv}g3j&pG3u{O}uuJJN6 zdXb9=`TZ}VrE`Fz0xNS zOu|>p5o}tqmCTxPVgiibj?{%4Nd2ZHS*GEh&ZIjzyt5)=CL32>Sw@nYC@o;ZQ?ff? z&Kr5o`#Eyi7XB5YoKMJy$VS$=pulI!Kbt_Tl!>a@HfHe{Rq$Lq{qd)sD%wVHV&X{M zQGk=HZ8I_^tQN)2p{?eq;O%{(#P;pbCuG%3TlF3Wil)1`PPo~b?kXirSRc5BPjjP9 zNggmGrrlh5*7n`nuhXRrHm%3mTQ;NIfzhvqegadm(`Z-TcB~VwUw(9K2f9ybjVVN{h^ozG%l9*K;9uF>dQ0!6XRaLP5kdU!xXvxAClu3;P-lj2TK zNvyMDmwgot(tGJFre_y7I;e~?i*>>-!0lKd7yJTQDcJ2jp`Z`}n{ z`4{Cw8a&~7A~RSJ$7~TBt`UDF3hQ_byJ=0@WC@)LO(+`17`ZbCEx}S4e}c?)9fci7 zP>YolQ4;?WF-~)g{C1dU7=fw0PP(%{os8f0Z25?M9gTFMl48H4y4EKdzRyR?vov_| z=Lwj7OUSD>)2Jxnn_{t<<{0bEFvj4N;3G$W7t_^9`BFnva{%#e-?6G1`Ndw zE4p?htdah?W_F5$V4zg|?m*RrKH^}Voaicd)sXKi5f`i#U+nMZTO3@V@;ugb%ij)T zwg9b6?i|hk&lfK66H(W$03;~e(o}{)|>3?_1 z7(2Q(-VO&p&4FKM46SqE93mZWffAS|w(YU1G&|OF;ETLPw_TC@+@cpLy&nsA7K?*- zcE`SwsZLBH9u@OyFQp)^GTWv7KJt!Y*>hT(VUC|nb8&ZQ-l0C?fBJAjrP?%H7jm&QgRGyJzyECUA*6=zJ03POZXmDW|Lgt%8LD` zJ9ydgQ4==YRgU?cm+eMi8S{zQKH}5;Z%7D>MgL;d{Pyssi(qpo@jK_Z`7ZL}8Xn}_ zBIXzk@~_A-W&v1foMY8F?8}pcB|}gXDMKlYYwF{Z${%wI$E}~1cS5Av(lJgXpjO0> zB-9cym6MD*JY~~M=I_&#MT@CBx&upwsi}6Dw{voh_6SawI+g#A{KW6veAh+zv7FfR zA_7<|;Bm3iM1fRphfCk1cIYu~BT0UYLw!=&V@Y_4*x`~7@`Z3#Tb^Cg9gGI0^bQf{ zrw;8?-EZP8x^gRp@*!7luBjM;Hs{!=u9N=9fP3BXmPXxRN3;vuOrbLs3i}TN)gJ|_ zO5%H65nR260risNom`2vRyNIL32%qzSz0VwUFB2IX3Mll#V7h<)A#I|TJ z-^P&bRH-JDn@8)HNO4P?52QB&Mc{}XT_EXi$J0%)1oV-QX6xG{1k300B6UCaxORV*`%=>miou`S}(Q(z*` zRy9aY?IDpaCJ4T^hapEIRP(Zst9uI>$t2snq7I0IIcQGvY*ead2-N%s$DU}Dhwgxg z_I0B+Gx@X|nLNHzV0@?{+l`HVuGrM)XX@fzW$GsV-nNdQxm+*N87bti;$^=-#ddmy z2nWQxDqeXkk-^v-gJ0&ZBRjXqx7e8^fQ2MHx02Rkrx}S{xZuD3c2TZB|AN{>Gxq>k zv+51(x(QXP4LRUxz=`7y0A61ILy8A#AwHUa7a?qI5watC`Yu5$@PqoAhxQp=il*z5 zLVJ4r98s;`T14_YJzZ-z-nu_Qxv%U>oaY4~xY}g;mXkTrU1~sAD#qc%ei9Au?`ylBeSzq+KH|kZvG?+gFsiEyC3Pc=uNjwz2n% z3k#eW!Bx@%fMDOv$&LNOLq={nV4)vL>;)Hjvjo0{=`eBhal4s%{Ag@* zZjcX@%8%!UEyc2%6Afrd^7SqHd6atCYG_eJN2_q(O5@i{2@(W`q1PYK4>5aJbCc7D zsWA#bVCbQQ#Py5u8IEO3j(UsQ>)Ycshn5g6ki6Kj2&4K7ubPzap+x326I>QY|5%>% z3R^B}5mxK7!nqBpHgq)o&(yi7GqB-+X4Q`tUOn|O;o?cT)+kd{V)JD&{tE?NljeY( zwtm~0H%RF@I07^AOFM<&RwvH8n0<-G8!}@{abVOchL>I1^aWbsIH9Dsh*HwsCk_fw zdBMXqVC162F|5{q=kFta3BkY8;)VAIBI-r)I+;Oy8Nrti)&;8B~@kf5p69JW&+p#03BAf_PQtRjcCjS}cWH6I9ryvKbj|BhwB$O^ zro&=bs4WcYr5NdHHgUk(Tk3xn)5zl{%AHN&*blJVw_1fuMH3Ri)6{BXVu*U0W0NPu zSzL(`=Sx#3BtHtJo0*iW3hy|+;&I{6EzvE?)GL{!{XYWs=fS?zU_u4=h>tM+BE;gi zFL^d3OFWNRL+R0CII{;$mKNYGN>W-8DUns;Zs5}vE9?tOQ=Zn96cBW~U2K1Fvk~mX zP{tVOirOmrT|Sqod`GDVvIPGzmXskQm(V%X%h|(_{^&&RC%Do0OB9P+3Fc&5u`Ym5 zYmr<|>oOh3_^f~&r*z;zcrS_hLb4E!R}d zp(xTw0<@|fCH?>PK)oQfWhjcON%+S6Ld3x}l)OE5zC4L~agjk&HU`=%hhQopLoKXk zC>!Bn)IPCzg$q-i&rna=nr4uMP&GfJGFVDd2nI;Ps#@iD_|zixrdlb^C>P&Q#$r^8 z0gP$^-gyx#|9_Wdt@0kJaU_#g4(@yt6d1;*lGI{2NkSbXDi;^$s0{TKODP-r_HOK* z*@)~YD}&NqnO+q%@AD9j@~RRY_A9+HgduGiQTo^ZvMef^m(68UgOzyY><3MSc=;f9 zc^*A7T(f2V(_swhBUQN~oSF=dc#|Nyd#Kb}L|46cv#H`6W*kwfM{xc|*CKbGVD>BG z;vaT-<^Qu*Z*$8>!9&Y6>yo!Rt-jlzqP56iUC9aiXjWleQo?Wu4^J4_J$~p)YW-F{ zt@5_57qWSYWehbQ<~~Llu+PVk#$c6<_Y=fv7HMn`&ACw&&rloq%C_8eSy6He?sIRJ zd{f6QZT~Vi-}Z%vs{YMzVAFA~gu*;{cqnqQNu}gESd9HRptDOLq2Lx91JAb_64h9{ zgNw4j4*|JnuU0&_Qptq;SK_Z%Zj>vO+!{oo@e?%<#nUyqlKTSe!tVN)D@W?o;F+b; zw^kA0KkNVByM5k@HU6#>=d0UGyyy(|XyBtk3YFnwzQ^vfiq_quRtfj!+EDk+FjRQh z&avY7J&in6u&xR1z!UIPl5d0ACJ7G((>3u^?Ib^H-6ZDnp)&cHjd$_IfvO*kxeEE{ zp}!}h;W9X>z-7GxO_FoJ`S&!edrmI;3}ccXW0>*_OeXkawpKI{HaQ@SwxfI{II=qA z^{y(4!|jnhk$r5TCN1PjTi+YClbm97kwLK$3g&M-PNI<9rz9vAdyp*^wgy{K%xhF|Nsp>LpfV@Oui zmGOn*hNoJLe;kd@!2L^QeJ0b5JzGy~I(=CEqr1=f;lXQnZU$vcsbwe?LoH&d7ggG{} zbD+GMjt*F;XdbvL8Qxz^SBaUX6&pH7HaSgVl2$0HahM{Sv;(_a@e47*^x<01 zw`HpXBEHX85BwX*5r1Uj{0)W6znNBLbnS`z-~F~KO-Sz1=113mb#z^s*lqiFq3o}b z{41%eil47GTzKWPPNo~2n$dh@P3{TrHF|eAc38_>PvZp>d{_6s|DHPG^zX|z)?cpK zJ%6T?zf&)HTi|c9LocJ>eCufU(R*Z*q4gH`{2(+7aX@N35xXbt(EEyw;igV^1AY_~ zwrk|GW}L<@l|6mSa2^S4zVqj8c5APd{^5$C{c8Qy2CGra85_D?Mxx$CzO|Md9!bx6 z6P0+;5urnan!;-T{HLJodEidoxuKOag!b)yH)0pCihU7&IQTwd@13Q;A_6Okn;%DP z*Z?)tq@K85Q@tbN;yI_=ss9+zzpof8py!jb;cs;JVOZxmoiD^wGxh_d~yLd46UsFL_uu;=;$n3r*u2&gdH-U9)NMD*N@lJ1FO+k3}&x z;rb4tV))e7;~qO?82vkLPD?Y&qtquQSyf*$&lzg52F(hxnmme2{ChWauBvyDK6I@+ z`1kj_$&Wh*T-k;+nPa-fEAt`)H#c-jpWqj!?(X zvZ~c|8_!1y%d+~o?k$YeiT)Aq($`VHJKjD&Sh)X}>YBew-hDM{BA-t=8hF6+?v~ZH zHxx6NEw^p2)FO(?1V;ukr@-$7u32}iJLr8w5OVp!mP(@FPXTIOH>xLUea!-bos zivlb7{t2D0x7CfojqF-$6V`KeQ@hj^W@GjV)XpFG^^On&b2wwb|ou8i#D98=Oe=HKk~}mcbBZK z^nCMhjdjCcBM+x;-mRr+{)bDD^)K(UD%Lf=k?!_X>yT@v{+H16N8C@XZ5q3p-uu<1 zq-b7vjSz2nxqcckv3gH|>*0^7f;}nZK&}5SZN$$v;15R>YsJ-uh97Hrvu7_u>HD|l z+(=z#=tG@BxL4)U28W(U7wu2aCw|gSb7KT29PU5-{amJbV{#M1spF-6C6Y&;@oMjS6ZJSVZo zUOx<9XnMP0EMB?6Y>Xgyx{$cR?oq9`QRMY>_{pB)!t8`hS6%%fXz}dLg{C*bmgYH| zg@1Ujt$n9ces<5V7p$HLTfDW89Z<#X$jUz+dfGZ8by)x8VXuPzDeH5WyFGT%sJt1` z4ZPpwU({IND{bpjZLhRz1&6KCSh`0ZhW-EdPXc2B{pgr`>byH4os%sYRy zMq#e!5VXDN-ms+aZhFf6R8mpeRoAf@+pErRw*A*ZXYVz3(mS=ohSjjBv%~Q>>O3U% zOV@#;FFoUT$w@-zlJrft$3KJiD&}p#%olmE%r(KIG(!{&@jm(yTUb@>CER8T*2Qs> zn(EDlx5suzHnW?w5ly=ww9V9u<6Hc4q8$W{LG1g^@H}?R25J5~Z0oZ=r^VMdcbB9W zYT9!L4xf965+*Bj@F8KXk{Oz}@c!r5+@n?c=E^{EM15ynBxy}VN(pgGZa8&US#t+! zq3!V<+bZ$}tD%I6uV%Uz_*)?_G_6CLBY?AesO~u9ZUf|Ki)WwmE~%*w*JFiG z@!DXjEVpwmrGfX;61X~w(ug>|qsgeZw{K{&exCo)Idj5Sm1l@L%G6y7R%}+b_1cbv zuZi7TrSF{_e$0C=5SXozPdoHqVZ;z;`P^+6ak)dD|Ccr=+5KNhvBS)__z&35k_fRMcp(MPGp+D7e*# zs1V3fL_q`z2nYxyQUzQPP+UMD0a?N(K|pp1kU$I}gzRLw_x_IG-yfWh7_!`(GiPR= zdFB~j^gVd7)4YGDzF;(+IDD+HzII3vy_0jH`T{lhSx-1MP>SPXqf*T8xswj`Ywh0j zYpTdTRQ{9b-NZt(g({(^gu7Gf#BPKqpTC{lGv`UaUw3QOr<>W)aelVVr`gm_9xGB<3F?H;3anMn z>B|;Mignw@nRkbUgDak`)H#0=<_`Bp*|!okUNWo*SpumYJoUiK(wI#;H(sc*G&FE`ZFyj{IHuaBa+|^|*q_~w&5!2DsgG;V z@vH#m2L-vP!eiksORWWS>)PRgOnQMeb8YsmkdWHGe^2jQzzV?kv5)?9o7=%4e`6nd z#B_~WR@D10jjx58Ob&)2_D%(=hg2lc#T(9S9L#v6tG>r-zRo?ePVq-<;5_EetTQxH zq>E{wk)`MdKBhM=1frX&q%JTAeUVf@J;SU$H-6I&%%GUq5#w!Gq_WvS-pMZ1X9(VN zZFQe=)9uY4E=ZTaVcp~pJ0rS@foFu6PDKWO9y)BaP=p$Yw(9H6FYjKEhDxF9s!-TA zRrjn9{=`ykZhp7tub3na?W3#a_tq9M)zh^kOwRN@R4N-e`6FXFdP|lUDIu^imSZbWuW$O`X)VJef>SoRg-bssgN|t ztNS@vg3T`vP<~0eC<1~b!5ABl^HrK==wKeI>%Uuz{Eeb1>pV;8eXo<=vD4t67_pSW zrx6u{$%#EU=Jo7tKX{KhP~%HAR)!%_Y9TR2Usd~Zu&vJt-ZK(w`y+bx*p)1fJOln2 z7kh4S;9#j9BW{fOtJ`1+XTc?{cfVdiQtgO2M;x8cIYTT~-BocG#xjLF4PiCM?=ZVOcg6TgO?X$0 z=bvN$!4;9^dzh?%3p<%-12#h=V8@<98#}&={rYB!wejD&shHAN#x)R0{(Z+c%ze!J ztD*N!Wrh?OYW;?}H@2T7RFK$Bn$Kc<35ob*8Je*dWs#;1Xm(Ze*o{adu(kuJ^;f;nb6`{12licRD353Bh z|96SQ-a0GzOfRAPQa+Dyil(2T$P0Cr$P2GNhU~9L@8+>e|JVqOH{q3FIN+~Rpyu(E z$_J9yg-2f>T;a@|8OTDeF#-*wOhFd1Gv>Ve>?zU<#U?0$?E{Ws%QkN)L9++i6?Adi z;yfvIN`6=Fh zc-K8>tHCBt_ZZ15i@pllu4}{})ld6>3F?~)Y`%>%c&P+;DO(_N);G}BTbM2L=eBy4 zaL-fk(TWu)&`9Xr^iQ$Zp#M_C5b}rdWtGSPIFdPv39{~8FPs%!SUaoG@@db+WExpj z0hfr6L*-W*dm+}g`@ESqf7=1c zKQY7H7`IG6l zm_o&)@=We`Qm1x*=F%UcT)E*)n=`ywvXE-xnYyM?)HH4FFlY=NQu+ibe^O|rEw?0j zdfLC13#?|ljfTA(Z|EC!$<{uy3-(NH%EIk*q4gwS#X2xw0ojz{gRy`MU%w7L;yz9K zJGeGBS(22_*4h*k_N!Kjx3sw(;yzLxB9l{82j~C}JWR!C+Tb_@wF*&;&bBi52*Eeh zgMI)W%47_|B^tgCUVPtd%XC4`ctavjKS1j%*4W5X(+Q@5-1_$aSV4?YGw;H9qgQz$|VOXR8I`72IkLOE5xMV z4n^-qPLdaxb5Sjb-7Q3-LrId0;o2F5(}G0da)mh6KeW1J&m&TF>qr(1bpNEcJf175 zHw>V0!f=ak=goDXuGM(17VM-Zh$Eh>LJ$8pcJu<+q?#{*wqrOwr{_LwsS+U>VXKHd zH|>5?z2Qk4!NZu>W?!WdD0_;8MG8w*kG;n*?=Z7HaE@T89Mpr771|BG<&nk#D91#>oY{BNW%6_$3ME7wAIR+cfX?TJYnI z@nwcjXq1_hLA0GG8koiv{>a_u7-97c^Nbnk`amw8^$v!D+X-Kp3m?G(gYqzf?!zJ! zo_Nun+BkEKYDulINKkJABthG4>C9}}H&j!th&uU|H=(P%WcJ-6mQ}2)eE+`;PSpf` z7;7efC^l=CyyCG?n%|Kr%LKwxVTIQLFpps@0wzo$0WKQv*qjO{Klsq&x}&46Jd$cB zwL~1z>X~If!vDkYo#83$Up0Z$wm@I!d1}6hjcTSbZ=*OSJH3_KwAxQN&srrBW$4OX zZKobUZzicBpWHIB+HYd}?Pr9K%wMXC!9IpU9%NG+lP=`WhyTwTnShg0uh&fODKm`! zOYEITf<+AQAJvXNuCpH&p~WcErDkyCKbkZ|%2q395zv zhB`bvqRNH>USOUcuM_1S3K~RjG=J|5Mdw?qmS*7^iZ$O&c_aLt?dgRSjiSY13}K!R z)P~AZv^Mjoyop$o+tk=n-L)NvENpR)(Mv+)Xw{_ zlE{1^?N!jdz_U;f6~Uelhzm|RyD>J^YWmcGVYJOc^$fX4;C&*$DAeWe<;dOTsfP%q zg5y6OD+SV6dw8Ll?tj9MasCM3zyqOV3_gk{%qsSk#yc3`9`?AmAHpQN(U>;yDw#t3yt+Eyu z(hXf!Q!CX8M-j)l97RdA-H-!o54Mz?0Usq7tJd_m(>c4b>PK7uB+p}qe?!C!&NBY% zXl_R!kb~l_!{rk9X-OkG?aH;dp|sZdx~;r*nOI4{qRcX zP9sK0{i%4uTQOif*2+0@gc&>i*XUvHj+p&I|JWs3;dR{)GdvGr?@s9b`!TQpnNF=w zm);vvUgak#y`V*j+@0{3U8dT}FARxdo3yA>o2^_<)H$bJ)cvacpR(Z=n@$CaT1Z<< z{h>XyM|hR6@%&&RP?JuTRDQg$gFU3Mp5lm7-*czU$@wfRZ(gq=N624;nkBcwUm2ay z`Q+yX*2W3*x<10QvD%f|Urj5{urz|5a>^d|GQ%D5@z_gK?gx=F^HNofD%A8ZGXZ*< zmjz<7GV@w78ice~P=Xy8p&&}jhL5z`|2FC(W5Fv2mh9BcUUdM(s;}=lT^X&D= zP1zT1T6PPf_ES4|A%5`p64NL;s<}v!S+`H4cVbrw?yU#eQAJSSchHt8>>6Vz0OAVl zrcUn_I#B$n7OG2G?mv?J;RZe5(uv1WY;LzOjba~S=LTv*#uWcC4P!r{_W-A!PUz>j zOVW>WDtJ&Fd|SgI1_^hKfhDuVf$CvYp7Pnt97$C66ZV5;pP=FegF=b4N#0T z_>&%+M^LjTDMy%ljq!EI>ynnQy=j1}j>qH6%zxYGYO#A+T2pfxS|+R8!&`6oPFkY6 z&vij&1C4QBvp0Abf?F+2gUcy}5yX?Ax)Vg%v3kbll_Q0IdG7Vb>BuRbwil~G5u?k) z&(BSM^H{bz?@C&Ls>eC6)BO<`?_n!@bnIYZa*fzmaq`*m*(_3%CB;4|b6@kDtA z+>L$ie}p**G9ho`Jf=KHf!nOz6MJ2qfZ9a`8nVQQt82=Y)nZqI`(|0=bPb*{zUVLD zKf-$yI}ID*pFDdw8(93a%UX#NOQ)mKO0VvqKgS2&z3|uiM8@ZGkM}vrvmQb9LfIha zeYH?~+mw_$wz?AP9y?C|mv}-@!TY?f!B z@2SX7o~v2j!g)+AwEXC-d;U7o26{iHU%kB_7qq#Z6nhi0DlnaN_Xj8Ffb%A3%aD7M zl{AI-$7lltPPToNv;yfKf<*6!ZvgF;dEzAj|13f(9D~}XYbR#VDQG|ZffW7cSgvU7 z1R0|-b*5oV7~@W4oH6En-pl|QP`rW0r}m63AoVt*SRmC3_@Kd*JhN}UyL`XSMzWtX zv`{C084=P-Tn!@71QjPOTUWE}e_N|o49v=#S_PTdk@)qz|B$j+TCXhfPW#S*nkT@f z1_HIeB7!2^uuo};W^L@J8PW^pvRG{=$n|W78~-r&VIcR?s7rDbH{{djkd|Kk(Zz)B zSHEer-(sM62!~%Xts4rGv&cX44jLZu(%?a2h}qlYF!4o6A^cnHs>irt-=;|FbgHVG z(f{^;5g1AO5VmLRWFL92y*I2O;jC39;!xxs^QQWBpeZlbPV9V#77LHonEjfPrGfD2 zd)${o0{}r9G*@dSHFX_hsF|9MG5=9+f6XlQ=fil{F7@PN+{J&KsN<$GiG{G2!3g(` z2^1b9y7nH6s!hck=pgQBKDy78(?f(pOG%ndh~Bf3kRaA8!62!G_C}*2q?mW!!LpJ`a~&SJ>3jY$dZFAuMfH|VzTgAZGtixq z8r^+#lSG>G6E|0DB~LZLKazmBaZGc!`>gy_4|5%|i0U|JEk_}GAQIYvxldb9J<8*B z8n4yCOZLUy*?^WU(NQl+vASsW9exjt5w1$({t1gN!z~?F$3@>RcqU19z|AVG=P4+;!g>R4 zRyJ<@r^_Pc3#Ok55*}~;96kJQT5uCw3HcP&WG5J?O|$REwWM+PPu*uIRvNcT2Ml!| zFU-@Wjt=E}?16odQ4%B`R=Mx0UA-}5)TJk$=(SHv@2~{jqAo8{3qlK%-J34YrH#h? zF3*5x1v%1ck5v2uee^T>QqH%u(L5Wrtn}KLMRDM*p=R4{o9FtHCw#)_#^~%^_D9$D zcC|Q12G#Co$iFgt+jz{?)1Xbf zNC=Y9vMx@__0Q|lGMxG9EoqUp^f=*S!xGgmZGMm}7ZW{Jp{BQy;nxvfr#E&2CW?=L ze)AFHsvE2im$_3mk#!R*yoI*J<%*X!1B%2a1VXO1L8-ZFN^(F?yHi|bi6XbjhARae zFrahQZH`vmW(A_A@SU)O;V9X0Zty^D>g+yZbE|MQ&zq59PBlJ<*YZ7F+bJ8!|ALTz zIkr$%D_C*goKHT^Y!1VyscAtS01~I8Zs6E{Ey8BW~XB%ymRU#bbTfnT5=9OYJxkNdsrkuLEh} z)>%PxSik!;OLvg@COi`*DxaY7fmo&v7vv&Ck`45+3mHb$xXl~GC#a&2FNysaXrZyKQ0XaYGT z6ALFEN1Ef-lhfo8A)hSZ8xHWr0mC-$+Nm;i1g3U4$$^56ngvpxy?-(&K0y5!O0b%e zMew2A<)nXQw2v$FR-_A#?yV^1^vy$r1-Je`IY)ReQw_}zn2`;o zg+akkL&6LSPPNnuj)g%D$g@J@RbFI+DB^^UxZs_zU>zv2{QDteE?4!?Tv?Dal}!i( zx4GIr3QtN=WNW6;4`t++5n|axcK@KGsS_$8^9Ew~B2kO5ms6hOIPE}LhK9eQ0 z>szdNjVax;Jy{zgis^koJXNeywVlJxqu=!r#tuwAN$ zv{|H3MYY{#@03tmsOllqlL51+F65JEi=D)c^nqyJllPdskldnmEC}CHhL++%;}3V7 zID8m^LyEJbQWR1WBRsxVgDo+7_J^m)eiwibZX{)KAmq+bgxskqDnD7CD|e9Csp-;e z`2^cgr+KGSHOrbdvNRld_C9FJ&g6z0%x*>~OO*%M)zh)QurjJld$PcPYm@sn7Y-@n zDrTtlK$-5I`dz}p>hkDA>{`*f^BY(hBbF#JFsB^^W6h0{>Z4Q6bjEXEj)oFwG>cm_ z+19EaUfuZR$>?{bXd@3}>thdr2{jr{^_cdiy0t}-mm~0`zOrJ04D8n+5Ydipg32$S zkVHy3+K)xdem%yGD0MTp?xA|)*(;T#H(lk&9ulPF#2MM0v-l6xD@#5IF>2^n`&Jel z^^iNajdgAv8d4vm)1M*r`zRo6B#)BL`Gi65dFT(qG{RA)qhj#DEI1N#HF@i>5FH5n zQeiMsZi@EfGk9UiTpC7J(4u`74%+OH7l-K)jP%Flq^*7Kk|h{C$re2C0;53-Mpy1M zcp$rn{JV%%_PWk>!c6Y{0+6yz74#5I11~(;Bz!fy+4S?)O4x;%i~b<+s>C0dV_Chn zVmYD-Xr;$y*%Ebjn|A#e?-`ZAXoFf`uyTZ*i8D*oxoz5~m`-COE$pI~ENO^yN0TRO z>c&pvDjyNXB$q>qC6vuFQ?k4Xe0gLLp9AIPpP`?XLr zv<0U@b-rFZaG$-61)>@eDlBGK7?Uee`tG8KFrpexI~8-ggWe4HV${{iqSkXb@+fOx z>@CCO3P0@nF2_o6j;Z+Oh$}ByxFDx#)2&Y31;LfcUi~?24wK;`!>Bu)*-kpgO0FW; zV3Vu8ZkTbmf6T)r5L`KRoN>b|8#Ks~*&XZlb#d#{9|4;tF0y?${fV$MYHW z9d+(NIDLDyAxYiZ6E#|)f!buPE#^P+%c-xh(QrNN86*c&tD1}-n&_^$p;TJ{yi%Wy zZ3%=>vcL@4e$puR^QRdL2fpCkPlPVF5oz^Hu;oqZ5-EMgN=Bi$XiaTBLMMK@NRtmO zl2QF_eY%tu61T)zp;IrL9zg`YUi<8PmEMZO;h+7B&QM8B={|o!bsdk%7?zd5%7o7M z31VRfQ)iu0Y451F$y&P*Bu<^{ClX;;ybKAr$;!JUq9$mIzSjhq@j>cONH9Sfp09B` zU|eaqD?d!WvX>WKu`}Ub1UcV{BUblD5~naC6rqlTGK}oO$}4${=LOLP3uY+Ew7xE)oe754 zv|foJkfiT2@ajxtdmYc1M4CD#+hUT&Vx0(WHcnl=CW&#OrNrzO z93LttfxojmDi7QkyQLYv`xHxMQ|+j(bSsHsa3qN&HAo?kx^m^@9jGZnOv}%ivYV6` zMxP6mri_8~V@RANi6gn6EMp4teYUm>TW2Vo+5@y0vZ&38D0rPs?`L@&5WFPZp7gi~ zbZv`>rT(SsA^JsdDUN5oWEq?Rzy3^~srd@XDxmSk#(vJVB@(f6`ykDO#xuW*XZ#7S<2I>Ezjzv1DVCqwo8<3 z4t1bpJ-6j8{KSGZ|D7paA9Hj4Sj!5xx^D$mZgsUH{BuXISxL|l;qxwN)e^l!-XwM7 zsJpf^Np-h9yF2j_IHp!gmhV>*{`&Kr+eby!x18ZiJkcWeOq9vyuWc7mbGy+dyC3>{ zOCyPmZy7)P)uvrHJ>IAM^@lk>*wTgvz~!SXo3Pk=#?`4aXnl&RjL~=w?F#~vO<96N z9A9HpYt3pNKm91VOk*XTKxVF+N=ntpB)S+@BJ#Hk=UynwKSiTt&OY8T*(^^rC8gWL zl)ysx2I5_Atx6D|q>m#VD|*~vR)7ONK^)jk+Q6J~Gl6*PfhwHYW>{NEEE0DxLRwkK z{U7={`;XnAvp3vCZldpVIg#MkNfnbF5h%gAd1ev_GNy?!J&YksyNttL#lCA7y@xuC4?Q?KBE22KTsEr^L zt!HeZJV%pL6oJNNgPtJ%0zR<19ZcwKQ8*_MXn_}jh9q%-eEg0RB}XoyClDq`(b>>K z$OAMoan)0Zb;timG$%SI0GTdV;IL@#tU%&f@DL#0=P2_);i>lT3p~LJb*vRXeH)_) z4B<43cf{^#z*RH zi2@y6)6vl45p;?wr`^+mcgu5Hzd;yKPF0!=o4gSXYM=c51I~5bi5^yEZ4b+v?5C9) z?hdiTYeI{ipb9UN)UlA*sh~fm_Xw+kKe1rc3nb&c2tpZ1XwXn8I3G zBMwxfb{PVuA~Hemk;JqCJu>2i68akk*#T3bu@|#&hsF*Xo^z}LLf4@K>hgR@QyjgS zdst`-M8YilF|lF73PZ%td-d?qoF> zLtUeaBxG~HG@z%l(^&A1-JBy#WIVy_f#pLN!RNFsuZ9gxeK zPwF7Hq}^(r@DJ)BlWQ$3zrr`$8~KbKeznW_Fu@O>?w$i?!G=Gs8+FrkD7SpD_uvM( zXd0DUKaY83NPhhbTuW42hwiP??L&}95JU0}byRpV6HxD8y~gc|jmTojafb;y#X;(z zy)f)m$w8`x-0^VGt8(15NtSRL_tV%(26-wO)h}65?)WWQ_&rG!?yL7BYT!PuCZ?T>E=1cD>Sv`-hT8nnL6oUhA#HU#~KuNa%Zsbu)UAA~Eg zlQ#|AbTxpi23C{0tUL#s4V?kP09)RdO4WX)&6mpIeM*3Q3kF6H*{38nXnVpF2o-Gm z03v-7T+b0CaOx4_{XN#<+wyncBR_s#1>-mQpA%_8gI3@aMh629n>vKY_u7ZFh6C)M zXpO_=Xiwix)KVL(6oT(@KfakUW!SXGE8Qxv^SMWf)};GS7%uF^lh1OyM#!!`9Pp>w zMC7T>AlaXleWMet=!3k2{GOn22}Zzy;3%1YGc-6jqv74kCS)97B@N)u|oDSK1Z z%rR3Tc;{itiYj8m3!ZZo`!N&}7k#-HIumEI+HX=`m2rmA3(H6q;`M->yb@P6<8N|~ zmlX~ZR|N?A7$3%Cigg{_hE!E31lrW5@fsc8|_ z1-opNG=Cc)|J)Uyph`3K*pm%RWYJ=lp7h%d8 z`bGSaBjxnwZrpUnvp%dx&^W^)vI_@X=^JsxCzj}o0b#znIVwl!OY95Z%}(*}gc8b> zZ=a1RR$&7mNrnw5hLv00Cq|kVx=OLb%qFH=HY8!xr9o51KU>Ep8UMWVoeiEM!z!x* z+PVcK>_VOM304I0pG5;`3;h>IS^>{M=MjMdqPsm~7wNM}p4(cBSlzV$D*LZkzv9~o zth@=s{$fgWw=R61%X7sIPv}F#oB~K+sPy2@(gx;MfGqX&~yVPR&CJtnS0XJawG*#=W|(L}Ld=ZK8rvZb#f__mPdEvEN8> z_eiCRHFHtF9r{cw|vt}Uiwy4N6EU*G>!6bC=HT$*{}Yi z%(i{Pxxt1WMUWt7TCA=*(L~HccSU`t6a=X@PA^>3vfc$QHF&_mP$=OScpU$UcA;+F zGvOJ+FZLg>+Ps>cW4p^`biO`N;fHvuX0^p&VADqzP(G`9fF2$(-Y@fLjsQ4VGvZc# zm@y1c@y^6qg$?joZajx+{Vw}7;bC^1(Jd?d9zB?mc7wPT`&@8Dkb~|*eE`>Slj`ru24stBOp&Mj{?s-GrXLE@I1*MbrzN~TX%a$kBTnAbwj2!D@VxQAa$ z{SpLPxPGEsy~vafjx?6%E<-z)#rM_*!cndoKOG}dq+Xvun_^PJ5NA`+QffPw5=Q@d ziVy3X(@Mv>5{E)z+>RQWoork7tk0NiO=T!;z5V#6Y5ilY-Z7gwHo>Hn!GjYN49-Q| zNWby51?j;2kM644iDlH0H=(Tqpbq2r`8jhwTk(qjqafu*^8}s=4C9-LMTR%xqw55q z6olwks&0YNXv7vfP-RKa5Dcsl;Xj@*vqC_(bHXuGTp`*fgh2uRVgF`XD2Q_H-SO{( zN&xdiQX5L#EDJZ^VYPG)z6UUk0L^Q1Rr@IhZ!a|L=OQy?H$j_=Z?k9*5 z9HH}-2SUI}z(c<-!z=a@7XpL|2%Vu^wP^@=zDe9W2UAo7BP6rj31A|?J2Vy%Dp*h+z&t_^*1kqJoSa(^AG4|eI5)x;hJ|Tb|)LLUsea{4C zapWS{Ti(pOGK{xwz!j9_uDx4EJw;hgme$kAhDsog;U_HAJR%tzZ}@{}hyMN5`k;_j zAH@9ud03#>M-Rg|@@&O%=06N*uqzisCq|#~rd1{T;B`8`eHp}?(DL3BlnCa>UxtpA z5p!mL9>DC=xt&4!e=*z-ptu+~0a%xzUQYEe;)Zq+`}QTak?Vpp6X6Y$>nB$IaKXoL ziUpoLy*2^=f-j_|Ni1!|@=a`~&%Zu0THg-eDZF3Tp}c#P>8G$DMf)E%3pf4Qswzq>m9({ja?0FptWFIgz(Vq1?-F}+kZR>oRRy!&p4*tl z{J(V7*MRF&`~jD;)$t!tJK3}CczltB9V47Q&0?sry zP@n~FcUF)N$ThdKH_(5UD|Las*inX&xBZHv}-yyDA){HeUi?Jn!@Q;==f4l&J4qG9`l& zd^vbh-L`{cn+#tXF1Ka0qD8-ofWR$@Qp|Y9?)KnuUI_eC%=@L5nOI%T1o!o}le}tz z%Sm3M=5#yDXb#E5z!dLVNt?Q}S%lg}52Y7czTi7813V+F_Hsv`FlICY?=m&XVIJR8RE+h>eiR`l_wONqRsVIvjF)_mP%^ysk6}sVmq||Wh*|~ zt^?X#-_W=4M9c1Qt&DNZk3RrqTXIdcBYlBqspojP$xyQ8w`3?^-M7knk{!_fOYZs#-4q~E<6HXiG)y}+XHD!)(=2!qF&w`J z$xxfZcfn(G)`rl!dq6J0ISlHC-wf9XJd0^Pb}<}0X^G)>2>2C7eADDz>|dMZR)h< zFYcKCByTd&8q8x&%kG%>+^PM*2>@4~SJHv~-8?OQ&Z@$mdt-k88!}1dJI~RWHx0D( zv)l<4Hi9?+=G1266C{Ao`n-qSje__~5(qVbf|S^!2N0F#VMagyARK2-tm{}ONUQz8 z41k^IMvUTA)61g1JIbcbq=A z;yxo-AskQ892dm;(V4EACCr*gSfFM#r-5zm{^7MRBc8F-uu_FCBBo=_k}kuWUh>?2 z?Mhjyp$>p;OQnqtB*I)YeEU6I5!9V$4Btzf;|T`TuV!PLb$4{ zaRkz^)OP1G!+L@L52X3k=!wL6dRZ*3q0fC*y#jXu11i9{{&>?tdVP?- z5CrdY-dfky!g#J_mFL;FFAZ0p@}l0;M_**;Od8Ip2-tTg*|uHcCGB5h@5D_sio& z*B^NWd%Y2HAFo^mMlwYuw4j@=wB(^G?hV2Rek(XvJB@V|nCFbCHM>-{Y&hO^v4B=tSB8Yv2w`54N zo*q7WLF#$3d^vJFk{9Z!{L&ejVd6Q_ZQtCX#cA&LBwq$-Kqf;)e?goJ-#w(huIp4^ z&rZ>w7GgBn&m{rO-9s`(fNZ&7Db&r5taCWYTQ0b~7Lun%e~W4{i6R>NkhI!9Ne325g!GQKKXzLxLi7}T_HD5@+9?-QaC=c|F4x}BrV&%LH^>qHtP!%APZMWli=3>D z-sV0FHT3(KwmN$3ygG<;1YJfkgV|0m1ShLjl|5SPjoq(WY67n=-cl@?yaMFXby%6B z%zpjq$NUKXTbMf^pTJi05#m;KoT1|zr}$T^caZUXR>s-ztQ->lKx(k8txA}+kP zQ0^Rv*BNe#wq(;q2Hv|^MrAZisZ7s~zFJTVoec0J?TV@3SSZ(E1c0CWr8BQtach=F zo{Hk)s5o7F$NnIY09M6(BC6jpC?Y(D z%J0U_O6%#rCQJ02wvpXrRx+%G%m$E@L+K)bf)`<5B|6aeWrjbjwKA>(knKndC=rIy z^JW|mg5iQm`U%CdQY;u6YEx{y&hy--P1YtlhsFFl*9z{I%Lj~Ec)W-Bc|n|PhDCsd zCHTWQOY)Ug5)C49(j#yv_m%sSmr(SC0}`Ms@155Vmk*0n_FNx_YR| zs#NucH$85O;D6EOTXyTmywl7GMB78Hj*GT@(gBBf9lt!(s~A1RzQasMRrvxM*NfM} zYRywM#X`B7Lv`>PCY54rJsO~dqkuRUMc|y6iCo9KM(`PnK)@8EQun3)^lr}O4=6bq zI&=)*ybdcbe8M<|jzHRHR6c=5L>wp45S_n0^DIf;Y9%FoCcWP_pDXuOpt$7QEI`Gr z3C2W`A- zTbfNwcRyx@Q;T8ho|o&aki1=SGM_So&z^u&ww%JvI?x-0o12^hw)0NzpSsRGQN;_9 z;_pl#@*?$-{ys)9X{lbnset#qSoM~(IiE+aMXtDYEHNFogmb#cN8^d6&hA8CcC#LY zb`zjjM_NZD`-GX6fWEcsAC=o(Rq?zNH*i&#>}5W?XboFF;g0$|XdWxd7SRgrZHK0sQW=4?F&v zWoBWHsQPIApICK`yV1J$9>@o(tH_+C=l$?`a$JARE*NbcQBfwxu@He(d;I-LMfktv6;$6A}*`Im_ z);BGqUz$>+CBnl|%fRlsYO=V~xBnAnBA%$4HiSNn2@ShWYSFPNAV)isSM z%{`N=HvHtIx=;57dG)8O4rr*(-P*`UdcUp>tepc8s?eKO^YVmXf%&-0ZKZ^@op-7E ziy(J=E?WqWhFtRKvv_r2mm@Bdqr0OHEQs3NBsk`)%Tj+_gQNioUCNtrvFY~f+1}fT z-a=9T8bIn}V)Gq6YS~wBerAVod94KkQ6QV>GV|J(@G9GN&iel{M%PSxndlBi4C4HB z_Ii3EzF1=+=TF;>q(7o0dxkMuIfzgN*T>c8H^-0O!*vSFt)~*9-|xM%Km+Kh-tJU7 zel8lY(2ulJeqwg&!!roSIZjD0hR$m_dJHhL>dygk~ zeNKHZTx2{_`+luCJnMcAa0JszoS`Ji5%O=rg&{>`_+bZ^9zGMkn=uo<4jPXH_CAgz zoj!%zPP)`!DQzI;=QC&U@5SZ}ePN)h_INvG2j>Vb|At=I*@uy*H!x;s-+syb-llrm zZ9Debj+M;|_R9V{UFsjZcPigZBxp`!H(47W&~rB6Ohif4c4B-y(rjc*Qt_ZnjGry{ zVAftDEJlrh*&jPWi>PlAAF$r8$B#CzeP!iH@5DrOS9_e#nc|z5qcTQ%sM&zL*Y$c| z*T5z2BGh&CIe=N%a6Z$jd|XX9$=L?P;zGsC=o{(GJof;#@E}5umn7w~H5qBIr`CwL zuZz^1t(5PxyLjXGMCpg@jZTB*vB95`b@fFEX=|%5()4WXo_eE|vInCOY}jS=HsHj> z)kN+7*m*ZkP%qCmA|b6n4f{vl9s-C3ud3Y(d~)O9RnO5?oWG?s5R=eA(~#~(za>tb zsCBl@9PCsA3P;^I@{jYh>9+ephSB1Y?pIS>^n|a(d2QD~S$8x$hpgg0dTp(0qGe0c zQ5?^qZo(g`{i>?aPws2b+PuBYLbC?#L4Hq7O)~YehYk^jOPY-PS_wtNLZ@u_a**hA zWW&4joQ$ch-#}8Cw96E?+U#aSJY9w8i=ps(`{oMP;KH#{3Xsd3kLtJ3iIY0m^Nc5P zw(PZ+J)HEj!=+I202i#CVol8^)+9VHI>#4R{;(#S;#tOl0 z?22ON8hq_vQOv}O?X!9}QEaE8;{C(ubfCsho4bkv4B%G_OnXK6s=;-B=b}=K|3J;V zaxMIL^NNb)CnEtAtjMrZ_ylZ5h`om7>kIwKdZ)k7%Ud_%W+x`i*YxXeH5>Nyz{eeT zL>81(OFrVWz&jo9o{BPgUd@-nPF|Gq$ zV(n-e)ME#n2Sk3Wh2`0R6iTR4A>0LaGbrhOz8t`BEY{9)>#HpVIZ3~PWjydH?E1)A72jv6j_ z_kr<}V{e5_uJ$*)B*LIygs)cM)3N-hCbX(Wdvg&olGj3RT5?6sByTcovj=T*=;;Mx z>=;~hmglkdyS)8^qlDDgg({lr8lVJ6AkW-yy%tgh{sE>&f4hLO6fMbPZ}XnHZlp(@ zYW~c1;G07n7`M(6-EFUbmKQ9=ZCq$9g9ets6=#txi(5h*{epD-!}MygB>){8Xm2Md zZ|1z?3UOOOw16-hZYex-jlUuh3&~}s-NB!3VyFUKpg!JXuI92l@k-O#2suTEY9El| z?mPbAjMQ=E!;0B?No^!uaT8M|yx<-436~0m2?DfFq4s4+=VeY}BR2A*aNXL z!%fB$uS(8=K>ttnHO3%$=TrlYzZ~1WLLjt&A59uOA(Z^}rToMwIp0o7}RQC(aaf_I>7;J3dwZalDAjjp4lVc|2uyrQ#2zkPu7%Zlce zEws75w|~J~=V5<}x&KG*oLe^i5PqVb`pW?0?zs7oGR{I7Nqmsa ztcQvIX5qN`57W`NYlt$eq>dKBxB_w|b6Y)qYgu&t#D?bNojS+7A<(q9U4?z~f1pJ8T@#eDLgwtkz}FLi1l=Y#xEe&j^RH7aK}Ruk?rM z6?CTLy5cl?8*DMu>;Y45zG8jQxu3Y#JmsN35w4wO z{{EBwHBXcG*0y+Eem-T}i2s$TM5V@(J-#OBgyVqupb0|&BDlny8|9z6wDGpLQKIlk ze2ZJuCyZQrGdJiaIOBWx(RqV{$(xGYDq;6aro%SER}x&3T2%)9Ki0lFAgXQc8%04{ zK)OLnV1@}wTDnt88itSla_HvUc+R=!oO|y3z4yNN z@CP$%_F8K{``Ig==l6ToTGu;|qvlOm=BH{7(C_x7)B)dnUe;X{tF)Yi0{?^j(rbbk zWWd7ORLpJF)8xL;iY13Hzg8RJB`?br#&lhGY6?|tio8j&4r{%&3qZ0qoeSeFAi+g@R zPdU&$L3ipv05${GI=TZ(r|v z2Qpd^u)CV_cRnwC26&PiGe)hW$RB5yCFH#$fTPRQpU$f?6vJ1>B--vguH9xd@pY@E z6K5+g9W12M5w!al^+b5QexK&-^6@S$T_CEt$Rm#~a=Bux^F(CZZ);K52=^ibL9pJ7 zbCK~7*Rw51Xj^1LMQJ^J1W%=-_uwIBU3fwxlW=9mR(<=au@9&BtY5rweZjn+dCTb_ zu;Qf{bBuv*&H3JW@RmvM{I$yt4^c}YZo1J);8&^x?7^@8xZoA=izW%fO7Lj0$Hxrl zw94_<7cV!u68tbcCxVQHm>15&n=hStk*CCw{+jEv^e;tH#&HfP%q8x zrwYlS@;n^rju2uXSXXK}-)lbNYrV$1^VH|bI-AP;Y0*xm2xSiy<`!(G{`}l>`ofkwy=%#CE9lb5cKQH*blJLOM-X(W zVyg^YZ1!84JzvzWrziMP-rR(J;lG`Ry7b^~>{yb*cM_W(>-=_EePNhtycly{-h2ey zaVJGCS45|2^pcWhp$>JCHhXeru@rjo_0*a7YM+hwD(eJO^&JJGuuXrwq9&@XP^`9= z(Mh#wMW-B5&5UQFMEV4L(<(#~Cj<>MbbwwBwzSV38oYNeE|&q`WRZTE#uBndyc}xk zP``Xm)_m$0b*Oe@q`h$AvT^pjE+r~;vCJs4SXC&7+Q)F`5W~CW)S8cKC)9Uc>Evkf z^KRea5I7mwHQ+igcm?M?2K7DYu#~jevJDu~PPUdBE@Kdthg5wOV48tU)oP!0I@d1m@)=@5ax1 znym59km(al32jp!M5B~~*4}9AZ+M#eS)d;lV)X9XPp>sK?^b9F#fko~oE3?l^|C-+ z=W}W~%smA5+L@uKo+0WAH_tZO&F3&Y@A$rj@+p9%n<<{ipkKCQ^p;aDaA5QnlNOJx zAJLw>8ei%<2!A6t;`T^)DVLZjDMsJjo%MB1!Ta7RzI0lWhki+iv6aCQB4kB}ewq<@ z*lkyI(Yc$D(k1%cv!mPl94OaMF3MHiSX(o&d~U}}`XgeQm``vZv;k3HGz-9(VTWTP z+y3gD-@p@mBba>Jr%T6Grofir4t@S!^NWW-G_!(fzDTJdS;R%(M_*aM2Tj_-UC+ZW zVtvIRVz+%ZY9Rug1qoZ%zEyN+XV^#f132{+Ynsfp^}FbfPXfh-C_!E$9*QYwIgeMx zhroYm+uzf{*WP*7JMv}7DShB_&R5)xmaz=HOLxqXD8-2#?!uF_%zM9r505sZq5avDnI%eOdU9{xXa>a^UGr%muLkX?e>wqyw)X>{!r60?6q+5AM%!vI z2lZthdG9X9*2EYvnv7HRc7+VmrRX5>(&@(aH^SEZc~Sm)+x5Lm4KphrF=!Wm5Hug~ z3ob4nXIudT5$lVKrw{#!*K(ToKXxn9Z4i?IM``#5iGDq`;-#Y4Q5tO;4~bRq2^jC2kavhpWBr3hT}42i&sh@;!2x;5QyTJ2E;xHU8GWvKJ| z1y}R-!)2|BE>w z8u@aY?xMy22#8SrcM>x~m%F0p;LAOuYw%c)Lu`b-xwDHC!o=?C8`AVKHWUJ-=cd2< zCM1LnmH;lfSR?HvOr1}4NP1D-N7AU1oFXLq5 zU}bIQOt0eV;^6866jOCVn!B1IoUX1yK@c7g6!`Jy&5&2Wv15yf{4Nme4+3d=Iw0u5 z(nxz3Y_Nu_smssg)sGNtu(FBW)ivPT0~2S&RUUel3I9oe|LH0-&bA$!h33yzv8N%G!*4E@7KU%rkTbekz z+S!`8x`2_ENPC10*v#arK4%9LGlapP^m3(w-yT`q)&=2Yf7QIek_b0zGlaU#1K?HC z!?3}M2zyHxD|#r8053LJ+WIOZ@Oo{5ypjk&>xip5e{H-TscDJsni^xIp}h@!4XV#? zhrj5vu~NS-i`O6<2f7Erx-I`P7LActQqw_FEiU&Klx_CO8;Q75#_-^4YNcy8C?tm* z9qv#i%9$5Z%+z~sb*IeG9s1d1H1tkcZut(^qQ#yC-Tb7egY^VAOXtqqa_h6G2uowk zYq;BJ=(cFH4&~(!NROniCtvp&jkHZBJ|b(V#iu_$y*DTt*^G9X@uEhT5rU?g6uG=} zG^S5M*2yodoyuIL(wS5VSL)%G?_typglfe*?{GfyIY>qj2<$?i3Q=@9_sk=<7bjU4 zq6CNtm??d7jgfqhNAUU*TGY4Lf*c>m&o;U&6?z zR~=aA`Q5~0H=h5w3q-<@&)&i-SMqa5&%DDi?ovkR5gq1*D=jJE+1XL#zX&WeW_^p{nn?%`;&mW*2{4<5^J9Vn zx{Pm3UQ_4BPk+L`jr~>Z_S4{w+a&6tF7y%|)Mddsu~dubHzf#FsbAb;mUtk0okVOc zQ~fRVyO1AQ7Aucd*jy-U(eNayGS#ezPDs2knYgiXoApWvZEuzvtMK27eoEHdxeeu~ z0|i!nOmIN=xxM*RrRC);p$@iaKpx?f+l2RDM{pC8ev*C==W!Q{kf9)!DEqp#*mx{$ zHeF4)Y+PQ)qdOQ&Ozj8lva^zoh2<^)bcx{A{e>{&7xW>}ll zGVkf!yTP`7M~h>K&E=lHnn&(4ZMf#1rvCe+Vx24xNk>^!K9OOkY*^uEHN70oH!hm1 zAp;+v567ehGzBC)%bg;2Zhn`!!`b?5USduyob8m&lFdx>={psKM$M4xkn|7TAN+U{ zu-uz{>ee|QkXAt-*h#{})8s$Mr^`ouaU@}<$)f5IQo|v4to(MkVdZ_ZS@dwK{ z-ftZ5ioY$r^?Zx^CO^5s!aMI0waP-k!UbJxy2R{tvA3G z#D&9E$C;r^q0{=vuKY*UiIp8P&3?+tw>`v^*h<4{&}_G$Fqvzlvh848e@B0&reN8v z*Vo?CzP)O~%zZHZF`a2sbK}TGP|%y8j;wBzf&Pz>{?cI-MnoI7nVm(N`vXBwfkLiEn?Jmv8xQS-jWMaM+Ns7{7SL*7899fF1dHqPOm|cVFl{@pp|4=Nau@zOkxr z?q7PRk-;I#IIA{7`1z}zi5{=D>T(^GYlVmM*P{e-E85_Ldtv|*$L-lje}6LNEZLx z3FCs4X9S3ISSPjd=!mG5Ih9$4s6Px6#uc_Dkd=zjvp4W0r$QmG+IADPNt}*}#6&*d z`T|~7xm&}Mz$z^7rZk-{lsuoV9=D_UkyH~WJ?|uMIHyq=M`K@`d_^+-S=C26hRU$)yl_PZToiO**M!Mf3@{y?mHzq z1rKI2g+c`m`5EMredAF=w|0V&@A&f%h?1{aw!Ks3v()v6*&6v`CzDD=k+5ULdwKYU%~_hqBBmAnfrHgd;D>OAX;*HNQ` zT6qt(^$zWejkmhJnofE!-h_nvCix1S((+349r$;j)Yizo$^Wq0;y35F8t@F=w>!GK zo9h)9qR^or+jYnIQ*+mhhyUPIn{5Fyuj(c3_0YSawEiha8~ZKdq24hi(I0#*j|}WE zE8b)i|InWn_?9rhyb--dD?;hyU0xSj$=eyT=&Tr?A(=8Olo;sUiuk zKUP;42hAE3ytY!qgq;h)^~i18zOmh9pWd|9!*x;5>HV`(oF1}hLvw@m+C_(a=Z}7w z3z(;L_c3TN1VgDqYr%pBn-uAMKJ($H34_`V#p!jV4jTgSv*frjwYSBF%7@bglGAN0Z^KZNgZ8#f0DnoX9niXtxe{OVU2 zj!jyh_DJqBO~|yf__BgU4Uas|pJ29+gt8|M)G|6w}n0yblnHQ;&;fH?s zbocaM_&VH>Uo27jD_`dq<6GPwFmwOlTPRxF+W>|*(#ag*^oSeC&TRme1@AwWKH;4buF4SKK)QWFVS zyYy^k)-DK;w28fp^123I}w?%@5**K>^v zz`KHSbHn~3+^A^a>di4C< z^n85WAbtUQdskcAD-ZOyUIqWv=l=Oje<=o`hXUGz{IwVqa@GF<$Mrug$Nk6q{lq1% zMgnOF@LqmiQU?-%m=NGa0oVYL;DZ8*pLoJm0vKqxuO9U33J-9F`Kmy`;cQT3m1h4rke!KfloK%C_xu>zS0J zzJbr5l6(}FKEG8@%7sZI(gp5uM?0Nh8HQW?q8Vs1TP=IB?lk+wzmsi!9nU!uubW^V zyy3cTrWcm{kQ*KLU4|Rdr=zR*LGFdR{*)XSCb2PbkXy>iCx;4uNlMIb!#CNU$U!*< zhSj<7PLp2bWCW^c+Ty>Eb3(gSosBrg0HsTDe-77l1J2$RzyxoW9o;ehVyMBdxh4>OfuBn#aP<6=i`lPQCT&=25w5vmb2LD6n;3Rj4MQ1{UfDwEn+JP z9y#<$bMe#8YuU)eqQck2+ShEy!!Uw+g~?anwsd_oM5_#ORxA>B=D?j44>EchhCWm_ zuz4PyeCsSsi6Js~h&JA+O%FqfoiWi^#T57bgFEGD1z*u8mBX0P>iRr+3XgY&QE}*M zsd$NrgA;EY(mi{*7Rv=0m@zpU0%lO4Sy=`9b&S4%ljQuBeTObJ0@qD`vX#ic{k2+ zOHXj+-AIUUMCW#-KQOG8Vr8$edQA#3p@j35tEl0BOc~(Qr8}{%cmFZ(k~fB`AEGgu zc+^-n-i&0qhwX2Oyn7LK*0$hx#k&ucHg#E-F!{6#M*0(9F)~FkgZB|0JoW507Zw60*E0bh9 zhB%`a*XP}u`8MY~I72raUCM3i_$5Emm?M#>n~@cpfQE}ZadOKmpm2>2O0lX|=dMtW za4|FC5KSjimA(HByfB>eiqaIs?Tg-mCSv`85L4ZI{jmd@-tH6Bmv7ag8*wkmMLqp> zEi^P0(;#uQY`KYWO8rAjNAcYXXRegPvvIG#$zQkuR2Mb79qA`R zhIGy2XH56A(JqEJy_G8o3rj28;RRlr7T!h*=0U|i+r|&yTWSR>F?{4#m@jVKzZqDzr&ah~d)%2?y!zP{EVblbOs4bE1VIlr8va%-*3Cm5e{x^mO926_r|iD5ftOYiE_r5{zWBtDWcO{|`X~sj&5>z3+T$J&+nHxjl6w7&u@Al4@|2pl!e%Ql zykQdGnH4h7Z$jCIU%~*Rs31$^J0l-mAkp4qfTF15hBr@ChJ7K{R#DHk(?v-Uy^10^ z)Yq-|E5qD7@o2V?kK4T;+*!nT4P*^!Yw0bFLB`}g$0iUXbH=J`ZQw-B+wbFA1w6`; zFz@e`Anog#ObRe8ySDc(nLVj0ky|glW72q|AT=^-=ylok`|6>$defghG4r7DpSP`{ zT;$vC_ZB^r@^!}@Wf*dJW<&yV73cEqE=(es^puhQ(KyS;FdJ|1C~fhD0&VHjDZ7k& zq)!&!zIW1^@V;hfMSK7CH5Mr{WOnuL1?Kyu;Tm3GIRS?9(1+cxaVP8NbE!3G*YIvT zT#wU#Eo1qT-FfT5_M3Q$dpf}anr!@BUP9GllLE`Y2F{S@e$&E|*X57DJ~&P6;7G@K zO+U*pwvk+eDZnUw!%1&{@uA@Dmt#5khTAyHO_^a*{%fex1wD9g%Jgxt2*X zYrX31I6i=T=r~eZTvoDc$k1_nCt2m=$kVeTYFEhh*pao5uC(qVWc>IUQ>(%4C&B&Y zeozbX6PB*S{3QF^=xAQ&^RYHb^k|U<1_MPl_d%$vDjMl;T5m18-hT$RIl$^0NWJlB znDl7TgvflAexFvSG=_^?0!;IC+z9 zpW5kGn#iGk{cd|Se$Vb~9GmUJ?4*i6DRw+l zacFzisPw*$-!8W#G1a#?w9hL#Xi(}jDtDz?L7OQHJx&$_;&{zhgZDj%v&ue~I+tK& z=mYC}ykAo9&rv4|?&R{bOQ*+?n=*0TYVaQ-F>WZXWP1qps55-m#XNhi(0+URO`jL5 zH~+qUdW_xguiJ}+Z%dcPbZ^ zcmK>La1EOevmG9@NiI$%ew#QujhRE*s65a%+P8sN5IBq7c#5Mr8VO-M58PS~rEiwP z^;Y7%*Q3f79MY-ZSVWWS@z{48lk?HbvkGy>p>YxUCtL2c(MJaS=-buKFYI|m2*u7* z%VRsDL0R|eYhC%6n*Anj7;<@3)UoIk2?@8NdpI!-D_CM=nx);nL1WtW0;hlxN$Yi_ z3b~F+G8h`Haq77ibW`PPj33GAZmDg5fz?HOZrBg^=?5@Z@nLmES62OHERAlId1m|} zp_$2RR^m%cac5PuKCFyo5|Nu^?+#0j#wsvF--bUQIJ#F%^ad&<5&T^@QR6^4hy7{V z*kYfeJ-E@^tvH?b`&Mx?=EqRkf|ZYz`PZ9-K5O5~>)ulV={(i4efLg?Oa6(PhLwWI z*Ohx3?>fpED-i6385(iIAYK&zmyA5@6{)EJhkmg$>!X|<4yko_=;?vTt_0*7h!Pr9_`H$^2zF11w5LZ&b<3vMvpTefP*D?T2&=Y4(YY>X_(r&>NjG+I>MT!L*0zjUXBeFEeMP?_gaU=#GEc@1imhQc~r)KThnD>mho0G~G{9u>5IA-#0j&sZ=^+*X*u$d{E6g(N?AQOFrh<(YTQwT1KZnCcj<$?Y$lYsD%CEe z9qgz#J?VfkDI;Z>D*9wNK@5Jeqn6!HdNYCY<@_hvn^v`iKD{7c63h<@5LLFa>-;8< z9pC}5^yKT8A*}Os84W6sPQ&YC>6o%jv!AA=Zc;tFjj8s9bo#Ky=l+SJ)3aL<(e^8u z*e|B5@s5K(8jB$j-k@sS(}``Bd{Y+$K)erOC_GYrxeKRn;Bv$@^umq=4&8 z?0cB#5OlIZkmLb7Tv263?V$0U2h|suRanBH+!4jA^oi`aa)~=*FFxE&G?aLr_f%kv`OC+v%II?QTb{S~T$IrAFVVh>U^)K_G#2((98A^35&;B; z0HGW}D1tNnFNlTu73S)UbalFldw{~O@IBxsB_JZfT>&)<-w{}OoShJYZveDpj502m3> z3+Lwn@d8iI%MEA%`v1ZF6cGqTgq=0Q)dPs?;r?gb@258YCJ6-~AOS!-ze&ggAkTbo z=zlHY-v{i%0GyByAOm=Kf9i}LF2D_fU#0o}7w}%f3W!kw5PT^Yaa#bs=lhEm|JtPg z&jiD7TKrYU-?aGO%lJnW@IP&fS8e`x5`+f=13>|Zl82iQ!~--*hycJX@Bmy01O$Wd z{Y&^+)&hxi0Vo#)2=W)@U3IwsYZLslU=S!DNC1e?f&+NC06##20Ej&=(1GE+d>{aR z{$C{f3o8TtBkug4s_dV5BcPk|z+v=oC@+W~U_XB2jo`2=u7T%YO7@dCk}$DF+FP3; zB}`mgOzaWJt0o9^mW1Ay5z>08d}x_T0dz2oMY)p8wxS^KXm# zM|}OiQ!4Vbh{$xD< z9+g5MynrhC0g{s!1P8i1z%=plU2&fRAeg|v?(TmjWB)?b{hZ1FCIR_jz#RAw0ioP* z5CrI{|D}MiKN3w>#MV!f3gC_Y|9lt}_G?7uKZvbAm4ndp0RuSl6ZRkxQsoDwsM~ocBfJ4N)y8Wi7 zbCd#DDkHNUR41;VWL95ere$us%N+m0{F?aXK~GPQ-z17HyfTPaj5fNeice6`NN{&T z*oh?~Ff`*E;_*W78ktP}lb-q3e!e^zqx4%Ew|Xe2pUu1I4ZSXDE0a#1cTrDGctG1E ze16dtU)!1gv`Clv3Fbh(pBtyVyWMQ92rWB))9cjYb5)MrENR%I6z;u(g}C8&)GhQm zpFFI))&$_azPsdpBK+4WSkcC*tcu#m;A>xb^!R27XNpB^-n9uM__8N9f!#TdSNl(y zEGZ11Fx#{Rvzap|7rHo>@;jaDX}>RZ&EjY=$78H)-COzAtiCa_Gsw;@#<_+0Y*F#y zu(v~S2-$aLebMF$NwVX*-Tu*ItSuGS9uaKrIoaXcQWY;}ab_=CQ5~{U-A6~S=690) zze?e4@EDXUt``d(+bc=dWX@6jaBcygl?dR~(GPh3NGGh~T}YI~IOYHL)Kr>}=G%>t z%Cis*0Sw~m&9J$rpR0GCGjWCT1}S{{_AzI>(K3)O(^sK3E&c@uxPH*`)vIN5IP}Hq zWPZcZeI`C?*F)RfyG(eu``~w9g{<{<0%s%lemi&;p6lQ~3wB$JZ{VKr@>9Ua4pe$` zdDg(pbh=6hc~$z_M>%)2Z}z6Abx@@00pA|Kc%Jcyv(rVmBm)e2wgHlkcE5!>X2qkQ zxWFqidbSVtRtls}-~ZGy#dVw|&Ki9eskrQ0;*r+iK7Cu#tn;>i4!y%LRsZQ1l~Wn3 zlQl<_G~DGw=%x}WtHNWIct>!@+j!fsyx;)le6_U47{`$|B##H^-rBkjq?;s^1-yRK zN6OcAE2R2fx48!0z4=&=Kd9&9op}naB6*rEZqMHrz59$8_>cg0Q@(4Ve!l#nat|(6qgxp68CE)^cxXsr&iJxlnrhZJHS zk=i>L3A_J&m670ZvxWHHqYk_f?3_;r!)uy1xA(Oglt%_+*KV*czIv8tu z*NVgy=8=9{GEV1;6N&D<7lDb2vMY__Of)r7M!)~YwK0nX6Hbn4ZzLM{r2#97}GY?PkVkLf$_n-;n76RWacOLQxE+!`M>N#@GO<(Whk zqjLihc`u;$!dfdOR?p2GwxOmd8{WFmd4#|amxyZ&3%%cepQ)_p^eeQ$Ha9&z+{q|7 zN#lh-YgvZ%kr(-1i)9!c_25XrMc%cN*U(rpHg)CVPjRQi*qVwzl7t_0=(GBKhV^~RkZMlk z;Bq0Wt?Ef6YbG8sw&_lB@(mWs;o2H$WTg(Qyg;@23vb^x8ZMHp+pG){XeWPcgOr(E zr2K%zV_B%Yt87vw3pcCD(nt1HnhV3N^n z*h^DY`<{7M7^~aF6rk@w8EY7JHC7Rnwg;srR9df+IzjlV<}8?=Y%-haKnRVa1~# z8k|9zm-_CNOQ@Rol`^oxo=_O8DM$e1YpF<5Hfe5#x?#uD)~nlq)IFjkb{`#(aOxYN z+t&AFlr_Dpkr)kQ2r>jk6qhvCeBd)bHw^P5FB8!WdA8O#J@%6jN83E5(nOTzHi+B5gGwCUn) z%zNn)tPemAwixds7#!i{>U)vw%vJ=vJc5zd$)(BI*p;IX_>Fl!JjT;_x4Qli|A}}S z_@n~uMrPJi>_eW*buKVV-(`a!btu$7MiVEtDA00w%@eh>l5iP`e~8? zpiZt-2$S)IMu0&IHg$C3H6=8mp;Vz02{iSRGR=7P<|Ji?S0C!9Y$geevm)|rK1ewr z2_=XTNADx(JrV=(+o39AV|S*99#~$FkX~|Sx+L|J*bwl;B>xy-(2aMGCUJ*L?#|_w z_}d9Nn89&3?hir{EHV4XU)6a`Lor$im8glAEx* zcykUF2`~3cYe`WNTaBJiz8hOz&$>~N5P}aQtHt;o8)+&t#&;v5Yqs#}cq2(CVn6vs zGeb6h1YAy8Zw1n!2OYOK8r0l-^Ek;nv8J8|-ahHwf%)>XK=l^br-|e7r$lb&2b?wZ z)$enH7B}7Ga&d@?%44o=o(pbqmSJegj;-v7JZ-MucbTqer0M>aj1{rPDJWHqTZe2K zlzP2ARS@hj_%7ViGdVd{n>2XSGvsh@40k>9d~oga3I1w%Jl=?>1oZuLPcNw4x0z2Vf_4UJAb7->QGIfz67`iYniA(3@LF@Y~kd zERcl1E+(CmZL`kN#9mH5yxx-lr|Iw{x+9Beknv)tY^X-?dw>voapu8sZLA2xdN2N1 zbu3MYZnt$GPhg8!NhV%Sz`Wjw0obB6)Q`IEn9k?6a(fm_1xF-PMa58ySM?X|u$Wg$ zq*4X0r0%p_byyBYbiMhcb_1e?e6+0}8J3%;x?HxOz9*gQ=yC;(N7KME`aWSQjUS-8 zvlqPP%O*WmzjyS6Pu7tspJcFqSk7`<6jaHRcw#HKEQhJAbe|<$$Ta;^Ya}Y+;)1t? zZ7R?LWu!fCe4`?Rh35IjKULm8NysYz;^P6__}?T1U|I;!Z2n6LdH&fC{n=Umcdr?cttJRJ{o`3#>fDZh*!0LcyIuA;< zU?WWfECN4q$w4eiICCs_AI;0R51Gp+EqlBx*U_K(Bmq-Lwm&|c=lYbi@;T!E;Fnq# z0sb1ZQcIHt=I6>=$@OGKp#crOA96R|TD3Rf5K()V-45OlzzaeVr*DfsY<+Z+Nn}bR z7VeDxTIZUm*ihYr?;rT|2QBUpe)|5cjU}T}mCopNiAdKX(`|T-*_@=$$%PdA2wLWp zQ#K%X!70fEI|{tTo^XNPRoVJ>4kzQGGv-FS?urZ#STE9Q&~(6F>sHr8zTktsPjwUD z2?ecRH&*1|WuAy{z{$G#aN))tUDb6=oaD8;%{-SPS}(pUabdf2$n$SJ#LEgB?k4rO zxZxDHa)S{)tajsRN&aV{y|jvr`TRtBJyB)AY#5FbBPFeo;belP9*pbZw4>o%Ahjcc z2*}y)pIf@Ter2M=jX!Q4j2Ajz?Dh?VSJPqYJzS$WuX_6YN+KHj7x=YFBwn_@y zCn~TGn%1(hp!Y}SD}$a8ajF~U*NBH<`1<8~MJY2nJxDin{aP75OyNcm<=v)z{?sJ) zv1CtZ?hF#69d+)0WEsqQoypHk2ZBwmwJ;#{Z9DMvT1iKZw zw{JY6#3;)4W-m24@w-EG(XcQH@J< zc0%7F?$=gAe0wiR#eJr*-pS9P+uCC5Hb_mrus3fV{Jc8C{R>KhaV>6UF1|U)E)lrxp%paFzj-YiGyI;` zi(p9hR^mOk*^QI^so=Vxx(F;Hg&Mm>x21vn;ZjcyU)z<{dpTS}_UsC!F)5~9X4zkj zQ8*IQP1%v~v43TP{dFSziwXAAO!^bO4bW(S#q{r*U{KzlVB;UwIzV~;hzb8P|Ngpa z;18>uq>)Z`K)gTj|7Q+h3k6k8DIE~7=pONNR|Ph(71Hi%ivSm}q!ZG?6zKtw@^*Hv z_Re5+NlAcQH?skl`m66QNTjVZ*v;C~9^vAGa0XjgTe>|AXJDeE@gm;l48BevbmU zTEF!_tatdiS;Wr;64C%N3z%9!bpXr@eEm7cUCnAz9xgH(E?0XH0QHE70FP#ibkexm zx8Nrr?hI^60A&A3=L46oO8h#p@xb{7{?}y^sW~a##dbAnt?l(q^SIbv!jusP##hB75r;kzp_~(N#n+Q77t$T8Sy9 zYr5R)YTu%RrFYX!q;C>zT}&>R)QK*8oXyS9HhGO=xE{x3hJ?SDbr)i5`&JE7^U1+#(ou}^h$B5eb zooza&x9^M{tRJB2ylr|#Xs1}c4i~BpFZK>rIMVYP98Sr5U1^V(EE^oE#$axZfmwKT zO~Nyt=1qtDAGFg&Mx4EP8CUBaPRD!WX+)i88+P_+dedqA*T)QNgvSR1{g-gwSbVt9 z7rY#GZrI-IZ-;4Jbe0}I7>Szeo%1~Ps?@fx!YYP@2yY~~AMOhY7m^FLwIef@#~2Hb zU_cd?uhQE2sZM;)4hA!mOup0)xb|nv)t@J%xBD_(F246ieA4qeAEUEabvE>Hry^GV zVk_E?V@P@UUEz^el=f2HaX?C`z^sdipLa+T4_%_+0*R)!Lv*?31gEM+W!>k*Yh%@n3FM7GzWb@fu}jOc?K*Pz!AOne z%b5D}`a6ui`^zhy-d-tmub{~~=bmBxZa{zrVn#?PZG!Ax!wm*9%jaR)sAUP?6v6_~3a}aEtUkfaGuD+!x_wKD zOFy-xnCYo<;h6^EH>k@?H|ghxRaG%Ulezwvn*>4=FuUWPsVzhOu=`~NJ~haD$oBQM zX2Z*ieHS^S?Tr(1MTgC+TP5Pjg?bc|HP#hj`qf+!jsd8>3 zaP6UM@QnoL8$_=W%-FB)zaQCHTd1-Oaj=;3Yb;PwdZv91cn9b4`?fEX;K8D*M9wsXW_bBX!lT_|d3a6XPc zH{zL8)A@^hE2GcOPrJgr(FNBAK0mCcjO*_3$?kkXrkwnRJjH5{JM4|a7fsgMROH3m zK9k4v6%1{Rw0h|tYO|n7am|9nT46dP5A!d_(vPM@V&4(RC{lPat+~bL??FB@Y0wBK zClANwFFkPc9?|?-7Bw~f%{6TO0G~LFrl`oqg0Q^w<4p}nAD&pHfFnhJf5+D$FEaeO z7wm4fEDlP!ZG_6nuP2*PH`hU_&~MS)=I>DLW3DOR!F9qA7E}qv=_(7{#O2!;+g%eB z_WCC#jfga2E6!4!7)8fL1FNq>vnQMxpO$_Wg|oBTqG;9pJT6iF0zN<8#ioa z-8Ke?5E+l*$Y0xRRXeb1vSDUO{t^(g?r3Wo+_B_-+%Y|OnnzW6VK9wKkMgRY>a9Jc z5#0CiZq$gWI#Bw7$~o_}Y4UD*kALEGc+uH4y{|GegihV6O)w^Cw6{H95IRn$9Wxzn zxoXo&xYZ_Mfp_6oAL(Wp(l)r_{@ALXd1R7X#6J>P7!hvcR$VlaMq5rYbIfq+x7_}t z_4L`;jINYfA#r?fM3v3EABQ;jQ9j}BgOZm176RX5&YqBfYj~p$-@DZMJc^m;nf6iE zW|V#TAtG#^H@5)bcS$c3wPnh~!rDF$ZIKG8p<`X;(~lSOM1Js>%15=T(6j1r0J@I;+Wm z($|g|gx5vD*`Xt+Uh%Z47V|me#i)c;AW#PDy2m{eBD@iaCa}~-M8)ce4ppH2jb2$3zNQL&!t`0+D@ch8!vDjkJ88R z$!-Vv#^<+(OrVAC8Gj(th|$=J2ovm}1SiQp#3^gy-X_ppAVznO`$mf^G>Y>bk6Je9 zJt`)kzXLZ~F&SULJjT_?sBjwdlR(X8#*kTs_hmM1XK6$hCMoGr{yfpJ% z1KT9v(1nlvfeSl<4Z7z+n8=;_dKTRa5OTewDz-RWn^pUiW!SrUfH;Kr&7&e9MXgXt^iCvt-KldcI(IWxD9K4lzBhx3rTGzCNg_C~SY>v~pxJ zEDhP?*DmI?%4}av@V_e&om|SRrlDFyZ>f8V#QIb0a=oXrqEs1blc2emE2QB8B23+BSK7v-$wR3=v0%0(D9Pf(%qc(Hh^p0EqmkdNs&=-)s zNDyLGYPzg9;HgDt#@(y!;ZH0pf?nTmv%55TnASby@x==h!SiY=Tus{&Mgf+#J7OuP zzVW6kI=p>!T*5j{QMmbS;hPhG_~+>KZXut&{P%dTJyo~N=IpI|!h-kHig zPS{t5l`UyI-G{oMFEH~5e)WKsU7(bP&*brep1I4kM#s04-g+$IqM+@4J&a#x!MDUg zy2|PdaULJw|JL>n9g~fad4pLApM1t5jrpos{YU$?R`2I|>y9d9)a4%ToBah%fNI1o z{P5cP1JsU5+!jvn4rT z^i}8tnd;sGv*#PX1&3fC=yh@#V;yKNOMc^xsZZ}xGUtXVe~N+Zs7Rg; zm0;vn=l4Z(BQ*c+otbCR^n2=)BG$W7KobTzX!lf*F3Iv}jF(aOV&0hYhqk(PfI*kY z0bN_CQ@u#6Yt+0ki9`TJ6S<&_eo z4aJTTigjL~?zyEVIEhTvq#}jWEk)6hMn??@`%a zvh$;xJCFL6?pL_5?CPvP6```MKTBe3pn2bFj3Diwe^?Tu7|}Cfurw#2+_H7$OjyLvBrc!H_c{r^kti~u2LjCLg%TcIChQJhV9JVf$JQX3b4eNUU{|v_g|pl0 zV(CaHI1^erN_A`(Bz~GE1>)h3D5-Z-Y-8*W3ZnQ}fUtLy)+kT>HKFFIJqVJ-a|)|2=F>|=x)GD!IFr;Zn$|}DV+JOq4Z!h|=^DqiKrXMbZd@h7|i< z!(0voJxCHp2~FinX-8afV^EQ8yK4~wi1AH&nc(|6`HaSa^e=vZ;;7S(1shNp$3Udb zZ4GF;dbOPc>GJ`2m9p&^H!=|Hj&d=`iUaBKB=UgIwY;ll3Vjk(-W}5jFdC4Ngk&%W zDfe@cw^Zy0b6OMV|bRjXgFQECIbzZ-Ciyk)E`*JPk~70qE+bcA4GDOH9A=7G+;;L>7Ly2=U} zz@z1mA6OW;6p}}PfpVM}ym-Uk{?5GN`Im_wwA0!8O&=9pZ7R&L#Qd4~9FH=V_ zdh9{9Qhdh27-B%^YHm& z9mHfY)1l)nlJu^46en*k2AfbfB8D~kN##0O!+;Ky9Kw#^L>?j<)k%z8V_JGjd%pcs zZ_J59>Gu;Bnx}-)ZzuAW={7(&+%WRgA=uaQ?Nftjb_6%?QZSFNXifP%PMt8=i8=+I$CO$Y5-&b8Rm2d9ksb4= zVB7rP1dqzPxuv$}^58lRibdTEt_`lDnIG|`fQTCdZbHRIAPv^sb7P4T6R6X=t;PwB zaVuMeDVW{eoMdLb9`x$3K;jCN4i#0DH04taiB1&9=gA5DDoC*Od03Tp)gS^i_nxHU z4Ct837bD7eqV|?o3w_Y=UF2go&lkm}7%Y5Ww)^EKNl~d)=X*`rT$;X3T z=IclB0iE$la;lSw@?{8b%k#{o`}bN0bTsZO5&O?6TGHC>L`nMtU{EoR zyn)&2_AW+zXb|k;i4zT4P8$|xY^;9k+2c;kfLCKa5Vq}|`W@n=WU0GbqNL<_bM#g# z6S~f%rK&Cx>U#W2N6gk^8CFZp4U5{gb161X^+QQQnM>rl!llccD^LjbBH)a5(xhbN z(5F1XrCaBz_AXIdv{dyD>OJ!}I z`>h+Uk!4|)b87?oE#0XfvQ6FAEjg530~#5Qa;Dm2)?Lve^rtJ_`z$$(KqYwrUOTym z<-rv10BGDiETMBU8 zF8dY48&isP>tZH-`+cCYSXAdXcvJ*^UWpF}2XT*1mBrg3|_}$;TuQIhnmI$8o-C+=a}Kn-V?7bqx&mwNpU5j~oTpyuVk5Ltk) zmT~0?=<0jTEh$1Xrvn5AU9)s##}gLnEf1`e57B^!Q?ilM8vnMYF3*qTCHwL$P zA-@ePwJe{#Y7i))vjEbqfgIh|xK4AjA!lA~vGCy*aD-StYme}x`7_{wrZdjGB2!?O z%Oj^f%C!|qd1QI!3}e#*!F-n65q*_MbIYRLgK-nK3#nlwU3{X_Zqwq{?U<~_I32#H z1(}VKCs>N`#f(D&MsuZxH)gsxTXh9$!!^wb*CeNZYWt^Cal53qAcfsGEhdKS4dvw@ zwE8cAyfGDDY2GvSms=^9X>U-gUWTwrR9M9&0FI47UL}{k36`3V`~c{E5p3?C(jL<# z0Qi_Bo0m8fL1-0@`2a%VNYF`PzgqcBsiKp@!jw^pxAAbTz^N3%6tt~mFx zh6a8IdVc_s0c7j{H=f21F!YZJeFx>galk(z^55S44?T?^0PX)^P?|sWGzRF7zk%-n z#QTRI*#ipx?HWIO8Z$hoIezgpe(3h=iTq+({LKgX$6x<@JdGc=;K!05J&hkdjUPRY zA3cp9J&hkdjUPRYA3cp9J&hkdjsI(&#th$-pnxaQf97%m{5$~<@qd;B`YS!^gP8T_ zZUE&BKm`o&3;m6bmEmV$`G3&wLD%$Sn!o5@|2Tj1S4o!t)&}*Pe)YTe#$S`H0vvpQ z*|C2pdl&#h=)Wpi-IY_3n5IH-=`Sp@7tU;*IK+5M2@h;)UL?%cKNE!E&|O7`5o&AF z!5qPym`N8@yh6KGkqda*eZc}W?Gox~J4JfZ7A`_2J zM^l);qN)=ghP9rDku(E-VhcH35hppKk}!fy2`@Xd+~p@t^x0j@i)Kb89&Td{re%$O zYM#3WPI{b5ywEe0>Z_0&)>>Kpr{Sl43N`ub)J``oJ$aC;a$jC@05R-wmakn zJu>dz=8^y4e*2`FcLpMa;NBtxekscV+y;}9e&y%#)kX&bNQnG`Nio~Ar34p^Wn=7s zkVdfe^02PRiSu)R$Egbtr>`vA<%;%~!T2bz}PCD{eWDL|s>;-p@x!aefovK&7 zlem`|8U^oF$34e5*JlIy9ZUr9P5b3j{~dz(S2^Ot7vt9%A%G<42RYtfbKChHIU>W) z`ta|U{hya3(*9*RA|RjrVf}xT91-Bt0~qc>jtB@ifWzO&5h(>^0Ku2>AsB-J{-6N_ zPMYs|?BD+cB(Hx@QU62b;`c=NUn>_GX&C=pxL7VHCV@^3QP*F101M^Gq!Eq|{`B>T zypdf7CQS6u5ZIf{CbxPG)=trcNx5>B!DijDL#w1+i#c3X;3nW3OpZv9vY~1+b=E`2 zJ1C8X@po58ms=2f>Mt_HAT6D%;%C?6G4^^d1?C_RSY~G2z0HA}=-Hux^{b(IToQNI zIO5?|;cSF1pV-P0xLYBtHaMi`PYTQB#o%^C%G?^?IOp-^t-y6ek`8uF%loR!N%!${ zur&@ZXiLB8KU*%!d9thu^2ruhF&HCd3Ua||=gFx46J=Qoii5Wdq(MO5c5Tlk#ej;~ z8_a;v_glUlPZ)p+;|%6XjY###6B5i`=8-GMwn0gn4icl{zx>1ijGMU|P2z{||Irz5 zSsqVkzN2!qW8yR?t|YWJTp7=w_z4T6#OLx*Hq%t=1|vOS!j3agf)p_CG|1^t7C6}@ zck*do@AML}trs-PGz5Q|{PM9N`UP}Sp6 zaq3Izr(Rg;Ah8X>AX{KM=7r(c9Hl~KHiQLX$*l~#9Ie((X$sA+w5Tz<-e+qR!+frX zKi@V%6{igKw5`q#O-^b&UdQLX)OzY{C*c{i@;r->$&t-_6NksgKSzdx!$=DrY`vtS zoZkO1lQ?05mz}beLH;dp==%tvx3pB0GHU_nAKRGx4h{$2QB--g^E4;&!zQgAR4E)I zfD&tbd8-mskugK+FP7w~xauEYCzhC@Nbd?ym?PIaUnV4sc&*^-Xs)6>%5IdYW?d*4 z5>dCcCo7q&erktH#8-I53Kv$Rsh3&dD9E54zd)JJ*H|%gXJh zU7($)W@jvyCpF6l1756kU#YG^dnufaXY^YWP36Zt69mbkPq(+@E|VvowfbtdWuQCj zRg1_{4bGz1x!Q>`K?)4F9+HcWvl?UGJxNt!jrhG#_zwr9KZl1I0h;AMDtY(q+}~94 z?jbDvKokEic=#c}{0D>nIXn!og83Ewnw}9`^nF zGJk5VqlFD{;rhA#L!A4=(E;s$HTpx?`_}qrsQSCL$1hOz!xH{wNVD%H{r-+S1C zA4`6Osvn{1N2vM{s(ys3AED|;sQMAAeuSzYq3Zt{R1I)s`~`ygh8;g(Qhy3n(>#Ds zfG5}oi2E1p_&@hf_=dLpx`Y11 z%@0$zO=@rQ^i?(z1Jb;Sy|2eJ3lkiqX;30xyiSzR5~3g)*W{_VjAxCuRLHrLYTJ1V zqa(h7xEPr2y_H$*K3`}t8ud?X&n&5H-iJ?jY-EgN`o203?KROBL0aXI5MEDjWx2|5 z2@cE^KVULlEcUps4qoq5I)!Dl&^i84(|*ytG+x8lrV(?Z7q*Sg7Dl}+WtioPyt>`m z^C2uqR5qp~ieYe!H}7@_jR>h~JW4#(W;xg79h?2_8PW;r4sw@>sCZS5Mxps8_8YvXP6NDyXu^H3FrTsNivB zPoSK7YUkiaLNV5;eCQ24Ua>M$(;g0Rz5_by1*2~ieB05%P;0~|&cbFMKe1*VpmHGn zDGBexD7?rx5jyXg?6hOAfE+Mo$=u?b_H8JeIC1Mw8^Mcu+Er7sHQ4q`DT0hF)4a{Nzdbys2B&ALJF%=V(14azTjjIml5Gh>`nXcjWA}gQSy?Z``0! z5Lr-hJ#0p0Kb?67*@iKg>{m;b=>hxT72>Gog5cN@OCR>LSF;~qQJ=-)B1K$0H%n8s z3t$ZMw|A4J6WU~#g0-|AK${X3G~_4vD)3eA*({uiC0R#B>ICED3;6=^TKKp+uFR+I z-UB50pcV{RVIHM&A{k(#Sb{GF5)eH=gh6H13LNMlYUucKhYcBJq15j|0^d}d^7oqJ zukA}!L6dn0O7_;KRDT@S;oPbabH;ZJeJ7CL@~&?l4=Yo4?demp(nic3ZLR{7V2n^1 z!2=IDPEA39&dOcBL!y)2gOfL85V6ssO%<-7rtv@s$lG{N@o{&h!J2!OKqgh)`?!(Y zQ#q&W6!-bcZ}V}s?UR@bU2@R&q;}dJj6NLBk{ftUaL zUgD{OeZ_0Je`fg1-jtT_E9(eja~XH+{MM~_(bhd;INN?}hr#Ztof?W>ImKsLsa{WB zfxc8b;p|0v-0@?>#&HkPdp|B^=`-?nX48(w9S0SW!`8Er{sIe(D`qYVI~%XH1s0ga zWTQ;kXu6nd_|M==&-TaIsvXBq`+m)hN z%Tvq)gYa!rmonkZmZ@f88${kzuNit!q7L2azsCRyY*5t*Y#@Hiv#E@8cP-f!L)!Oz z)haDQ%Wnqxvjb2v2Zhtsf^J%48CZD=E*@~c_vBNYq0x3E9JxEuI*+Owo=X+ks!;c0 zCGAAWB#sYFq?gdgI>7g?A|%%;jgH9(pFs(xmc=;VY6o1RFhb5&a@qnHEXtggLls#o zx|)ypdmrO>fp-QGnlWi(Sz>(_Ph7dkp(9^lY`IJ`P^McGUW32!KDT;Oi`^jO9NuTP zB7qI?T01tIR)fYA(-eK`>Owlq{X3W#(>FN!M_~JXdf*}U{hA&C7+62RJtL>(|cfNu}f0l)wVuxXV1wAeJv5Bv8U z7U7Rf4FH~4-x0iTJ^pd~Vy2_})B9FJE5N2lmK|btUL#bmrlG~bKnNCF&MEmBEgX1@ z_jsDon=SMZz$@yy9IVVY+bs6GE#tRHr{d1> zNgTD#HklmkqJpkQ`0YLt&R3Uf4JT`t_c!K}oZ07C5%S4|vg0RJu|*BHjFE+eKE;KO zA8NSNUSLH8YKD~%KQUUZ1u{P49u2XSwp@{v_;KZ@D5$XU|GA=r6i8w*jA; zQ`4ygjbnRlJ4FW)j{b}tJ&qk6-Bb{07d@^QN|4ja>~P*@ICI9XApyI3QBrJCljtp@ ztzp)?qCqzlRyrB(1d9&(P;{>8PyzbqurHV^-|&|Ec-X+IB184Q66FJrc_uTe?*jv5 z5zSYw3pe)$%p==KI4Qx6ioq~zrE@5!rBR07%cJ?3p)FJ|0+hAwptMbuBtJZBsH!OW z9YUi%Y|3FuY#L_pc?kO?1_$;tf|PVG)mz5Zq(h8gZ_=q4M-#+0UC2gAWPlOgC{!CR zcN$k~@f314b=&&1Vc)N^;mEE3gC43wKyAn`5uc-jnV2x#NN@1vDR>zh7bwb-@XCd-(J&Mxn+vUS?)w$hkGfs?Mv zFwlTL%Lo(4^x*(4Ct}R*fpQ2jqF(c15iCYN=0VSpKe$IEQVfMV5 zo^MURTOoxtQ88fEvM_plsq*7Sg$mZXZv6AKoJ*D{J9k1cy_R6kXnRtsmNtoJnEG&% zaP1Jt$Sb$4+Xm4q*`uvzt*apAbsSOim9zpXJOUt?#IW#<(MK7%!5#fvn_tFswIq@t zy(9qX`jn*wN>26lvI#Bgl;`i2K#TN}&o{g)eBhoc`c#|@qgq-mY8?qni-a&F~id>gou#Idav=ip2bh!5$VJ%v{ zEOnPKns&c$cT#qgSXOev+}h|{4rih8`Q>!{1v6XUIx0R#KII5R@maX-;Bhm8 z;F~%i`6@P6wnn@FYc zIwnA=DnLajT0pTx0I&n72}TR}rSa`;Kw+ytHsk(Y6YQUb9jTc9)iL}5S^InDNJ9@O zk4OdZ-~PuO0p-A$0N&<*!yJDW34bGo9?-}?C5C=u$o;Es-`qbL0rkp$TZ!r+L*mDl z{N{3h-0#6`_22aal;&grl$!cY(!_&X_y0}D2YmHM$6uJQKhB!?DN*8Ab*g^Ld;uy| zJpinKk@=#f`kkx^Y8tA)Z1i2AAQC+NVDt^c+{u-X&nFb|^h7!Xtt^@W9GLkvA6IvY z!UsKvRhuu@`>d2*Wu<&2Tu`qxj+26$i{(`^M|~y>yC-`Kh$9By78s{Tp~<1Ff<=#2 zNOqTBCB#_XogW3qPv-{Zh^l910-^9)ox7O9-LN;A$57^b7Yf-5=-VjuD6iz?`88ab zeeJM{x7RFTI540!>=XX#w6~1OZg&!Qn4#Pz^;Lyn zUWqPnoEB$4N!TLm#g3Gt*!FeQI?)wxT)m-=!~T=3$j*V6w7brOUN3UfCt{4F+{3W& za&(C>!oe$fqims*`DLNdFxlZh5Aq-cW~DR+B@(=E{2(Ks^6Z(OEF zC6$}UTaYW*_G%3_9XwPGIsTPH@1j3DO&mMUu%qpCkt`E#xOHHdm)=Ssuz`c6_l}n$ zD)Kz8d6GTd+g?lg6_1VSlqe|#O~s@Go>GITAcWdCx~%<+MYqQ_?P5IgA|`~zHQ5iClA6?E zcT#SV4m)(4@3>$05=+IGPG!Ga->VTcXnA7T4a*^*71Kc8-*BrDjgFulp zq)J)x$waR+DD9{NJRmFEUv%2s0cr6Pa(?jKo&8hE3N_qJ@;QI8{(G#ZaB+f2NhOTw zleg-tZurQ-^~2BfK0}8-S0j=OUFx7A5xs78qhx0p;Shew*XPZw5@Z^X03W4XIsg>X4_E}dLll`#D+#QAZpsIg+) z(--s=Mzq%#M)6u`Zp+u}bSR zkdqRFg8&U;BVUP(B^{X)U6Qig7whKr6Cm75O?)}H7FLKJU9g8iOb>YH>enN!#~t_c-QNI-r3-C8<@a_gX6Pl!A%FfVF@U5$ zZGfdJaXe~?fkD>hizJvTkOMLKdO>(gfh{>>W^`R@+a65ZTtMr+FHO+~Q+MVlpBLyE zD#`H3WWyFQ8&x`bJ0uXEp1>-Yw3sG*YwQK+5rRyWmO0l;W;<3B)RgN6pby!RySp;>|Z|aKs4? zcj+<$u~{4K#sz0_LMaxXzmc^c$hPA)KuR63KlX#8lXO&A^s3ERaiK(Syiz6%mxd9P znNLE)bRj9n^N@a>dWYv<%aRv(@9YV?*Y8Re2o?2P7?qalPqS#g2g+a3WVC?7q~Bx4TB?UcncwhV4_P#{ zRR6G7|DHtyC=&C17T^B-R*B{Nf65yHqUk7R9}!E~$5SbfB;j($@Z}kmN#zflj5XPL{w@4Z1?VAzg@e76pg+1 zc|cd5ip5=o{H|Bt#E}mNjcXn;mk5DMn#oq$Fio zlRujmFO?MpYf2&VANAfg&Iie3h8B3C6dTdOJUO{iRqLHL1Bj?n@>!m`_*_ zn#yo^c!}D%M61!5;@|#ul~fVffR*JPSb}InHYU@ML=(mOGk~4mn(s=oN@`<@v)DDb z#?omZovcrq9~Xgvy(QxBl{=Sw); z3m+>GaXygY%`D+iv-e-rM^;`AXO=mWL$bvC>;~msVki_ygs~CeLaRKjIO#M(59)`Y z9<=Ad({Yka%3``5K803}+u~n!pQ@AsvGXyiC68;~ydZ0Fsi@>J#BE8TS?#WCU|%ox z)dm&4mJ`*JkGM6`&=5Uy)+iY_LO=nJvh+&6QU*PRFrGu~`YMZ(V9W z3uFqS6Eve$dUma>l8Y-ppLLz|^%d%gyJ)l!2cai^>=eYHojXi{?4IuA?hW>4+PhNU$~b4Jj;lZ|0fpax5Nv;&*cHm`>VtYpla|h3;L0AL<_jYUragbRZuaXW%VrOJSIpz5a9s&n@<}bnP z=tkv|%C|IE7A(~+X!$fO!gXV6~KjiB_TK)w4YtCR!@JoBdC$}24q3dC-#Fszp}0*{CYr~E(iHhf&zB7En9J> zNG|l0E@XfK>ucRkpevErJK6@_@UNAvTHM5PP4Q%vpTNI%k)bV*WJlBWgx|DZq6rs0 z6dlQ0zC_yC3l;bRUpEcepRe1BNqAW3$PJ7htGw7at7QUC*V$mF-phOB?A7fcvKU5M zl(j}pf*E!ug>3f9ki2N5MK{L|Uj?)*mMOjzHUtRT02}k*wcI_9IIr3I#FZgU+TacC zL6;KmN;$vWqG!lQF?XBJWL`AI4`w4uVfjU8A6zSsb#_b~p65)Idt``x(Rl;)+KTe# zERE*))oNUU=l#r5(L;R>c$uzNNGDkAO)>u#{}6@@6FwW zX?i$DQkqwlyTo(PUNj@_bF>&!H>XF}hVKmRwf54(zl2nKy%*C#;a1H)!ZM zer9~0k9`u9uM!cnk){^70~$b>_uPEJC$~nI8P2@ekfj(q4Qc-hn8Z4w8@zrbk9~x1Yq||Gxjtv=n@)-L1RvxA+}PZ3e4GAW4Y$n_M|pS zpP|aE3smD)p&TW)ZZ|O2Qx&#q;ErH0Rs+zExPyhcVd&TVR<~Bpba(FYUkGIsu4L)S z@4cQ{3x)jXe;AfuvE(!)58)dwwdv>c1=J1gsqeF=v4&V}@cZHQhcU=2u9_EF@;P_V z7B2ix$~?v#eAC0d$DD=lwnh!0!1!_lrK)U*8(?ldtk;jqAf8A^Up+O`PG4IHFGSp` zkGy$BTFapKnFnZ+1$<1Vr6Wa>ieQDpPy?alSmf1Q8<=1+ZXp*iqU8MhU4B~xCw#V$@% zMR&NBA_b_8wQP->4mv-KpK2)+_!cCkC;8|O$E&T{YthOL2Ik8h{FXjEX}_Gpm1y@O zoO=tJnbu~`(1>kC7f`h#c%_35d{NepQomRg&)yXb!p<9;Mz$apyfAs^Mlzemgc_{n z&%<^oy(i-C9GJd9la-hPw6RzDO3&?a7qcR@JqNCeU0)9kFEPu1xuy3f_uO^`Vp;P} z_#H$MAbt2HFn4%4TgCSW;^UXfrL@%luPIXikqBT+0QK>`1o+P>Q?!7a)xS>Z zf1W2|_{%&IpqTl?cKuB}5uoTfV7LdKh~|OK`3+C>N8}Gc#PMw+zbgJp$3#W-=j=~G zf>)VWSk4bsq>|mbf+^2~>5J>jz zK95!l1-g@fno3tQ(2BplTa#nO&l>_~o_ zLOa0}NRi!jQC*pNGne4qF88$pQaU1fCrtP@rixWXN@q@Vk<;wEt@_dqb11u7QQ=9! zi*H4mX>z+_b>fGr^@Zl*z9im~e>=z8AFN(Umg8!bvI%-7apsn?vN`OK$l zS=_LY;OmQSBcjnhv(x}^@ZEBs^fsCoPj~5S_tR`6XlQBo3XW?q73VvpWB}M9cg}1Osb{UnTY?~ zOwi5i5ZvC8@G(FOP+%yZW|cI0W!XPy)az)0s#(B^~^t-?(u|VLCx{d$~v+)UP(7oV|>uC~6Or!#vq^ z$CCGUUg86Hk)4I+@l=RbHDRNv#V}LT3@#~zxc1aQn$RiU_V-rNj1t;iMrufd!I9^0 z2GY+&rD*7c+1Jw))how? zgR-^ft``nZauXC}nsa`J4J1_i9k&jr&QU8^Nw}&oIct4eObOss=vHo3%Gy9o# z0Y&Q0S~B8!Z}J_%*1O@=E?hj}`ds)b&4@4Jo(HfKs)QWD7X8*sM{*OoxKR~K>Ljqa zqF_zDxKWL48mO>&vGVW3KdN50i{SLV?Wc1Cbw#_(gq9-N#)sbYzs!VEQl_-{7&c}% z>}|hRsy+mR|5i=LyM~egVzA$Fqe-p;B7&?XH&3on4rhGJ!mp_Xhm}{WxcI$q(;99E zAC6|o6b@Ljp8tRdf>~$@pVsNM8iIDH%N8*hR$)D#R&nEW8qAk+N?t9?!IiWky08Tp zFX-|a6$E*RYoxS;!@EkNmMNvLFkZo&^L#jCZS>+&F-}gZ2tnjq6+~oN8()ZC&p=5L zg(^x&#hlr|d!f%e`ZetwFQ>sYo25LYm#P#9yT!7R(P5reIgm`i=sk_g(UZ)sOjkf%;Gn>>UxYK9+ zGzOiK`0gYI9nx@(oxs3eL!%{=weX6YqV7JR^H9D7H@H)zq@zK{vL|$HM(1cJ_$UUQ zHlGUc#@f><|Js(MooOA*82_sJ_LT-T4fBhzwEp8PN(B=7y2JQ{6|{QQ!fQ7THp*z= zdP51k3%}0j<=(^i@YwS<%6U`t3$ItS39K&EG&<-Ptql%6yVOH?Lmu> z_2jH`wxSeWUk|5eZ#AeL>}FV9+SP+>MfcWf4_VLc_hOvlu1#+&*$d5Y^z(0{fG4Og zsjTKM#9GJuFv2N=Q!(l%x&4q_n8~&q%wz9df;4LNIS;`p<$5X({msVV>knA`t1#+k z6>bAHF5C|e0Mn!744PLGLo&JfY|y^ptwF}PcIQ2R#KyoGq_HG@ynaDW*L~Aw?#7M^ z#ZKUJtJJe`v3gVob<=bYxgRut)0ES`!toWYK9lJVqrM^jbo@}nXbiZ1bk}$}8ky-( zMeV)mjrL9Xjp+?Tf2hfgd)RIZ<#L7PLbPQH#ziJdByfF^#;PoX%QcNd@gaC=@oEp? zRf*6Aw&No^T0IrK|0PEKu$6wYOBB^=wZHH3sVJ%eU2XN~_%*atKtE$GbZF&)&y~Pg z$!+^Oy!Ufg%2_K<)$GOnOhS#MtTFsG7?UdAW@O|w?EHF!Pf?{stC33%#O+$g&~jh` z#K`*ZT_;F+8n?PdyzAuq?&*5PcmO34vvVyM8-~yb-@;VG|2Yl~fSj$h8` zxo&YnRw1c;mcu&h5=7JASbf8j%5FzWilY2M>9TO_mhAf6GP9l*1pmDPkJ?>Y0tO^I zQfFY+IkE8EK)o)fQz+m4@oKcUMy{o1STOp>(3Qe2t+y$ncOU!F1jn! zaDcDw>8L!_BjLyQMxYp=Uf6GmIt4jjV;DPf8VuG`_|NzL;oE{KqgRKo|SDI9T36r{sjl&k7YqGdi{&7Ba8e&aq` zjqebG*hoYKvI(9yA4!``=U(!(Htok_qwa%UuQ>MUmFLZrC#9R5ZW0NdlP(olXXLDR zekI*0ReC?>%CuAh*uj2b0X48-I?hN7zVT}z3WW*6$ngVoV=rfE$KDb^y()Fpv5}-! zJ>{$jtCU4uFU}=%)2SX!aaHEcDcy;d%CX_8SGV!ZrfBnK4wbP^H=4;O`v(0Q<7-|k z#Yy9c*@*dH;1UtfUh)hU<<+ZxoR+(EF)|laV%TeBTRNu9BxA@a@GzH_;XL;k>FLYz z7!iBAEM^2D7z>iaT)K&EGs`_E1leC=QXF1Q2CbSfqF2Z(z9lv$wiU*9U@5)+HmO)B zk-er?C^2u9nIQ*Al<#T$h^R_|#|XADt59OaI&02iCqF77{WBl=BeAU&+Ipeei@jlj z(^8@343`;8hMcPSGxQ7>C%aCe-dSIo`Ha4-dyNcv&A9oDHL9*shMe`X%bAR}vYzmf z7zVu3aL1iHmK?1Y(r1*?oCq_3i94KljOZVjOE0^Au??x-jqDQ&)K6UDHzK)q3PCN@ zBMl5kZPp|ObOe!#ADP(&Op0y4T*&mp`|ztnF6;2CPW^rHtunR{Tj}i8uJ_@Nj+*sC zf$eeZ%sGRBB~a4MTIBInLWw(fVq1GPsqrJo1bDLqr#ic)(q9hobE>X~B%}#tY~x1` z6awc7=z&ul!m6ik%%lwzjN(T+OGD#F>>($E!yV~CYTO(tj?LETmKHeXV%l=`baWz; zFzJ{w+UX!y0{90*-hSkl@@szCtK~BHVNQP6iNJpgtv{ypw01Lqm_7zIA$BU(oWZ!B zwSKZkQE94evIk~Dzh$ClVr&dmQI}$hvH}(Z&H}=sCi7EbXM%9RkbfuQo9f*Sl<>DK zS#yb<2Mz{B)DDg(Ut-xxX-8w(Y)iUg+59;BV|xeH%vbte*bVOYZB1-j!q zAy|eQSJnn+^=ZOsk2Nh%@5~9TM6fYL=LX00X+{+}VpQ3Rzs3e&lO>D35DqNv)1_(} zEv81v`%-|?r>pPZ*0{3M*&gkvu5NppaCTkkn02*hPEZ=()=`iYjS@p!#pV*y9D6fm zVM|~&p(=(JJ|2Xb&?#C_=+SvVqZ35y;7C^$D|(VBikSpCDT>({Qye>Uj=CYLe?kvM zpmVp%8Q*DI$lSNG1)|FkzFit?DoW880l3^}v&7D-xGeje_09eLEoKMHyUe8Q!q_%l z0>u1#6?RJhAja@T&N>WH{SrHL(IiY~69S2OQ9$$JSToVJ7sFOmD9yT}vs;s;jDS5T zxd!Y(++t>u+OP>hb3H<@838nBNNH^C_-g}8Z|BL|HeJ2&DYPz8B8i}iL(6?YW;`J0p8@Uge1-lKx2#O1Kgr#BN%+9n#{!C6ev z3g%4ksF)6vuE7S~D3uqQ1CdOXTk?#9@zk9a7Ya7PWuuwE(J*Mo32;(xo{r`b_Ziwe zPZ3p)0R5D^H2Ur|ip&8W{W8li1|V8i`qHEKsTU35g9u_M`!H z>KIyh^kJXG8eD8uz<@W}a6x;ocW;!rq1t7Ky^V;*3k(J%J=RFwKt(kv%ZScx!HL}0 z>qB??o;EkRBsQk?-aT1FGTpOtf@DpnTI?3_KDj-3d;2rtxre@`2*})VTAHe+9HukQ2OMm+$BzP0jae&>$A7^W^Dtfx_dE{ zG+7$d&^gDzrS%SkekrjunR5uyX%%o0^z~8GC%Z3b*)^7evGB`p+PiJpx=?)t$CSMA22}>3m5yOxyK4Yt*(#EozG4f6fn906 z6X&6WSyl?DXbMFLHp~AUNuz7i!xB;1PVelDa>nEm1Owe-zmrk%?rTuCEW#U*b&On^ zf_Hs>2AW@S+}A>5<(ic6UQpkt6UVHrx+QQlZGP3(XyXeHWZRPo4?6bbVu!~wTvfs2 zVLY|dwqKxqMw%2zDm?9lZre2)mS}i&wZ-OOko??-z-;q6d!r4E=M$lqotJ%*4_3k9 zbis$o1KBY{7G^Xd4p~f^o~gx;pM;Yxb4hDSWp{bzHwH#C(vxOJ{X0C2=5Kk|6W2%O zok&ZMF7&Rw$B^(g4r+MhIJ&={Kr@l`PmN+GGhH|NyQ-3Kqj~pT4km;6gO(b(24SnK z%=xZ%-LCE;{Mwn$%fTR`1s z>xa%ZH>{h)O7oY;I`i3fAHCMW8U>k8G)S)3TC$gQ^b9r~;W)#Z^WR``@oV4&gE>7< z?cZ&pptW|njTXT6Up zH~D}M{s)8pxo(o?L4^2|aR}`LsQB#~KWi0f9vqqe>E}WF(Cya~`CsnmLHn=;KbHKc zReaPcK57*owTh2g#Ye5;qgL@ztN5r@eAFubx3r2h57G+2ljz^#=RrsDEjtNNSdxMP zp!cI@VxnNAr^aSr1{67BX82=64>27cOD#(W8miw|d3;xV{7utirUO`2(EW3IG}KHK zbbxxF|1Z;{{udVy+6RHmpDI1SD`I{u>lfkWADdjz0k-o&RtgxK|ED^kztviPOY?pB zfrb6;oTR0>j*Ol)whA_-BriWUrL3O4HTJLcGc-Rh;U8K{8d|`@{-V}$7e&o#y6sS{ z{^@Y-2U;8_ET$*Xj3S>CGlW<}nR>04#6i5VUqZd?dZIVko80e$@h;<&V$xxm^9FE7 z^X%N-oXb2n{Jf)+ZLCBx!6==IvBrQDxm1^>hda>CyR108%AYNLOYA6nfdSkt`WbN?o|o`IJKpCi-vx}|}{5{aW}bJp3l zxy;OAE}sZ65}3X~p2xXXt7{|XVh*x9_*w<&)9lRdVRuAHLwI4f!pt2=w!3zoy84o9 z{0v+sv&5T8Z(0&hCt6U~L;JpCI2xjfY(Q!rJDU}bt_c{S188y{x8`=011SSC!mT0} z-q>i*J+fAQ$^{ZFUqoQQ@UvQVyuA-n7+Y9l<9pa9e6zywCKj$y;P6*2hFPnPAJG^p zVHbVHBrO(gs<~MbHMttc*@GwNbX`?~xorZU4l*Ck1`S_&T`R*p_k7*{HBh24Tc=Kd zrn9aRy4$rztKtbezzUgxecG>WK#}h1nONbggXRiC+QLYg1IM5wcl~Pjm%Sp880pXT z3n&*nKkVZbhRmMg)j!p(&r~yc8wcT zQmWt|3pMTQv4gY3>iwLqMWi=iJ534)#^2aBL2Y6Xni&zi$bPe5_I&fR;B?gUAX>F| zI4hNWi+;e*c5z@Z3@|F|q2=v*^JFTC&%K_am+ebBHKNz3!Q>}K1c81e5i(wRIf$UG z!cSyFg6gsR+Gw$UJ%{rhpD(0SmC{gDkmiIm~M#ciCA(jLYuM)o4o3W~#;205Mq?2V`t+{+!>Td8 z(C99?$Q>uJg{p{}Oco+LwO9i$dg+vqI*V2*|JwrYgjWW)(Fm^!8crleoR0jV-duuA z1_iqbbjrNEdIMI{9fFc%q>{V>WIO~$a^Tm0jRZ^4UY}>mJ5+(_JkNqVME^`YxvlFgl!4sVA%ng{ANsWyUXhUvLZ!slMo@aHn=K+b z$-@Z3Bj3SZ_)5b_p>LZ*xf@!s%rd}l!ZijMim8m&r}$mLyH8k>E0;WGqpwXcw}HKo zl~@TzXdDylyO5v^h9i#_pZ_2B-UBMCq+1vzqezq}NJfIhrhz6W2?ByhmLNGvlnj!Q zD2jj*B`HV{l%OD40SQV{a?VMRAUXD{?q+6~nQ!i!`@j3vTkEa6SX9@kQ?;vV?_E2c zI(53NB`LqD_lMfwyXnrMoAC5XLxX9jcVU>oy@si2UPFvLu1c{FR5+vX&9>Hg?fIXk zJm2w{8N-W!JO}KGqcKbv?*act^T~RAMHqY@5r@e9m}Hidf4u-%8?FmdkPJGzqAvV zX!Byi4p-mk=Y%#o{@W9UoGhh&nnfQj?DEuDQ`71t4-JQ@1$H}0Jt5T; z%Z=r9ce9w>jtD-igtXt@ZWZL&BFD-#T%Ki8O#D*eu*j?)!#?whr#yDEeIEOLth+70 zw$}O4xU%nhtj6sG7I#T^3HHBJxm!zDV+&=tCeGD8?KBn}`#e$?$rO?F*?hjF*V&Kr z!i5`8lU*8`E~O>E*)wAP)oSDu6x`*iHy&Cn9hE!BbbQNa7vnusvisC(bcnI{-1Bcr z(|pP_wq&;xbKk!2=py0hW9?-L;SLzvsmR*bcN+c>W=l1~k$knl!dqeNfvGVz{xRxRJ}bxbg!cFDmEhFfOg>{3vv`y+o7nf}^Jr6I;m5(?*rIHN|FjFobI`{whT`fW%Dhs#bv?r#ZR*px)ySS-JONI_q|um6qU+oW{6Z2>sMzfuD)k_ zvY#RoRqJFVuOrRPM$9@}cTH~CqH`9?#Lr{ob)3qR#qTfoHmBo;e`dduD~=jRO5+q~ z?6$#D+*e96!-L0gtL^05e(J?>2Pco|FK6e+U=LKyspe|F%A5@h86)5kNnuT*pRcziF?dp&Io5rXm{PDJ`!<3GLC^bb8l_yu`HfT91_ z#!w_f{M}>tm#=D_c{}S*?gO|0uZN*d2?CA8g{oG3+pluK%FKwb4iYIr{62D%Q#jm4G8j;+b{-h$ZZ(1&T4Ro4`+YRig9ls4n#cG&p94!El> ze`TL&nD9UkP}w7onThPbS|!7XH&4Vq79EgLCnf&u6)fjoLocz!mgo91C~S z6Fv3Xt~WaT3|$a*JO1c%h~4U|eVZsn?GhuD){S&V>0aEbpOK^Hf4l6w`tq~zh{xl_-j-XiFKfk(4Y1hMtNgd7uI#c8?umxde0_U? z-}lzbX*&M8DF?ot=m+Ctrf?%C+*)OUMsvI2_Ea53HlxI%R&dsl5c|uFFxi$XOq%G= z2dJP_I04vir^8IG;uZQN5)yP6dNCjCsFJBCrg9g!RdBUJFiRNTQ*;V^t^MWqo$h`P zlc3U~sVOT=m^4uK%1^mjzufJ3%vZyh?3Vno$${);^tbQ|1Dm$mHp%?&kiF9#y|lXV zFj39#+ayP)zPJ*DcvDYi&ponW+sN;iu73*u5JuXMh`oY88=4-{FoMz^Fj*=+V@A}kuLI)s8_24yDun^M@H&2xmh-W4xN zj*`4%?6r9AGDVC~;N>@WGNvFjyH7)zzX=s^d4=p5kcMOK|8i>U4N_>eU6W*haT&OZ zn0tSAaHY#|z3t{7o(3V$YEI<5%goF1>>TZ~WQd7Hh1In;TbAwh(c9XEx?he7yaVE> z;%pMmy^yJ2CNJ@WZKa3TljqyrY>=qQuxR*@##hTu+!uMJpyt!vDjE+e*ZzZ~O?#sv zXEyly(u0@Z%#8ab2Vp^19um755C$xIb@8A@g{-xwQo>o?+!8!hQy<+`zTA3=F^r=* ztE~m9Ers{}`3Lm+iCgM@HQdU+9lNp~8it@94rT!+e*0#Tyr}9c@1kaeos~&aJbFIsTBdq=lW* z9JqPI$g_ruVxwjA>kZXhXDaCj_0KnBgEeq4b#5l@kjOnZ3=#@?+)wzUjgR(zr(jd1 zQYfA(qLLjBW>Pc~ot zp66CR>H4%FxWm(^S0xy@HE{1$E#B9ogxneQ=)kOeVHN3j@A4VBjy>9N6)5j(F;7B% z?94snCg!mF7|r-C3G$$@Cs+KKOGD=4M+%$K9eF|x>Nv&2%PCKN;7)rjmN#`+@0Tgq zVLPkS+v(aA-YuI`HF=Z4^5A{8Yi)%4f{&?qzuJ%S?HBh=Cdtql)qgT!Nrv+hbr-vO zpToUGN;a9jVAQ?#-B_H1+1snF-g%6i-{H-ho|4a`WJlqg++TK19==g?m?XS$8Gk~o z{F-BN{*&V;;XOyp9Rn;$$~L(knv{c>v?E<;D(HAmPTrYcSk?D7UDCG;RjZS^v3o*g@3^QgMa@ZyeRudB8t*Z& z5ADWV33o3+J7zS|%lA}_LiuhBv9+aFFs7b-^c%dDa8kQ#njh^K_oeyB1_$QEF@-^R z1s^^1{gX?B6HN`xD}l_S1(wQdLf(TG*orM53m|)h8a~M@br2@K^je69e50q|S^zaU1(ux zKTq5ielWS%c9jUcq7g7jou9^cFJ9N^m;2iivjxWaSoDA%5t(__;33{W&;^tn-`IgEF2^Pn(u?aF zfH1R$r8$Urf-oo#Kd_I4p!_^SLNEqFetsSi@a-5O0YM%CAwf`2)7{L?+u4%$hOMI= zuZ*}jFQNxt8FM#VCr4gQUTqB}#6P=@o13#JFR!hIrKu~Ai>0%rIggWzHLoeJrKKe= zI1JIz$${4cBEXLfVB7LL3qb_Ag}`~yHf|2~93TiQDar8LIbz7U{vXZJc7btK0*RK0^rn4-~jLl z3JL%F`8b$@(gwv(7kR|L(Dj zz^VU^XCMeRi~aBa|6?5dvENYOG*kgli&%0Df`EpIe_=r&iB41Sbxx2+oGB;>7Kg|` zrid^Kj6ndj6h5s36X558GQa@j-`a}sgB5~!e8+!Ui~^2IQQ%QspUtBHoDKs3gE4?l zC4dxF=TCP*hu~y;3B zMM6m6XVLKY{Mix&;8VIGb1(q!481`asy4C=3|8Ru`jk}Q{wX>UIplo-a8kAa5K02S zk?Qw5s0pBIA=5L=czU`vo`DbqM7n@_|2;iZ=~U0+8Ni@I2oxeyK_p+DrotfT!~pc@ zUs9ML2=$%$2V4l$EP@#kKQIv>e^1l1ZH1u1fT({@g%KhbkoB)Agdd><7*2nLkyAKL zfm%VR79k-a(9?gN3WNOuA`Jf~MZrP9J^OzKbqvBFP6-8(E#y!HVEll%f`W))pB6y` zk$3*fD?Vfc@U2*YDHI44)PG7L0*I<-sCH^s133e19E91y2Y3dRL;e2GrhmXc3l~xP zPk(fzAYg8~|&YA0g8P5C%Ws0k9$gNFY36h486o8hX zwh#o-S`d&BEJ8knG!TG603<=s5(qRf9bjtr2@K!{A*LZj;gF7!=Y-1aJ{lh6*9(hTsn{2Ve*y2Eh+?G7LrFeVUJ#s5^Vb~e`oB&A4!{~a{r|74{`+g?}GnM}+JS$ZHC_Ph^A4p;3P*#g@@oFKrXNpfyw}+14Kinh|On!g}{>xAz=ie z!S{NA-we1Ic*#K1A+)Cu;CjHENJ%UVBnRjOsnHMsz*+`RU=YlS;CB&WBrw2*Kxznq zuT_D;BDm!2RR2T%4;9XUR0;nf{SEslIe|)%taOIcPB&%&Q3n_l%vA_6Y(c=XfQi9S z0qcWdi!ca45mNvg><}sNYk>Iym>Vnrq{u_5bs@0G5OqKsWNkt4oDV=kn7s%%pbW8i z_`n1Oks<+s1TanTMJ^!v0DTaUg^+glAu-xD*bKB z|MvH6TNGa)c?L;eBn%Mv0G21xxIu6V41ypHN?gH!0fUe^P(W^&FhcSOBlVF0z$CyS zQe+4Vh#<%cgqaY72vT(j^Fa}CP;)|B>xg?WASw|`10gU3g%Nm1s2*VMBaJPTd4RwO z;6NlS#9a`^Kq`Q<=^v;OK(Zdf8Wuu|BOvI20s#<_ObTLCh;qQaAcY}lgcv^*$=w2g zwNUkd#Shj8papmkDuk4<0$^;QHkboYf3_XaKrcY^|M~wj=>FX~IJ+27dDN0X z*`=uTRL&z71RqLPA;l|*3<1rGVogB=o54`z2lY;w0q6$IAa}?vHDfRzOL#vw3i=DOdr>m5%HV)#9`i z*%zt=Wsaj-{!tsHC7?(L2Ygi!tOnFtJgtWsD^l|yYo5XR@4l8W*m{5vFo;M1j2~gp zfG6`{L5To4CxF5O60iu;eiA}<1>r;fAgTx>5s#2Qz%)eWg^_k3%B=!c5il5$5(_D_ zA&A}5Ku;krP$>)uZNzR~q(glsF9C>II zLkV_Zs)?LJ5&_>i1VRp32LT_I6GGMyKpJxbK&b$M1oY)ud2qTP0_Z3ZRR=-a-zCWJ zz7G`Gm0%VC5)e*E&G`Q$MZr0n!jPWjS(vC27}6Yt0dWXu2t*x1kb`*v%NEQNwGNQ; zLe+zU@CINu!2K{FE&)CP_JGm=N)=ecC`c#|7TNx^2VhAetWe}CL-l~FiA+U+cm_S6 zDM6?ZV1=Gy0?CqRuyS@zsM!FU7Gc+(Vhxc))%m0BY#T%=KXRdf4^$$Q1ae$w@q(x! zz>l{kx<@_=Nu}DSwxgf0CmpT%lwtDn+i&Gvxi%BTA(t~sW1S5;{Yeu7J%ZGF zXMPbn_*9>Q(zE^*qNWH^l|cB;XnhnwREnr_s#1T?p>+Rgw`UAnMBP8#Lq^^Hfb-XZ z{nPc?{!w`p)c>_^ej^2n69Br;+Asgwx&hJe`}QR^&MTxCi~c)<2Ey-2%hJks)VrCWMK&M$HxRa00~4Q1b+10xS{=@3ygr1J(I86##W4D4s%q`?sG7KmaY%raC3MBDk zhLjMJyAdWA!Z|@c;6SM`g!2i^AEXh6ECHS_g9yUmKwcr_oY3z%gr5%B6$J~a4q-@R z8ezaAf|N+vgt|bbr!ETE42_8VAfE4_MCn;+B!C51W$K|&yg9swl^Dj5yJ}Sr7A{(X_x^cb2t*u*x zKQQ~aEz^IEsWmps)g70?-t#*vyyUJ zU3gR*mUi2Kh}}B8IFy}nl0Ea|wI^7UkzqAx=g=_DOJD_IZ43=8JlR& z%YVFbV!GZ$YZg)!&oP*}x*|aA9GHTO&%l61OdLy0{0uD!EtuiSUOhg^>P0kcnwxpF z(ldm9>A3lzvq2IfAt4?YaO@uN+jLaSr*Jd#DG9!=Y zrB6b9fpi%7p_#rXoLGt3%;5agPhD$sbKBj`*!#p&s|+0-xa+|$E~8fwvowv7n&IxL zQf1oCVC+8}y5{QtAW+CXcF4)feD;g zCy6Bo#yGx#^>&!VUhL~@&H?w~gjk{Qd*$dMBs_0~oaxy|(M^a#Wzh7Me-PaoXO|2l z7+tN%BEXOQuvxM3E~vrYehvR*bQC9(B^R@}l6em%!7@nuBT80MPS&)Z;}@LJRo7Df z!x-sLL-KuHPNiJ!o_OpVmN1Ge#PuP4yu34*+6a*polR|^gev_ zc=C|RL7WloX*F)s#BN3uTwxCb15J#b3cEN|SbAy?9_h~(HV6-0OIah_#z_iVwYrIh zc5uAE+cxc3vqJ2g)D_SU-%6a&(%p?rp%{3Lyq;3ySKz0UyvmbBxYS)5O7`{zr;zGfJJMrC zp*YiyB9m~tyIA{n&*n(@s^NY4FYH$nt`V-H9eR>vUB8kCYf__$!Vo(Vl!5>FWaLam zM)*yEA*()v8ciJy>wtc2tSTsNEuD1MDEB0f!E2zeEeMMBi+bIdBL&@YD6L4v?utKkX`QzFzdN0_gqxFD~)#?$5 zWECFhsVjGa8HKiYD_}C<8TQK5s{gM3(WQ~EO@ zl{@!+?aS3Wp7!st;UnzYYuBd|4964|#Bnm~R#GP3r)HRDLam@a;nervq=r+Kcu4Li z>&BFNjWN;c^#>o`zu41R>cKmBVIKBvlm&zIj{ z%6c|Ii94NgB0x+(uXSLn+N6DdzAcU`J~K!-YWD>MN zQa>~DW$Aov3e2s~`+}S=?*v1tXq`sFannYsacFCfSQeCBUiySTSQEY;&vs)QQ<9ym zL&?f|#JIi3D9Y&OOIJy{8dz9dE8~EMbE(x22ePK)J34+N_S~yR;`f?G^jyiG=C77i z%j+{PQl==`n1|L8-gjb~;A(2~aw2!-XiBNF+kG}<_ASKk;lhhJP4o3`R{o7m@2~ug zug1vGNsbGC*qks89&`54^WYqtDrO9)irWT9#AGthb#^?>sM&V2T&I9u9}9|!IQJIg zq-(hdp#PjyHjwly4G>~$G7qgvHZ-eZX)|eYBsyGW$Z9rIsxgt zk%*cr1(G~UK?+5SpNG)jUdw-}w4L%z?tOu>^W*1}n-Lk8MQ7}U%=DZusoUCd$Q(*g z$izt)NbLMj+E+Xr_FmXdKDLN0_BQK_b-NO=+`Jdi zAmPewSqTbn7cbn2G5U5(BvFx!S!w*WoaJ3hDBYaIaoLF)kB?62#l`PI*Vgoy@4Oys z=Ahf4EM4%5R;zPWBUq-Y=aSHZzWv;}Iv?qmHlaX&C5n>8B<2=86(aPtW{KU;=Hv%{IRpRM;6K6>brl!!>(mcsW@D4{W z6n5OKw|(r*lq~eLqE1;;KKGvDqp~5+`69X+v~<=(f~5eToBKbmz4-X*oKM5K=Q^^q zl%IS&Ap4)=x9{B9+Y2FeXtwcZpqP`?#JIO%RV6nJE6k#8xfpDv8G9>*Sb(xF6r%VV zzdrsN>xMev^fDiQl`g%7a7^^da`b#bow}KiTvPKdy54ZM{z6Ari9)IM;mY2$i}>X+ zo=ErCxbjDI26>@QpN6TwW|&wEg?Liwj20Q^I+$yUkzLrD@ptaOwWu}{XxW;Rhu;k+_j3ma+O*A7U5Hcd+Ww`TPYr)R~ z(jVDuKjWj=_Yx*KitM!p@VQDdsyhOAf6_8IwHI3~GTBwW{q|!l%9^y*_8}8Bz8pke zbZFdfE57*Bh^I0J?3?6ZY@$ciQ7LaqSfAw@r%62P=el|;Ns+^`F6p=1^H`j+S{7`g z;R^(+aWi+9UnW|GH(kvqwM^=_uUeLu%p|78N&KEsrTyq~W8CYy+ZmWPUOOvxo{Vwy z^TT(K95NCZYkT=pHCl>4mjr5-JqqQ?8@4uc>&a@{Mz3MtXHz_HFRlrd!nu8g`?{s-Be{)ZiBWvhnU}t- zA%ZfrQvL*x0Gf(+xK7UDu~JBcz{IzUkeKR>^_$-wUL0JyX4uXvE|PP#bYr`%+`gi7 z>wR604tfjehiuY@^zmRO#bv_h7)u61f;#s8@UJ)i2E z)tAg5^g%JSxG!54?~CVGSXFO){gXf`AwOCH&r6Ef<1oyk8t>)4kE^96esOS{*-FZv z;ab{04H<0CI+ROqe14KGvplyGH7ZcozVAM>NLse*m$r5;QjlUThqVHYIb45NC5n92 zwvme5pKUnu4Jl5@yRYD-5AyWxOF6jbcdJ;IIJ(EV?XeB8-%sWDdydJ-Ki6Z>M4 zDQty~UDt+sh;Rw3I%ynlr82NrS3A7uaNvFriiuVH>~?`x>G4htW_hND9OJapo$!EM zzp2Z<``t823`y1!{kuHdtZ%ldTEg?A=wf~(cd>PvyvhuT*%(Pp?{Fhuww0nG$D6G- zRk^))9%J>*P$xytc|F035Ajl44@$W@m%~Go?8;x26m{G=*tk>U`{rY&Q@4);$vyid z&lLWEpJ>`oP9ArN+9oKJsRy;Iso>r@ycz!U{c^Uc*u`Y{V(^@7aP8}Gex8l(q1gls zA_40r(GqvMmXQFrLCMlzMRMb0XkPaoNxir$%WNZhoi;0X|8N+6M>FC{WVvBSsGLmu zXe+wCf3{Akb)D-RY|8S@H%Iz=aPv+5i(lqLjgPV}<8E8ZF9}Q6u9&EBR~R`xo294W zS|BWg?C#`QY#MvE+hB(@;nzWws3d59JTK(BYKz8t=MrZ`6Q*!+*qv_?F*?2+Si1fg z<-2J+L;)8wIeQ6OO3AlYJ)$E{SVObwi?r#s%fMbfpFGZyX0FQ{Pqpe)wz$qn`GpaUe&~KZlPk}Ve&EKN-FI+YO3G!sti>IJ zNd7t5FF&8Yd7`Gz(Pto;qEgktcWu5c0&}iKoCrh0;JM`z>FNftw!_x+BW0TVk=wPr zBwgk#VKo*F&be0o?_%nvj<@Al_9b}qev&;VR}ShjtkWx=ql{E^E6O{BRt`$xc#2k` zZ4L-XgxVDbQ!XU%D_dPD!`SHc6|)+Um1PgA)nQ6~#_&M-Ilj(|!{)~&{nvdcoZ6*Z zxAq^EZ*;jOw@k!u4pxNT7<9xF+e`Mn-f)i7^7&2urJ-sjjF-BUYOq{89{pz(_b#}8 z%Y5Fu%jC7-PWUimn&ceTMyzImKU|Loi|f6x-mLC@?(UQehX>!Qrb^!XmAib~`@l(L z%BaIZ{S@*jBt=1`23z!o>{Cad0$wFujb9DiMyX_tl1!O7pGep8Ri|2-YBwuNIO*@p z`-z6Oz0jhMv8#=q(O^_Dv1#g$S!<}tH0q-yfwSEC@j&Sy1?xfhG@fELgH$VVbdPT_ z_X;KRPd{+P0jV37ac90v&m>Xl_e>TeA762*IcK5nH}Ke}{pPbq3u@6aU zm@8T$TBuuwAw#WoiY;EO?tKAS-Nxw_jWf?o)IHKJn%OJJ?Y_vrC-{`&bJom#dK135 zHxJA1$CdVyeRx#}_lWHlW#_UfQgv_GrdH|Vd413iE1>sKc%c1L`BJeX$*b!_J;uK@ zezA>oZGSmNA9yltT0X|M%#puXP4QhvxJBu_rKNJX&8EykVyNo1<+xp`;F6h^^U;J` zR^QCX;$H`TDNLsU;j;VQH<}I5Ke<*wJcnO;)>>b0|J9dsKvLCr-<*?xc0NlAYx(vX z_KbC}Ez?9UdAD#D45J4JEm%MEvzh==0nc zbqTI+<<@y=R~<#b=pIM!#V)A_x_4kP6koO^qW6^+PVyR;5?6Rk5byVK>$Yo&BsA!e z1)V0_P|uUDp7xaToyEt_zRHmFwope_#`6(+vB+M9QTei+v2|J&6w;k`jh> z-CjP_mSX!f#39J`g0#e)RGD^PV=AJ$`mixl$X?MF9rwL!Kml`GqkQ2z)<8PS^3GmX zYI!5B^w%_j96jpaXG1f%l=hNe@VFVyHs`4nHil()Yzzum*8i^sHLOaW{47yrg-8nIzw1nZ5AS_tH_ya4ZwEQ)6D~M$Us~u83+tGq4yRAda%;=gnl`h@?D`ke7vEb6rrYOY^^xE86t=k=H&Y+itj8$EalC2M2oTZqldeH;f7T44v#A zUD6%fjBfb4b?E#F>)H8%n%u)DqEMO@@}C9L2E`mVjqV;eqv zYj&f%He^(ijUj)mNBx*ft?c|IqPK_3%FC(w**Ln-pV|tP5j}hQA;H0ObBW*mJ!em} zHOEdRp=5+z1Z_;oEls|3Gm5JBxOlSRcXKT7XxFklc)G4(Kd2HTQuJ=`6)Wc*@pv8< zZbDVH480=&3E*8j*g41UmR(K6y|H`eQN%&sNi&=V6zl&dBd_kB(90=ni9qU zO;!~Sl37m6~g6FOswf6nn`PsMQ0rG0fiAMK#JHEm%d zEXp|F7Qdj~!`&UQ)puPd`oV?9xu^ub+$EEXQY#A<16M36Z{4$F8xQFA{o+|6{E+tw zH>_UXil^S7&}v%0lDgzq)VSIY*S-$X0<7rug*wNrM|J!)TfslRQ)w4k{9>Q8bZULt z_A}$v!-uvO7iEdQ(wFwO8sEsUXBKdwkW28&T|r+@&fiOr9Q@eUpY3N+TP!3vzK}!G z?f41s;_KP=zVJG)iap~>i5M0o(=8>9 z2oo)QnX4^T8_uJr9qvPS&;QBIJF%e@X5yWVqUJs7t2fK2257vWxH93emOcpEkl2ao z@!qF1>snXww;TS@#?z1Q5>tDg%f;)+Ud;$&MiYBAETFN!O_t2i!|P?NI5Fo+iFI%e z`D*|24Z-r9#-iGM{2%uYI_b@Qe^k9GNlLx(nALq@Yf2~Gt~!4vXBOAQC}c3!**nk1Q? zg+2H}&t=uX#8P#PCCwRBAIy7MAWJl%;6V^ax)EpMj+)DgA0cn~3#`gATDO9T`jr5W z;UyN<$j3uVKS_BGF0(fZCyiQBq3OpbrI4;)8x+WWxSMk2aUFhcXJcFJBNfH2iQH@T zCZ1DJ(T zdFj7jW;^=9?^Wb_r|e~{sg%#fiBA43YiLe0eoutc?2_8-7a~IYi`xO%dys*P9-FT| zw2W9q=OzT$e)1rmCUv-OdQ@&HGcmO2e~-|C)qI^H@L|v+0+0PNkNIMI$8u-)mE*5n zZ+H`9irj+=z7SaOW^`AW6`Q}l;b-esJ(lM#6{vCJsjzDbL@3PdQ=UUT|SLADl+no2HDPluXnc;>Kxmg5(8}q*DXtiPTm2DAmS+U4j@1uK-l&pD){3e=)6(O4Kyq%o2+W$b!ZCCFD{f4*KS?AL zrMd4Y$-FMbn88Nm7UYi3z?8iCMz~>^>L*Mt*h1!~Sl$N^^RDa~CV9!ra-lE{jY$93 ztu#@ZQ_a15wBedn)vJdUmx2V52AT}}k ztvPQ%c)3#byymCL?tA_*=6(W>Vr+XPT2yecfkOG+#>ubA#NCbaILXVag~4xCgPdrs zC56zIhvNtj!k!q~I5vfbMs~T!w`nbHJ|Hg`{vMpth55E#=NXp9WkZ|vZzl11=2KRC zf>x#(wHFnhIrk7IS?3hB^g4!9ko^37$My!?X2saTgc-Z`p~HQm)h|zr`+2iNeaImg zl}#RIbjmS-Qd-jlNltd}2mQ(7`EEvX?^DRUpNi)lOyY7}8==`q{z|JxqGPB@uRtk4 z#D7QgIV1Nh6YmSSjaT|yFnlz0_Tx&oR+$-hS;u&Cs7KcMwl_)RY6Zch$*Y^Sx9?^$ zTLk&>M27yvhc)sU2OC{6DPhC@=0-6KNvoV^E|n3(94_we>oL#3P14slfstVu@tBt? z*NN&co2iT2Wms-rt<~>Wpw@0_o5wUrdUQ-$x>$m9M95mT1jVjtlQ;h5?QE8zo$*6s zs0W?z*N=caanDyqzN)IM0TsD#aRl5?&SNjX!?c12e{ zi`;!ZbgU1)%9T4osT~~|HeP9NWR#P`QK-!=D5ZKX+9O!vt-=@y-73tVr9z)mda7`JlXm=&(4EXZk#?vevSzjm2kVy8`=H$ ziz>%l^itm4f?WM@u%&hTian{+_}GQW1e&8!C*A1Jmx!14aeiH~Un>kwh%oUY=h$%7 zK61v1aa`ShLFo1N(N0cCslmg_%Q*jb!5I-5OgBfpX}`(+m~L@I8owlNQuk3!=!gkm&^{cgqe!IAaI)gv!^y&u{VrWQFi)-`HIeP?B|Y(Y?!NPV^}>v53w!gAYmvVvNUMx7CAcSyr8zB|*s7bh)wYVcwN z+e(eSm}@@pU4CX)Kt@A!`JrvkU53&o{pM-(j~>uY63HQK*}pN`D*|b~*o; zi8=r)jbc_HFl|iWM_cSb*%u=2&2v%D<*rE9Q&L!Lxb{nx4*Iy&{223*OiBEn7VM%& z@)#%WL)V?3b?a-JCe-AlZg~!{3tM;0WtrdP#BZ?N=kfg*Lgn~`=7FZL>$!SK9)_S# zo%&9Y=zbcll1O~zD&=STEv0#Rl%cb+snKiH4||eQav61uaeSTd~byG*{oDRR4lv%sHBL*nGuWx&gT=-Gdv7&+GYgm-m&{I4TU@486a<^tq0eIi%qu8*}cr0uFz2vDf-f zB^U(IUCzIM$5}aLVL;tnXpx)H>YrTuZGqQ4yWWXRf`hz=dB*AM_qQIbM}5R8+7!O7 z)NGj^`-NdSZ)cQSvR^k;wm#(3A38XGTI!)&t?bnhtZ(n>ZF0;=a`M0qT|2~Lqr3N5 zJ}A`mm6teM!^rAxjAQ}x7}F$#>E!F8bh^(C+BVMJ{;ondrfrK@l>#j0BrSSg-w8|p z%rb(s$4ikOA0&?Ds&%^p4n#xX-dq-nCnMf!P^SjWk9~qm2OheIoS*K*SJ2(uxM^`z zu$BD4STw6!PfZNFXX$|>uC^|P^PJ}H!=?0jYPT1CUb$HIR$+Erp4^D$_#;hJhyW8dwS<*G0p`Tnw+)=0*OEfYe5 zs*vUWCwas=#JILJMwzm-M)Vs-x5@R}ZyQWL#KJ$)dhVnUHfZAC^5#QklsT~*%S`!8 z+@)>Fd2%<~c>frT+JpW(_R%6fwQf}*KiQP1px0PxL#FzbJ)b^1wzqpVF%g$mI{Foo zoT2=#Jhh&&>}Ox|Y=7bH@sw^En)|y0uSJu3LUQlxIg59cw-akKR(iIy5M9+sH*&MP zpk1WBR&`H@PwHyV3}lRTS0t_EvUf>_p%N22R(n8J<&NXcJ=Ib!U&VJlU%w^BFF@_m zV$06?^g+7nmbpu)vB4RvLwj}}MIWu*{RyOXq}kXE;5Tswvk8UA;b>}YqIS5nTh~_PbvR6E*zRhe`|x^Y(Z*S`Tb(cIOzt@n?^H7qN<`dz z+BTA7DlFK1>jz8r35I?aj^@v+i?imVKZKZc#jG5Izo}DPf9do2h7bq$kEk^NzKBKL z0UrS^wPRMyOR?_Ku|K;+piB)R-kmC0J4f;g(`t8j8>V)DX>OKylCjPCa0Gu_iCLwT zSY(dM+oA1Spr5~Ry7+ueHDN|d}H|Wu~ zJ#Sq@uDa|Az6TtOWlgX9z#&g~%S|>S?Y2OakoetPBa!yhLLnH1ivsRb&i6l>Vrs@R z_|tBP6NEHrcS?AKXk+a&eoamI9zf7}9>PiAYwz{ziF43lY4$rfQH+R})_*uA3GBZ6 z>oG})14861UCmu=o!y*V@OTl|YNigB47~ap8rPJSIj^b8Lcpdh1$$F#R|c?A3sFH< z*2#;(fE$40<_8)?CIBoO6TN^QGx#>7WAu3FGnVoi+k{)c_0|Qy0YH@9eyCyehmJ;7B72 zUQ1pZUVB~#UPoRhUKd_hUN`WSGQ_A9Yym9rJ`k9r#@Q2#gw7uE^V=RYem()v*Kd2! zAYgYX^ta2io6sQO1wzQb-GsJ{t#0_R96M@y^&*4b%aZ?T>(_{!D_lyj^3c+P)EuRuAL*Z>M>TtVtj~uqsiXCB6+MS*#5Ph%Pa?Hjk!9b^C;7)oD!%Y3bZ7HAq?~kmbptt;)aXp%{x{BRMaD)A>+r7#-fYtAE}NLoN$d% zF>t)V=kvGTgGpIyvT@>4S}Ry{jz|gfACt`2c3j-CGGh=E%dC9}ZJ^(dG!Q{ooj6== z+uC(@Sdm%X8HdZv>+D#~2Xynfx|?WJRJgcde~ExQZ1TwNDO#bsp*w?pn6CF+FasZ> zWrpWp>7hU0D^432aP{^HalPyMwg;LBTKj}8nqN_S(3;e_@y=#P>A;8aoZSP56H##a zb6i|#P)<$C!1LV=U+AVX7T3%&_l@`bPSkYh(2VAHx6RS{;2ZmE@h692$w4a)5^xCI zwdsZi)0eAJ1#SVFCvP>h$Y#;kttKb2_=;WlF!l6=htLhzi0a@p3-z>nM2Av2%FQ|f zy1Q>9_;=A3J2Y9b0+;ScM5>{STx_vYH12c_eaoM52R@)hx;G&6 zFxbB1)Oq}0xu_X%}}6waDuGTeOqPD16gk$UkH^$^3flev$CCZ$J|zD|$(>L>5xEC+nr z#c+UQPrR-;#I2)e?UBlHt?4NbpkJ)tTKgPwa$#s9O$Pqb|82(<{q}vn@LkFewcOoD z^!_Vc0V-)Hi9%n+9tOmkd0S5%-MkXOkV&&{>|hD@>cku#KH{&`6Geyj2hQgcGmGtZz}W|1smy=fBX%oMYC>*J zah?8Xfu4|f5nVuDF9kRGSE$}V=#f_*$tO?i!Bpa;oWY(OFHP6)xZL&hlMPbM%J0M* zcCI2-y0j`|FczCxM}CLZe?!vNHjuzcRm1WA&b~uZCV%ZfSh4W7sY&U&Ty|XsaeAPP zs@KHA=WmM4-8iM#HJS-b1K*y}$aBzdeyY9sa;>Zf?N2?I^W>k2VQ5myML|Bq868qjXABw7R7rH$|w@}l6wO22# zdcAeS&G|f|6QubSN3A?jed{!rR{-bZA!5DOsi*c-66!cl767{Qf8XQ<9%~JbadG{37T^g_TLWSd|IFl_;%w<@j zHrcOjRhW}h|CVHnu%#4cft*SU(~m9%$Sbiu8ns8H=Pa>TT{0HdgCBdP_DWSzM6oR` z4(HJD5nO_GzF9r&D$8vU93C$wy3*-4=o-7Q`;w)<{alfAB5c0oqk8bN$GcGt!q%kL z<8I5JI)bXCK3Qvq%XzW~{Mr&!$~%Y9^_qvp9CI7k`ih;#N(cO(l=$P}cVva?S4BdI z0$fvWeOt>GkTx%GCQ-YS(CJLw=~He>^Jz|dMAeZa;{$Ep0$w6dK>i9<%iCCXW`6pE zjlI~GJ>0@6QS!NxY%kInvSbB=Z!e2eReOt7pf9n4VsyQ8)#|iajUStFe`gahV_jtv z|E}`E_ML`ptmT`>-i$Kee?1Sjzns{^+qmlcuID~U`Q?bTh`6}c7b(>@xv~o6Sl%8J zhZeqjl)J|#)$(ZF{Db#<$qJl1Lj{Qe4;%<%+v-WayYq(ceUPxiyP5B5q7@7?I(Tnh zi_}4Xx#xug2pn_Fk%=yI1(FO+jg8bl~<#>+p(VT6wGAi-}i#e4VqV@$p-^HDBK= zM~|lu9$w1P7=_g9uDsb}mne>+Gbj}LV4OPWrqn;nz=U&E=V_9`=I7+|v3})Oa%RN2 z*;Yyd2V-{qYvgnN45g%0KBp=)W$S8>%bRjLehqk&nSEeo9GPpamHYNG?Zx){5v8^L z-y8og*6t}*l%UZ9^tNr=XWO=I+qP}n*4egg+qP|c&-w4%naNG&Ci5_zbf-J%m#(Mk z%BpW!M48Q642=4_5rS6)O>wD^zwiUUi2Yrdbu z{JMMSf)mlx>%O=Gg~bU$HGJW9ndmhMw+`<~ZA6ARVq8>tsa;YpYio&=EIaPG`7I7; zFV{O~w#-HUmXnX`&G$KqSZfA1{vuaE?Tl z#Bz;h#=>oN9&=jy?}m-PuxN=)ns_tgmqJ>e{eF);4SQK<(q%%`;z+dCafsPzHE?BT zydJ(?6gu^dr}oc8r6g26_YYU+<$FH~^rrMpNA z?bb*;ev18yNX z%E|9#SE>VpaQn+IXyZNhcIe?yb*CkSD6_mf^z-=I69GPly%=hxEo+@R-rA+K%pXIU zSlbVZ;hhI217Oo#LF}HB{*@&Phu?p(e){D<4xE|<+HAoQ7FC_?y|6i0V(-|zq7Q22 z`)pU0hQiPU`egz4R*_hbizq{3s7zCK_@wZ4sR>62LoOS9hOwYGfihM7~z4?Kja$E&7pW3=P)5n8{j=ROsFW1 z6>|a0WUfq?%&{Zyxj?3Oitw%Rp9=v#ScO!!uprLi_t4Xb(1C!G;AL9@VswCixi)yX z;ikq+Y@d<%Yb$sQdEzF@0DDY0MPzJX(7e(}qRZ@usP;@+r4zwPV?ZgH$6B z>l5{?0s(^M5I$?HM>4&G4A`)wVuY=WE_W0r?&DrQJ)rPiFF`i=;ux}q0|EQaC9WcD z2K^hjBLMSOo>iZB-Z3emmi<1j)_p93ZdKV7&3HlY9)d)GlXGjHlG@Jb)v~ukH zXBA^4D8c7Absaux;wZ^Y)p9>mV0AlqEwr8$w-vC{v^n4wEY`(MzWobX5fWL93&>%M zj_3#Y5XSrFAtIKEDmSPRAi7r8mIAf)Ir27w+oQ)0C9 z;jtn*7cLNVS|E7C(i2eYfFwA$X^BF%ZR@ZnrD81#T&2UkzU1^j(}N*RN^4sz$2uI^ zi4h7lLJR-mPbk* z3?6gmeVK##ao`Qo3L<}X(Vp`Yp~Jg9p4WR~51g$Uz?8fQhF!)?c7CDfp_D=3KKY%V z;ChM6OQOo~^m4~q!Og#SK|$w)U0UBx+6HfOb9ookJ$6P7E`0IdY`8|F^-z5g1xpD7 zTtM>kxN51JsBH_eWPi`Ra?_EMv%_zsVjQKE;qY5Tzds^>5Q*-~sj`r>h(?(K607Xz zYVVm0Etk$peawx;35KMN1=&;X6RD&|mPzPw>UN1E&LXd@^+h7RoN+GJ_kJ>X+Zop2 zb*~yI=Iyjh2Ho^IZd&9S}0s%s2s-&+&IaLlYmUf=5NA^m)dz$`G7R~MXgu(fnY2l zyq3wZ#wO7MpQk3}QT-J=k$dBd1FNhZyH^7C+!D2hS&oshT~>Y%e4|$6X7X0yD9@=U z^IAkHkpWpQ2rp4b+XdS+Wpp%`bO~Gn!v0h2Iee9m%cw)DONUQcnJ&k%CDn>{h$z&6 z%4v`|Z~2i}!F^2;>>!O`YFD{1=QBdn7TQ{p^~f&1;iCC$@%CeO1&Rx>ytiOY5^wHB z%);qgH&REJnM%0IMIN=#yyXEi#@G2Ca51FwSAXC)e72b2E}dmCT!$(^$9 z9fo$;piz-g)hM2xTL_G`Ga0?zTj6-5KaiB;K-QrmMI_B<@aL?zYJ`j;wye?N%g8YLAOFIJh;U7@<24yu-8m<@r)5t`%@!1#Qnn-Z)QS6vUPf&K#lzPOADp~72T3m;LK%=v$XqX?*kOC!B8z2~g_w+iXoXA|2@O+25j zV3QIJd7}H3p|EKhx2|pX6m};s_>p67sf|;v5&}WbVK_#SU+D(nq8u5_RO>})J=?Ep z%bYj_?U8MelbG8-DG{$O#pNg}sg3t|@>d?{Xk^&e7>6`V)+Jw~d=q4-{R4^F4=eL^ zf(m_K(60<+2iA?TtOn$UCr8%&d5w&L<4>ik1Z>}7Na0UJEston`t>P^GI6^i^H?I~ro6TRMjSkKO50}+~%Zd25@_S;{hxyx@ypt(YTfidXj`lOL6 ze@hU}P_XjAvrgX=bZlm797i=>5!tGj7Z^ifPGv=dEz1r<;7gfKBoEt~&tcsMx`f(8 zj2gETc(%v5~bmh(wBFF zNjKGW31tf#7Z}LNWBIs^Hhlb~yGQeCL%7~B(-=PE|JAjXfo8~j2n`Xao0nUE*}xYe ztqK`Jty3s;LFqJ>f2eX4WNx6byTHNTzwRPAf|>q7fz>HetF4%icKkNcqx5OR8QeZC z(*3tbE6;I^jfJQb^^p@z&*s{c9arPoc;Jgo$w*VJe}qd8T7oz@X5IV)!4a_^wH?l+ z{UV~k*S6k16*=J$=IVcxGMBFm{zV-2N7R* zsC>~3g&ZPLeee8@QZFd1f6C*o!q9$0{X;<{kR{FZo zzS#;z2#5W&E2Ll(86@zFw@kdS!-HT~F0@1-Hdy9ghSQ4+j3~Y9;TtdX)yFM!5`;bj z@ps0VKMt@)_^47`lMNLk3+RHrWL9%~2CJ@aX}@Fz6MNBLE0*+nJ!vJ7^1bkOlTmHB zo(dph7fNc?lVZK;R%B781_IB{ym&!K%E})`5DaAkH3nnVr8SbbHRMfZ#W~9@T{fkR zsSP$1E8g==U%LTN#FO)=N-jgQyP-PI#K~vn?*@V2zDI}co8>osW=X?c&aWZ3JW1>k1)g+yB;tr~yacRP6SZ~;|}G}$XEs#qG5MFEi8??@9qB|7{^WE|gO zRR{)bMXRlm7r$}DMR=^g*4m=dzqFAw9!7}97^~LGOxlqLeHsziH&!wxd`OQ2Piib@+@kCeCdm!4{@7}k575@5vz7y|PAJwX_D zQz)C0BAh{j`Pgl-(9SzJr%rmxAhS1-NSj-~P zrW3rb3;6RQZ>0T)DOlv3C(g6kHT16Hfp&$}@KpwuE$Ydv z`6DFP3Emw%wjsI5o;WEE*_l?>43w%jb0?IJPn(Z^A-y z9=DNWnI%+}+$cmG8(9jqe`}0AO7vK^1BOOpmL`mc4+>OkiwC=vqt)!d%pg;ISG!TD zN&eE{h{d|Y7)L<1c8`!yvP<7xj*K$OLHT$A!aWF_mErCVErz64oSkfPt3S!54)quq zfXf|{U<-x0CZ=)}Vk~7&>8&_hQ^WQz-h91`dhxh)@acRUD-BO>2A2RY1H7#|Ll~g(`j?$O z{)^q#!ny3o;dqlux6s-PJdWwG|82nLdNq?98;n@hbKSSKL(Ha#~) zj`MMo5t3GBu2cTmTQ|xcUaxBciqnj9F%~mx6$*23MHP@d^R>a|yTf>6;40~V{&c$` zHdbzt38U+6pC86OPXgnlz+aJfSx1StZOJzH&_2naC!g%dT8@8%n?cU&{Tq32Kzt_Fabs&cA=wdGYHfW1#$U!0KRkTLx@T<^#Bu@rSji=e8NVn!LDbouogJN5_Q0ZM5 z%LpE9I;4Iy`*H8^+*`Mnb7hTF3p3Z>AwZzA7ayx;E%s;f`KA@Xa0L@b(Tm-_-i|92 zkt?xbYmu&-&Sb%~1Tfi-KYITVCV@}R!@1mzS%(dqQ=0n5YP@+|()PsTkoKr^Z#{_Fi) zpM~ixEuyKxmUKm#a-J@cQ@&4=jEEA0rE{AOMcKM1<&sChqzpA8Uw&GMx9snxFDF?c z&f^3QzV8p68(nadYJn?P-QTbyO!e*^%kPKB^^_)0l74gQF_=SFU(~IUzJDoD0hTZ` zrEW5+0r4o@=&$yPPKX27M@rhn73wd4c$9=hK!L}VQ>~%m`tJ!UZ*6?c3YgilbJI-J;$D*+awC0uUQ|L z8zAeiPY8bQ!7`R&bPx_JH;%b)>LN^V?5qeEB_k*cK`Y_amv>oobr(yaVvk(ArSeF` zNzX%$f)Y>hd5@bhIq;i37;-ALxotc-`BA5a1uLW)VxT8o?swfGHFj@0*Qx`8FHR?yw@FGL=n|Lg1;+O(SFoP7rh`hzO3=v!efztKAO%HxoCUXmZhV%| zdZj%;z>4(+et6CVm%r_OKl<-(^fDs4wCTWoyjfXqFrmCQs1uSSRbYn(j_9>`!9(I_;Hs9|Ds~Zk_P4P(n z@)qkhtG>TUOfc~}^w;*tlB7Rp`%P}~#}-L;Q~#9`nTlK~V3AJ%|Csmnt;s>J{%cJG zW|bYKPxQ=or&W2|bC&c=Dj5Glu~)6H5t1`IfFabPvXx-Jhbo$pC(*%7<%+!Dk$L*D zQXum%#g|7qi?Ef}E3kr@CD7uN67IW~WlSSXXHjz+=8&?udII!EJpH@OywUu)qK{$Vq`c(m9a~ zb2NFY{D}M|Ug8t&3-r*V?1-kk|6ENyOz&?{nGlnDctIY9&zqQLC5Sn2VD~LPnN4Ht zOoyC%bdjG7H+iCFhG6cH8YdGRxV@%z5zolIdqHdy33+w)PDY$GAtGYY%jhVvT8;=|a59}!fZWPRjMBVA3`NvE9UyT8vM8Uw8 zKh=5ZuN?bUu|C?d*#|O%94#IC2iSf~HNG5yO-;e8>Grz|ai}5Hf10IIY8SwU^n9~V zE=i|mYRYygj~s!e;ic%$T}3R?P1Fz<5DM@jawP#uw-*{OB&k~3q5 z&EN%t%FTDlYb9B$B4)9kQpB84xXD)TFD^Ey%UT1qgZVQVCL^0B0mFKchfoS7(J%rp!>6cXJyPznu2OvqHAP0gFR!O9EsSgb(AAu|Y@>J4t8Xxb8GPAWSzHaM zd&RTiD2paI7h#3>GOa@=)NdjQj^CSn+tAA8=~dgyWR!Uluy>FcMHVP$OjDVNp6?Wv zS_;`znXdjMM!HmxE=DLzTd40AoU&+wcY-pZPrTI$KcfmhVXyMf;`M6HXlK?2`|T2w z>?(}5L+f6s5%X?F(4zLep}TPIUx2VTHANS)f78NfDltL?1swixo8&>EyGDXv{SiM9&@(IyV0l{LxZUG%r(9?<2nd7l)E?LjO$C?ssi zbT5Mt=wCn20MFZ%bRb1O?&yiHsO!h})T*B+eWL&q*^KX6MFFMt*kkaBw%F4JOeDl5 zwwPTy9A+beUN$@>c*VeN1Ig^iQBtDF6>B_D{(cDY6(usikvG*J5I~u(kv-y+D+v(D zA{qBI4O4+)S=!Zpi%;M+uIywjnb2{wk0lb~G>+}99rsm#nhZmE$1+L71Nx zk{&+~_l!Y|@CY0h<`9-EoJS+q6^ZGFGH)0U;mNQufpB^fkN=j7kztthZjdIAs_D#< zgEJfoUlB1q!_< zVG@p5JC`QQTvQUNGpVJeCuGK!-ZU^9V*srKjqvxD7GOEDQ35C3)GBzbo2ToB%F1@V zu`Qg&9X;{}&2P+29_=!F-fs&F@5u=@m445u8&hO2 zGzp2c2KGnx1QA!9Jj+MyqYf3oRBw`$MszqhEfn5!LRHo>=OV;*!D{W@Rt~x~t(MVs zZRWx0fDy%LR0H9-;wEkScDW3z7?7Q zP17!lxLMvy4^#y!$P9!kGPc%F+i@#_xCajb#zWiV=4Pp6^ zf()CRa*a*70HG78mI_u5ym6F;q@2z5g2}#h;`Q1L=#+v1*38Z@KqFbV@i|Uu%Z2+a zsDb@oE}rQ1m8*1Zx6dO?{OR=Mn;j$9<6x6twu zV*o}$Yes=BBtRiC&va43qsJ)S%9%{qx}Ei!(~pK7BiAUz7f>O3KzVbIx(z#wgMDKy zCI|*vPT`^A`k7NUXGaqFxi7pMl#7q!!z`6Cr`xu^x#|tCw=Uloi+P-f94WDG!-$W|K?RgpDx7Mm}yR-?@TbQaijng6poOxe$BG zmz6B^*VeShKL7!@2P40Y0TZW>cRHKtW6r`AKhKl!w=L#>S`TVc%i=j0j*(8H=Zk?= zLbr@)g<4)l{4459wS3=+5hNRhO}NeS^&0~HbX*(@W7KFZ()Ma#*`F3w+#b5wV0e;B z(ha25H7_Q^TDr#%G8*O$xr1H9<~14 z;@s_Z3Uok$7i9K`a9BsKh5O2N&vc0E<>-N|14&_3k*L-A8ThC9JZ;9;!5OXC3AUw0 zO$4o~M!cCY>ejat|3Jo0npl`Wk`^|X|EP`qOHW47y0Qepr2N^!nK0~I!y5Xi6J@nw zy(Z62Oa*$+!aEveR+6g2#*Px@jICgcisd!NNkQJvE6uwX7PYd-bz5FtOGps&PkU9T zQbE{bLe6d7Sv4e7qskCAQ*Hvk!1B%hL3>sYnuOi~^wv}*0Sk5Ep*E}L)3yW6iaX*R zb~ks_2CDS-La5wI0@i5*7V_jC(mREP58HlvXM{ECN`lA3rnkqaIb@YOy{8$-ti#&^ zT21E(={mP53S7(VxGlwEE!j77YdB!08k#MsQy~KJD5hLjRxwYrP=FjDk@V93B}?kT z&5di4?{i>Ti<$hM`#B7`DvfGkp}snF8VpV$nSpGhV&Xo$0}XT#N%V|s2vctE^gZE< zN>|lspiu+CPmXdzzRVk_beGe9V;twv&oBg7xdV`cvOO(QbW|jFd*7+Adz(Ci%=_KG zsQG?3g^RnN7@MhOY;mJcVSKoI!;ZiH<)5LuwswU#9ykl;65U{hnYF6>g5%m%W$>O& zEkG7Wea|Lq(q5tM=?5*IT0D;cCpa-4GlVvl(rxpu?q6jUU%(6aN?=Kr z{2g8zd^hNdbHp?UjjY*L2)H^ZL4GK6sUt$}YrNerqMM2G^7nY*R*YYz^TIq2bdewp z8LA*uAZTHE?q0w$E46fMdKi~4%AbTLAH$T(*CA06vD$1#JW9rwKPG=3M?N?;@JuKB zTXKk;bBl%RSunx|Wk^Yjg+UfP8#w;d>p8&Z;JDHoBt7LHz2Fg?y$$YTj_o*-oMXBA z6D)fjPn{)<^p_V~R@#Lk6_(p5);<3dkXAHm$YB>zDL-0*qJDqtF zAn)5~lbt`j5EISCB^Er@QMHEN+>3RGowz7`)nH{ zZXX&pLBoSSzbFz6{2VF0Fek8LS&kO<9WP>>e+tzZ{J~4iFhx9boz=9Wq`8TBnWG|+ z+s6T<;DnsZj(IGnD1=~6`!X|oI|wO0rzYMVj)bUf`BW(@m^Hi_1M@)8kiOiRdp^|z zU#6H{ms2AizWz`}hL4di(V7W|(PfNMxCsx%>K{VREfO#G!j3(;@JK>ty9MA$y$!P1 z#DsM4QPm}CmlyC{5vdo-hy~^=-56|;&%}#of=;bDf2MtC1va1uV(%ggO0i84i z+6sinH>0Gg`>~EL`T?WrPYMcy+4a^k=W0^)Yt&DJ!>R&hL!L|j`*ne_(;U3EHa2V>kHG0PEtE1;QY2!1W6_P- z7OuZpMFH>O5lAe>y>=NGgif{*O1fUu8mG4nao6-fZQ-C!u7VDU4zy1Yih8GEijnwQ zoD)~Uk|b2aF+kLT`+-LHWAJ4uGK-HwQEQQO_I`S54Rz%q9RYgiL2&QdtWC6NA|38wdc!Y*NRHRx=&t4CMt3(mBv~MVGwHM{R0%e z>13+fj^d%gtAb!)quQk+O3dkaBY=v_ERz2C9>pq9+#OH7_;bgZ>E%+A+7>*g=$4@oH z!E2iFcR@0E-m4P!V)&O?Y~E)gFvA$myK4%o9HTVBbATYE*+T;8o?K%MI9BK2NX#M9 zd~#8zPMt?crI>(_7NbcmL)%wKuhRj6w$VOIj)VoHyjiuHCMh!98<% zV{UZ<8czqH#&=`+AJVQ8?-c-@bc7s^3oBd zs6ufn$M4e#S1Ln8j?olQ1jh7z;B!AwXB#q` zvnW@23|) z0$Jm74{55O_x#{kEz+phhFmO`Y>-m@ zVg1~)zvc$Xr83d0mXkEX^zqCVp_?Id9Zt3x(s7^wc_4!am5cevX9x}}FK=c_70KcE z?dOA@nBCu&!oR$|6C0{B`8*sXPMfoCnkg0jB4zIKElCHLxuN^#^wP=3{)X^+2UDH` zzM99cQrd_7yjMHLQnJX2lmM7O910)55Z3ogN9Vj&e}Oz-I2c%cYt4&J>dNOAM+84J zEl`q0Bf+5mWg}obtuxae%q9khI?kQ+wZ=eUMh;cW9k03{R-Zid=Y*-=62YCukBfh?W;F}Wp_hay6%emJM+)6~D;Q{n zY))DMqpS~YA5JDEr@ZEJ$(f-xdZwg0Zt0{^ksK^;BUsaP-38)v4CGNsxL*88z{>)o zdPP(#$`Vm~?H$GD&-AZU7m*La7CB*oC!r~tI$5UL`>Izh2Sg#B^&HC_1SGu6 zz(%0|I4Fy@07u64sdtD)=G*$M*2l^H7d1p$fM+_*jvQfci&!Z;-HNAqzPnOzzPM{J z5qH(>DEL@AxGWsxrwx|7RZrhm0g4^Mj)TvbP{_bW*UKfzylYZ#Og`xsNo`Z`an+bG zrrjvs7`K=K#b0McVX};&$wTq-Q!{*ZYLXMMiW}$3kS*;75)|zeohNt%C=c214fj7= zTY>dgKCd)gpf4cMI7tk}09yHq2mxbd16_<;$L%mL%}IOAO+`LO>@mv?=bY&8;KiOTJ)tRi;*KyXD#+rVE#X*;ocYitHXA7dn+?3eGgF8otuxV4UY9)no-XveuhE1<9=uz`Sj($FK9SU2|7FtQX~)Sn=+-0FKyVMs!l+Q; zx^+djCXI#>P4+Xh9=2H}?=e9nM|5nyZBp!=C9Ff$?G>1;HCEhnsp4Kg)#W0n6_Sr}!GmI)*90+m%}*Nwx7{)GH7; zs;TJ)-?vR;nu_YDynWl!fC**ryUG^4A*!Rzs6jL-&=ZrOIHHh6Wa7B=5j#(-FZ>PY6Tc z6!lB)v({4Z5Qlok;YAj?KBL$}qQz!O10XjdE*>KK3!a_{ra#S|Mab!SdU{4>i<@*j)x%_ zh-PP_y`Yy)`5s10p*O0+u-nQQtt*K$5KDb|90`9J0l(`L$zH|qPkM$C-_=l)LT+SW zJS^K`FD;9+uU7=J)soY{UGy2pY1x%gET+wnX15^n#6yC6uc~oF9!yYkk}zDzV!$uq zmi6r8sB);#e}8Ndqz$KNODBU(N3KBDSKBcp7zKSI9j-eZdcb2Bb_>i&Yh|?q1>paX?3i=qcY=01 zf&#SVPe5QAE@N}`0isSk9Ll?8Nkq%1AtWl&zk^z|_qqA%kHA?T;t9k7=-O#Qsp0uF zocdyo=LM6(0|J*Aw$>)f>p7FFHig*&(5h0mkt`t&_ZM2hqZsr-R*;QZgxkNEH+>ax zt16Fw)yZoJ92#H9a0c6tDJCfY%b-l$J+0jM1Wsz$d@YgA8r2=mhEc5#SrhfxTHZ*L zH$$%lPmO$4(0v;C%8dK!tfb5o!9lxQcnb-3tz;TRKEr}AtS3TH>RC13qAR^(j0o#H zV7JP{9gO1xzHVZSGzV%d=c=1Dc_xleRUZuo<8HBmv&p`|GpMw0Xo*{2x8OUAa&W;L z!LQbvv=Ioc^saFI*g+`-UDWH>jAN(CT-^6;YZnJyXuO#ik}qHX@Nkwd=fNs_$X6| z)jIG`FTGAA;fot*nYTNgB&@U^ncf#@k^Zfh;4I}TV1=2{ik$8MlAd^V9(vF!Ax=-j zqBKjW3X=aA&rr#aD!V*=^X6?CR(^(3zEMhG?RiHdwv z8*Zc5Xp>K<_ajEupA+%DaSotj85|lLZ>@jLsawDtM|yrlm3|(+wiing zTl91;#2{BIQfo&{qGc7L=srD$&FowhFn!8d;YW0bwMRlD$$2Dr8(o*qUy#jW>vUra z;|q20#|uePE$L=Gea7>eBdF9?VeUL(-UX5fP*zEc2I@FU>!+kGQ4)#IM&$CA%$Bj#x# z_a|qSi;pk`LKPt+G%nWH52d(Nx-}@Z40?m&cDFCrx_-cLnDwAWXi%XfLh=zb+)@lD zBKR(o2kD~(5t3K@!7L->P{aqzWBX|@mN$<}3SA@&?0K#Z4TSAb^}Sj&IemGengkb0BAKMmr}E3SBr6FtkLr2nMJwc&1;X<%X(5 z){geNiJxfT^6WDh!o)RX0A2xUAT9PJmufSJB^#P=>{qSyyW!^~WC>fu6?~xlln+m4) zwT)0pR!Rn3Vj4kEk1Hll-e<;xs^Hs`)|Uy(_+gI91%PBNzE42_xR-xSUxoffvAHsf;1UR#r5KC_0kWe<9uu+@UwAJb{2 zVu65@(OpqJCx=pekN0w16{ z#NU^_*q=Rs({Pn!(Sq=}PMnt(SAWN^V>?ycWO?K2uv7KzxKoG{&YX-LM(3 z<@Pw3cDXD$mWJ{vLn~DKbI;Ag?mkUou-ndlC$a}zy|#z(8F4ijuCgSq8a|v*n3Q_# z4e9X0A`-}B!jmQ(Q4(EsWUE^+HMWNNHI!>%90n^~D0Hp}){C5YX<9@!-ULG!6=D&W6WIs0eT*Gyqvqdw(TJ?%7s}m-SJPE z=v>c1g64#0mUbx%TbasZ--dfCmfnVVwm4-0z`-PT65^M5`xxYQKH9+xDZb?J)#=J9 zaVls@o&vHRtH?CzpZT4ZvOi-m{5T40=O;)QhFBp+ab$=pX_D&Gr$@@xsmGA^@DFlc zl)HN+cNVJ8T{TR(!V|PZX?6`4%zJJnuD5%j(QlA%l0}+8yUKHODs#Tw?0cf*{9gx2 zS#04WXu8e6JgaGfsJ+G#a<82^;Zt?n!*R%8X6PwS5$#aYpFl0wYk0|MHug)Nv8~YD zJOpR5F;cNeKl0XJTx@A09{`Ay#M*`QBLGmAJS$cwxI7j7-Pas$J7Y;-pxrs+nipmc z6#Q45OzM+XVwip}&HcZ?6*agX|8LsEe>YnaaC1Y^DSO!eGadeS?LkaHK~YxeKiY%( z|HeJAu>Lpqz`**SuJ!*PxCe%R!o&ZwkH2{2)ln*dpdgqM-y9X6I18^^Um=< zB*lNh5l$wqCbo3Wbk63ECMI;wZgzAobgus*VeWJube?pcCXROhQK_1xPehqBGyZ*g{ux1G8A)LgkbMI~L*IG)UgUWG7<1DLCyMf zw6Zk>dbfU@Kj{68Ou*7KGTHzm1Wr<1YkXI?rt#~&cc1TE8lC{o89SSCn0-&Hr@e9? zx45R3c4mj~l%Ph)K^mgrlzX40OVZAeXo8V zKUx95#=os9kmm1pF4BG&#n)3;fLp(k2i=~(5<}PjoP+1v`U0@8TR5nf+iw^k`ELt9 z9x_+5q*uC=-&vu%*Ti4H?qBrDU#rhwJrSfDR#v~y@*mW@-$U>X%?%fjF60j~C# zVqEd@o%M%WXmI}7si7x7?^`A_!*Abm_TIeZUD~-%@$cKz16Q(_62ECYXfAMovm=nF zU=vR}dNfy8f40ZZ_{>1=pBozh;-H-F$xoy{FUKALCNJ`}UfJXz+&+r0v~#_1;6926 za0eg^kzWE@fWK?_|I`VTU%CThAbQC!fhhpdalUZWK8kPfZl{S~f!l1TUlHwFYDqr? zXn%!ccuzBh?|%@5@R^kJi{-zw^`jAov{~PPe^GH=vkiUj!o*X z|81nr58&=%{WoyN?(nbC^{3CE`ES@a&&zkr6Z~r@XBgkjD;8%LeEv6I!|$Jdzi>0( z)q^kccDK^UPo3w{@0q=a(eIx2s1W2c{AG8w(*xVzIM7@0;}7_^+^kK$y-wX%zWC#u z*~hqzS9QAh#onJeiG1xdNPTm8I-dBGn;SEQ#(&y` zF_O7~kDQS@^nbJo!@QI3mC0rG>`sRV zlIn&GGcNPj_h6m`*)G0&-dztl*~v{o;|tv?i@eD4SwMsMWT3J1S_o#3f|xlb7I3i2 zg*_V3{)Z_;(th#HSe5UTi^m~vE2Z%+hDg+HhJCHSBp|;APV)*jvn6&6NPx4# z-_GOGAX^C*Dd84{vrW$DOCDv(0baq}iYDtM;mXoif$v(Fm8OcmZX|iu`09OB0KiLHkluGuNAG8xNB*i z4R6~$T*mf zvj^27w1+au_q@cmYCvIY0ba$|1#gz1YNeo-9KLE%iEHoq8HDu_$6G6S#qG0TB0Xy| z)57uF+fH?zPs7N%7tDv1!BxlLzOP)0pf~FMx?U69_$Ofno8buPEhCsc(njg-O{s<_ zod%_;2Z|;j1rO(UA`a9hb(1wSCQAXc3!dHoRyL0q1C-o8xh&GiMeeCp3*fVk0*oRF zl8+oE{}0ygAxP9PO3-xLnKy0Qwr$(CZQHnM+qP}nwr%&Vs_BWEnC^~Q%=+Jbt3OVh z=e$-^;5~x0SI6c(&BhgHM9kjDKY-_Tvs3&HrKgaI> z`g*+JVG@5%m!;u&7taqD21buw_=oZAeCeq!56$Y+QMSeR;Jfw+l!=n4K7|9yc}!XQ zA?Tt(Ni)j(4K0Fd*@w0F`iXj#!OEWEBZV}{<{o%|)N{@!+zFi8grx{`2np0X_iLh5 z0q>kHv_Dh4b)r^FdG3Ki46XPtOX9o-LKoRN`gC_9nYF zDGLEj8s|3WHhUtQ#ZPwN%^WPjKfp|sz#j6i!IA!u(Hqqgl%4D5d%+vjM4d9WinC=~ zb8jY@O)P*I5o}+mJZa>ZteQt}mn+iVgp%QTwcdQr)lNswIP^~Ml5&(qJ&5K;vJuUP zPq)E>CdF2I8xZ%TZmB`=(_WY6ldzQt-1gUzG$Yx21n`y(&Q0j&3h?f$7w+{vLe5FN zt6(O<22?^Tzvt)K{)^NdjYuX;m58yy%u4-j2txb-K-OdnH*GqqI zuohb6W(yrHjM?R<^S`B^^2ptyUj5MKYb#1*A-_;#Gk1D*R>KY1FwL0x^2rKgxI^p9 zN`v!(Z!wx?BSlm22z)`z$W$4`noF<3Hfppd)L5Tui|KCjnA~r^~9_LyS8n8D#or<#wO2} zIwavYM)q0kHKOhncJq4ZmVhl{d8j)8qWW~)?O3V4e9*AYR{Fn?c)y~>nRX}We-YEn z`{mLwGRX1F_J^00nAQO|Hla)p`XbW`h*dgEZ@;;Gix_@F$(ap4Kr~=IQ&NY}ngJhKS6ryf7^E7qxL(dO4a7^Ed+R9DuKk=S={MP3qF|i)Hn)}-;4bh zWD#em*Jm`?!ym(fS}wQiTxjJ)`pj-GFW+u?Ic!Cjg1cc14c^|W+9yB98;r-<&)&mw z7d8Q%tA3g>D3~s1e0GQGHdxJ6b_f%pJeT1yfk&h*^Cs10kpjno^|*(hjxH6H+ly0Z zlZ`e`dpXj#B~dZD&gvV($P#a;I}Of4E#+2}jIi}5ZYogG|3xF$n~T)O4lQ{W9Tbk7 zfDpi>$9+p{$ObXm=q(GtXgy?I-`&3ZXan0R%&b&Xo=bF3@W7#$k*(NJ%o|5Raca+u zIjPAGHAClu;)9bAk9VREy(exZaPTGAJB*FskHeFiMEyK5h)_*0gVU$D-+DlE6cUZb zX~r`s8t|*tz-;Y+%8*YkmJch>E(PpxWPjG@S8MJlO=xoFEmv66fU1)+n-$F(@36KO z1)lWEayxQ#tn@o|Eaq)4WNuy8F=I2jC8dwD1{3M=mW}hAJ@6;DN$vFnUkgE5h){6( zCXMEr2$iY$HFf{p2i{JTm|{SM95@b&@u?TfL1zMqMLMk_u#Up+JlpjEJ$KPJ5lpf3 zRxpruGyL>*bPuHXtz-vv!lian7})kZ0~(UWsPwzmt6i*SmOY~f!R>5YQ$JHCVJ|}d z1A`%&5ieCx6xMecmd)JHPx0OL(noo&l?N8<#GhXO7t3r_hSM1Tj=+}GEPyeLxAEPm zPqZ&%$f&flt3cB`IjvE8ql{74>bo{a-|kFqHUP&GD_f?OIvJB4G8t-y&&)8lHsOnF zTqID9x}a8V{0{BB#TKODbrXoqsyDzz5|{esUySh3f=JNL zbF_jCLSkMt(daQi1nek}fo_E@>iM*LGD8g`F9G#tliCj%g6Z_;9b`Zp61Et>~QEkYAf`A_XpEZI(S!A_YhIpT`ZxO*2*i+efxga1CM zkPv}<^zm7*57Mz}b}H(&nGyD?7JGsPN?@0UShGJZH^LXR5`W(%m#mkKA|hlX-yu)Q zGh>5=S({0T`0TIC)-a&*jm^*fF|f^=Z}Vm>fhL7aZBEr^WQheoXvsO~iZQWEtCzrx zPSzq*^uT+Hd93OmC}R8CnJWb!XQsh8B#p}enSnN3GVYDmfZ=0bERa2V7yHJfx3-^| z!j!Kb{%{rN2Y04;X#%Nj&%ky1*cR0Fqv?-)G>p}b*QvWtCzRW9vuJh?XVIGS92+1P zrP~}|R^B^BxeYRjqR%ln^&keT>JHv_?udBK7ChNH6(i&-?9#K1LVsMM#u%?WkLWZm zGK0XDTiofT)7PDVYoWq=Cf>SPl4F6~>j1KzF&O8;cbUFCjh_{)X8(ec7ui3dUlB({ zf~~Ro`I%)=WZD{`jXQP+v4Uj za?w)lwaMPPVNA9)l0X1KbkdIo=C0Xvg~8i^5c|yN$Fvfqyxg+AkakcJ~J8EqH;^OwmiBfdgR>ttTlR?;s%0D4FJ~ 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
(bWOgx|=F_h`g&mi&k$$R#F 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

tU5+`@NYHWWi?B6-Pq|0D@( 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� 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 AUH||9 From 166b0c0d6e1c464c950ff87c24ca059de299145b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 12:29:12 +0100 Subject: [PATCH 018/323] new roxygen2 version --- NAMESPACE | 2 +- man/Lee2008.Rd | 2 +- man/RDDbw_IK.Rd | 2 +- man/RDDbw_RSW.Rd | 2 +- man/RDDcoef.Rd | 2 +- man/RDDdata.Rd | 2 +- man/RDDgenreg.Rd | 2 +- man/RDDpred.Rd | 2 +- man/RDDreg_lm.Rd | 2 +- man/RDDreg_np.Rd | 2 +- man/RDDtools-package.Rd | 2 +- man/ROT_bw.Rd | 2 +- man/STAR_MHE.Rd | 2 +- man/as.lm.Rd | 2 +- man/as.npregbw.Rd | 2 +- man/clusterInf.Rd | 2 +- man/covarTest_dis.Rd | 2 +- man/covarTest_mean.Rd | 2 +- man/dens_test.Rd | 2 +- man/gen_MC_IK.Rd | 2 +- man/plot.RDDdata.Rd | 2 +- man/plotBin.Rd | 2 +- man/plotPlacebo.Rd | 2 +- man/plotSensi.Rd | 2 +- man/vcovCluster.Rd | 2 +- man/waldci.Rd | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index ed4bb13..d92e5c2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,4 @@ -# Generated by roxygen2 (4.1.0): do not edit by hand +# Generated by roxygen2 (4.1.0.9001): do not edit by hand export(RDDbw_IK) export(RDDbw_RSW) diff --git a/man/Lee2008.Rd b/man/Lee2008.Rd index d2fb83b..0233cc6 100644 --- a/man/Lee2008.Rd +++ b/man/Lee2008.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/Lee2008-data.R \docType{data} \name{Lee2008} diff --git a/man/RDDbw_IK.Rd b/man/RDDbw_IK.Rd index 5534f62..7795b56 100644 --- a/man/RDDbw_IK.Rd +++ b/man/RDDbw_IK.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/bw_IK.R \name{RDDbw_IK} \alias{RDDbw_IK} diff --git a/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd index 4d83eb5..7c9986b 100644 --- a/man/RDDbw_RSW.Rd +++ b/man/RDDbw_RSW.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/bw_ROT.R \name{RDDbw_RSW} \alias{RDDbw_RSW} diff --git a/man/RDDcoef.Rd b/man/RDDcoef.Rd index 6a2c3e0..12f68e6 100644 --- a/man/RDDcoef.Rd +++ b/man/RDDcoef.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/RDDcoef.R \name{RDDcoef} \alias{RDDcoef} diff --git a/man/RDDdata.Rd b/man/RDDdata.Rd index b34aebd..a1ed2a9 100644 --- a/man/RDDdata.Rd +++ b/man/RDDdata.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/RDDdata.R \name{RDDdata} \alias{RDDdata} diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd index 9be2d6f..818c89b 100644 --- a/man/RDDgenreg.Rd +++ b/man/RDDgenreg.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/reg_gen.R \name{RDDgenreg} \alias{RDDgenreg} diff --git a/man/RDDpred.Rd b/man/RDDpred.Rd index 11cc9a5..4645f45 100644 --- a/man/RDDpred.Rd +++ b/man/RDDpred.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/RDDpred.R \name{RDDpred} \alias{RDDpred} diff --git a/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd index 4c06c0e..7bef056 100644 --- a/man/RDDreg_lm.Rd +++ b/man/RDDreg_lm.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/reg_lm.R \name{RDDreg_lm} \alias{RDDreg_lm} diff --git a/man/RDDreg_np.Rd b/man/RDDreg_np.Rd index d7279dd..aa3bb46 100644 --- a/man/RDDreg_np.Rd +++ b/man/RDDreg_np.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/reg_np.R \name{RDDreg_np} \alias{RDDreg_np} diff --git a/man/RDDtools-package.Rd b/man/RDDtools-package.Rd index b38ebae..7d6a43d 100644 --- a/man/RDDtools-package.Rd +++ b/man/RDDtools-package.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/myRDD-package.R \docType{package} \name{RDDtools-package} diff --git a/man/ROT_bw.Rd b/man/ROT_bw.Rd index 6183c41..c086aff 100644 --- a/man/ROT_bw.Rd +++ b/man/ROT_bw.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/bw_ROT.R \name{ROT_bw} \alias{ROT_bw} diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 6100e93..15a0221 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/STAR_MHE-data.R \docType{data} \name{STAR_MHE} diff --git a/man/as.lm.Rd b/man/as.lm.Rd index 11183ac..de41281 100644 --- a/man/as.lm.Rd +++ b/man/as.lm.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/RDDdata_methods.R \name{as.lm} \alias{as.lm} diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index 7cd7ce4..c018c82 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/as.npreg.R \name{as.npregbw} \alias{as.npreg} diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index 960ad6c..ec66a4e 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/clusterInf.R \name{clusterInf} \alias{clusterInf} diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index c427a1c..8a6f06f 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/covarTests.R \name{covarTest_dis} \alias{covarTest_dis} diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index 0388d66..d2b3dd0 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/covarTests.R \name{covarTest_mean} \alias{covarTest_mean} diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 37362d8..9b377ae 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/dens_test.R \name{dens_test} \alias{dens_test} diff --git a/man/gen_MC_IK.Rd b/man/gen_MC_IK.Rd index 86cf3b5..55ecd34 100644 --- a/man/gen_MC_IK.Rd +++ b/man/gen_MC_IK.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/gen_MC_IK.R \name{gen_MC_IK} \alias{gen_MC_IK} diff --git a/man/plot.RDDdata.Rd b/man/plot.RDDdata.Rd index 8571f71..6c8a945 100644 --- a/man/plot.RDDdata.Rd +++ b/man/plot.RDDdata.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/RDDdata_methods.R \name{plot.RDDdata} \alias{plot.RDDdata} diff --git a/man/plotBin.Rd b/man/plotBin.Rd index 4637185..2aeaca0 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/plotBin.R \name{plotBin} \alias{plotBin} diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index 29a54ab..d2c8dc8 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/placebo.R \name{plotPlacebo} \alias{computePlacebo} diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index e7b82e7..3764cb8 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/plotSensi.R \name{plotSensi} \alias{plotSensi} diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index b58c01d..c51233f 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/clusterInf.R \name{vcovCluster} \alias{vcovCluster} diff --git a/man/waldci.Rd b/man/waldci.Rd index 4bd5e3a..9cdcc39 100644 --- a/man/waldci.Rd +++ b/man/waldci.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0): do not edit by hand +% Generated by roxygen2 (4.1.0.9001): do not edit by hand % Please edit documentation in R/Waldci.R \name{waldci} \alias{waldci} From 28dd15ff12257fb69e7fe93802b6446f64a634cf Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 12:29:22 +0100 Subject: [PATCH 019/323] new vignette --- vignettes/data_entry.Rmd | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 vignettes/data_entry.Rmd diff --git a/vignettes/data_entry.Rmd b/vignettes/data_entry.Rmd new file mode 100644 index 0000000..a466e35 --- /dev/null +++ b/vignettes/data_entry.Rmd @@ -0,0 +1,33 @@ +--- +title: "Data entry" +author: "Matthieu Stigler" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Data entry} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} +--- + +**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. + +### Data preparation and visualisation +Load the package, and load the built-in dataset from [Lee 2008]: + +```{r} +library(RDDtools) +data(Lee2008) +``` + +Declare the data to be a *RDDdata* object: + +```{r} +Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +``` + + +You can now directly summarise and visualise this data: + +```{r dataPlot} +summary(Lee2008_rdd) +plot(Lee2008_rdd) +``` From 6155fed60d5ed9fec3322dee5e8cf67b5d3921dd Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 12:29:30 +0100 Subject: [PATCH 020/323] move to vignette --- README.Rmd | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/README.Rmd b/README.Rmd index fb7d76f..8239084 100644 --- a/README.Rmd +++ b/README.Rmd @@ -48,36 +48,6 @@ RDDtools: main features + Contains the seminal dataset of [Lee 2008]: **Lee2008** + Contains functions to replicate the Monte-Carlo simulations of [Imbens and Kalyanaraman 2012]: **gen_MC_IK()** -Using RDDtools: a quick example ------------------------ -**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. - -### Data preparation and visualisation -Load the package, and load the built-in dataset from [Lee 2008]: - -```{r options, echo=FALSE} -opts_chunk$set(warning= FALSE, message=FALSE, fig.align="center", fig.path='figuresREADME/') -``` - - -```{r} -library(RDDtools) -data(Lee2008) -``` - -Declare the data to be a *RDDdata* object: - -```{r} -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) -``` - - -You can now directly summarise and visualise this data: - -```{r dataPlot} -summary(Lee2008_rdd) -plot(Lee2008_rdd) -``` ### Estimation From d9139a203ee6724c3c2d31e161ca7cea8ddab0f8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 13:00:01 +0100 Subject: [PATCH 021/323] add Rmd vignette --- DESCRIPTION | 3 ++- RDDtools.Rproj | 2 +- vignettes/data_entry.Rmd | 12 +++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 71093ab..403ada8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,7 +23,8 @@ Depends: AER Suggests: stats4, - car + car, + knitr License: GPL (>= 2) Collate: 'Lee2008-data.R' diff --git a/RDDtools.Rproj b/RDDtools.Rproj index 9f96499..6843888 100644 --- a/RDDtools.Rproj +++ b/RDDtools.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace +PackageRoxygenize: rd,collate,namespace,vignette diff --git a/vignettes/data_entry.Rmd b/vignettes/data_entry.Rmd index a466e35..67c7e67 100644 --- a/vignettes/data_entry.Rmd +++ b/vignettes/data_entry.Rmd @@ -1,13 +1,19 @@ --- title: "Data entry" author: "Matthieu Stigler" -output: rmarkdown::html_vignette +date: "`r Sys.Date()`" vignette: > - %\VignetteIndexEntry{Data entry} %\VignetteEngine{knitr::rmarkdown} - \usepackage[utf8]{inputenc} + %\VignetteIndexEntry{Custom Print Methods} +output: + knitr:::html_vignette: + toc: yes --- +```{r, echo = FALSE, message = FALSE} +knitr::opts_chunk$set(collapse = T, comment = "#>") +``` + **RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. ### Data preparation and visualisation From ff1f3ec161089f49c69e8666f84d58a75ce36556 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 13:25:53 +0100 Subject: [PATCH 022/323] add VignetteBuilder --- DESCRIPTION | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 403ada8..73b6f82 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -9,7 +9,7 @@ Authors@R: c( person("Matthieu", "Stigler", role = "aut") ) Maintainer: Bastiaan Quast -Imports: +Imports: KernSmooth, ggplot2, rdd, @@ -19,14 +19,14 @@ Imports: Formula, locpol, methods -Depends: +Depends: AER -Suggests: +Suggests: stats4, car, knitr License: GPL (>= 2) -Collate: +Collate: 'Lee2008-data.R' 'RDDcoef.R' 'RDDdata.R' @@ -56,3 +56,4 @@ Collate: 'various_code.R' URL: https://github.com/bquast/RDDtools BugReports: https://github.com/bquast/RDDtools/issues +VignetteBuilder: knitr From e343ec843839bc56525a4cc2879437ef511dec2f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 13:26:07 +0100 Subject: [PATCH 023/323] update install instructions, bquast repo and build vignettes --- README.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.Rmd b/README.Rmd index 8239084..839069b 100644 --- a/README.Rmd +++ b/README.Rmd @@ -10,8 +10,8 @@ Installing **RDDtools** This github website hosts the source code. One of the easiest ways to install the package from github is by using the R package **devtools**: ```{r eval=FALSE} -library(devtools) -install_github(repo="MatthieuStigler/RDDtools") +if (!require('devtools')) install.packages('devtools') +devtools::install_github(repo="bquast/RDDtools", build_vignettes = TRUE) ``` Note however the latest version of RDDtools only works with R 3.0, and that you might need to install [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. From 175c58ac00da4ce694350515f198d6c32e80c74f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 13:26:29 +0100 Subject: [PATCH 024/323] use devtools format --- vignettes/data_entry.Rmd | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/vignettes/data_entry.Rmd b/vignettes/data_entry.Rmd index 67c7e67..f390ad2 100644 --- a/vignettes/data_entry.Rmd +++ b/vignettes/data_entry.Rmd @@ -2,12 +2,11 @@ title: "Data entry" author: "Matthieu Stigler" date: "`r Sys.Date()`" +output: rmarkdown::html_vignette vignette: > + %\VignetteIndexEntry{Data entry} %\VignetteEngine{knitr::rmarkdown} - %\VignetteIndexEntry{Custom Print Methods} -output: - knitr:::html_vignette: - toc: yes + \usepackage[utf8]{inputenc} --- ```{r, echo = FALSE, message = FALSE} From 6c17005f1d364b53c2b4119000b703408449d983 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 13:51:58 +0100 Subject: [PATCH 025/323] move examples to Rmd vignettes --- .Rbuildignore | 5 +- .gitignore | 1 + DESCRIPTION | 4 +- NEWS | 23 ++++++ README.Rmd | 143 ---------------------------------- figuresREADME/DensPlot.png | Bin 16332 -> 0 bytes figuresREADME/RegPlot.png | Bin 8443 -> 0 bytes figuresREADME/SensiPlot.png | Bin 5550 -> 0 bytes figuresREADME/dataPlot.png | Bin 7720 -> 0 bytes figuresREADME/placeboPlot.png | Bin 5186 -> 0 bytes figuresREADME/reg_para.png | Bin 4680 -> 0 bytes vignettes/data_entry.Rmd | 2 +- vignettes/estimation.Rmd | 51 ++++++++++++ vignettes/tests.Rmd | 88 +++++++++++++++++++++ 14 files changed, 169 insertions(+), 148 deletions(-) delete mode 100644 README.Rmd delete mode 100644 figuresREADME/DensPlot.png delete mode 100644 figuresREADME/RegPlot.png delete mode 100644 figuresREADME/SensiPlot.png delete mode 100644 figuresREADME/dataPlot.png delete mode 100644 figuresREADME/placeboPlot.png delete mode 100644 figuresREADME/reg_para.png create mode 100644 vignettes/estimation.Rmd create mode 100644 vignettes/tests.Rmd diff --git a/.Rbuildignore b/.Rbuildignore index b67b153..85c4e86 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,5 +1,6 @@ misc -figuresREADME -README.Rmd ^.*\.Rproj$ ^\.Rproj\.user$ +^\.travis\.yml$ +^cran-comments.md$ +^NEWS\.md$ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 807ea25..09a72cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .Rproj.user .Rhistory .RData +inst/doc diff --git a/DESCRIPTION b/DESCRIPTION index 73b6f82..ee90f10 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: RDDtools -Version: 0.2.0.9000 -Date: 2015-3-11 +Version: 0.3.0.9000 +Date: 2015-3-12 Title: Toolbox for Regression Discontinuity Design (RDD) Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, estimation and testing. diff --git a/NEWS b/NEWS index d03d969..25b1212 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,25 @@ +RDDtools 0.3.0.9000 +===================== + +* development taken over by Bastiaan + +* move package from subdir to repo root directory + +* change S3class method to export for roxygen + +* connect method functions with . in stead of white space + +* classify default functions as RDDcoef.default etc. + +* update DESCRIPTION with CRAN guidelines + +* change .onLoad to .onAttach + +* remove old lyx vignette in several places + +* move examples from README.Rmd to Rmd vignettes + +* fix empty package dependency bug RDDtools 0.22 =========== @@ -11,6 +33,7 @@ Updated on 21/5/14 * Correct import, suggests, calls to ::: + RDDtools 0.21 =========== Updated on 25/7/13 diff --git a/README.Rmd b/README.Rmd deleted file mode 100644 index 839069b..0000000 --- a/README.Rmd +++ /dev/null @@ -1,143 +0,0 @@ -RDDtools: an R package for Regression Discontinuity Design -======================================================== - -**RDDtools** is a new R package under development, designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. - - -Installing **RDDtools** ------------------------ - -This github website hosts the source code. One of the easiest ways to install the package from github is by using the R package **devtools**: - -```{r eval=FALSE} -if (!require('devtools')) install.packages('devtools') -devtools::install_github(repo="bquast/RDDtools", build_vignettes = TRUE) -``` - -Note however the latest version of RDDtools only works with R 3.0, and that you might need to install [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. - - -Documentation ------------------------ -The (preliminary) documentation is available in the help files directly, as well as in the *vignette*. The vignette can be accessed from R with vignette("RDDtools"), or by accessing the [pdf](https://github.com/MatthieuStigler/RDDtools/raw/master/RDDtools/inst/doc/RDDtools.pdf) stored on this github. - -RDDtools: main features ------------------------ - - -+ Simple visualisation of the data using binned-plot: **plot()** - -+ Bandwidth selection: - + MSE-RDD bandwidth procedure of [Imbens and Kalyanaraman 2012]: **RDDbw_IK()** - + MSE global bandwidth procedure of [Ruppert et al 1995]: **RDDbw_RSW()** -+ Estimation: - + RDD parametric estimation: **RDDreg_lm()** This includes specifying the polynomial order, including covariates with various specifications as advocated in [Imbens and Lemieux 2008]. - + RDD local non-parametric estimation: **RDDreg_np()**. Can also include covariates, and allows different types of inference (fully non-parametric, or parametric approximation). - + RDD generalised estimation: allows to use custom estimating functions to get the RDD coefficient. Could allow for example a probit RDD, or quantile regression. -+ Post-Estimation tools: - + Various tools, to obtain predictions at given covariate values ( **RDDpred()** ), or to convert to other classes, to lm ( **as.lm()** ), or to the package *np* ( **as.npreg()** ). - + Function to do inference with clustered data: **clusterInf()** either using a cluster covariance matrix ( **vcovCluster()** ) or by a degrees of freedom correction (as in [Cameron et al. 2008]). -+ Regression sensitivity analysis: - + Plot the sensitivity of the coefficient with respect to the bandwith: **plotSensi()** - + *Placebo plot* using different cutpoints: **plotPlacebo()** -+ Design sensitivity analysis: - + McCrary test of manipulation of the forcing variable: wrapper **dens_test()** to the function **DCdensity()** from package **rdd**. - + Test of equal means of covariates: **covarTest_mean()** - + Test of equal density of covariates: **covarTest_dens()** -+ Datasets - + Contains the seminal dataset of [Lee 2008]: **Lee2008** - + Contains functions to replicate the Monte-Carlo simulations of [Imbens and Kalyanaraman 2012]: **gen_MC_IK()** - - -### Estimation - -#### Parametric - -Estimate parametrically, by fitting a 4th order polynomial: -```{r reg_para} -reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4) -reg_para - -plot(reg_para) -``` - - -#### Non-parametric -As well as run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth: -```{r RegPlot} -bw_ik <- RDDbw_IK(Lee2008_rdd) -reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik) -print(reg_nonpara) -plot(x=reg_nonpara) - -``` - -### Regression Sensitivity tests: - -One can easily check the sensitivity of the estimate to different bandwidths: -```{r SensiPlot} -plotSensi(reg_nonpara, from=0.05, to=1, by=0.1) -``` - -Or run the Placebo test, estimating the RDD effect based on fake cutpoints: -```{r placeboPlot} -plotPlacebo(reg_nonpara) -``` - -### Design Sensitivity tests: - -Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available: - -+ Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: **dens_test()** -+ Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available: - -#### Discontinuity comes from manipulation: McCrary test - -use simply the function **dens_test()**, on either the raw data, or the regression output: -```{r DensPlot} -dens_test(reg_nonpara) -``` - -#### Discontinuity comes from covariates: covariates balance tests - -Two tests available: -+ equal means of covariates: **covarTest_mean()** -+ equal density of covariates: **covarTest_dens()** - - -We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. -We here simulate three variables, with the second having a different mean on the left and the right. - -```{r} -set.seed(123) -n_Lee <- nrow(Lee2008) -Z <- data.frame(z1 = rnorm(n_Lee, sd=2), - z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), - z3 = sample(letters, size = n_Lee, replace = TRUE)) -Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) -``` - - -Run the tests: -```{r} -## test for equality of means around cutoff: -covarTest_mean(Lee2008_rdd_Z, bw=0.3) - -## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: -covarTest_dis(Lee2008_rdd_Z, bw=0.3) -``` - -Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. - - [Imbens and Kalyanaraman 2012]: http://ideas.repec.org/a/oup/restud/v79y2012i3p933-959.html "Imbens, G. & Kalyanaraman, K. (2012) Optimal Bandwidth Choice for the Regression Discontinuity Estimator, Review of Economic Studies, 79, 933-959" - - [Lee 2008]: http://ideas.repec.org/a/eee/econom/v142y2008i2p675-697.html "Lee, D. S. (2008) Randomized experiments from non-random selection in U.S. House elections, Journal of Econometrics, 142, 675-697" - - [Imbens and Lemieux 2008]: http://ideas.repec.org/a/eee/econom/v142y2008i2p615-635.html "Imbens, G. & Lemieux, T. (2008) Regression discontinuity designs: A guide to practice, Journal of Econometrics, Vol. 142(2), pages 615-635" - - [Cameron et al. 2008]: http://ideas.repec.org/a/tpr/restat/v90y2008i3p414-427.html "Cameron, Gelbach and Miller (2008) Bootstrap-Based Improvements for Inference with Clustered Errors, The Review of Economics and Statistics, Vol. 90(3), pages 414-427" - - [Ruppert et al 1995]: http://www.jstor.org/stable/2291516 "Ruppert, D., Sheather, S. J. and Wand, M. P. (1995). An effective bandwidth selector for local least squares regression. Journal of the American Statistical Association, 90, 1257–1270." - - - \ No newline at end of file diff --git a/figuresREADME/DensPlot.png b/figuresREADME/DensPlot.png deleted file mode 100644 index ef7498d4fa9c5485a0aee6d89f3accb987d4e020..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16332 zcmeIZWl$we&?brwKDfKPySux)yTjlU~VSu@-DXD{jLqI}7e}jRAgGWF_`i_i(iiVDXiG_`Wi-%7@ zNJLCRN=8mWNkvUVOGnSZ$i&RT%Er#Y$;HjX%f~MuC?qT*Dkd%=DJ3ltEX>ZXk=_+YG!U>X=QC=YiIA^=;Z9;`oqoL!_&*#$Jft4ATa3Xui%i- zu<(fAkx|hxv2pPUiAl*RscC=GGcvQXb8_?Y3kr*hOG?YiD=Mq1YijH28ycIMTUy)N zJ370%dwTo+_5%h6hlWQ+$Hpfnr>19S=jIm{mzGyn*VZ>Sx3+h7fqVN0heyXJr)TH? zE-tS?*EhF!_YaRx&o8fU?;oEPI+HJ73jxkWM%N7t3<2%G20p(P_yz_>0wyaVs^Oh| zkptt6A&Eb-({&drB1VED2G=7l<~;A0x?Kzl0f7}IgDwi&Lr2!beVT(pf}#dXLZ^lC zFUmjfiS#!KWyiCXXPrY=ubW5U3?w%{e;2>k=fBGouWjs~{U$6ph~Gl~58iKn8imC)VcaNtYNC^+uX;Gr%iCSX=u1p$Z@RwsCp$a7u0D zGz;)O>;*ybREj1H?ur@1*-EZWawHw}A>-wq@HGHsr+A7zYed!E$I{zE`_8sL7W#;N z#Kl!YU09>w9b~Ghss7@)B}LU;B=G1T=%wAy)G3uYk3j5b0^lD-3uQWT^P(iMTq67e zkSI`lX#N~Ej?3Cmx@K?ndRJ#? z^ldWH;&fS#Pp!(o$aqP4WPm=z zghhS9Dn~;frH!Oq6}+=5E-&GEBI-3isiI5(8j#Xt%Wbb zn$<3rO|~p49*#n@b}^%qBTI|%^18f_280k zZA#75`R-g$!5jZ~zg*BLrBdSO3`q+5-ZmcZ-&VEY*q!Asfdz|`a|H%wygo)!O6f;o zZg(Tl@>Ia9lCKwBP(@O+G-U?ZkgmTcGZG2p_yy-o%%0iV^({_KB7rGRiUoL)znFAj zrN3zi2Q!zA<)9%NkO68%&kRwK(o5;80^-a?K;t8+z)*ExXiyVAEhjD`_>vuR!E>z_ z4p+j~jn!$6-tz))O}Ch71Js>KGWQ5) z_)k16p@pqfm!B1mQ26XB`L}=|zUbNLnHob4N%8BVA4!HssejbJjH%_22_QE1g>*R zc!lWwce%V){_4gB73YF_K3J);>JCSZoD15u-RiTu>`jCVSJb64eE|qG8d>Hm;7c?A zNSh7MF7Z}lsTAAqPfh6n=ei%HHSAsZvHx0*t}%GXHeUky(YHMdKTm*{bUaEvbAFH0 zbeN%a79yPkE1@e^Tdch_`0Y((aVWGu+TJXB;Q@IP$U*xFmmpf8UmP^e`z{ZL(m}Y; zN~9DcAPK&sOzS&ZRB7dPxv}#weF`(2F>CUqsG`^eN~eT`(k8{K?h~7s;id+wJ}ra0 zy)I6yrudVVGtKd95(tL3=eKtniPdZl`IEIb+<_rWxf!){;)byUr`VKs zTc^Dqk?wtJjdfeD)A? z9M!b;sA?%f#2Ju%e$gC|MSbT_JM=a@y2~(o1a?zAG^-uU$2;uD8LHox&>>0H?ZfrR z)wKWA6YNh$K02&E1pr`c6e-0uC?7N*gE!#bi378;Cz@$5{W@rm9yDgMMyQQi)&P8yp$gjm5{Ds+Oz#B1d@xN0e6#igj;{fJ$8f#ofuJKn%KJKhT=hfc_ zWB+)!V}vPG|NNaN^@&cThBBT~_mqT^>BQQ5FyGCW=IMt69S7fbRus4U2N3byZ|$Fn z{cg%4?I!V1>o!UUi>8&MImy|_mdEA`sJ-J%Tg8K}7Tu{u9I2l zccStLJ8%eb(D!?2;8g<0sUJ6oIup^=YmzdRo+Gn2&H_pUrZoWJw_)?q6m(C)3hO1+ zcbtyDC<*y$SKFK>MrXx^!-Y%7L2t!{^Sp>D0arb2X%AgVUF(AB_KX&IimElTi4ss#iCUzZTwc%Y<;)6?y zfV#Rt>8tI2bUx(D?SRDK#EfR(6kfb*HmT9r8{A{mjXY4+xhH2YH$7XTdj@plbVIpL z%id#W;rlc1eE{DO@AL07=vp2aZ|<79l>s%vNzH71iA&g^^%wvXeOz(v5G%B_vWZwr zjl$5o|LGh5cJ&7^GqV0&brd=7!0!atqG-9T(`x_&*_joPkXdCvO)bXcT|eg$pz5#) zw#9G*{8|;vN*QFF<@T%vFsJ!_Adr?mdxZUW$}@G-oq&ofGHoSx^;Jmk zz-||MJl7nxJ`AH@f5vuS<%g&0ALm?euddLJkrqHXb5H?v;YM58mhQqpE!+>&k9qW#ay%&fHJq^m4r zr0*_jbX7+5c+FBXiO5s}r1b%xch1=7+S1=9mkjMUn<`6gQhiI$q;K;37sOwV#7_U6 zSZ$F_6735O8sYn1A4w~C1586dIGT6O7v{n#{68Prjl0>m1Lo>~dv?#QcCJaoTGDz! zZAN+TIzjDqo3j8}C7~hDWraWaQ?e2jIgLNSwgUo-P0t0lNQ4SB@y;K?<|Xx=$u27f zLq|fmr1gzTt$lwPi8);a%lgI7~q21ZdTnH08Xl#=Sm5*VnPvD`IBdrFu2#u!_Lwx^UIfQn+5ejD}i@aTCjQ|Lj( z2agr$d>XDT>NB@|_W6T2klY{IpPTCf%_zDPL{Xz@`6UV+g`XjjG^2PlI@s@QZ= zB1s~P+spM!{chgoncKWye)Zk~|M;2@FcEB5Vz+;;mmOyFgxjS4$i2pb;5EoXKT&qD5%AnSf0ob6k4KyB zyHXdd=OK7%dplJMAkh^%T~vn121SM9za4JGAQ#`P}ecdQZ}l zWFAkowC={81NfnNGxCO?s+p?&R&qj_q@q^MIdxy|c~D$L%z) z*U(%wM*UHg^ZV&B{kG=ihpUS1JjQc=m^9oD1#kDEo~3~8g&^T+m7yTjZrTLN zRN~qAw}hF0F~rb zz>#!ZpX8?(z_Y- z{Jio})(s*TTR5QKyeJ)&44@~2%)99i!Uspx?2jxRhdP)#KvzNtiYG3Pe^c)qNDiy> zM>G)>6E4i-1D`W+cdNPwN_^TJCuu$9tIB>q7>I)oBoG@(R036kL-cK%@mh{G{rSbULpOX4^2 zx)gf%(|TRnhJBsUw#-!ni>!mZ#?Y?dmM!r7%{}01SkQPoX)V*I9>nab3K_li5sJOp zD9O>V=DT#H{>ZJg5KeS767zd%IratXyDc-Qrc9`6P(C=99p{68rxMwL)Bk2v>xQTb z24SW^G2kyU_d}D3D6)ZoZu9a{6O|zsQz7DJ4A;KX)_4EzU@r=E^ssQSN;egO$63hJ zto*?Fcx<#ue4QClf8wq+-3cw1kVA9fwBN#x{zdks=S+it!TkM^XPIERyd;neOyVxE z>(OPIJt^k#m7WSfW7((fuLAFmZ^12(_7N5l5gNXNZ?$O6@>I$zL?hzKt<~BFDp@>b zeG{A8w@!@x#9_(@3Q|#9y-JRzRY&=APDPhjLAXaJ-<$wm50=_6T)$HWmG!Oavp~W? z;c_sF=0V8XIrJOwSlC_4X`I;O=%AO$SvCrJm&8f2ShjoY=(e_iI_0N45W&VxyXLp` z05*0AO;`eF2W|-hG5n|4U4l?HLqgl$x>ZC-C8K5PH?gO)D@9I)f>0MSM5*ZZnw66< zTv$#9^I4`vLnHPa9CuBgcOQtB^9e%Q5Bf!eB_MDQD?1irtY?}W7F(Uc54-$WEa}Dql5k%r(p_gR8rEv9o&Z-Ra^jur{ z+8KoW6WOIy0Tv$5I~ZUjwQXPtNj7yFo4WVH&2PkUM#hjP(B9LF50*gH?1AL96%AYU z&9x)2N|8_|_ta6ypr*}{Tx&6v=n6Q`-=!|MFz?T>IbNP4nPw>H1m%pWDX_C%YnL%nwdO79!< zs@L~0fqy>2lRSE4?04*pw2k#>L}-u{Xdnms(r}f57BU`JQ0vyImF*F?ZYwPoPOaUQ-hgKg#`mqW+|D@b74|<1*e)$+p}Der??B z)(I1_vWy>rEprF9tXGumrgzdEJBvy!W_M%wh_6Wm*4u$=q}Z1 z(M&mX8L3-$O{9my0AzA=Px_n97MB3TWBUCg!b?K^NufOYI5*M8fW0WvLvFxvUoig~ zr&}bh$1cSyva*Bu5WDGGEByDn7>r&WUvfS?1j~;nAuPORcTHuZCjF%A2GY&APuR}~ zl{bEi57A5m^$|UK26Hws-Nt$eF+L#vdJ?OnnkU4g?s@+RJ_;YMiV?J*6U@^Vj`q59 z=oPk%uWm8DAu#4$o&9%HUgKX^`v>(@BcQO~VWJ!5kMLe5>DNge={{5<^p}CM1Kcc~ z^$+pL8S&f8I+hKG2i@oIsJ#>#!axY~Y^J55jj%cT@ZuQ+<4(HMzoE(XvsWi6A>t8~ zx=1v)2H*6|p4rM~i6r%FL+zwCqFXjYe^DX0#+9v~MUPO0@8(kFoM6!p_97L0WBY=3 zf^JdQF_hi8LARr@(Gsl-Gk@9+s2@XQ9q5bfkbPPq6y;+rs+d;@Ot-YLk?B8`8FFCIvtn%jOB(dip_IgciuZ3<~1=#sw%+mo?Lbp~7YWj48aT3G6=$b*N@R^hc9l(P<=-50q7imnJyhr!WD z|HQsIbewO?3?YH>d1O{!UkRgT ziiq2W2ci=Vo*Nhk{rXN?p-Uk701Np2)DFsYN75L}3g5VQR^ttNtmbH9`Uih8mTT{c zCNhDmbNqU5Ma?K;8-3&-hsJbU=qFkqIzJM2)sADb@lG>qMJF-rmP>Y^>Zr6C>z&8> z`hK~oUvA$xe!o}#oXc_S_ly23SnwfZOOq$RIX0hhfAH;SDlAKG;MFQqxE1Tz=yuT1 zEY>Ye%Hg`#oB}s92pYV?-@toQ+UQjov6r(#K!KD3pH%m+AY>hyz25DJoqFU>4cn(v z|ECv0o$nIZx-9iiv&4Md(|rKspm5-yy)}dwT(jP#RlCBWh77r~F?q9Er6CoWw2CmO zT9QT7-g@idG^C4o{OK9FkYND&O6(%l*G_i9Ru*BXupC4OYkch=i^kibJTp;REFkjK zzfW>gm(va>Iip#9i%510TQBJ`a+nD@pFJm2Z?$O)WM)L*1qIrS-t5m45|Q}pVRRQ% zea}R!^1Qti?Mm6a#s0`5ZWGdcY}Yohsuz50$cNl(1|diNow{jXcxiKwcnxE2hYAkl z56LnihsrQqRwmz1Q(UH0KiyqZy6g5pIz}9hEbi{G(9J8MDUF-`k;Y+tjvS0s7N(q$ zulvaM_iua&|0c756^R}5w9W6V_4XkBZ$a(6BzvL;VNriZjdyAzuE8{Gs)t*$^cq2t zwqnQpN(jdP_RpnnrprF1J#pI*>X4w?Z(5`Tm`dZ}XQg*5MimqA?y5z7uSWe}5SHAF$&BV8*Kg*P zKZ4Zhjir)nwsy;=_{S}ejs*Emv7pchr2t6V&S#Fl8~&#jJ>fso~m3}-9Z zm zU%oDIOjx*eCoCOn{2suxen$!9Jm4Of8B3t}9ng)j=Z(E(?|S5*tv$pliCibn#Cub4KIc9NY{w(VE|f9a6w-xz$JsTL_m zdpZ1?2J)Sjg82-D0tidfu&?{tB8z5WLf2o2l8*i<0<_oo%jA=w)h%C(0?}JVgcq>@ zqq~n)PL&~$cf(gjNy^v|431_!^_aoaV~utQZ#yXdD&CGP76BnwnHUV+BR&!=@o5si zJ1@$lux{H>RcCm*TFexI@K5=mgE~KgMVbYO0(JLgIW=+?TIEzv8{v-RSXr4j{ij@z z;Mu^sG&E2@)QGvF)XnUr883L&>oYoZHF9}Eue83~u}O~2SxMEKTQMvzJ}RL5n_jX} zqFFV{ObLGldnBH?c@*$Kde1QmVBBmJ4k4>=T3HKEd^3XJ>q;h*Q}>PoTZiO%BLUyw z)teZ~R!Y-7$uU4Fpv`{5ZMNE@iAMSte>GS|&TA0?KBnGi84cRPZ885{o9(-T>J$C) z#H&$&lfkTp(n;^c|h-aZYb*L?!@s|@T+fDhZw_j`Hannr@|LOR( z&*o4H|J7Oi3B@7W2#wmxE=APY%4$bH4dMhYtfK;vNuiSooJly7+zvrhwSDLaiDn0` zJl_hV_7I~0JH;MW2pSt`KM)Frc%LHFeUJ+6Pxz5cP8ZDJ+CSbk1+O=Jl7zoS0X~7@ zMt5D-b4|_PW~*Jip6^n)Q4&yLDf1YAitX?L7x+|w&VeiONnbKQ^;UgJTXg&Df**`V z>B0iM$p2>K+AJX-_z=rWYtq06X*xYh5^hF{pUW>d7|kZzlEG2{VM7jjM5lz+%A9+b z+WmUSv3l?IoUwX+m4Di=fUR?XnF`U(Vq4b5S&7g0N*sXP<9yj7>pu{4CO6#`1t z-rif60RDkA!Lb9!B)poYoxE%jairkI2vgSdDCpBX+s}G8yS7FsD4XPsz^;c~38eYs zTSg7_83?hPo;kJfCvg#(R1&Cez;E$FcKUZ_{C0X-Ap39XG5I3)sbboMb~shsx;cio zQEuDYujXh;)u)gfHl>Y6Ffe?*|IPw<_;Jw226ZBXYW7S~;T$X&YI|&lEP&GRNN)P4 zJd(LyYFw^jw}i^V)kVMM+#(*ta{8xgy$DM5f0&D-$u|N`5kJ&D|0$^Rjo$Vq5A}lz zh7IqCc&_C|HV&D3t6vD{pd)R_pbmJBw!8zf8R(xfChJEcLW4YPbhq4j45o+vXy$26 zfK9()LEUQLd(;LOyOvbI_W@eMQBI$ag&5(tHzQVx#$bOcl@q6E)Fdtvj%{MkVtfd; z2=eNd>dsz-F!hjd7B)Ps2*cy_R^&j!XlvOlD$k8oE7`&ecaYb((Jw%@AgkM~dQ+RD z=)NuiJ|IWr_T|mEwvsI8FnUXF=^-7c%b~MhRQX>h&nbI;Vi}U&5W$I`ipYD^0J@Eq zeRR`iI4(PT4B5O&sl*+RcP>fk^dX}oxr+stC**W%>i2GH{dN9YhYF+RW#b#`;R&zl z>u!IG671-HJe;U}BmI+vw+U_t6klH8Ys*eB7j290xct#9`**6dCP-S8SyL*%i=?B6 zbBSLlXSpNwBnl(5Xw@li;4T;JNZmWDzPhCFmw{q=vQs5F84<9}=yNIhXu1KXo(kMP7?wZnAwMzN(=Cs0n!;2|`DRTE_C z>iZ|??h2R6D;pW5RcdXilY&i@QY(Ls8GXuGN{f;}NEie0huSt8vm`v7pyWf;jIUfd zrl7tkFd~oiu17H7nUM0pr$QSOzLMfCuQ464$!{cNA`zAtLVZFP`#=`N&87Op(I+xk z3+5vyc=9<~81WMx@R=+x;?prt$mFn@6Z`Ro=J4nr-{RTW33v79m7M<{9!7WhV4*8K zbPiVU%}|deJZ7hUQGz=R>NaP1yrocegul6#l0t?r*fC1xGEINFCe7GK|EpGci&*V# z{L4?*9e0k$@;vhBUy>oe_o|3138UB4%PD?@EWs5_Nd6NXY8EK5F2K8bYCLZHtYLW5 zd4>Y1n1{=pgx9=8<@LtyOC8SfJcwXzR3P)G zmM+EpSEAPPQGO_q!CAnZpapeS$W3z6*t_6PfFL|P4^9jJ(db0`9b6Tb&cKyoM0fK~ z^m+008e?Pc@adH-lqovu*Q|Bqr7R+Up4$(7`4Np)>Vj$_W^JQ|@YxS^ug3!oX`wJ{ zSF`q?R6V90VnGN)KaQc`cWAdz`3~+wc)$L>JuXn^x$vQZ;Y3Npja5oDV)$+RYB&o8 zLRweBT-y7p3%7ESKiIAz8xYTxb9MPyr@0rPC~J@}QII zIZA{+dKSgtkO>eEHgT)fXK7NY0gsj5bsA_6^8tPb6FwScaClE=2!I&TC&iO)7#r>; zC{nhCxd12|p-(*o=5>k>z2_hN7lM{6EGZ%IGoF80Hib$xc3v>v8Ht#G*Bn7&;g)oe zzRb$^&*t%TO*RgdA7=ZDl@$iA^@4}pGE+U3IYh+wSPdJ4UE~8E*5TI`$ufCt(wPxg)5+;zE_^XtV7!Oy z>S`0-j+lzGY7Np_r?zN2O#`azwgU*<=CrMCc#d{q^lp%O!PIMf`}8T}%hwwuNg^+e}xJ21PY zWf*@_oqSxZUfmPtQ?P(>ecDQsz+2nQjK*yTBf`d`ht$50sYxQ|o^ox~Gn>}ggi^Ju zCK<85UM$!qqIad>}}B%#a0&FQ(LJkyvyD4(R*Aebts6spaSS})2oV3ayKFP zas*}9_f5VKP_Ly5GVT+7B;JqbX~;YBkLY;@J}73Yyjb1q+3b7#0N`m&p1m{5_K5G7 zPpOSI!_DN3kQwj%?aQOG`VREgzH}QkVBUrXI2S!uJJ(yI>-qf{_9k8+-@ zsD#zg2V1{0f3TpM;b^FEiRczqfnc0vlrq!O690jvvkh}(UM>D+V)(KY73SEXm$bzgH2;TdY(&CP~WQ5Zf-ay z&Bz)*v8TkCo^`Ll-RoQv0(b+?8P#oZz|*y^LWYPX}6Un}Y=a|Ev_c zeZ;oJZ+>4tL00TaE1tlMy1F|NcDH11gRaAYY7zMl4T*SW8f|B;d1-qubo zVmzD_LA;v@Wn1Y=uoVq7v1S*2lD*De(E^jt?sK-&%9?LH?uF&qDe{Df7t-p1?;S=2)HhkY(<6I5()Mg0a0jY8nE7S1RMxVLQ|cG=kQA99f&xU8Z~Ty0Mi5UQI&hGPFYHi*Ebn>uQ5rb6$O&Iw87-NOj8G8->iww|GJp5I2KYBtPnoMY2)K?ze z(n>DH&rIAwI}?z{F*QS&(8cKm>)1wVNmK*pp<0cvOrGM`*cUu2N0Y$pl3GhI;`p9z zpkTNF=m-hgFv*fsf1-?!nf4w=R6ER$Md^%Xs73=hZtwCtpnM{!8`>N z^@`KJz*0FTGXBE0h5yQzX*c%K9SaQHA1IaoV5%!ZdA@v^R)9>ZeIlVpIRYt-F#{a~ zEgfd9g*Vu|zGk_xNgqG%{tNfX*&+)TUkddF7wy!dsKJdn5@!kWGalLS-+6bmNUp$F z1abzYTr=-q#q*+h0WrF(R&Eq;W{>evQt{}bTiTx#Fx5X zp0I~&uqtDk9nbhM75&GOmg?ixsPP$BL^zZ6*MAl_hDC{;ED6g8hwGcDwsUdI;NQ*V z=wwaHXg=YVK1q|>wYMwqRCGL~mXbPhR}jJCCOXrPRV5I8EBSnsA^mB;?pm3tswE| z$cTnhf#<=g$+Fw5E*uZYe92SE<8IJ^csyu4l+TsMgh>xGiYT{(>-L(N_i}THy*_CM zY4*(r?BEKACA!1tiruIBf=7zAU-IokR`Z6P z;^Xlfw^i9%tzZ8-I8`>*2cDC%-S;U?EFriIGpYl5uQNWyQNfSdSxwSjh%`PAp*#{0 z1nY$D4Npin%(kR@4Uq}J7PuiW8W|>*=U++V|JN8|;%sYLaZ!VC`J!Shl-^0kF9;ND z7CZV;Bz}$lxHh&s8b+hr`Wi-X9dBfEfjQu|@~jnLup_gnc-5tnIa3qA^Vma6K1f>v zl6QFBVP)2Lf!?dbSp19N^N5->GfxFPE-d%y!LvSrai{$X0S>?k!>6hqza`-5@p?JU zQr5*&mkHG|K%BIhD=9w*aEh#>k?o7HKU0LQHs;K@yeSN0jKjkiWb!nCN*2sk-?cUR z#^Un&y>v}3wMiHF$n;BSd5VbgiZ9>~%X)%+3AnYF`A+9j-Ht_*`Z9F%@<*d`URI$Y z`}7=!(>vez2P6|^IeL=M&yrKjCjjBX(68V5FReRy2%f6)2c%!gq(@@}WD`E(-mNCT z0AkJqMPaj(k(ivZa~SomAN|54SI)If3JjNhj&@hT{}2kfcnF)NBceynrd!7qE_8XO z+{;;R_Quf+E%mQu1qAw9XIcvl<8`OyNiT`&D6LCU7(Nh} zQn=(^N`sERC~GZd_9x_6t+-uO_*M9b+)tzT!Ra4@OCbjIoPODSS;u6n2*~V3-_I(9 zMo~0szT(JS9IwAMh2uHSBdT?<997xvdVsxX)57vh$`uX(Vhdvpiz77Pq3bGm6Wf$$ zA(O-xj-sf92>@q)0Q$^ZK<)--Xe}OPQb6>?(Wbzls%bn5o4V~n^aH>#O&{}x$V;P( z4O_OpOY#$%^_szTiQL;|zEIDTr`l@LoljQr@_MCdl#1(frj4|`t||f|G*0A>9>SZq zVe^&(fZJU_m{uP$Kdhg^I5~J$*1P~o+{SR5;!S07bS~N55PIk`FLb=D8vEYudwLQD z%{9%>#Ko3cU%=#{U2|qg;zIAOfHhw(M5B={CFWuI@WwPu{vJv|_ zyVGFj*CRG&-tn^rNmI`doLuz=XfY=tK@vcxfgcWrn(9@w0%ch+Dl5LKLDqhe^<0tu zjhnh0#*ip}h&9L%zn@Sp4ySNBj}17sesolaZ~Pk-cqD4OqxvMSPl46b#eCwe7UsWmBmYPX{nGE=S?2pi@c zAD+c*llJad(BecnXt{o8y?4dYIx}s(EDZg)}p;mB{%80o_WFuBZRVb4jP)rnkmfg@B2 ziC!6RTFCozwtIErpu?GT-ctp>2h)ZO2-*A0Aky8{hg5sTm+5ghoKO%n={9jXd|UKD zIfdmU=6YJd)9Rqiq1Groyf>HG(U0<)XHUu!inOvG9taM3Z5cNV0%Qf{EPG{uTpp0u zG`iJd3jacVjIo$<*{FZi=v59F!OFqXsn+! z|6rEFtjj03`Dqs@gK#@rzW{q*>kIuZ+dJ%pM`{-UTLYZKk>e9h%rud&nu5RIRtWM` zn(>>llZ&3zC7sfZ#x#l%-Y3rw*ls1Yu)WhNE(>dB5tq??Efj5M3iQ9bn6W^5R+SmL3afhnlleWN>-*#~v5| zhuk+LdgzRLrUp~sC-G=Lc{C02Bxpm`+M4!R2Hju9w!^9okBskjC|{1&IP`4=m2*H$ zty9EgJ(&u{zfvzYxIK+?pc0Ew&M|)s8z*X3xsZGn3q6Jz)aNG+BVAo z0dk^-FjzBo%7cbI29zk0eTuVQF|V#$K}NiiW)ew%c+IM z@Ggk9Pu1_bz&$&lC_gcwx`7%iU%;Wx=8bSoR^*PnjA^W)3Z7UiFVH%@1op$xE5U|} zsc-+-!Z_f;vT&Zs@m+=H^M0QcOq@$nv~02(VQnwh=;W4gHF+CNuE|IZ{+=jMsH^Qf z>`F0w=hK@_R=2;^%b6R(CQ%cB!nbNA?(pp>Sdods=hjynL0O4L0Xz!=oL9F4$hK znjNJ(38{uZGgs7(`}nHQq3lv`6@wik#WfC|@*7k&cCN7{v&h@|)AK~h1n+Zy1t5Qf z%s%ptJP^$c28DLolZ&w zpm03r*E`jrAl>o3a#obtl}0>_S(tqIu3%*O9e%mb3R>K}u<8z#QU3|+v_HlUjzb6s z87A*d2$`^7bD?Kjwv5{K5c^aDlJQrDd2A3|Ri|aqa1*h4rp8PLnjh-7*ZB_o!-bJ5 z0mO{~yxM$B|riYY)NxidMzfHY%g}lr3p5jnKAfW^%|o=3Jc#0gVOAKHKdyvrzb2*Fdy_YO^=; z9x#!{{ty1RiH=E5R(q>ewye?mM3;@d7WEhv(SKz;e()cOaeR1&SKx>TO{2wcf18G~ zt0BZ?c$kt|pHRoz(qsohZ= zRAN+IUrUG@W*G##@MAiXd``#feKGUzfbn;#s3V4BqrDv6GtZv0`F^6XXREo4ks8rQ z(W$q$mQ}tZ=c>OM{V?GS%FNE3l+lMfhLK(c)y;XZ*Ta-Z+$C~+StfnGgVZq$bHyCi zj_i4bx}qsDVdCIvkn49huQR}I+1c+!>zWd_wUKW<#4>IQz39RcyGGdv>VjgI{#Dfr zV?1t=#fS@8eDCE)-R^yYMns5d=w}z`N$e78TA1ZKM`~L?waKue5rfRBgArFwBzT5D zIHvpscM`jKk6WaX4TOKGO*$GhNO@zN#qTf&bfH!VhEqwNVW(}65~6R{$YegS9b4T= zU8aLBC9-JmsMS=Ae*SL~#srtpCZx7<+Ep3%kC9L><_7co$oUGn0-;mgT^8V$Qg4y^ z@KX3HR7rq>w=q?zy0x1UAOjQ#kG`#J3V5Zx3w8F|uS9sd--%$_tEghSd$QMlbK!Q> zmA~qb(aQWR0{Cbf+L#Jz8;)iDhga|x{wi@S`zm%dl`_8;qnB`jd7Vk50h7ot8W`Ewmpn z$D*M*xIOPLdO&Fx`~64Tu=OC!e@04z4^(j5Ty`f^kGcsv2_$v4elq%*PHkb(wP`Hf zw;?%I5Pr&6igAcA_b#?QeGm&KY9JCFzQU)m?zAP@x3I!mLSy{<68px=sK?8BbyV=_ zn~xP}D3MtiD^!P4VFlGVaW4$^t~a4=;YI!@6}N1qllq&UKc3|K|07gsx5nr>ZW8JQ zbLXJ0lvRFuzAuhc@?FfmFJVRfc>R+r0_<%;m;G$`J;e2{&Rj;d59N?~@c;LU)o|Vq ZWCuR93C3~cyZ`F3WhIp)YQ;=~{}(8{jfwyO diff --git a/figuresREADME/RegPlot.png b/figuresREADME/RegPlot.png deleted file mode 100644 index ba49f786d78803cdcd276a10bd29ab4411e467e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8443 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 diff --git a/figuresREADME/SensiPlot.png b/figuresREADME/SensiPlot.png deleted file mode 100644 index b709e71f69f99aa89693218d7b609996ff7d4fcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5550 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 diff --git a/figuresREADME/dataPlot.png b/figuresREADME/dataPlot.png deleted file mode 100644 index ec610f7083aa9448449388b9aadbe6742333242b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7720 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 H-HH7VU>e-G diff --git a/figuresREADME/placeboPlot.png b/figuresREADME/placeboPlot.png deleted file mode 100644 index 2a028acb22343e6e51fb02611b7e64de6b6fc3d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5186 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 TzU(8Lzk{6Y+-z&D&tLxsrX*(t diff --git a/vignettes/data_entry.Rmd b/vignettes/data_entry.Rmd index f390ad2..9820256 100644 --- a/vignettes/data_entry.Rmd +++ b/vignettes/data_entry.Rmd @@ -15,7 +15,7 @@ knitr::opts_chunk$set(collapse = T, comment = "#>") **RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. -### Data preparation and visualisation +# Data preparation and visualisation Load the package, and load the built-in dataset from [Lee 2008]: ```{r} diff --git a/vignettes/estimation.Rmd b/vignettes/estimation.Rmd new file mode 100644 index 0000000..32b696f --- /dev/null +++ b/vignettes/estimation.Rmd @@ -0,0 +1,51 @@ +--- +title: "Estimation" +author: "Matthieu Stigler" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Estimation} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} +--- + +```{r, echo = FALSE, message = FALSE} +knitr::opts_chunk$set(collapse = T, comment = "#>") +``` + +Load the package, and load the built-in dataset from [Lee 2008]: + +```{r} +library(RDDtools) +data(Lee2008) +``` + +Declare the data to be a *RDDdata* object: + +```{r} +Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +``` + +# Parametric + +Estimate parametrically, by fitting a 4th order polynomial. + +```{r reg_para} +reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4) +reg_para + +plot(reg_para) +``` + + +# Non-parametric + +Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth. + +```{r RegPlot} +bw_ik <- RDDbw_IK(Lee2008_rdd) +reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik) +print(reg_nonpara) +plot(x=reg_nonpara) + +``` diff --git a/vignettes/tests.Rmd b/vignettes/tests.Rmd new file mode 100644 index 0000000..73e8ba6 --- /dev/null +++ b/vignettes/tests.Rmd @@ -0,0 +1,88 @@ +--- +title: "Tests" +author: "Matthieu Stigler" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Tests} + %\VignetteEngine{knitr::rmarkdown} + \usepackage[utf8]{inputenc} +--- + +```{r, echo = FALSE, message = FALSE} +knitr::opts_chunk$set(collapse = T, comment = "#>") +``` + +**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. + +# Data preparation and visualisation +Load the package, and load the built-in dataset from [Lee 2008]: + +```{r} +library(RDDtools) +data(Lee2008) +``` + +Declare the data to be a *RDDdata* object: + +```{r} +Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +``` + + +# Regression Sensitivity tests: + +One can easily check the sensitivity of the estimate to different bandwidths: +```{r SensiPlot} +plotSensi(reg_nonpara, from=0.05, to=1, by=0.1) +``` + +Or run the Placebo test, estimating the RDD effect based on fake cutpoints: +```{r placeboPlot} +plotPlacebo(reg_nonpara) +``` + +# Design Sensitivity tests: + +Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available: + ++ Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: **dens_test()** ++ Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available: + +## Discontinuity comes from manipulation: McCrary test + +use simply the function **dens_test()**, on either the raw data, or the regression output: +```{r DensPlot} +dens_test(reg_nonpara) +``` + +## Discontinuity comes from covariates: covariates balance tests + +Two tests available: ++ equal means of covariates: **covarTest_mean()** ++ equal density of covariates: **covarTest_dens()** + + +We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. +We here simulate three variables, with the second having a different mean on the left and the right. + +```{r} +set.seed(123) +n_Lee <- nrow(Lee2008) +Z <- data.frame(z1 = rnorm(n_Lee, sd=2), + z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), + z3 = sample(letters, size = n_Lee, replace = TRUE)) +Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) +``` + + +Run the tests: +```{r} +## test for equality of means around cutoff: +covarTest_mean(Lee2008_rdd_Z, bw=0.3) + +## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: +covarTest_dis(Lee2008_rdd_Z, bw=0.3) +``` + +Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. From c0a85dcb7e8812394def36e9b383d8c48552d216 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 13:57:25 +0100 Subject: [PATCH 026/323] remove examples, update isntall instructions --- README.md | 227 ++---------------------------------------------------- 1 file changed, 8 insertions(+), 219 deletions(-) diff --git a/README.md b/README.md index d61f761..abc4db5 100644 --- a/README.md +++ b/README.md @@ -9,24 +9,25 @@ Installing **RDDtools** This github website hosts the source code. One of the easiest ways to install the package from github is by using the R package **devtools**: - ```r -library(devtools) -install_github(repo = "MatthieuStigler/RDDtools") +if (!require('devtools')) install.packages('devtools') +devtools::install_github( "bquast/RDDtools", build_vignettes = TRUE ) ``` - Note however the latest version of RDDtools only works with R 3.0, and that you might need to install [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. Documentation ----------------------- -The (preliminary) documentation is available in the help files directly, as well as in the *vignette*. The vignette can be accessed from R with vignette("RDDtools"), or by accessing the [pdf](https://github.com/MatthieuStigler/RDDtools/raw/master/RDDtools/inst/doc/RDDtools.pdf) stored on this github. +The (preliminary) documentation is available in the help files directly, as well as in the *vignettes*. The vignettes can be accessed from R. + +```r +browseVignettes("RDDtools") +``` RDDtools: main features ----------------------- - + Simple visualisation of the data using binned-plot: **plot()** + Bandwidth selection: @@ -50,220 +51,8 @@ RDDtools: main features + Contains the seminal dataset of [Lee 2008]: **Lee2008** + Contains functions to replicate the Monte-Carlo simulations of [Imbens and Kalyanaraman 2012]: **gen_MC_IK()** -Using RDDtools: a quick example +References ----------------------- -**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. - -### Data preparation and visualisation -Load the package, and load the built-in dataset from [Lee 2008]: - - - - - - -```r -library(RDDtools) -data(Lee2008) -``` - - -Declare the data to be a *RDDdata* object: - - -```r -Lee2008_rdd <- RDDdata(y = Lee2008$y, x = Lee2008$x, cutpoint = 0) -``` - - - -You can now directly summarise and visualise this data: - - -```r -summary(Lee2008_rdd) -``` - -``` -## ### RDDdata object ### -## -## Cutpoint: 0 -## Sample size: -## -Full : 6558 -## -Left : 2740 -## -Right: 3818 -## Covariates: no -``` - -```r -plot(Lee2008_rdd) -``` - -plot of chunk dataPlot - - -### Estimation - -#### Parametric - -Estimate parametrically, by fitting a 4th order polynomial: - -```r -reg_para <- RDDreg_lm(RDDobject = Lee2008_rdd, order = 4) -reg_para -``` - -``` -## ### RDD regression: parametric ### -## Polynomial order: 4 -## Slopes: separate -## Number of obs: 6558 (left: 2740, right: 3818) -## -## Coefficient: -## Estimate Std. Error t value Pr(>|t|) -## D 0.0766 0.0132 5.79 7.6e-09 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -``` - -```r - -plot(reg_para) -``` - -plot of chunk reg_para - - - -#### Non-parametric -As well as run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth: - -```r -bw_ik <- RDDbw_IK(Lee2008_rdd) -reg_nonpara <- RDDreg_np(RDDobject = Lee2008_rdd, bw = bw_ik) -print(reg_nonpara) -``` - -``` -## ### RDD regression: nonparametric local linear### -## Bandwidth: 0.2939 -## Number of obs: 3200 (left: 1594, right: 1606) -## -## Coefficient: -## Estimate Std. Error z value Pr(>|z|) -## D 0.07992 0.00946 8.44 <2e-16 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -``` - -```r -plot(x = reg_nonpara) -``` - -plot of chunk RegPlot - - -### Regression Sensitivity tests: - -One can easily check the sensitivity of the estimate to different bandwidths: - -```r -plotSensi(reg_nonpara, from = 0.05, to = 1, by = 0.1) -``` - -plot of chunk SensiPlot - - -Or run the Placebo test, estimating the RDD effect based on fake cutpoints: - -```r -plotPlacebo(reg_nonpara) -``` - -plot of chunk placeboPlot - - -### Design Sensitivity tests: - -Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available: - -+ Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: **dens_test()** -+ Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available: - -#### Discontinuity comes from manipulation: McCrary test - -use simply the function **dens_test()**, on either the raw data, or the regression output: - -```r -dens_test(reg_nonpara) -``` - -plot of chunk DensPlot - -``` -## -## McCrary Test for no discontinuity of density around cutpoint -## -## data: reg_nonpara -## z-val = 1.295, p-value = 0.1952 -## alternative hypothesis: Density is discontinuous around cutpoint -## sample estimates: -## Discontinuity -## 0.1035 -``` - - -#### Discontinuity comes from covariates: covariates balance tests - -Two tests available: -+ equal means of covariates: **covarTest_mean()** -+ equal density of covariates: **covarTest_dens()** - - -We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. -We here simulate three variables, with the second having a different mean on the left and the right. - - -```r -set.seed(123) -n_Lee <- nrow(Lee2008) -Z <- data.frame(z1 = rnorm(n_Lee, sd = 2), z2 = rnorm(n_Lee, mean = ifelse(Lee2008 < - 0, 5, 8)), z3 = sample(letters, size = n_Lee, replace = TRUE)) -Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) -``` - - - -Run the tests: - -```r -## test for equality of means around cutoff: -covarTest_mean(Lee2008_rdd_Z, bw = 0.3) -``` - -``` -## mean of x mean of y Difference statistic p.value -## z1 0.004268 0.02186 0.01759 -0.2539 0.7996 -## z2 5.006 7.985 2.979 -84.85 0 -## z3 13.19 13.44 0.2465 -0.941 0.3468 -``` - -```r - -## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: -covarTest_dis(Lee2008_rdd_Z, bw = 0.3) -``` - -``` -## statistic p.value -## z1 0.03482 0.2727 -## z2 0.8648 0 -## z3 0.03009 0.4474 -``` - - -Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. - [Imbens and Kalyanaraman 2012]: http://ideas.repec.org/a/oup/restud/v79y2012i3p933-959.html "Imbens, G. & Kalyanaraman, K. (2012) Optimal Bandwidth Choice for the Regression Discontinuity Estimator, Review of Economic Studies, 79, 933-959" [Lee 2008]: http://ideas.repec.org/a/eee/econom/v142y2008i2p675-697.html "Lee, D. S. (2008) Randomized experiments from non-random selection in U.S. House elections, Journal of Econometrics, 142, 675-697" From 4d54edbd49d75c9e9dddfedba885fa533b47b9ef Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 12 Mar 2015 14:03:01 +0100 Subject: [PATCH 027/323] move to estimation, since based upon object created there --- vignettes/estimation.Rmd | 57 ++++++++++++++++++++++++++ vignettes/tests.Rmd | 88 ---------------------------------------- 2 files changed, 57 insertions(+), 88 deletions(-) delete mode 100644 vignettes/tests.Rmd diff --git a/vignettes/estimation.Rmd b/vignettes/estimation.Rmd index 32b696f..3d84612 100644 --- a/vignettes/estimation.Rmd +++ b/vignettes/estimation.Rmd @@ -47,5 +47,62 @@ bw_ik <- RDDbw_IK(Lee2008_rdd) reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik) print(reg_nonpara) plot(x=reg_nonpara) +``` + +# Regression Sensitivity tests: + +One can easily check the sensitivity of the estimate to different bandwidths: +```{r SensiPlot} +plotSensi(reg_nonpara, from=0.05, to=1, by=0.1) +``` + +Or run the Placebo test, estimating the RDD effect based on fake cutpoints: +```{r placeboPlot} +plotPlacebo(reg_nonpara) +``` + +# Design Sensitivity tests: + +Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available: + ++ Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: **dens_test()** ++ Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available: + +## Discontinuity comes from manipulation: McCrary test + +use simply the function **dens_test()**, on either the raw data, or the regression output: +```{r DensPlot} +dens_test(reg_nonpara) +``` +## Discontinuity comes from covariates: covariates balance tests + +Two tests available: ++ equal means of covariates: **covarTest_mean()** ++ equal density of covariates: **covarTest_dens()** + + +We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. +We here simulate three variables, with the second having a different mean on the left and the right. + +```{r} +set.seed(123) +n_Lee <- nrow(Lee2008) +Z <- data.frame(z1 = rnorm(n_Lee, sd=2), + z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), + z3 = sample(letters, size = n_Lee, replace = TRUE)) +Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) +``` + + +Run the tests: +```{r} +## test for equality of means around cutoff: +covarTest_mean(Lee2008_rdd_Z, bw=0.3) + +## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: +covarTest_dis(Lee2008_rdd_Z, bw=0.3) ``` + +Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. + diff --git a/vignettes/tests.Rmd b/vignettes/tests.Rmd deleted file mode 100644 index 73e8ba6..0000000 --- a/vignettes/tests.Rmd +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: "Tests" -author: "Matthieu Stigler" -date: "`r Sys.Date()`" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Tests} - %\VignetteEngine{knitr::rmarkdown} - \usepackage[utf8]{inputenc} ---- - -```{r, echo = FALSE, message = FALSE} -knitr::opts_chunk$set(collapse = T, comment = "#>") -``` - -**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. - -# Data preparation and visualisation -Load the package, and load the built-in dataset from [Lee 2008]: - -```{r} -library(RDDtools) -data(Lee2008) -``` - -Declare the data to be a *RDDdata* object: - -```{r} -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) -``` - - -# Regression Sensitivity tests: - -One can easily check the sensitivity of the estimate to different bandwidths: -```{r SensiPlot} -plotSensi(reg_nonpara, from=0.05, to=1, by=0.1) -``` - -Or run the Placebo test, estimating the RDD effect based on fake cutpoints: -```{r placeboPlot} -plotPlacebo(reg_nonpara) -``` - -# Design Sensitivity tests: - -Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available: - -+ Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: **dens_test()** -+ Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available: - -## Discontinuity comes from manipulation: McCrary test - -use simply the function **dens_test()**, on either the raw data, or the regression output: -```{r DensPlot} -dens_test(reg_nonpara) -``` - -## Discontinuity comes from covariates: covariates balance tests - -Two tests available: -+ equal means of covariates: **covarTest_mean()** -+ equal density of covariates: **covarTest_dens()** - - -We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. -We here simulate three variables, with the second having a different mean on the left and the right. - -```{r} -set.seed(123) -n_Lee <- nrow(Lee2008) -Z <- data.frame(z1 = rnorm(n_Lee, sd=2), - z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), - z3 = sample(letters, size = n_Lee, replace = TRUE)) -Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) -``` - - -Run the tests: -```{r} -## test for equality of means around cutoff: -covarTest_mean(Lee2008_rdd_Z, bw=0.3) - -## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: -covarTest_dis(Lee2008_rdd_Z, bw=0.3) -``` - -Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. From d966300cec150c5c5645fbe373b10ecf5b479969 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 14 Mar 2015 13:24:01 +0100 Subject: [PATCH 028/323] add coverage badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index abc4db5..6cc0d92 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Coverage Status](https://coveralls.io/repos/bquast/RDDtools/badge.svg)](https://coveralls.io/r/bquast/RDDtools) + RDDtools: an R package for Regression Discontinuity Design ======================================================== From 28ae6229355fdd3fa08a4d11832f84171b7f17e8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 10:54:05 +0100 Subject: [PATCH 029/323] rename --- R/{myRDD-package.R => RDDtools.R} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename R/{myRDD-package.R => RDDtools.R} (100%) diff --git a/R/myRDD-package.R b/R/RDDtools.R similarity index 100% rename from R/myRDD-package.R rename to R/RDDtools.R From 74c805a8bf47114548b5a26e1dcb905101ba4546 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 10:59:00 +0100 Subject: [PATCH 030/323] recompile after rename previous commit --- DESCRIPTION | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ee90f10..82160d9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -9,7 +9,7 @@ Authors@R: c( person("Matthieu", "Stigler", role = "aut") ) Maintainer: Bastiaan Quast -Imports: +Imports: KernSmooth, ggplot2, rdd, @@ -19,19 +19,21 @@ Imports: Formula, locpol, methods -Depends: +Depends: AER -Suggests: +Suggests: stats4, car, - knitr + knitr, + testthat License: GPL (>= 2) -Collate: +Collate: 'Lee2008-data.R' 'RDDcoef.R' 'RDDdata.R' 'RDDdata_methods.R' 'RDDpred.R' + 'RDDtools.R' 'STAR_MHE-data.R' 'Waldci.R' 'as.npreg.R' @@ -45,7 +47,6 @@ Collate: 'gen_MC_IK.R' 'get_methods.R' 'model.matrix.RDD.R' - 'myRDD-package.R' 'placebo.R' 'plotSensi.R' 'qplot_experim.R' From e6b09043c2596d8c28c5f6ad22564892893edf2c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 10:59:11 +0100 Subject: [PATCH 031/323] without vignette again --- RDDtools.Rproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RDDtools.Rproj b/RDDtools.Rproj index 6843888..9f96499 100644 --- a/RDDtools.Rproj +++ b/RDDtools.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace,vignette +PackageRoxygenize: rd,collate,namespace From 69937b954122bd9fe027d0e9a28acda692c83070 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 10:59:25 +0100 Subject: [PATCH 032/323] recompile from rename --- man/RDDtools-package.Rd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/RDDtools-package.Rd b/man/RDDtools-package.Rd index 7d6a43d..30064ed 100644 --- a/man/RDDtools-package.Rd +++ b/man/RDDtools-package.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2 (4.1.0.9001): do not edit by hand -% Please edit documentation in R/myRDD-package.R +% Please edit documentation in R/RDDtools.R \docType{package} \name{RDDtools-package} \alias{RDDtools} From 127a70ea8a7a09df3c20012ca9470d175a1ce9a7 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 10:59:47 +0100 Subject: [PATCH 033/323] remove redundant method export names --- R/RDDdata.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/RDDdata.R b/R/RDDdata.R index b561ed1..87d3c6b 100644 --- a/R/RDDdata.R +++ b/R/RDDdata.R @@ -124,7 +124,7 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ r } -#' @export subset.RDDdata +#' @export subset.RDDdata <- function (x, subset, select, drop = FALSE, ...) { attr_x <- attributes(x) @@ -160,7 +160,7 @@ subset.RDDdata <- function (x, subset, select, drop = FALSE, ...) { res } -#' @export as.data.frame.RDDdata +#' @export as.data.frame.RDDdata <- function(x,...){ class(x) <- "data.frame" attr(x, "hasCovar") <- NULL From 5ed1eadef54ea3c8c115d04fc237082d2bff269b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 11:00:06 +0100 Subject: [PATCH 034/323] update use of testthat --- tests/testthat.R | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tests/testthat.R diff --git a/tests/testthat.R b/tests/testthat.R new file mode 100644 index 0000000..07858ca --- /dev/null +++ b/tests/testthat.R @@ -0,0 +1,4 @@ +library(testthat) +library(RDDtools) + +test_check("RDDtools") From 12abc7e130312df2226438f8b64b984f5f8699cc Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 11:00:36 +0100 Subject: [PATCH 035/323] all S3methods gone --- NAMESPACE | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index d92e5c2..cb9bf53 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,14 @@ # Generated by roxygen2 (4.1.0.9001): do not edit by hand +S3method(as.data.frame,RDDdata) +S3method(plot,RDDreg_lm) +S3method(plot,RDDreg_np) +S3method(plotPlacebo,RDDreg) +S3method(print,RDDreg_lm) +S3method(print,RDDreg_np) +S3method(print,summary.RDDreg_np) +S3method(subset,RDDdata) +S3method(vcov,RDDreg_np) export(RDDbw_IK) export(RDDbw_RSW) export(RDDcoef) @@ -11,7 +20,6 @@ export(RDDpred) export(RDDreg_lm) export(RDDreg_np) export(ROT_bw) -export(as.data.frame.RDDdata) export(as.lm) export(as.lm.RDDreg) export(as.lm.RDDreg_np) @@ -30,21 +38,15 @@ export(gen_MC_IK) export(getCall.RDDreg) export(model.frame.RDDreg_np) export(model.matrix.RDDdata) -export(plot) export(plot.RDDdata) export(plotPlacebo) export(plotPlacebo.PlaceboVals) -export(plotPlacebo.RDDreg) export(plotPlaceboDens) export(plotPlaceboDens.PlaceboVals) export(plotPlaceboDens.RDDreg) export(plotSensi) -export(print) -export(subset.RDDdata) export(summary) export(summary.RDDdata) -export(summary.RDDreg_np) -export(vcov) export(vcovCluster) export(vcovCluster2) import(Formula) From d0df8a607028a9a004af9d2b0289ab6c39114819 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 11:00:53 +0100 Subject: [PATCH 036/323] remove redundant name --- R/placebo.R | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/R/placebo.R b/R/placebo.R index cc928b8..d9798f6 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -27,8 +27,7 @@ plotPlacebo <- function(object, device=c("ggplot", "base"), ...) UseMethod("plotPlacebo") #' @rdname plotPlacebo -#' @method plotPlacebo RDDreg -#' @export plotPlacebo.RDDreg +#' @export #' @param from Starting point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint #' @param to Ending point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint #' @param by Increments of the from-to sequence From 2099b12d3f2aebaaa79a12f385982966269affe7 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 11:01:18 +0100 Subject: [PATCH 037/323] remove methods names, fixed documentation warnings --- R/reg_lm.R | 4 ++-- R/reg_np.R | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/reg_lm.R b/R/reg_lm.R index 871af73..11c913c 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -105,7 +105,7 @@ RDDreg_lm <- function(RDDobject, covariates=NULL, order=1, bw=NULL, slope=c("sep } -#' @export print RDDreg_lm +#' @export print.RDDreg_lm <- function(x,...) { order <- getOrder(x) @@ -131,7 +131,7 @@ print.RDDreg_lm <- function(x,...) { } -#' @export plot RDDreg_lm +#' @export plot.RDDreg_lm <- function(x,...) { ## data diff --git a/R/reg_np.R b/R/reg_np.R index 17a45b7..eb1612a 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -83,7 +83,7 @@ RDDreg_np <- function(RDDobject, covariates=NULL, bw=RDDbw_IK(RDDobject), slope= } -#' @export print RDDreg_np +#' @export print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), ...) { RDDcall <- attr(x, "RDDcall") @@ -133,7 +133,7 @@ summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), object } -#' @export print summary.RDDreg_np +#' @export print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { bw <- getBW(x) @@ -155,7 +155,7 @@ print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3), } -#' @export plot RDDreg_np +#' @export plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) { chart <- match.arg(chart) @@ -202,7 +202,7 @@ plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) { } } -#' @export vcov RDDreg_np +#' @export vcov.RDDreg_np <- function(object, ...){ infType <- infType(object) From cf60c6bca247876e49c2b44bf140d761e6fdf82d Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 11:01:29 +0100 Subject: [PATCH 038/323] recompile --- vignettes/data_entry.R | 14 +++ vignettes/data_entry.html | 96 +++++++++++++++++++++ vignettes/estimation.R | 46 ++++++++++ vignettes/estimation.html | 177 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 333 insertions(+) create mode 100644 vignettes/data_entry.R create mode 100644 vignettes/data_entry.html create mode 100644 vignettes/estimation.R create mode 100644 vignettes/estimation.html diff --git a/vignettes/data_entry.R b/vignettes/data_entry.R new file mode 100644 index 0000000..26a0622 --- /dev/null +++ b/vignettes/data_entry.R @@ -0,0 +1,14 @@ +## ----, echo = FALSE, message = FALSE------------------------------------- +knitr::opts_chunk$set(collapse = T, comment = "#>") + +## ------------------------------------------------------------------------ +library(RDDtools) +data(Lee2008) + +## ------------------------------------------------------------------------ +Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) + +## ----dataPlot------------------------------------------------------------ +summary(Lee2008_rdd) +plot(Lee2008_rdd) + diff --git a/vignettes/data_entry.html b/vignettes/data_entry.html new file mode 100644 index 0000000..e391ba2 --- /dev/null +++ b/vignettes/data_entry.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + +Data entry + + + + + + + + + + + + + + + + +

+ + +

RDDtools works in an object-oriented way: the user has to define once the characteristic of the data, creating a RDDdata object, on which different anaylsis tools can be applied.

+
+

Data preparation and visualisation

+

Load the package, and load the built-in dataset from [Lee 2008]:

+
library(RDDtools)
+data(Lee2008)
+

Declare the data to be a RDDdata object:

+
Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+

You can now directly summarise and visualise this data:

+
summary(Lee2008_rdd)
+#> ### RDDdata object ###
+#> 
+#> Cutpoint: 0 
+#> Sample size: 
+#>  -Full : 6558 
+#>  -Left : 2740 
+#>  -Right: 3818
+#> Covariates: no
+plot(Lee2008_rdd)
+

+
+ + + + + + + + diff --git a/vignettes/estimation.R b/vignettes/estimation.R new file mode 100644 index 0000000..d52d507 --- /dev/null +++ b/vignettes/estimation.R @@ -0,0 +1,46 @@ +## ----, echo = FALSE, message = FALSE------------------------------------- +knitr::opts_chunk$set(collapse = T, comment = "#>") + +## ------------------------------------------------------------------------ +library(RDDtools) +data(Lee2008) + +## ------------------------------------------------------------------------ +Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) + +## ----reg_para------------------------------------------------------------ +reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4) +reg_para + +plot(reg_para) + +## ----RegPlot------------------------------------------------------------- +bw_ik <- RDDbw_IK(Lee2008_rdd) +reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik) +print(reg_nonpara) +plot(x=reg_nonpara) + +## ----SensiPlot----------------------------------------------------------- +plotSensi(reg_nonpara, from=0.05, to=1, by=0.1) + +## ----placeboPlot--------------------------------------------------------- +plotPlacebo(reg_nonpara) + +## ----DensPlot------------------------------------------------------------ +dens_test(reg_nonpara) + +## ------------------------------------------------------------------------ +set.seed(123) +n_Lee <- nrow(Lee2008) +Z <- data.frame(z1 = rnorm(n_Lee, sd=2), + z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), + z3 = sample(letters, size = n_Lee, replace = TRUE)) +Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) + +## ------------------------------------------------------------------------ +## test for equality of means around cutoff: +covarTest_mean(Lee2008_rdd_Z, bw=0.3) + +## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: +covarTest_dis(Lee2008_rdd_Z, bw=0.3) + diff --git a/vignettes/estimation.html b/vignettes/estimation.html new file mode 100644 index 0000000..029cb45 --- /dev/null +++ b/vignettes/estimation.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + +Estimation + + + + + + + + + + + + + + + + + + + +

Load the package, and load the built-in dataset from [Lee 2008]:

+
library(RDDtools)
+data(Lee2008)
+

Declare the data to be a RDDdata object:

+
Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+
+

Parametric

+

Estimate parametrically, by fitting a 4th order polynomial.

+
reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
+reg_para
+#> ### RDD regression: parametric ###
+#>  Polynomial order:  4 
+#>  Slopes:  separate 
+#>  Number of obs: 6558 (left: 2740, right: 3818)
+#> 
+#>  Coefficient:
+#>   Estimate Std. Error t value  Pr(>|t|)    
+#> D 0.076590   0.013239  5.7851 7.582e-09 ***
+#> ---
+#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+
+plot(reg_para)
+

+
+
+

Non-parametric

+

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

+
bw_ik <- RDDbw_IK(Lee2008_rdd)
+reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik)
+print(reg_nonpara)
+#> ### RDD regression: nonparametric local linear###
+#>  Bandwidth:  0.2938561 
+#>  Number of obs: 3200 (left: 1594, right: 1606)
+#> 
+#>  Coefficient:
+#>   Estimate Std. Error z value  Pr(>|z|)    
+#> D 0.079924   0.009465  8.4443 < 2.2e-16 ***
+#> ---
+#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+plot(x=reg_nonpara)
+

+
+
+

Regression Sensitivity tests:

+

One can easily check the sensitivity of the estimate to different bandwidths:

+
plotSensi(reg_nonpara, from=0.05, to=1, by=0.1)
+

+

Or run the Placebo test, estimating the RDD effect based on fake cutpoints:

+
plotPlacebo(reg_nonpara)
+

+
+
+

Design Sensitivity tests:

+

Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available:

+
    +
  • Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: dens_test()
  • +
  • Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available:
  • +
+
+

Discontinuity comes from manipulation: McCrary test

+

use simply the function dens_test(), on either the raw data, or the regression output:

+
dens_test(reg_nonpara)
+

+
#> 
+#>  McCrary Test for no discontinuity of density around cutpoint
+#> 
+#> data:  reg_nonpara
+#> z-val = 1.2952, p-value = 0.1952
+#> alternative hypothesis: Density is discontinuous around cutpoint
+#> sample estimates:
+#> Discontinuity 
+#>     0.1035008
+
+
+

Discontinuity comes from covariates: covariates balance tests

+

Two tests available: + equal means of covariates: covarTest_mean() + equal density of covariates: covarTest_dens()

+

We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. We here simulate three variables, with the second having a different mean on the left and the right.

+
set.seed(123)
+n_Lee <- nrow(Lee2008)
+Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
+                z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
+                z3 = sample(letters, size = n_Lee, replace = TRUE))
+Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+

Run the tests:

+
## test for equality of means around cutoff:
+covarTest_mean(Lee2008_rdd_Z, bw=0.3)
+#>    mean of x   mean of y Difference statistic  p.value  
+#> z1 0.004268177 0.0218581 0.01758993 -0.2539109 0.7995803
+#> z2 5.005608    7.984865  2.979257   -84.84982  0        
+#> z3 13.18888    13.43534  0.2464617  -0.9409715 0.3467888
+
+## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
+covarTest_dis(Lee2008_rdd_Z, bw=0.3)
+#> Warning in ks.test(x[regime], x[!regime], exact = exact): p-value will be
+#> approximate in the presence of ties
+#>    statistic  p.value  
+#> z1 0.03482029 0.2726692
+#> z2 0.8647849  0        
+#> z3 0.03008545 0.447416
+

Tests correctly reject equality of the second, and correctly do not reject equality for the first and third.

+
+
+ + + + + + + + From 0cd81ba1bf92e2aab65b7c529e97883135152855 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:00:44 +0100 Subject: [PATCH 039/323] fix last summary error --- NAMESPACE | 2 +- R/RDDdata_methods.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index cb9bf53..4796415 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,6 +8,7 @@ S3method(print,RDDreg_lm) S3method(print,RDDreg_np) S3method(print,summary.RDDreg_np) S3method(subset,RDDdata) +S3method(summary,RDDdata) S3method(vcov,RDDreg_np) export(RDDbw_IK) export(RDDbw_RSW) @@ -46,7 +47,6 @@ export(plotPlaceboDens.PlaceboVals) export(plotPlaceboDens.RDDreg) export(plotSensi) export(summary) -export(summary.RDDdata) export(vcovCluster) export(vcovCluster2) import(Formula) diff --git a/R/RDDdata_methods.R b/R/RDDdata_methods.R index 7a157e5..8aaea45 100644 --- a/R/RDDdata_methods.R +++ b/R/RDDdata_methods.R @@ -1,7 +1,7 @@ ### SUMMARY method -#' @export summary.RDDdata +#' @export summary.RDDdata <- function(object, ...){ cutpoint <- getCutpoint(object) From 4633e1d823fdd2d51d328cd4035023462b2080bf Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:06:14 +0100 Subject: [PATCH 040/323] use method documentation style --- NAMESPACE | 4 +++- R/RDDcoef.R | 6 ++---- R/plotSensi.R | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 4796415..56db6cb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,9 +1,12 @@ # Generated by roxygen2 (4.1.0.9001): do not edit by hand +S3method(RDDcoef,RDDreg_np) +S3method(RDDcoef,default) S3method(as.data.frame,RDDdata) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) S3method(plotPlacebo,RDDreg) +S3method(plotSensi,RDDreg_np) S3method(print,RDDreg_lm) S3method(print,RDDreg_np) S3method(print,summary.RDDreg_np) @@ -14,7 +17,6 @@ export(RDDbw_IK) export(RDDbw_RSW) export(RDDcoef) export(RDDcoef.RDDreg_npreg) -export(RDDcoef.default) export(RDDdata) export(RDDgenreg) export(RDDpred) diff --git a/R/RDDcoef.R b/R/RDDcoef.R index 6a73b04..36fd2ff 100644 --- a/R/RDDcoef.R +++ b/R/RDDcoef.R @@ -12,8 +12,7 @@ RDDcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) UseMethod("RDDcoef") #' @rdname RDDcoef -#' @method RDDcoef default -#' @export RDDcoef RDDcoef.default +#' @export RDDcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res <- coef(summary(object)) if(!allCo) res <- res["D",, drop=FALSE] @@ -22,8 +21,7 @@ RDDcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ } #' @rdname RDDcoef -#' @method RDDcoef RDDreg_np -#' @export RDDcoef RDDreg_np +#' @export RDDcoef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res<- object$coefMat if(!allCo) res <- res["D",, drop=FALSE] diff --git a/R/plotSensi.R b/R/plotSensi.R index 331f243..734add8 100644 --- a/R/plotSensi.R +++ b/R/plotSensi.R @@ -42,8 +42,7 @@ plotSensi <- function(RDDregobject, from, to, by=0.01, level=0.95, output=c("dat UseMethod("plotSensi") #' @rdname plotSensi -#' @method plotSensi RDDreg_np -#' @export plotSensi RDDreg_np +#' @export #' @param vcov. Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}} plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, device=c("ggplot", "base"), vcov.=NULL, ...){ From 9897f3f9d15e84d3430631cf0d5bf25ec648ed78 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:56:44 +0100 Subject: [PATCH 041/323] remove deprecated functions --- R/deprecated.R | 177 ------------------------------------------------- 1 file changed, 177 deletions(-) delete mode 100644 R/deprecated.R diff --git a/R/deprecated.R b/R/deprecated.R deleted file mode 100644 index ee38ddf..0000000 --- a/R/deprecated.R +++ /dev/null @@ -1,177 +0,0 @@ - -plotPlacebo_OLD<- function(RDDregobject, from, to, by=0.1, level=0.95, same_bw=FALSE){ - - object <- RDDregobject - bw <- getBW(object) - cutpoint <- getCutpoint(object) - forc_var <- object$model[,"x^1"] - -## set grid: - if(missing(from)) from <- median(forc_var[forc_var=cutpoint]) - - seqi <- sort(c(cutpoint,seq(from=from, to=to, by=by))) - n_seqi <- length(seqi) - -## set matrix for results: - seq_vals <- matrix(NA, nrow=n_seqi, ncol=4, dimnames=list(seqi, c("LATE", "se", "CI_low", "CI_high"))) - -## get call: - object_call <- attr(object, "RDDcall") - -## original dataset: - dat_orig <- eval(object_call$RDDobject) - -## run each time: - for(i in seq_along(seqi)){ - attr(dat_orig, "cutpoint") <- seqi[i] - bw_reg <- if(same_bw) bw else RDDbw_IK(dat_orig) - object_new <- RDDreg_np(dat_orig, bw=bw_reg) - if(!inherits(object_new, "try-error")){ - co <- coef(summary(object_new))[2,, drop=FALSE] - seq_vals[i,"LATE"] <- co[,1] - seq_vals[i,"se"] <- co[,2] - } - } - -## compute intervals: - probs <- (1 - level)/2 - probs <- c(probs, 1 - probs) - quants <- qnorm(probs) - seq_vals[,"CI_low"] <- seq_vals[,"LATE"] +quants[1]*seq_vals[,"se"] - seq_vals[,"CI_high"] <- seq_vals[,"LATE"] +quants[2]*seq_vals[,"se"] - - -## plot results: - ra <- range(seq_vals[,c("CI_low", "CI_high")], na.rm=TRUE) - plot(seqi, seq_vals[,"LATE"], type="l", ylab="LATE", xlab="Cutpoints", ylim=ra) - title("Placebo test") - - lines(seqi, seq_vals[,"CI_low"], lty=2) - lines(seqi, seq_vals[,"CI_high"], lty=2) # - abline(h=0) - -## add optim in case: - est <- RDDcoef(object) - points(cutpoint, RDDcoef(RDDregobject), col=2) - segments(cutpoint,ra[1]-1, cutpoint, est, col="red", lty=2) - segments(min(seqi,na.rm=TRUE)-1, est, cutpoint, est, col="red", lty=2) - -## export (silently) results: - invisible(seq_vals) -} - - -plotPlacebo_OTHER_OLD <- function(RDDregobject, from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, device=c("ggplot", "base")){ - - device <- match.arg(device) - object <- RDDregobject - bw <- getBW(object) - cutpoint <- getCutpoint(object) - forc_var <- getOriginalX(RDDregobject) - -## set grid: - quants_left <- quantile(forc_var[forc_var=cutpoint], probs=c(from, to)) - - seqi_left <- seq(from=quants_left[1], to=quants_left[2], by=by) - seqi_right <- seq(from=quants_right[1], to=quants_right[2], by=by) - seqi <- c(seqi_left, seqi_right) - - n_seqi_left <- length(seqi_left) - n_seqi_right <- length(seqi_right) - n_seqi <- length(seqi) - -## set matrix for results: - seq_vals <- matrix(NA, nrow=n_seqi, ncol=6) - colnames(seq_vals) <- c("cutpoint", "position", "LATE", "se", "CI_low", "CI_high") - seq_vals[, "cutpoint"] <- seqi - -## get call: - object_call <- attr(object, "RDDcall") - -## original dataset: - dat_orig <- eval(object_call$RDDobject) - -## run each time: - for(i in seq_along(seqi)){ - - ## select sample: - if(seqi[i]cutpoint) ## exclude x>cutpoint - } - - ## change the cutpoint - attr(dat_sides, "cutpoint") <- seqi[i] - - ## Re-estimate model and eventually bw - bw_reg <- if(same_bw) bw else RDDbw_IK(dat_sides) - object_new <- RDDreg_np(dat_sides, bw=bw_reg) - - ## assign results (LATE and se) - if(!inherits(object_new, "try-error")){ - co <- coef(summary(object_new))[2,, drop=FALSE] - seq_vals[i,"LATE"] <- co[,1] - seq_vals[i,"se"] <- co[,2] - } - } - -## compute intervals: - probs <- (1 - level)/2 - probs <- c(probs, 1 - probs) - quants <- qnorm(probs) - seq_vals[,"CI_low"] <- seq_vals[,"LATE"] +quants[1]*seq_vals[,"se"] - seq_vals[,"CI_high"] <- seq_vals[,"LATE"] +quants[2]*seq_vals[,"se"] - - -## plot results: - # prepare df: - seq_vals <- as.data.frame(seq_vals) - seq_vals$position <- ifelse(seq_vals$cutpoint < cutpoint, "left", "right") - - # get estimates at true cutpoint : - est <- RDDcoef(object) - est_conf <- confint(RDDregobject, level=level)["D",] - - if(device=="base"){ - ra <- range(seq_vals[,c("CI_low", "CI_high")], est_conf, na.rm=TRUE) - xlims <- c(quants_left[1], quants_right[2]) -# ylims <- range(seq_vals[, c("LATE", "CI_low", "CI_high")], est_conf) - plot(seqi_left, seq_vals[1:n_seqi_left,"LATE"], type="l", ylab="LATE", xlab="Cutpoints", ylim=ra, xlim=xlims) - title("Placebo test") - abline(h=0) - - # left CI - lines(seqi_left, seq_vals[1:n_seqi_left,"CI_low"], lty=2) - lines(seqi_left, seq_vals[1:n_seqi_left,"CI_high"], lty=2) - - # right values: - lines(seqi_right, seq_vals[(n_seqi_left+1):n_seqi,"LATE"], lty=1) - lines(seqi_right, seq_vals[(n_seqi_left+1):n_seqi,"CI_low"], lty=2) - lines(seqi_right, seq_vals[(n_seqi_left+1):n_seqi,"CI_high"], lty=2) - - # add estimate at true cutoff - points(cutpoint, est, col=2) - segments(cutpoint,ra[1]-1, cutpoint, est, col="red", lty=2) - segments(min(seqi,na.rm=TRUE)-1, est, cutpoint, est, col="red", lty=2) - } else { - - est_df <- data.frame(cutpoint=cutpoint, LATE=est, position="middle", CI_low=est_conf[1], CI_high=est_conf[2]) - - # hack for decent width of error bar: - last_left <- nrow(subset(seq_vals, position=="left")) - W <- diff(seq_vals[c(last_left, last_left+1), "cutpoint"])/5 - - pl <- qplot(x=cutpoint, y=LATE, data=seq_vals, geom="line", colour=position)+ - geom_smooth(aes(ymin=CI_low, ymax=CI_high), data=seq_vals, stat="identity")+ - theme(legend.position="none")+geom_hline(yintercept=0)+ - geom_point(aes(x=cutpoint, y=LATE), data=est_df)+ - geom_errorbar(aes(ymin=CI_low, ymax=CI_high), data=est_df, width=W) - print(pl) - } - -## export (silently) results: - invisible(seq_vals) -} From bf84346cb7de5f531e386d6425d6e20c5fdbede3 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:57:31 +0100 Subject: [PATCH 042/323] fix the summary warning while documenting --- R/reg_np.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/reg_np.R b/R/reg_np.R index eb1612a..650247d 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -104,7 +104,7 @@ print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), .. } -#' @export summary RDDreg_np +#' @export summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { x <- object From 6035b9741002ef0a2f831068a17d5dc9dcc1ea62 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:57:43 +0100 Subject: [PATCH 043/323] losts more fixes for methods --- R/covarTests.R | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/R/covarTests.R b/R/covarTests.R index 0da8cb8..eb5b261 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -41,8 +41,7 @@ covarTest_mean <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p UseMethod("covarTest_mean") #' @rdname covarTest_mean -#' @method covarTest_mean RDDdata -#' @export covarTest_mean RDDdata +#' @export covarTest_mean.RDDdata <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) @@ -55,8 +54,7 @@ covarTest_mean.RDDdata <- function(object, bw=NULL, paired = FALSE, var.equal = #' @rdname covarTest_mean -#' @method covarTest_mean RDDreg -#' @export covarTest_mean.RDDreg +#' @export covarTest_mean.RDDreg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) @@ -139,8 +137,7 @@ covarTest_dis <- function(object, bw, exact=NULL, p.adjust=c("none", "holm", "B UseMethod("covarTest_dis") #' @rdname covarTest_dis -#' @method covarTest_dis RDDdata -#' @export covarTest_dis RDDdata +#' @export covarTest_dis.RDDdata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) @@ -152,8 +149,7 @@ covarTest_dis.RDDdata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("n } #' @rdname covarTest_dis -#' @method covarTest_dis RDDreg -#' @export covarTest_dis.RDDreg +#' @export covarTest_dis.RDDreg <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) From bae60bb3760d63c2e889ec6d0fcf8fb7f212c7a8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:58:02 +0100 Subject: [PATCH 044/323] spelling, spacing and method documentation --- R/as.npreg.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/R/as.npreg.R b/R/as.npreg.R index 1403466..478a8b2 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -4,9 +4,9 @@ #' @param x Object of class \code{RDDreg} created by \code{\link{RDDreg_np}} or \code{\link{RDDreg_lm}} #' @param \ldots Further arguments passed to the \code{\link{npregbw}} or \code{\link{npreg}} #' @details This function converts an RDDreg object into an \code{npreg} object from package \code{np} -#' Note that the output won't be the same, since \code{npreg} does not offer a triangualr kernel, but a gaussian or Epanechinkov one. +#' Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one. #' Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while RDDreg -#' proceeds as if the kernerl was univariate. A simple solution to make the multivariate kernel similar to the univariate one +#' proceeds as if the kernel was univariate. A simple solution to make the multivariate kernel similar to the univariate one #' is to set the bandwidth for x and Dx to a large number, so that they converge towards a constant, and one obtains back the univariate kernel. #' @export #' @return An object of class \code{npreg} or \code{npregbw} @@ -75,7 +75,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ ## if npreg, return instead model_np <- npreg(bw_np, newdata=dataPoints, gradients=TRUE) if(npreg) { options(np.messages = TRUE) ## otherwise got warnings messages... probably because comes only if loaded! - res <- npreg(res, newdata=dataPoints, gradients=TRUE,...) + res <- npreg(res, newdata=dataPoints, gradients=TRUE, ...) class(res) <- c("RDDreg_npreg", class(res)) } attr(res, "RDDdf") <- dat_np @@ -84,7 +84,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ } -#' @export RDDcoef.RDDreg_npreg +#' @export RDDcoef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){ co <- diff(object$mean) From 2f006883e17ccad3f1adb9475103a366acf88971 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:59:07 +0100 Subject: [PATCH 045/323] more method documentation --- R/RDDdata_methods.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/RDDdata_methods.R b/R/RDDdata_methods.R index 8aaea45..68b4e8a 100644 --- a/R/RDDdata_methods.R +++ b/R/RDDdata_methods.R @@ -140,10 +140,10 @@ as.lm_RDD <- function(x){ x } -#' @export as.lm.RDDreg_np +#' @export as.lm.RDDreg_np <- function(x) as.lm_RDD(x) -#' @export as.lm.RDDreg +#' @export as.lm.RDDreg <- function(x) as.lm_RDD(x) From d7bb01a38568172c853c8cb8a69fabdbe8ec864c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:59:21 +0100 Subject: [PATCH 046/323] legibility --- R/RDDcoef.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/RDDcoef.R b/R/RDDcoef.R index 36fd2ff..4d149ea 100644 --- a/R/RDDcoef.R +++ b/R/RDDcoef.R @@ -8,6 +8,7 @@ #' @return Either a numeric value of the RDD coefficient estimate, or a data frame with the estimate, #' its standard value, t test and p-value and #' @export + RDDcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) UseMethod("RDDcoef") From 150453e20c6adbefdca7b463c5f2301ab41b0bb8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 13:59:37 +0100 Subject: [PATCH 047/323] recompiling all the previous --- DESCRIPTION | 1 - NAMESPACE | 14 ++++++++------ man/as.npregbw.Rd | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 82160d9..4f9b98b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -43,7 +43,6 @@ Collate: 'clusterInf.R' 'covarTests.R' 'dens_test.R' - 'deprecated.R' 'gen_MC_IK.R' 'get_methods.R' 'model.matrix.RDD.R' diff --git a/NAMESPACE b/NAMESPACE index 56db6cb..c183608 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,8 +1,15 @@ # Generated by roxygen2 (4.1.0.9001): do not edit by hand S3method(RDDcoef,RDDreg_np) +S3method(RDDcoef,RDDreg_npreg) S3method(RDDcoef,default) S3method(as.data.frame,RDDdata) +S3method(as.lm,RDDreg) +S3method(as.lm,RDDreg_np) +S3method(covarTest_dis,RDDdata) +S3method(covarTest_dis,RDDreg) +S3method(covarTest_mean,RDDdata) +S3method(covarTest_mean,RDDreg) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) S3method(plotPlacebo,RDDreg) @@ -12,11 +19,11 @@ S3method(print,RDDreg_np) S3method(print,summary.RDDreg_np) S3method(subset,RDDdata) S3method(summary,RDDdata) +S3method(summary,RDDreg_np) S3method(vcov,RDDreg_np) export(RDDbw_IK) export(RDDbw_RSW) export(RDDcoef) -export(RDDcoef.RDDreg_npreg) export(RDDdata) export(RDDgenreg) export(RDDpred) @@ -24,17 +31,13 @@ export(RDDreg_lm) export(RDDreg_np) export(ROT_bw) export(as.lm) -export(as.lm.RDDreg) -export(as.lm.RDDreg_np) export(as.npreg) export(as.npregbw) export(bread) export(clusterInf) export(computePlacebo) export(covarTest_dis) -export(covarTest_dis.RDDreg) export(covarTest_mean) -export(covarTest_mean.RDDreg) export(dens_test) export(estfun) export(gen_MC_IK) @@ -48,7 +51,6 @@ export(plotPlaceboDens) export(plotPlaceboDens.PlaceboVals) export(plotPlaceboDens.RDDreg) export(plotSensi) -export(summary) export(vcovCluster) export(vcovCluster2) import(Formula) diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index c018c82..9863fd7 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -22,9 +22,9 @@ Convert an RDDobject to a non-parametric regression \code{npreg} from package \c } \details{ This function converts an RDDreg object into an \code{npreg} object from package \code{np} -Note that the output won't be the same, since \code{npreg} does not offer a triangualr kernel, but a gaussian or Epanechinkov one. +Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one. Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while RDDreg -proceeds as if the kernerl was univariate. A simple solution to make the multivariate kernel similar to the univariate one +proceeds as if the kernel was univariate. A simple solution to make the multivariate kernel similar to the univariate one is to set the bandwidth for x and Dx to a large number, so that they converge towards a constant, and one obtains back the univariate kernel. } \examples{ From f596b75b472d5475b946801c97eaab37aa09ccb8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 17 Mar 2015 14:52:58 +0100 Subject: [PATCH 048/323] fix error with npreg --- DESCRIPTION | 3 ++- R/as.npreg.R | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4f9b98b..cb7b249 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -25,7 +25,8 @@ Suggests: stats4, car, knitr, - testthat + testthat, + np License: GPL (>= 2) Collate: 'Lee2008-data.R' diff --git a/R/as.npreg.R b/R/as.npreg.R index 478a8b2..a6c1629 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -73,11 +73,20 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ class(res) <- c("RDDreg_npregbw", class(res)) ## if npreg, return instead model_np <- npreg(bw_np, newdata=dataPoints, gradients=TRUE) - if(npreg) { + if(npreg==TRUE) { + + # check if np is installed + if (!requireNamespace("np", quietly = TRUE)) { + stop("The package 'np' is needed for this function to work. Please install it.", + call. = FALSE) + } + + require("np") options(np.messages = TRUE) ## otherwise got warnings messages... probably because comes only if loaded! - res <- npreg(res, newdata=dataPoints, gradients=TRUE, ...) + res <- np::npreg(res, newdata=dataPoints, gradients=TRUE, ...) class(res) <- c("RDDreg_npreg", class(res)) } + attr(res, "RDDdf") <- dat_np attr(res, "cutpoint") <- cutpoint res From 6d611426a1882c42506911dea332fff7f21afd26 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 10:13:10 +0100 Subject: [PATCH 049/323] fix s3methods --- NAMESPACE | 6 +++--- R/model.matrix.RDD.R | 2 +- R/placebo.R | 17 ++++++++++++----- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index c183608..33ecb3a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,9 +10,12 @@ S3method(covarTest_dis,RDDdata) S3method(covarTest_dis,RDDreg) S3method(covarTest_mean,RDDdata) S3method(covarTest_mean,RDDreg) +S3method(model.matrix,RDDdata) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) S3method(plotPlacebo,RDDreg) +S3method(plotPlaceboDens,PlaceboVals) +S3method(plotPlaceboDens,RDDreg) S3method(plotSensi,RDDreg_np) S3method(print,RDDreg_lm) S3method(print,RDDreg_np) @@ -43,13 +46,10 @@ export(estfun) export(gen_MC_IK) export(getCall.RDDreg) export(model.frame.RDDreg_np) -export(model.matrix.RDDdata) export(plot.RDDdata) export(plotPlacebo) export(plotPlacebo.PlaceboVals) export(plotPlaceboDens) -export(plotPlaceboDens.PlaceboVals) -export(plotPlaceboDens.RDDreg) export(plotSensi) export(vcovCluster) export(vcovCluster2) diff --git a/R/model.matrix.RDD.R b/R/model.matrix.RDD.R index 14041a3..efa3b9d 100644 --- a/R/model.matrix.RDD.R +++ b/R/model.matrix.RDD.R @@ -1,4 +1,4 @@ -#' @export model.matrix.RDDdata +#' @export model.matrix.RDDdata <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){ diff --git a/R/placebo.R b/R/placebo.R index d9798f6..621ab6b 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -122,8 +122,7 @@ plotPlaceboDens <- function(object, device=c("ggplot", "base"), ...) UseMethod("plotPlaceboDens") #' @rdname plotPlacebo -#' @method plotPlaceboDens RDDreg -#' @export plotPlaceboDens.RDDreg +#' @export plotPlaceboDens.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, ...){ device <- match.arg(device) @@ -138,7 +137,7 @@ plotPlaceboDens.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25 } -#' @export plotPlaceboDens.PlaceboVals +#' @export plotPlaceboDens.PlaceboVals <- function(object, device=c("ggplot", "base"), ...){ device <- match.arg(device) @@ -177,8 +176,7 @@ plotPlaceboDens_low <- function(seq_vals, device=c("ggplot", "base")){ #' @rdname plotPlacebo -#' @export computePlacebo - +#' @export computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL){ @@ -237,6 +235,15 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_ ## assign results (LATE and se) if(!inherits(object_new, "try-error")){ + + # check if lmtest is installed + if (!requireNamespace("lmtest", quietly = TRUE)) { + stop("The package 'lmtest' is needed for this function to work. Please install it.", + call. = FALSE) + } + + # load the lmtst package + require("lmtest") seq_vals[i,"LATE"] <- RDDcoef(object_new) if(!is.null(vcov.)) { From aa3ec5631e67aa44fffe14f55fa0eb13c291a268 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 10:13:19 +0100 Subject: [PATCH 050/323] fix require package --- R/clusterInf.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/clusterInf.R b/R/clusterInf.R index 18bf110..e08d708 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -104,7 +104,8 @@ vcovCluster <- function(object, clusterVar){ K <- getModelRank(object) dfc <- (M/(M-1))*((N-1)/(N-K)) uj <- apply(estfun(object),2, function(x) tapply(x, clusterVar, sum)) - dfc*sandwich(object, meat.=crossprod(uj)/N) + # require("sandwich") + dfc*sandwich::sandwich(object, meat.=crossprod(uj)/N) } #' @rdname vcovCluster From bb1f9290e4d2b29d261e01849323d5aaa0b0bb1a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 10:23:08 +0100 Subject: [PATCH 051/323] remove np since already in imports --- DESCRIPTION | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index cb7b249..4f9b98b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -25,8 +25,7 @@ Suggests: stats4, car, knitr, - testthat, - np + testthat License: GPL (>= 2) Collate: 'Lee2008-data.R' From 3f5a950fc19bd13ffa48701b05a95664bf220e96 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 10:23:23 +0100 Subject: [PATCH 052/323] fix s3methods exports --- NAMESPACE | 4 ++-- R/clusterInf.R | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 33ecb3a..92b8581 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,10 +6,12 @@ S3method(RDDcoef,default) S3method(as.data.frame,RDDdata) S3method(as.lm,RDDreg) S3method(as.lm,RDDreg_np) +S3method(bread,RDDreg_np) S3method(covarTest_dis,RDDdata) S3method(covarTest_dis,RDDreg) S3method(covarTest_mean,RDDdata) S3method(covarTest_mean,RDDreg) +S3method(model.frame,RDDreg_np) S3method(model.matrix,RDDdata) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) @@ -36,7 +38,6 @@ export(ROT_bw) export(as.lm) export(as.npreg) export(as.npregbw) -export(bread) export(clusterInf) export(computePlacebo) export(covarTest_dis) @@ -45,7 +46,6 @@ export(dens_test) export(estfun) export(gen_MC_IK) export(getCall.RDDreg) -export(model.frame.RDDreg_np) export(plot.RDDdata) export(plotPlacebo) export(plotPlacebo.PlaceboVals) diff --git a/R/clusterInf.R b/R/clusterInf.R index e08d708..fe32d82 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -51,7 +51,7 @@ estfun.RDDreg_np <- function(x,...){ estfun(x$RDDslot$model) } -#' @export bread RDDreg_np +#' @export bread.RDDreg_np <- function(x,...){ inf_met <- infType(x) ## def in Misc.R if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators") @@ -65,7 +65,7 @@ bread.RDDreg_np <- function(x,...){ # sandwich(x$RDDslot$model, bread.=bread., meat.=meat., ...) # } -#' @export model.frame.RDDreg_np +#' @export model.frame.RDDreg_np <- function (formula, ...) model.frame(formula$RDDslot$model) From bcc417ee2c2c826e1d99ba77d6c033756debfa12 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 10:39:09 +0100 Subject: [PATCH 053/323] remove loading lmtest --- R/placebo.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/placebo.R b/R/placebo.R index 621ab6b..55c96a0 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -242,12 +242,12 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_ call. = FALSE) } - # load the lmtst package - require("lmtest") + # load the lmtest package + # require("lmtest") seq_vals[i,"LATE"] <- RDDcoef(object_new) if(!is.null(vcov.)) { - co <- coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE] + co <- lmtest::coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE] } else { co <- RDDcoef(object_new, allInfo=TRUE) } From 50458f847eea77cb5e45d794cf1d0ccdd4763450 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 11:03:04 +0100 Subject: [PATCH 054/323] s3method --- NAMESPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index 92b8581..f8304b3 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,6 +11,7 @@ S3method(covarTest_dis,RDDdata) S3method(covarTest_dis,RDDreg) S3method(covarTest_mean,RDDdata) S3method(covarTest_mean,RDDreg) +S3method(getCall,RDDreg) S3method(model.frame,RDDreg_np) S3method(model.matrix,RDDdata) S3method(plot,RDDreg_lm) @@ -45,7 +46,6 @@ export(covarTest_mean) export(dens_test) export(estfun) export(gen_MC_IK) -export(getCall.RDDreg) export(plot.RDDdata) export(plotPlacebo) export(plotPlacebo.PlaceboVals) From d403749ce2e64ee6992b29f42fe76b9d196a391b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 11:03:26 +0100 Subject: [PATCH 055/323] using :: --- R/reg_np.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/reg_np.R b/R/reg_np.R index 650247d..9275ab2 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -176,10 +176,10 @@ plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) { ## Use np: } else { - np_reg_left <- npreg(npregbw(y~x, data=dat_left, regtype="ll", ckertype="epanechnikov", + np_reg_left <- np::npreg(np::npregbw(y~x, data=dat_left, regtype="ll", ckertype="epanechnikov", bandwidth.compute=FALSE, bws=bw)) - np_reg_right <- npreg(npregbw(y~x, data=dat_right, regtype="ll", ckertype="epanechnikov", + np_reg_right <- np::npreg(np::npregbw(y~x, data=dat_right, regtype="ll", ckertype="epanechnikov", bandwidth.compute=FALSE, bws=bw)) newDat_left <- data.frame(x=seq(min(dat_left$x), cutpoint-0.001, by=.01)) newDat_right <- data.frame(x=seq(cutpoint, max(dat_right$x), by=.01)) From d615bbdfac1cdfc1a049a805e7946d1429030433 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 11:03:33 +0100 Subject: [PATCH 056/323] s3method --- R/get_methods.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/get_methods.R b/R/get_methods.R index cec2134..818eabd 100644 --- a/R/get_methods.R +++ b/R/get_methods.R @@ -135,7 +135,7 @@ getOriginalData.RDDreg <- function(object, na.rm=TRUE, classRDD=TRUE){ #' @importFrom stats getCall -#' @export getCall.RDDreg +#' @export getCall.RDDreg <- function(x,...) attr(x, "RDDcall") From 07ab6e3449540b65c80b92047fbdd9b9367a2c88 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 18 Mar 2015 11:10:31 +0100 Subject: [PATCH 057/323] call explicitly --- R/as.npreg.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/as.npreg.R b/R/as.npreg.R index a6c1629..ae15c4f 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -39,7 +39,7 @@ as.npregbw <- function(x,...){ #' @rdname as.npregbw #' @export -as.npreg <- function(x,...){ +as.npreg <- function(x, ...){ res <- as.npregbw_low(x=x, npreg=TRUE,...) res } @@ -68,7 +68,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ ## start npregbw - res <- npregbw(bws=bws, formula=y~x+D+Dx, data= dat_np, regtype = "ll", + res <- np::npregbw(bws=bws, formula=y~x+D+Dx, data= dat_np, regtype = "ll", eval=dataPoints, bandwidth.compute=FALSE, gradients=TRUE,...) class(res) <- c("RDDreg_npregbw", class(res)) @@ -158,7 +158,7 @@ RDDcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE) ## manual predict: cutpoint <- 0 -dataPoints <- data.frame(x=c(cutpoint,cutpoint), D=c(0,1), Dx=c(0,cutpoint)) +dataPoints <- data.frame(x=c(cutpoint,cutpoint), D=c(0,1), Dx=c(0,cutpoint)) dataPoints2 <- data.frame(x=0, D=c(0,1), Dx=0) dataPoints3 <- data.frame(x=c(0,1), D=0, Dx=0) dataPoints3 <- data.frame(x=0, D=0, Dx=c(0,1)) From 0c46018f64183fbd3bbd962c97b7c760bb9925cc Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 31 Mar 2015 19:29:35 +0200 Subject: [PATCH 058/323] fix method documentation / namespace --- NAMESPACE | 6 ++++-- R/RDDdata.R | 2 +- R/RDDdata_methods.R | 3 +-- R/clusterInf.R | 2 +- R/plotSensi.R | 3 +-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index f8304b3..0d5ee5f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ # Generated by roxygen2 (4.1.0.9001): do not edit by hand +S3method("[",RDDdata) S3method(RDDcoef,RDDreg_np) S3method(RDDcoef,RDDreg_npreg) S3method(RDDcoef,default) @@ -11,14 +12,17 @@ S3method(covarTest_dis,RDDdata) S3method(covarTest_dis,RDDreg) S3method(covarTest_mean,RDDdata) S3method(covarTest_mean,RDDreg) +S3method(estfun,RDDreg_np) S3method(getCall,RDDreg) S3method(model.frame,RDDreg_np) S3method(model.matrix,RDDdata) +S3method(plot,RDDdata) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) S3method(plotPlacebo,RDDreg) S3method(plotPlaceboDens,PlaceboVals) S3method(plotPlaceboDens,RDDreg) +S3method(plotSensi,RDDreg_lm) S3method(plotSensi,RDDreg_np) S3method(print,RDDreg_lm) S3method(print,RDDreg_np) @@ -44,9 +48,7 @@ export(computePlacebo) export(covarTest_dis) export(covarTest_mean) export(dens_test) -export(estfun) export(gen_MC_IK) -export(plot.RDDdata) export(plotPlacebo) export(plotPlacebo.PlaceboVals) export(plotPlaceboDens) diff --git a/R/RDDdata.R b/R/RDDdata.R index 87d3c6b..88b6585 100644 --- a/R/RDDdata.R +++ b/R/RDDdata.R @@ -104,7 +104,7 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ # subset(x, y> # }as.data.frame.default(x) -#' @export RDDdata +#' @export '[.RDDdata' <- function(x,i,...){ attr_x <- attributes(x) r <- NextMethod("[", object=as.data.frame(x)) diff --git a/R/RDDdata_methods.R b/R/RDDdata_methods.R index 68b4e8a..4f03723 100644 --- a/R/RDDdata_methods.R +++ b/R/RDDdata_methods.R @@ -50,8 +50,7 @@ summary.RDDdata <- function(object, ...){ #' #' ## If the specified number of bins is odd, the larger number is given to side with largest range #' plot(Lee2008_rdd, nbins=21) -#' @method plot RDDdata -#' @export plot.RDDdata +#' @export ### PLOT method diff --git a/R/clusterInf.R b/R/clusterInf.R index fe32d82..45b15ed 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -44,7 +44,7 @@ clusterInf <- function(object, clusterVar, vcov. = NULL, type=c("df-adj", "HC"), return(res) } -#' @export estfun RDDreg_np +#' @export estfun.RDDreg_np <- function(x,...){ inf_met <- infType(x) ## def in Misc.R if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators") diff --git a/R/plotSensi.R b/R/plotSensi.R index 734add8..dbd2234 100644 --- a/R/plotSensi.R +++ b/R/plotSensi.R @@ -128,8 +128,7 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out #' @rdname plotSensi -#' @method plotSensi RDDreg_lm -#' @export plotSensi RDDreg_lm +#' @export plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, order, type=c("colour", "facet"), ...){ type <- match.arg(type) From 1eda492ea7482f8af5084a2c87a39f30df669dc8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 31 Mar 2015 19:40:27 +0200 Subject: [PATCH 059/323] fix last S3method documentation / namespace --- NAMESPACE | 2 +- R/placebo.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 0d5ee5f..13bde39 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -19,6 +19,7 @@ S3method(model.matrix,RDDdata) S3method(plot,RDDdata) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) +S3method(plotPlacebo,PlaceboVals) S3method(plotPlacebo,RDDreg) S3method(plotPlaceboDens,PlaceboVals) S3method(plotPlaceboDens,RDDreg) @@ -50,7 +51,6 @@ export(covarTest_mean) export(dens_test) export(gen_MC_IK) export(plotPlacebo) -export(plotPlacebo.PlaceboVals) export(plotPlaceboDens) export(plotSensi) export(vcovCluster) diff --git a/R/placebo.R b/R/placebo.R index 55c96a0..7580e0b 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -50,7 +50,7 @@ plotPlacebo.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25, to -#' @export plotPlacebo.PlaceboVals +#' @export plotPlacebo.PlaceboVals <- function(object, device=c("ggplot", "base"),plot=TRUE, output=c("data", "ggplot"), ...){ device <- match.arg(device) From c01dde944f94708f0f90b3d57e68cdc261425977 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 31 Mar 2015 19:41:45 +0200 Subject: [PATCH 060/323] add travis --- .Rbuildignore | 2 +- .travis.yml | 9 +++++++++ README.md | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .travis.yml diff --git a/.Rbuildignore b/.Rbuildignore index 85c4e86..158b955 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -3,4 +3,4 @@ misc ^\.Rproj\.user$ ^\.travis\.yml$ ^cran-comments.md$ -^NEWS\.md$ \ No newline at end of file +^NEWS\.md$ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..100db03 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,9 @@ +# Sample .travis.yml for R projects + +language: r +warnings_are_errors: true + +notifications: + email: + on_success: change + on_failure: change diff --git a/README.md b/README.md index 6cc0d92..1a3fad2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -[![Coverage Status](https://coveralls.io/repos/bquast/RDDtools/badge.svg)](https://coveralls.io/r/bquast/RDDtools) - RDDtools: an R package for Regression Discontinuity Design ======================================================== +[![Travis-CI Build Status](https://travis-ci.org/bquast/RDDtools.png?branch=master)](https://travis-ci.org/bquast/RDDtools) +[![Coverage Status](https://coveralls.io/repos/bquast/RDDtools/badge.svg)](https://coveralls.io/r/bquast/RDDtools) **RDDtools** is a new R package under development, designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. From 97f3cfcd07b31059764525e7340810e48d228b49 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 1 Apr 2015 09:32:58 +0200 Subject: [PATCH 061/323] remove subtitle and empty lines --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 1a3fad2..ba78e7a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -RDDtools: an R package for Regression Discontinuity Design +RDDtools ======================================================== [![Travis-CI Build Status](https://travis-ci.org/bquast/RDDtools.png?branch=master)](https://travis-ci.org/bquast/RDDtools) [![Coverage Status](https://coveralls.io/repos/bquast/RDDtools/badge.svg)](https://coveralls.io/r/bquast/RDDtools) @@ -64,6 +64,3 @@ References [Cameron et al. 2008]: http://ideas.repec.org/a/tpr/restat/v90y2008i3p414-427.html "Cameron, Gelbach and Miller (2008) Bootstrap-Based Improvements for Inference with Clustered Errors, The Review of Economics and Statistics, Vol. 90(3), pages 414-427" [Ruppert et al 1995]: http://www.jstor.org/stable/2291516 "Ruppert, D., Sheather, S. J. and Wand, M. P. (1995). An effective bandwidth selector for local least squares regression. Journal of the American Statistical Association, 90, 1257–1270." - - - From 4c9f2cc64de6d1b1ee95685e04f2ec7fdcf5d209 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 1 Apr 2015 10:45:28 +0200 Subject: [PATCH 062/323] fix line > 100 char --- R/RDDpred.R | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/R/RDDpred.R b/R/RDDpred.R index d0cf456..2824e95 100644 --- a/R/RDDpred.R +++ b/R/RDDpred.R @@ -43,9 +43,15 @@ #' RDDcoef(reg_para, allInfo=TRUE) #' #' ## estimation with covariates: -#' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, covariates="z1", covar.opt=list(slope="separate")) -#' RDDpred(reg_para_cov, covdata=data.frame(z1=0)) ## should obtain same result than with RDestimate -#' RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) #evaluate at mean of z1 (as comes from uniform) +#' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, +#' covariates="z1", +#' covar.opt=list(slope="separate") ) +#' +#' RDDpred(reg_para_cov, +#' covdata=data.frame(z1=0)) ## should obtain same result as with RDestimate +#' +#' RDDpred(reg_para_cov, +#' covdata=data.frame(z1=0.5)) #evaluate at mean of z1 (as comes from uniform) RDDpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){ From b41d99013a68b177218e01c264ec2ff15ad81a10 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 1 Apr 2015 12:19:22 +0200 Subject: [PATCH 063/323] remove since not used at the moment --- tests/testthat.R | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 tests/testthat.R diff --git a/tests/testthat.R b/tests/testthat.R deleted file mode 100644 index 07858ca..0000000 --- a/tests/testthat.R +++ /dev/null @@ -1,4 +0,0 @@ -library(testthat) -library(RDDtools) - -test_check("RDDtools") From d2d1bdd7fd7b237858e48ca4890ba6c1e5a458bf Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Apr 2015 15:32:42 +0200 Subject: [PATCH 064/323] fix long lines --- R/RDDpred.R | 36 ++++++++++++++++++------------------ man/RDDpred.Rd | 32 +++++++++++++++++++------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/R/RDDpred.R b/R/RDDpred.R index 2824e95..416f171 100644 --- a/R/RDDpred.R +++ b/R/RDDpred.R @@ -30,28 +30,28 @@ #' @export #' @references Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024 #' @examples -#' ## Load data, add (artificial) covariates: -#' data(Lee2008) -#' n_Lee <- nrow(Lee2008) -#' z1 <- runif(n_Lee) -#' Lee2008_rdd <- RDDdata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0) +#' # Load data, add (artificial) covariates: +#' data(Lee2008) +#' n_Lee <- nrow(Lee2008) +#' z1 <- runif(n_Lee) +#' Lee2008_rdd <- RDDdata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0) #' -#' ## estimation without covariates: RDDpred is the same than RDDcoef: -#' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) +#' # estimation without covariates: RDDpred is the same than RDDcoef: +#' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) #' -#' RDDpred(reg_para) -#' RDDcoef(reg_para, allInfo=TRUE) +#' RDDpred(reg_para) +#' RDDcoef(reg_para, allInfo=TRUE) #' -#' ## estimation with covariates: -#' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, -#' covariates="z1", -#' covar.opt=list(slope="separate") ) -#' -#' RDDpred(reg_para_cov, -#' covdata=data.frame(z1=0)) ## should obtain same result as with RDestimate +#' # estimation with covariates: +#' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, +#' covariates="z1", +#' covar.opt=list(slope="separate") ) +#' +#' # should obtain same result as with RDestimate +#' RDDpred(reg_para_cov, covdata=data.frame(z1=0)) #' -#' RDDpred(reg_para_cov, -#' covdata=data.frame(z1=0.5)) #evaluate at mean of z1 (as comes from uniform) +#' # evaluate at mean of z1 (as comes from uniform) +#' RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) RDDpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){ diff --git a/man/RDDpred.Rd b/man/RDDpred.Rd index 4645f45..5af49d6 100644 --- a/man/RDDpred.Rd +++ b/man/RDDpred.Rd @@ -49,22 +49,28 @@ where \eqn{\Omega} is the estimated variance-covariance matrix ( by default \eqn as the square of that diagonal matrix, whereas for mean/sum, covariances are taken into account. } \examples{ -## Load data, add (artificial) covariates: - data(Lee2008) - n_Lee <- nrow(Lee2008) - z1 <- runif(n_Lee) - Lee2008_rdd <- RDDdata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0) +# Load data, add (artificial) covariates: +data(Lee2008) +n_Lee <- nrow(Lee2008) +z1 <- runif(n_Lee) +Lee2008_rdd <- RDDdata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0) -## estimation without covariates: RDDpred is the same than RDDcoef: - reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) +# estimation without covariates: RDDpred is the same than RDDcoef: +reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) - RDDpred(reg_para) - RDDcoef(reg_para, allInfo=TRUE) +RDDpred(reg_para) +RDDcoef(reg_para, allInfo=TRUE) -## estimation with covariates: - reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, covariates="z1", covar.opt=list(slope="separate")) - RDDpred(reg_para_cov, covdata=data.frame(z1=0)) ## should obtain same result than with RDestimate - RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) #evaluate at mean of z1 (as comes from uniform) +# estimation with covariates: +reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, + covariates="z1", + covar.opt=list(slope="separate") ) + + # should obtain same result as with RDestimate + RDDpred(reg_para_cov, covdata=data.frame(z1=0)) + + # evaluate at mean of z1 (as comes from uniform) + RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) } \references{ Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024 From 8724a77f2f3c85be7e42ab5e83e37f4aa47b3c6b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Apr 2015 15:33:02 +0200 Subject: [PATCH 065/323] merge vignettes --- vignettes/{estimation.R => RDDtools.R} | 4 + vignettes/{estimation.Rmd => RDDtools.Rmd} | 21 ++++- vignettes/{estimation.html => RDDtools.html} | 34 +++++-- vignettes/data_entry.R | 14 --- vignettes/data_entry.Rmd | 38 -------- vignettes/data_entry.html | 96 -------------------- 6 files changed, 46 insertions(+), 161 deletions(-) rename vignettes/{estimation.R => RDDtools.R} (93%) rename vignettes/{estimation.Rmd => RDDtools.Rmd} (86%) rename vignettes/{estimation.html => RDDtools.html} (71%) delete mode 100644 vignettes/data_entry.R delete mode 100644 vignettes/data_entry.Rmd delete mode 100644 vignettes/data_entry.html diff --git a/vignettes/estimation.R b/vignettes/RDDtools.R similarity index 93% rename from vignettes/estimation.R rename to vignettes/RDDtools.R index d52d507..502d583 100644 --- a/vignettes/estimation.R +++ b/vignettes/RDDtools.R @@ -8,6 +8,10 @@ data(Lee2008) ## ------------------------------------------------------------------------ Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +## ----dataPlot------------------------------------------------------------ +summary(Lee2008_rdd) +plot(Lee2008_rdd) + ## ----reg_para------------------------------------------------------------ reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4) reg_para diff --git a/vignettes/estimation.Rmd b/vignettes/RDDtools.Rmd similarity index 86% rename from vignettes/estimation.Rmd rename to vignettes/RDDtools.Rmd index 3d84612..9c58401 100644 --- a/vignettes/estimation.Rmd +++ b/vignettes/RDDtools.Rmd @@ -1,18 +1,22 @@ --- -title: "Estimation" +title: "RDDtools" author: "Matthieu Stigler" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{Estimation} + %\VignetteIndexEntry{Data entry} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- + ```{r, echo = FALSE, message = FALSE} knitr::opts_chunk$set(collapse = T, comment = "#>") ``` +**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. + +# Data Preparation and Visualisation Load the package, and load the built-in dataset from [Lee 2008]: ```{r} @@ -26,7 +30,16 @@ Declare the data to be a *RDDdata* object: Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) ``` -# Parametric + +You can now directly summarise and visualise this data: + +```{r dataPlot} +summary(Lee2008_rdd) +plot(Lee2008_rdd) +``` + + +# Parametric Estimation Estimate parametrically, by fitting a 4th order polynomial. @@ -38,7 +51,7 @@ plot(reg_para) ``` -# Non-parametric +# Non-parametric Estimation Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth. diff --git a/vignettes/estimation.html b/vignettes/RDDtools.html similarity index 71% rename from vignettes/estimation.html rename to vignettes/RDDtools.html index 029cb45..c7d3894 100644 --- a/vignettes/estimation.html +++ b/vignettes/RDDtools.html @@ -10,9 +10,9 @@ - + -Estimation +RDDtools @@ -52,19 +52,35 @@ +

RDDtools works in an object-oriented way: the user has to define once the characteristic of the data, creating a RDDdata object, on which different anaylsis tools can be applied.

+
+

Data Preparation and Visualisation

Load the package, and load the built-in dataset from [Lee 2008]:

library(RDDtools)
 data(Lee2008)

Declare the data to be a RDDdata object:

Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-
-

Parametric

+

You can now directly summarise and visualise this data:

+
summary(Lee2008_rdd)
+#> ### RDDdata object ###
+#> 
+#> Cutpoint: 0 
+#> Sample size: 
+#>  -Full : 6558 
+#>  -Left : 2740 
+#>  -Right: 3818
+#> Covariates: no
+plot(Lee2008_rdd)
+

+
+
+

Parametric Estimation

Estimate parametrically, by fitting a 4th order polynomial.

reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
 reg_para
@@ -82,8 +98,8 @@ 

Parametric

plot(reg_para)

-
-

Non-parametric

+
+

Non-parametric Estimation

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

bw_ik <- RDDbw_IK(Lee2008_rdd)
 reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik)
@@ -107,7 +123,7 @@ 

Regression Sensitivity tests:

Or run the Placebo test, estimating the RDD effect based on fake cutpoints:

plotPlacebo(reg_nonpara)
-

+

Design Sensitivity tests:

diff --git a/vignettes/data_entry.R b/vignettes/data_entry.R deleted file mode 100644 index 26a0622..0000000 --- a/vignettes/data_entry.R +++ /dev/null @@ -1,14 +0,0 @@ -## ----, echo = FALSE, message = FALSE------------------------------------- -knitr::opts_chunk$set(collapse = T, comment = "#>") - -## ------------------------------------------------------------------------ -library(RDDtools) -data(Lee2008) - -## ------------------------------------------------------------------------ -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - -## ----dataPlot------------------------------------------------------------ -summary(Lee2008_rdd) -plot(Lee2008_rdd) - diff --git a/vignettes/data_entry.Rmd b/vignettes/data_entry.Rmd deleted file mode 100644 index 9820256..0000000 --- a/vignettes/data_entry.Rmd +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Data entry" -author: "Matthieu Stigler" -date: "`r Sys.Date()`" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Data entry} - %\VignetteEngine{knitr::rmarkdown} - \usepackage[utf8]{inputenc} ---- - -```{r, echo = FALSE, message = FALSE} -knitr::opts_chunk$set(collapse = T, comment = "#>") -``` - -**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. - -# Data preparation and visualisation -Load the package, and load the built-in dataset from [Lee 2008]: - -```{r} -library(RDDtools) -data(Lee2008) -``` - -Declare the data to be a *RDDdata* object: - -```{r} -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) -``` - - -You can now directly summarise and visualise this data: - -```{r dataPlot} -summary(Lee2008_rdd) -plot(Lee2008_rdd) -``` diff --git a/vignettes/data_entry.html b/vignettes/data_entry.html deleted file mode 100644 index e391ba2..0000000 --- a/vignettes/data_entry.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - -Data entry - - - - - - - - - - - - - - - - - - - -

RDDtools works in an object-oriented way: the user has to define once the characteristic of the data, creating a RDDdata object, on which different anaylsis tools can be applied.

-
-

Data preparation and visualisation

-

Load the package, and load the built-in dataset from [Lee 2008]:

-
library(RDDtools)
-data(Lee2008)
-

Declare the data to be a RDDdata object:

-
Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-

You can now directly summarise and visualise this data:

-
summary(Lee2008_rdd)
-#> ### RDDdata object ###
-#> 
-#> Cutpoint: 0 
-#> Sample size: 
-#>  -Full : 6558 
-#>  -Left : 2740 
-#>  -Right: 3818
-#> Covariates: no
-plot(Lee2008_rdd)
-

-
- - - - - - - - From d8cee202049ceba2c2b924b0909b7bcabef02973 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Apr 2015 15:39:35 +0200 Subject: [PATCH 066/323] ref new vignette, open directly --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba78e7a..a18265f 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Documentation The (preliminary) documentation is available in the help files directly, as well as in the *vignettes*. The vignettes can be accessed from R. ```r -browseVignettes("RDDtools") +vignette("RDDtools") ``` RDDtools: main features From 608d705d29edf007be21b373816879896b8548b3 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Apr 2015 15:45:40 +0200 Subject: [PATCH 067/323] outline --- man/RDDpred.Rd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/man/RDDpred.Rd b/man/RDDpred.Rd index 5af49d6..3d32302 100644 --- a/man/RDDpred.Rd +++ b/man/RDDpred.Rd @@ -66,11 +66,11 @@ reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, covariates="z1", covar.opt=list(slope="separate") ) - # should obtain same result as with RDestimate - RDDpred(reg_para_cov, covdata=data.frame(z1=0)) +# should obtain same result as with RDestimate +RDDpred(reg_para_cov, covdata=data.frame(z1=0)) - # evaluate at mean of z1 (as comes from uniform) - RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) +# evaluate at mean of z1 (as comes from uniform) +RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) } \references{ Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024 From a59b3b85e8660f18f1dbd92fa9f1736b4d67c5a7 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Apr 2015 15:45:52 +0200 Subject: [PATCH 068/323] take out test at bottom --- R/RDDdata.R | 59 ------------------------------ R/RDDpred.R | 64 +++------------------------------ R/as.npreg.R | 43 ---------------------- R/bw_IK.R | 31 ---------------- R/clusterInf.R | 30 ---------------- R/covarTests.R | 52 --------------------------- R/dens_test.R | 16 --------- R/placebo.R | 67 ---------------------------------- R/plotSensi.R | 83 ------------------------------------------ R/reg_gen.R | 97 -------------------------------------------------- R/reg_lm.R | 36 +------------------ R/reg_np.R | 95 ++---------------------------------------------- 12 files changed, 7 insertions(+), 666 deletions(-) diff --git a/R/RDDdata.R b/R/RDDdata.R index 88b6585..029fc90 100644 --- a/R/RDDdata.R +++ b/R/RDDdata.R @@ -99,7 +99,6 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ ### Specific subsetting methods -##### @export as.data.frame.RDDdata # as.data.frame.RDDdata <- function(x) { # subset(x, y> # }as.data.frame.default(x) @@ -168,61 +167,3 @@ as.data.frame.RDDdata <- function(x,...){ attr(x, "cutpoint") <- NULL x } - - -if(FALSE){ - -library(RDDtools) -data(Lee2008) - -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) -Lee2008_rdd2 <- RDDdata(y=y, x=x,data=Lee2008, cutpoint=0) - -all.equal(Lee2008_rdd, Lee2008_rdd2) - -### wrong covariate setting, legitimate warnings: -Lee2008_rdd_lab1 <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0, labels=c("a","bb")) -Lee2008_rdd_lab2 <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0, labels=list("a","bb")) -Lee2008_rdd_lab3 <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0, labels=list(x="a",u="bb")) - -### Covariate setting: -Z <- data.frame(z_con=runif(nrow(Lee2008)), z_dic=factor(sample(letters[1:3], size=nrow(Lee2008), replace=TRUE))) - -Lee2008_rdd_Z <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0, labels=c("a","bb")) - -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0, labels=list(x="aha")) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0, labels=list(x="aha", u="aa")) - -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0, labels=list(x="aha", covar="aa")) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0, labels=list(x="aha", z=c("aa", "hj"))) - -### subsetting -dat <- Lee2008_rdd -dat_sub <- subset(Lee2008_rdd, x<1000) -dat_ind <- Lee2008_rdd[1:nrow(Lee2008_rdd),] -dat_ind_1 <- Lee2008_rdd[,1] -dat_ind_2 <- Lee2008_rdd[1:5,] - - -all.equal(dat, dat_sub) -all.equal(attributes(dat), attributes(dat_sub)) - -all.equal(dat, dat_ind) -all.equal(attributes(dat), attributes(dat_ind)) - -df<- as.data.frame(Lee2008_rdd) -head(df) - - -head(Lee2008_rdd_Z) -colnames(Lee2008_rdd_Z[, -c(1,2)]) -attributes(Lee2008_rdd_Z[, -c(1,2)]) - -colnames(subset(Lee2008_rdd_Z,select= c("z1","z2"))) - -colnames(dat_sub) -colnames(dat_ind) -colnames(dat_ind_1) -colnames(dat_ind_2) -} \ No newline at end of file diff --git a/R/RDDpred.R b/R/RDDpred.R index 416f171..440deb2 100644 --- a/R/RDDpred.R +++ b/R/RDDpred.R @@ -47,11 +47,11 @@ #' covariates="z1", #' covar.opt=list(slope="separate") ) #' -#' # should obtain same result as with RDestimate -#' RDDpred(reg_para_cov, covdata=data.frame(z1=0)) +#' # should obtain same result as with RDestimate +#' RDDpred(reg_para_cov, covdata=data.frame(z1=0)) #' -#' # evaluate at mean of z1 (as comes from uniform) -#' RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) +#' # evaluate at mean of z1 (as comes from uniform) +#' RDDpred(reg_para_cov, covdata=data.frame(z1=0.5)) RDDpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){ @@ -164,59 +164,3 @@ RDDpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c( } res } - -if(FALSE){ - library(RDDtools) - data(Lee2008) - head(Lee2008) - - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - - set.seed(123) - n_Lee <- nrow(Lee2008) - Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE)) - Lee2008_rdd_z <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z,utpoint=0) - -## use: - reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) - - RDDpred(reg_para) - RDDcoef(reg_para, allInfo=TRUE) - all.equal(unlist(RDDpred(reg_para)), RDDcoef(reg_para, allInfo=TRUE)[1:2], check=FALSE) - -## pred other coefs: - pred_Xr <- RDDpred(reg_para, newdata= data.frame(Tr=0, Xl=0, Xr=c(0,1))) - all.equal(RDDcoef(reg_para, allInfo=TRUE, allCo=TRUE)[4,1:2], unlist(pred_Xr), check=FALSE) - - pred_Xl <- RDDpred(reg_para, newdata= data.frame(Tr=0, Xl=c(0,1), Xr=0)) - all.equal(RDDcoef(reg_para, allInfo=TRUE, allCo=TRUE)[3,1:2], unlist(pred_Xl), check=FALSE) - - reg_para2 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=2) - RDDpred(reg_para2) - all.equal(unlist(RDDpred(reg_para2)), RDDcoef(reg_para2, allInfo=TRUE)[1:2], check=FALSE) - - -### Covariates - reg_para4_cov <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=1, covariates="z1", covar.opt=list(slope="separate")) - reg_para4_cov - summary(reg_para4_cov) - - RDDpred(reg_para4_cov) - all.equal(unlist(RDDpred(reg_para4_cov)), RDDcoef(reg_para4_cov, allInfo=TRUE)[1:2], check=FALSE) - - all.equal(RDDpred(reg_para4_cov, covdata=data.frame(z1=0)),RDDpred(reg_para4_cov)) - -### Check RDDpred: -vec_eval <- c(2,4,4,5,6) -estim_sep <- lapply(vec_eval, function(x) RDDpred(object=reg_para4_cov, covdata=data.frame(z1=x))) -estim_toget <- RDDpred(reg_para4_cov, covdata=data.frame(z1=vec_eval)) - -all(estim_toget$fit==sapply(estim_sep, function(x) x$fit)) -all(estim_toget$se.fit==sapply(estim_sep, function(x) x$se.fit)) - -environment(RDDpred) <- environment(RDDreg_lm) -sum(RDDpred(reg_para4_cov, covdata=data.frame(z1=c(0,1,2,1)))$fit) -# RDDpred(x=reg_para4_cov, covdata=data.frame(z1=c(2,4,4,4,5,6))) -# RDDpred(reg_para4_cov) - -} diff --git a/R/as.npreg.R b/R/as.npreg.R index ae15c4f..766fdb2 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -134,46 +134,3 @@ RDDcoef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res } - - -if(FALSE){ - library(RDDtools) - data(Lee2008) - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) - -# environment(as.npregbw_low) <- environment(RDDdata) - reg_nonpara_npbw <- as.npregbw(reg_nonpara) - reg_nonpara_npbw -class(reg_nonpara_npbw) -RDDcoef(reg_nonpara_npbw) - - reg_nonpara_np <- as.npreg(reg_nonpara, adjustIK_bw=FALSE) - reg_nonpara_np -class(reg_nonpara_np) -RDDcoef(reg_nonpara_np) -RDDcoef(reg_nonpara_np, allInfo=TRUE) -RDDcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE) - -## manual predict: - -cutpoint <- 0 -dataPoints <- data.frame(x=c(cutpoint,cutpoint), D=c(0,1), Dx=c(0,cutpoint)) -dataPoints2 <- data.frame(x=0, D=c(0,1), Dx=0) -dataPoints3 <- data.frame(x=c(0,1), D=0, Dx=0) -dataPoints3 <- data.frame(x=0, D=0, Dx=c(0,1)) - -diff(predict(reg_nonpara_np, newdata=dataPoints)) -diff(predict(reg_nonpara_np, newdata=dataPoints2)) - -diff(predict(reg_nonpara_np, newdata=dataPoints3)) -RDDcoef(reg_nonpara_gaus, allCo=TRUE) - -## compare: - bw_lm <- dnorm(Lee2008_rdd$x, sd=RDDtools:::getBW(reg_nonpara)) - reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm) - all.equal(RDDcoef(reg_nonpara_gaus),RDDcoef(reg_nonpara_np)) - all.equal(RDDcoef(reg_nonpara_gaus, allCo=TRUE),RDDcoef(reg_nonpara_np, allCo=TRUE), check=FALSE) - - -} diff --git a/R/bw_IK.R b/R/bw_IK.R index 99a295b..5f9e8a5 100644 --- a/R/bw_IK.R +++ b/R/bw_IK.R @@ -197,34 +197,3 @@ RDDbw_IK_low <-function (X,Y,threshold=0,verbose=FALSE, type=c("RES", "RES_imp", return(res) } - -if(FALSE){ - lee_dat4 <- read.csv("/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv", header=FALSE) - colnames(lee_dat4) <- c("X", "Y") - IKbandwidth3(X=lee_dat4$X, Y=lee_dat4$Y, verbose=TRUE) - IKbandwidth3(X=lee_dat4$X, Y=lee_dat4$Y, verbose=TRUE, type="WP") - IKbandwidth3(X=lee_dat4$X, Y=lee_dat4$Y, verbose=FALSE, returnBig=TRUE) - - -data(Lee2008) -Lee2008_rdd <- RDDdata(x=Lee2008$x,y=Lee2008$y , cutpoint=0) - -### -bw_IK <- RDDbw_IK(Lee2008_rdd) -bws <- sort(c(bw_IK, seq(0.05, 0.5, by=0.05))) -bi <- Vectorize(IK_bias, vectorize.args="bw")(Lee2008_rdd, bw=bws) -va <- Vectorize(IK_var, vectorize.args="bw")(Lee2008_rdd, bw=bws) -ms <- Vectorize(IK_amse, vectorize.args="bw")(Lee2008_rdd, bw=bws) - -df<- data.frame(bw=rep(bws,3), value=c(ms, va, bi^2), type=rep(c("ms", "va", "bias^2"), each=length(bws))) - - -# qplot(x=bw, y=value, data=df, geom="line", colour=type)+geom_point(data=subset(df, value==min(subset(df, type=="ms", "value")))) - -bws_03 <- sort(c(bw_IK, seq(0.25, 0.35, by=0.005))) -ms_03 <- Vectorize(IK_amse, vectorize.args="bw")(Lee2008_rdd, bw=bws_03) -df2 <- data.frame(bw=bws_03,mse=ms_03) - -subset(df2, mse==min(mse)) ## 1.78, not 1.74 from: -qplot(x=bw, y=mse, data=df2, geom="line") -} diff --git a/R/clusterInf.R b/R/clusterInf.R index 45b15ed..52676c4 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -147,33 +147,3 @@ getModelRank <- function(object,...) getModelRank.default <- function(object,...) object$rank getModelRank.RDDreg_np <- function(object,...) getModelRank.default(object$RDDslot$model) - -if(FALSE){ - - library(RDDtools) - data(Lee2008) - - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - - - reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) - print(x=reg_para ) - summary(reg_para ) - -## cluster inference - set.seed(123) - nlet <- sort(c(outer(letters, letters, paste, sep=""))) - clusRandom <- sample(nlet[1:60], size=nrow(Lee2008_rdd), replace=TRUE) - clusterInf(reg_para, clusterVar=clusRandom) - - clusterInf(reg_para, clusterVar=clusRandom, type="HC") - -## compare with rdd: - library(rdd) - rddest <- RDestimate(y~x, data=Lee2008, bw=30, kernel="rectangular", model=TRUE) - rddest_2 <- RDestimate2(y~x, data=Lee2008, bw=30, kernel="rectangular", model=TRUE, cluster=clusRandom) - coef(summary(reg_para)) - coef(summary(rddest$model[[2]])) - - all.equal(clusterInf(reg_para, clusterVar=clusRandom, type="HC")["D", "Std. Error"],rddest_2[["se"]][2]) -} \ No newline at end of file diff --git a/R/covarTests.R b/R/covarTests.R index eb5b261..af18112 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -190,56 +190,4 @@ covarTest_dis_low <- function(covar,cutvar, cutpoint, bw=NULL, exact=NULL, p.adj res -} - - -########################################## -###### TODO -########################################## -## -mean: can use t.test for factors? What else? Count test? Warn for character/factors! -## -mean: add multivariate hotelling -## -ks: ok for factors? -## -do qqplot? -## -add methods for regs? Once converted to other objects... -## -add example and bettet output documentation -## -## -## - -########################################## -###### TESTS -########################################## - -if(FALSE){ -library(Hotelling) -library(mvtnorm) - -data <- rmvnorm(n=200, mean=c(1,2)) -spli <- sample(c(TRUE, FALSE), size=200, replace=TRUE) - -a<-hotel.stat(data[spli,],data[!spli,]) -a - -b<-hotel.test(data[spli,],data[!spli,]) -b -b$stats - -} - - - - -if(FALSE){ -library(RDDtools) -data(Lee2008) - -Z <- data.frame(z_con=runif(nrow(Lee2008)), z_dic=factor(sample(letters[1:3], size=nrow(Lee2008), replace=TRUE))) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z, cutpoint=0) - - -covarTest_mean(object=Lee2008_rdd) -covarTest_dis(object=Lee2008_rdd) - - - } diff --git a/R/dens_test.R b/R/dens_test.R index 3120872..cef176e 100644 --- a/R/dens_test.R +++ b/R/dens_test.R @@ -46,19 +46,3 @@ dens_test <- function(RDDobject, bin=NULL, bw=NULL, plot=TRUE,...){ class(test.htest) <- "htest" return(test.htest) } - -# print.MCcraryTest <- function(x,...){ -# cat("#### MC Crary Test of no discontinuity in density\n\n") -# cat("Estimate of discontinuity:\t", x$theta, "\n") -# cat("z-value:\t", x$z, "\t p-value:\t", x$p, "\n") -# } - -if(FALSE){ - -library(RDDtools) -data(Lee2008) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - -dens_test(Lee2008_rdd) - -} \ No newline at end of file diff --git a/R/placebo.R b/R/placebo.R index 7580e0b..99056c6 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -285,70 +285,3 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_ class(seq_vals) <- c("PlaceboVals", "data.frame") return(seq_vals) } - - -########################################## -###### TODO -########################################## -## help file -## -choose between functions - -if(FALSE){ -library(RDDtools) -data(Lee2008) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - -## Regs -reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) -reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) - -environment(plotPlacebo) <- environment(RDDdata) -pla_lm <- plotPlacebo(reg_para, by=0.05) -head(pla_lm) - -pla_np <- plotPlacebo(reg_nonpara, by=0.05) -head(pla_np ) - -pla_dat <- computePlacebo(reg_nonpara, by=0.05) -head(pla_dat ) -plotPlacebo(pla_dat) -plotPlacebo(pla_dat, device="base") - - -plaDe_lm <- plotPlaceboDens(reg_para, by=0.05) -plotPlaceboDens(pla_dat) - -### - -## MC simple rdd -x<-runif(1000,-1,1) -cov<-rnorm(1000) -y<-3+2*x+10*(x>=0)+rnorm(1000) - - -mc_dat <- RDDdata(y=y, x=x, cutpoint=0) - -bw_ik <- RDDbw_IK(mc_dat) -mc_reg <- RDDreg_np(mc_dat, bw=bw_ik) - -mc_reg_lm <- RDDreg_lm(mc_dat, bw=bw_ik) -mc_reg_np <- RDDreg_np(mc_dat, bw=bw_ik) -waldci(mc_reg_lm) - -environment(plotPlacebo) <- environment(RDDdata) - -plotPlacebo(mc_reg) -plotPlacebo(mc_reg, from=0.1) -plotPlacebo(mc_reg, device="ggplot") -plotPlacebo(mc_reg, device="ggplot", by=0.05) -plotPlacebo(mc_reg, device="ggplot", from=0.05,by=0.05, to=0.95) - -a<-plotPlacebo(mc_reg_lm) -a -RDDtools:::waldci.default(mc_reg_lm) -waldci(mc_reg_np) -plotPlacebo(mc_reg_lm, device="ggplot") - - - -} diff --git a/R/plotSensi.R b/R/plotSensi.R index dbd2234..39fe150 100644 --- a/R/plotSensi.R +++ b/R/plotSensi.R @@ -117,16 +117,6 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out } - - - - - - - - - - #' @rdname plotSensi #' @export plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, order, type=c("colour", "facet"), ...){ @@ -227,81 +217,8 @@ plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, out if(plot) print(sensPlot) -# if(n_seq_ord==1){ -# ra <- range(seq_vals[,c("CI_low", "CI_high")], na.rm=TRUE) -# plot(seq_bw, seq_vals[,"LATE"], type="l", ylab="LATE", xlab="bandwidth", ylim=ra) -# title("Sensitivity to order choice") -# lines(seq_bw, seq_vals[,"CI_low"], lty=2) -# lines(seq_bw, seq_vals[,"CI_high"], lty=2) # -# } else { -# ra <- range(seq_vals[,c("CI_low", "CI_high")], na.rm=TRUE) -# for(i in 1:n_seq_ord){ -# if(i==1) { -# plot(seq_bw, seq_vals[(1:n_seq_bw)+(i-1)*n_seq_bw,"LATE"], type="l", ylab="LATE", xlab="bandwidth", ylim=ra, col=i) -# } else { -# lines(seq_bw, seq_vals[(1:n_seq_bw)+(i-1)*n_seq_bw,"LATE"], col=i) -# } -# title("Sensitivity to order choice") -# lines(seq_bw, seq_vals[(1:n_seq_bw)+(i-1)*n_seq_bw,"CI_low"], lty=2, col=i) -# lines(seq_bw, seq_vals[(1:n_seq_bw)+(i-1)*n_seq_bw,"CI_high"], lty=2, col=i) -# } -# } - -## add optim in case: -# if(is_IKband) { -# points(object$bw, object$est, col="red") -# segments(object$bw,0, object$bw, object$est, col="red", lty=2) -# segments(0,object$est, object$bw, object$est, col="red", lty=2) -# } ## export (silently) results: out <- switch(output, "data"=seq_vals_df, "ggplot"=sensPlot) invisible(out) } - - - -########################################## -###### TODO -########################################## -## -plotSensi lm: work when no bandwidth!! - - -if(FALSE){ - -library(RDDtools) -data(Lee2008) -Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - - -reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) -reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) -reg_para2 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=2) - -bw_ik <- RDDbw_IK(Lee2008_rdd) -reg_para_ik2 <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=2) -reg_para_ik3 <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=3) - -plotSensi(reg_para) -plotSensi(reg_para_ik2) -plotSensi(reg_para_ik2, type="facet") -plotSensi(reg_nonpara) -plotSensi(reg_nonpara, device="base") - -plo_res <- plotSensi(RDDregobject=reg_para_ik2, order=1:4) - - - -## extract matrix: -plotSensi.RDDreg_lm(RDDregobject=reg_para_ik2, order=1:4) - -a <- plotSensi(RDDregobject=reg_para_ik2, order=1:4, type="facet") -library(ggplot2) - - - -environment(plotSensi.RDDreg_lm) <- environment(RDDdata) -plotSensi(reg_para) - -} - diff --git a/R/reg_gen.R b/R/reg_gen.R index 5202ab9..6e036a4 100644 --- a/R/reg_gen.R +++ b/R/reg_gen.R @@ -108,100 +108,3 @@ RDDgenreg_old <- function(RDDobject, covariates=".", bw=RDDbw_IK(RDDobject), slo attr(reg, "bw") <- bw reg } - - -if(FALSE){ - - library(RDDtools) - data(Lee2008) - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - - reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) - environment(RDDgenreg) <- environment(RDDdata) - reg_glm_norm <- RDDgenreg(RDDobject=Lee2008_rdd) - -reg_nonpara -reg_glm_norm -plot(reg_glm_norm) - - -### Binary example: - -## gen from latent model: -gen_MC_binom <- function(n=200, LATE=0.3){ - x <- rnorm(n) - D <- x>= 0 - y <- 0.8 + LATE*D+ 0.3*x+0.1*x*D+rnorm(n) - y <- as.integer(ifelse(y> -0.5, 1, 0)) - if(mean(y==1)<0.04) y[sample(c(0,1), prob=c(0.1, 0.9), replace=TRUE, size=n)] <- 1 - RDDdata(x=x, y=y, cutpoint=0) -} - -mc <- gen_MC_binom() -environment(RDDgenreg) <- environment(RDDdata) -reg_bin_glm <- RDDgenreg(RDDobject=mc, fun= glm, family=binomial(link="probit")) - -## quantile: - library(quantreg) - MC1_dat <- gen_MC_IK() - MC1_rdd <- RDDdata(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0) - - RDDcoef.rq <- function(object, allInfo=FALSE, ...){ - res <- coef(summary(object))["D",, drop=FALSE] - if(!allInfo) res <- res[,"coefficients"] - res - } - - reg_bin_rq1 <- RDDgenreg(RDDobject=MC1_rdd, fun=rq, tau=0.5, bw=0.5) - reg_bin_rq1 - coef(reg_bin_rq1) - RDDcoef(reg_bin_rq1) - RDDcoef(reg_bin_rq1, allInfo=TRUE) - summary(reg_bin_rq1) - - pl_rq <- plotSensi(reg_bin_rq1, order=1, from=0.1, to=1) - pl_rq - - - - - -## Monte Carlo - -doEs<- function(n){ -mc <- gen_MC_binom() - reg_bin_np <- RDDreg_np(RDDobject=mc) - environment(RDDgenreg) <- environment(RDDdata) - reg_bin_glm <- RDDgenreg(RDDobject=mc, fun= glm, family=binomial(link="probit")) - reg_bin_glm_log <- RDDgenreg(RDDobject=mc, fun= glm, family=binomial(link="logit")) - -a<- RDDtools:::RDDcoef(reg_bin_glm)/2.5 -b<- RDDtools:::RDDcoef(reg_bin_glm_log)/4 -d<- RDDtools:::RDDcoef(reg_bin_np) - -res <- c(a, b, d) -names(res) <- c("Probit", "Logit", "LPM") -res -} - -MC_logs <- replicate(500, doEs()) - -MC_logs2 <- t(MC_logs) -colMeans(MC_logs2) - -colMeans(MC_logs2-0.2) -apply(MC_logs2, 2, sd) - -colMeans(MC_logs2-0.2)^2+apply(MC_logs2, 2, var) -colMeans(MC_logs2-0.2)^2+apply(MC_logs2, 2, sd) - -head(MC_logs) - -reg_bin_glm -reg_bin_np - -fav <- mean(dnorm(predict(reg_bin_glm, type = "link"))) -fav * coef(swiss_probit) - - -} diff --git a/R/reg_lm.R b/R/reg_lm.R index 11c913c..ed2fd63 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -131,6 +131,7 @@ print.RDDreg_lm <- function(x,...) { } + #' @export plot.RDDreg_lm <- function(x,...) { @@ -143,38 +144,3 @@ plot.RDDreg_lm <- function(x,...) { plotBin(dat$x, dat$y, ...) lines(pred[order(pred$x),]) } - - - -if(FALSE){ - - library(RDDtools) - data(Lee2008) - - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - - - reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) - print(x=reg_para ) - summary(reg_para ) - - reg_para_same <- RDDreg_lm(RDDobject=Lee2008_rdd, slope="same") - print(x=reg_para_same ) - summary(reg_para_same ) - - reg_para2 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=2) - reg_para2 - summary(reg_para2) - plot(reg_para2) - - reg_para2_same <- RDDreg_lm(RDDobject=Lee2008_rdd, order=2, slope="same") - reg_para2_same - summary(reg_para2_same) - plot(reg_para2) - - bw_ik <- RDDbw_IK(Lee2008_rdd) - reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik) - print(x=reg_para_ik) - plot(x=reg_para_ik) - -} \ No newline at end of file diff --git a/R/reg_np.R b/R/reg_np.R index 9275ab2..ab7a596 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -24,7 +24,6 @@ #' plot(reg_nonpara) #' - RDDreg_np <- function(RDDobject, covariates=NULL, bw=RDDbw_IK(RDDobject), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){ slope <- match.arg(slope) @@ -104,6 +103,7 @@ print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), .. } + #' @export summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { @@ -133,6 +133,7 @@ summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), object } + #' @export print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { @@ -214,95 +215,3 @@ vcov.RDDreg_np <- function(object, ...){ } res } - -if(FALSE){ - library(RDDtools) - data(Lee2008) - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) - - environment(RDDreg_np) <- environment(RDDdata) - environment(plot.RDDreg_np) <- environment(RDDdata) - environment(print.RDDreg_np) <- environment(RDDdata) - environment(summary.RDDreg_np) <- environment(RDDdata) - - - reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) - reg_nonpara_inflm <- RDDreg_np(RDDobject=Lee2008_rdd, inference="lm") - RDDtools:::getCutpoint(reg_nonpara) - head(RDDtools:::getOriginalX.RDDreg(reg_nonpara)) - - print(reg_nonpara) - print(reg_nonpara_inflm) - summary(reg_nonpara) - plot(x=reg_nonpara) - plot(x=reg_nonpara, chart="np") - plot(x=reg_nonpara, binwidth=0.05) - - - RDDtools:::waldci.RDDreg_np(reg_nonpara) - RDDtools:::waldci.RDDreg_np(reg_nonpara_inflm) - -environment(waldci.RDDreg_np) <- environment(RDDdata) -waldci.RDDreg_np(reg_nonpara) - -plotSensi(reg_nonpara) - - -class(getCall(reg_nonpara)) -class(attr(reg_nonpara, "RDDcall")) - - -### MC -mc_simple <- function(n=10000, xr=0.1){ - x<- rnorm(n) - y <- 1+1.2*x+ 1.4*ifelse(x>=0,1,0)+ xr*ifelse(x>=0,1,0)*x+rnorm(n) - RD <- RDDdata(x=x, y=y, cutpoint=0) - RD -} - -r<-RDDreg_np(mc_simple()) -summary(r) -plot(r) - - -} - -if(FALSE){ -bw <- RDDbw_IK(Lee2008_rdd) -dat <- Lee2008_rdd -x<- Lee2008_rdd$x -y<- Lee2008_rdd$y -cutpoint <- 0 - dat_left <- subset(dat, x=cutpoint) - - llp_left <- locpoly(x=dat_left$x, y=dat_left$y, bandwidth=bw) - llp_right <- locpoly(x=dat_right$x, y=dat_right$y, bandwidth=bw) - -p1 <- -0.7346403 -llp_left$x[which.min(abs(llp_left$x-p1))] -llp_left$y[which.min(abs(llp_left$x-p1))] - -## around x: -point <- -0.7350795 - -po <- subset(dat, x> point -bw & x< point+bw) -mean(po$y) -a<- plotBin(dat$x, dat$y, h=bw) -a - -a$x1 <- a$x-bw -a$x2 <- a$x+bw - -b <- rownames(a) -b1 <- gsub("\\[|\\(","c(",b) -b2 <- gsub("\\]|\\)",")",b1) - -mean(eval(parse(text=b2[1]))) -diff(eval(parse(text=b2[1]))) - - - lines(llp_left$x, llp_left$y) - lines(llp_right$x, llp_right$y) - -} \ No newline at end of file From 00d9b14614cfb288503579eda923b4aa8936d4ac Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Apr 2015 18:16:18 +0200 Subject: [PATCH 069/323] np error --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4f9b98b..3411737 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -13,14 +13,14 @@ Imports: KernSmooth, ggplot2, rdd, - np, sandwich, lmtest, Formula, locpol, methods Depends: - AER + AER, + np Suggests: stats4, car, From c90e54dea9664f24dc1644d1a8ad9679c3324fb3 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Apr 2015 18:16:43 +0200 Subject: [PATCH 070/323] break long line --- R/STAR_MHE-data.R | 3 ++- man/STAR_MHE.Rd | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/R/STAR_MHE-data.R b/R/STAR_MHE-data.R index 3155f20..fdf8a87 100644 --- a/R/STAR_MHE-data.R +++ b/R/STAR_MHE-data.R @@ -27,7 +27,8 @@ #' data(STAR_MHE) #' #' # Compute the group means: -#' STAR_MHE_means <- aggregate(STAR_MHE[, c("classid", "pscore", "cs")], by=list(STAR_MHE$classid), mean) +#' STAR_MHE_means <- aggregate(STAR_MHE[, c("classid", "pscore", "cs")], +#' by=list(STAR_MHE$classid), mean) #' #' # Regression of means, with weighted average: #' reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs) diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 15a0221..fa63943 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -33,7 +33,8 @@ The transformed data was obtained using the STATA script krueger.do, obtained fr data(STAR_MHE) # Compute the group means: -STAR_MHE_means <- aggregate(STAR_MHE[, c("classid", "pscore", "cs")], by=list(STAR_MHE$classid), mean) +STAR_MHE_means <- aggregate(STAR_MHE[, c("classid", "pscore", "cs")], + by=list(STAR_MHE$classid), mean) # Regression of means, with weighted average: reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs) From 2f622b73e9a4fbcdc066569317711c7e51e11788 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Apr 2015 18:16:58 +0200 Subject: [PATCH 071/323] fix require call --- R/as.npreg.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/as.npreg.R b/R/as.npreg.R index 766fdb2..731d313 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -81,7 +81,8 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ call. = FALSE) } - require("np") + # require("np") + # requireNamespace("np", quietly = TRUE) options(np.messages = TRUE) ## otherwise got warnings messages... probably because comes only if loaded! res <- np::npreg(res, newdata=dataPoints, gradients=TRUE, ...) class(res) <- c("RDDreg_npreg", class(res)) From dd59d4bc639a215bb5fbaff3c6baf9a80058ac65 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Apr 2015 18:17:10 +0200 Subject: [PATCH 072/323] rms ref causes error --- R/clusterInf.R | 1 - man/vcovCluster.Rd | 1 - 2 files changed, 2 deletions(-) diff --git a/R/clusterInf.R b/R/clusterInf.R index 52676c4..c1af134 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -83,7 +83,6 @@ model.frame.RDDreg_np <- function (formula, ...) #' @references Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http://people.su.se/~ma/clustering.pdf}. #' @export #' @seealso \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. -#' See also \code{\link[rms]{robcov}} from package \code{rms} for another implementation of the cluster robust. #' @examples #' data(STAR_MHE) #' if(all(c(require(sandwich), require(lmtest)))){ diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index c51233f..59de915 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -51,6 +51,5 @@ Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http } \seealso{ \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. -See also \code{\link[rms]{robcov}} from package \code{rms} for another implementation of the cluster robust. } From 1dc554f3108b27178a587f1b256f5a47e4427f17 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Apr 2015 21:42:29 +0200 Subject: [PATCH 073/323] bump version, date --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3411737..d6ab98f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: RDDtools -Version: 0.3.0.9000 -Date: 2015-3-12 +Version: 0.3.0.9900 +Date: 2015-4-3 Title: Toolbox for Regression Discontinuity Design (RDD) Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, estimation and testing. From 65691db36bf0374c8f794c43bc70b5e7a61ed8e7 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 4 May 2015 13:43:32 +0200 Subject: [PATCH 074/323] fix notes --- R/RDDtools.R | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/R/RDDtools.R b/R/RDDtools.R index 46263d3..f433a5b 100644 --- a/R/RDDtools.R +++ b/R/RDDtools.R @@ -10,4 +10,8 @@ #' @import ggplot2 #' @title Regression Discontinuity Design #' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> -NULL + +if (getRversion() >= "3.1.0") { + utils::globalVariables(c("x", "position")) + utils::suppressForeignCheck(c("x", "position")) +} \ No newline at end of file From fcfa3fec1744d08a57d583e92bd51de1a00f64e2 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 4 May 2015 13:43:49 +0200 Subject: [PATCH 075/323] new roxygen2 version --- NAMESPACE | 2 +- man/Lee2008.Rd | 2 +- man/RDDbw_IK.Rd | 2 +- man/RDDbw_RSW.Rd | 2 +- man/RDDcoef.Rd | 2 +- man/RDDdata.Rd | 2 +- man/RDDgenreg.Rd | 2 +- man/RDDpred.Rd | 2 +- man/RDDreg_lm.Rd | 2 +- man/RDDreg_np.Rd | 2 +- man/RDDtools-package.Rd | 2 +- man/ROT_bw.Rd | 2 +- man/STAR_MHE.Rd | 2 +- man/as.lm.Rd | 2 +- man/as.npregbw.Rd | 2 +- man/clusterInf.Rd | 2 +- man/covarTest_dis.Rd | 2 +- man/covarTest_mean.Rd | 2 +- man/dens_test.Rd | 2 +- man/gen_MC_IK.Rd | 2 +- man/plot.RDDdata.Rd | 2 +- man/plotBin.Rd | 2 +- man/plotPlacebo.Rd | 2 +- man/plotSensi.Rd | 2 +- man/vcovCluster.Rd | 2 +- man/waldci.Rd | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 13bde39..2700657 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,4 @@ -# Generated by roxygen2 (4.1.0.9001): do not edit by hand +# Generated by roxygen2 (4.1.1): do not edit by hand S3method("[",RDDdata) S3method(RDDcoef,RDDreg_np) diff --git a/man/Lee2008.Rd b/man/Lee2008.Rd index 0233cc6..7f50987 100644 --- a/man/Lee2008.Rd +++ b/man/Lee2008.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/Lee2008-data.R \docType{data} \name{Lee2008} diff --git a/man/RDDbw_IK.Rd b/man/RDDbw_IK.Rd index 7795b56..4e8d065 100644 --- a/man/RDDbw_IK.Rd +++ b/man/RDDbw_IK.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/bw_IK.R \name{RDDbw_IK} \alias{RDDbw_IK} diff --git a/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd index 7c9986b..10a71e7 100644 --- a/man/RDDbw_RSW.Rd +++ b/man/RDDbw_RSW.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/bw_ROT.R \name{RDDbw_RSW} \alias{RDDbw_RSW} diff --git a/man/RDDcoef.Rd b/man/RDDcoef.Rd index 12f68e6..61842a9 100644 --- a/man/RDDcoef.Rd +++ b/man/RDDcoef.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDcoef.R \name{RDDcoef} \alias{RDDcoef} diff --git a/man/RDDdata.Rd b/man/RDDdata.Rd index a1ed2a9..6fe3216 100644 --- a/man/RDDdata.Rd +++ b/man/RDDdata.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDdata.R \name{RDDdata} \alias{RDDdata} diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd index 818c89b..2216092 100644 --- a/man/RDDgenreg.Rd +++ b/man/RDDgenreg.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/reg_gen.R \name{RDDgenreg} \alias{RDDgenreg} diff --git a/man/RDDpred.Rd b/man/RDDpred.Rd index 3d32302..1ef3671 100644 --- a/man/RDDpred.Rd +++ b/man/RDDpred.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDpred.R \name{RDDpred} \alias{RDDpred} diff --git a/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd index 7bef056..9e4e9ff 100644 --- a/man/RDDreg_lm.Rd +++ b/man/RDDreg_lm.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/reg_lm.R \name{RDDreg_lm} \alias{RDDreg_lm} diff --git a/man/RDDreg_np.Rd b/man/RDDreg_np.Rd index aa3bb46..8d11d64 100644 --- a/man/RDDreg_np.Rd +++ b/man/RDDreg_np.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/reg_np.R \name{RDDreg_np} \alias{RDDreg_np} diff --git a/man/RDDtools-package.Rd b/man/RDDtools-package.Rd index 30064ed..8afb300 100644 --- a/man/RDDtools-package.Rd +++ b/man/RDDtools-package.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDtools.R \docType{package} \name{RDDtools-package} diff --git a/man/ROT_bw.Rd b/man/ROT_bw.Rd index c086aff..70e169c 100644 --- a/man/ROT_bw.Rd +++ b/man/ROT_bw.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/bw_ROT.R \name{ROT_bw} \alias{ROT_bw} diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index fa63943..96c6f02 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/STAR_MHE-data.R \docType{data} \name{STAR_MHE} diff --git a/man/as.lm.Rd b/man/as.lm.Rd index de41281..1657e2b 100644 --- a/man/as.lm.Rd +++ b/man/as.lm.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDdata_methods.R \name{as.lm} \alias{as.lm} diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index 9863fd7..ea73541 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/as.npreg.R \name{as.npregbw} \alias{as.npreg} diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index ec66a4e..b7cbe9f 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/clusterInf.R \name{clusterInf} \alias{clusterInf} diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index 8a6f06f..3d6f31b 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/covarTests.R \name{covarTest_dis} \alias{covarTest_dis} diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index d2b3dd0..01e04e3 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/covarTests.R \name{covarTest_mean} \alias{covarTest_mean} diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 9b377ae..91a2cfe 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/dens_test.R \name{dens_test} \alias{dens_test} diff --git a/man/gen_MC_IK.Rd b/man/gen_MC_IK.Rd index 55ecd34..f507e50 100644 --- a/man/gen_MC_IK.Rd +++ b/man/gen_MC_IK.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/gen_MC_IK.R \name{gen_MC_IK} \alias{gen_MC_IK} diff --git a/man/plot.RDDdata.Rd b/man/plot.RDDdata.Rd index 6c8a945..37d9f9a 100644 --- a/man/plot.RDDdata.Rd +++ b/man/plot.RDDdata.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDdata_methods.R \name{plot.RDDdata} \alias{plot.RDDdata} diff --git a/man/plotBin.Rd b/man/plotBin.Rd index 2aeaca0..c690134 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/plotBin.R \name{plotBin} \alias{plotBin} diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index d2c8dc8..1b5d5e2 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/placebo.R \name{plotPlacebo} \alias{computePlacebo} diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index 3764cb8..66d78b6 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/plotSensi.R \name{plotSensi} \alias{plotSensi} diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index 59de915..7bf789d 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/clusterInf.R \name{vcovCluster} \alias{vcovCluster} diff --git a/man/waldci.Rd b/man/waldci.Rd index 9cdcc39..51eacb8 100644 --- a/man/waldci.Rd +++ b/man/waldci.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.0.9001): do not edit by hand +% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/Waldci.R \name{waldci} \alias{waldci} From bf9c0df0b74390ba2921e2d3590d9e6658399ba3 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 5 May 2015 12:30:35 +0200 Subject: [PATCH 076/323] install rmarkdown --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 100db03..7b685ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,9 @@ language: r warnings_are_errors: true +r_packages: + - rmarkdown + notifications: email: on_success: change From 98c736e34f76bc3d61e16eb93a0532e5308d4189 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 5 May 2015 13:04:31 +0200 Subject: [PATCH 077/323] fix all localvars --- R/RDDtools.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/RDDtools.R b/R/RDDtools.R index f433a5b..d51f253 100644 --- a/R/RDDtools.R +++ b/R/RDDtools.R @@ -12,6 +12,6 @@ #' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> if (getRversion() >= "3.1.0") { - utils::globalVariables(c("x", "position")) - utils::suppressForeignCheck(c("x", "position")) + utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high")) + utils::suppressForeignCheck(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high")) } \ No newline at end of file From bf288e04869b7fd555eba3e5622ff664bac520c4 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 5 May 2015 14:00:52 +0200 Subject: [PATCH 078/323] verse order --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d6ab98f..2ed8db9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -5,8 +5,8 @@ Title: Toolbox for Regression Discontinuity Design (RDD) Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, estimation and testing. Authors@R: c( - person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ), - person("Matthieu", "Stigler", role = "aut") + person("Matthieu", "Stigler", role = "aut"), + person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ) ) Maintainer: Bastiaan Quast Imports: From f39b08c9b1ebf02ec2b89beede230d2723218709 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 5 May 2015 14:18:56 +0200 Subject: [PATCH 079/323] update help file name --- R/RDDtools.R | 5 ++--- man/{RDDtools-package.Rd => rddtools.Rd} | 9 +++------ 2 files changed, 5 insertions(+), 9 deletions(-) rename man/{RDDtools-package.Rd => rddtools.Rd} (68%) diff --git a/R/RDDtools.R b/R/RDDtools.R index d51f253..063f170 100644 --- a/R/RDDtools.R +++ b/R/RDDtools.R @@ -2,14 +2,13 @@ #' #' Provides function to do a comprehensive regression discontinuity analysis. #' -#' @name RDDtools-package -#' @aliases RDDtools +#' @name rddtools +#' @aliases rddtools #' @docType package #' @import KernSmooth #' @import np #' @import ggplot2 #' @title Regression Discontinuity Design -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> if (getRversion() >= "3.1.0") { utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high")) diff --git a/man/RDDtools-package.Rd b/man/rddtools.Rd similarity index 68% rename from man/RDDtools-package.Rd rename to man/rddtools.Rd index 8afb300..388707d 100644 --- a/man/RDDtools-package.Rd +++ b/man/rddtools.Rd @@ -1,9 +1,9 @@ % Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/RDDtools.R \docType{package} -\name{RDDtools-package} -\alias{RDDtools} -\alias{RDDtools-package} +\name{rddtools} +\alias{rddtools} +\alias{rddtools-package} \title{Regression Discontinuity Design} \description{ Regression Discontinuity Design @@ -11,7 +11,4 @@ Regression Discontinuity Design \details{ Provides function to do a comprehensive regression discontinuity analysis. } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} From 102b87ebb80265711aa36f5a3eecd103e70e6e45 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 5 May 2015 14:19:15 +0200 Subject: [PATCH 080/323] start migration to rddtools etc. (from RDDtools) --- DESCRIPTION | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2ed8db9..3683072 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,4 +1,4 @@ -Package: RDDtools +Package: rddtools Version: 0.3.0.9900 Date: 2015-4-3 Title: Toolbox for Regression Discontinuity Design (RDD) @@ -27,6 +27,9 @@ Suggests: knitr, testthat License: GPL (>= 2) +URL: https://github.com/bquast/RDDtools +BugReports: https://github.com/bquast/RDDtools/issues +VignetteBuilder: knitr Collate: 'Lee2008-data.R' 'RDDcoef.R' @@ -54,6 +57,3 @@ Collate: 'reg_np.R' 'var_estim.R' 'various_code.R' -URL: https://github.com/bquast/RDDtools -BugReports: https://github.com/bquast/RDDtools/issues -VignetteBuilder: knitr From bdbaa8094d410bc6587ccf5b053434f3ffae2f0e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 5 May 2015 14:20:55 +0200 Subject: [PATCH 081/323] rename --- vignettes/{RDDtools.R => rddtools.R} | 0 vignettes/{RDDtools.Rmd => rddtools.Rmd} | 0 vignettes/{RDDtools.html => rddtools.html} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename vignettes/{RDDtools.R => rddtools.R} (100%) rename vignettes/{RDDtools.Rmd => rddtools.Rmd} (100%) rename vignettes/{RDDtools.html => rddtools.html} (100%) diff --git a/vignettes/RDDtools.R b/vignettes/rddtools.R similarity index 100% rename from vignettes/RDDtools.R rename to vignettes/rddtools.R diff --git a/vignettes/RDDtools.Rmd b/vignettes/rddtools.Rmd similarity index 100% rename from vignettes/RDDtools.Rmd rename to vignettes/rddtools.Rmd diff --git a/vignettes/RDDtools.html b/vignettes/rddtools.html similarity index 100% rename from vignettes/RDDtools.html rename to vignettes/rddtools.html From 7a01082a48e3a54d5b13c056436eb29399b8908e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 11:00:49 +0200 Subject: [PATCH 082/323] vignette title --- vignettes/rddtools.R | 2 +- vignettes/rddtools.Rmd | 2 +- vignettes/rddtools.html | 20 ++++++++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R index 502d583..7e0412a 100644 --- a/vignettes/rddtools.R +++ b/vignettes/rddtools.R @@ -1,4 +1,4 @@ -## ----, echo = FALSE, message = FALSE------------------------------------- +## ---- echo = FALSE, message = FALSE-------------------------------------- knitr::opts_chunk$set(collapse = T, comment = "#>") ## ------------------------------------------------------------------------ diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd index 9c58401..f01aa73 100644 --- a/vignettes/rddtools.Rmd +++ b/vignettes/rddtools.Rmd @@ -1,5 +1,5 @@ --- -title: "RDDtools" +title: "rddtools" author: "Matthieu Stigler" date: "`r Sys.Date()`" output: rmarkdown::html_vignette diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html index c7d3894..422f6fc 100644 --- a/vignettes/rddtools.html +++ b/vignettes/rddtools.html @@ -10,9 +10,9 @@ - + -RDDtools +rddtools @@ -52,9 +52,9 @@ @@ -63,6 +63,18 @@

2015-04-02

Data Preparation and Visualisation

Load the package, and load the built-in dataset from [Lee 2008]:

library(RDDtools)
+#> IMPORTANT, this is an ALPHA VERSION
+#>                         many changes to the API will follow
+#> 
+#> Attaching package: 'RDDtools'
+#> 
+#> The following objects are masked from 'package:rddtools':
+#> 
+#>     as.lm, as.npreg, as.npregbw, clusterInf, computePlacebo,
+#>     covarTest_dis, covarTest_mean, dens_test, gen_MC_IK,
+#>     plotPlacebo, plotPlaceboDens, plotSensi, RDDbw_IK, RDDbw_RSW,
+#>     RDDcoef, RDDdata, RDDgenreg, RDDpred, RDDreg_lm, RDDreg_np,
+#>     ROT_bw, vcovCluster, vcovCluster2
 data(Lee2008)

Declare the data to be a RDDdata object:

Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
From 37b1baa308298886a1dcdfd5608a9db384dd2231 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 12:49:38 +0200 Subject: [PATCH 083/323] remove unneeded --- DESCRIPTION | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3683072..392dd9e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,5 @@ Package: rddtools -Version: 0.3.0.9900 -Date: 2015-4-3 +Version: 0.3.0.9990 Title: Toolbox for Regression Discontinuity Design (RDD) Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, estimation and testing. @@ -30,30 +29,3 @@ License: GPL (>= 2) URL: https://github.com/bquast/RDDtools BugReports: https://github.com/bquast/RDDtools/issues VignetteBuilder: knitr -Collate: - 'Lee2008-data.R' - 'RDDcoef.R' - 'RDDdata.R' - 'RDDdata_methods.R' - 'RDDpred.R' - 'RDDtools.R' - 'STAR_MHE-data.R' - 'Waldci.R' - 'as.npreg.R' - 'bw_IK.R' - 'plotBin.R' - 'bw_ROT.R' - 'clusterInf.R' - 'covarTests.R' - 'dens_test.R' - 'gen_MC_IK.R' - 'get_methods.R' - 'model.matrix.RDD.R' - 'placebo.R' - 'plotSensi.R' - 'qplot_experim.R' - 'reg_gen.R' - 'reg_lm.R' - 'reg_np.R' - 'var_estim.R' - 'various_code.R' From c9aab71b9e0128a5a4212ee1d4a937b61402a651 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 13:01:43 +0200 Subject: [PATCH 084/323] unneeded call --- R/dens_test.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/dens_test.R b/R/dens_test.R index cef176e..d43caba 100644 --- a/R/dens_test.R +++ b/R/dens_test.R @@ -10,7 +10,6 @@ #' @export #' @import rdd #' @examples -#' library(RDDtools) #' data(Lee2008) #' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' dens_test(Lee2008_rdd) From 0eaab7ed4145f545f5b2b329df0803798d9b1433 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 13:01:59 +0200 Subject: [PATCH 085/323] compile of unneeded call --- man/dens_test.Rd | 1 - 1 file changed, 1 deletion(-) diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 91a2cfe..ac3e118 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -21,7 +21,6 @@ dens_test(RDDobject, bin = NULL, bw = NULL, plot = TRUE, ...) Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{RDDobject}. } \examples{ -library(RDDtools) data(Lee2008) Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) dens_test(Lee2008_rdd) From f8dc9b6aa2d6321fa753c04d6f5bed9ee438a5cc Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 13:02:37 +0200 Subject: [PATCH 086/323] update to rddtools --- tests/RDDpred.R | 2 +- tests/RDDtools_vs_rdd.R | 2 +- tests/packageDemo.R | 2 +- tests/simple_MC.R | 2 +- vignettes/rddtools.R | 2 +- vignettes/rddtools.Rmd | 2 +- vignettes/rddtools.html | 14 +------------- 7 files changed, 7 insertions(+), 19 deletions(-) diff --git a/tests/RDDpred.R b/tests/RDDpred.R index 4a85245..7f0c8ae 100644 --- a/tests/RDDpred.R +++ b/tests/RDDpred.R @@ -1,4 +1,4 @@ -library(RDDtools) +library(rddtools) library(car) diff --git a/tests/RDDtools_vs_rdd.R b/tests/RDDtools_vs_rdd.R index 910cc7c..9cdcaad 100644 --- a/tests/RDDtools_vs_rdd.R +++ b/tests/RDDtools_vs_rdd.R @@ -1,6 +1,6 @@ library(rdd) -library(RDDtools) +library(rddtools) set.seed(1234) x<-runif(1000,-1,1) diff --git a/tests/packageDemo.R b/tests/packageDemo.R index 547ed88..45fd54d 100644 --- a/tests/packageDemo.R +++ b/tests/packageDemo.R @@ -1,4 +1,4 @@ -library(RDDtools) +library(rddtools) diff --git a/tests/simple_MC.R b/tests/simple_MC.R index e88c6f3..6e714b0 100644 --- a/tests/simple_MC.R +++ b/tests/simple_MC.R @@ -1,5 +1,5 @@ -library(RDDtools) +library(rddtools) library(rdd) ## simple MC: diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R index 7e0412a..8fd6401 100644 --- a/vignettes/rddtools.R +++ b/vignettes/rddtools.R @@ -2,7 +2,7 @@ knitr::opts_chunk$set(collapse = T, comment = "#>") ## ------------------------------------------------------------------------ -library(RDDtools) +library(rddtools) data(Lee2008) ## ------------------------------------------------------------------------ diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd index f01aa73..8bcba9b 100644 --- a/vignettes/rddtools.Rmd +++ b/vignettes/rddtools.Rmd @@ -20,7 +20,7 @@ knitr::opts_chunk$set(collapse = T, comment = "#>") Load the package, and load the built-in dataset from [Lee 2008]: ```{r} -library(RDDtools) +library(rddtools) data(Lee2008) ``` diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html index 422f6fc..5802947 100644 --- a/vignettes/rddtools.html +++ b/vignettes/rddtools.html @@ -62,19 +62,7 @@

2015-05-06

Data Preparation and Visualisation

Load the package, and load the built-in dataset from [Lee 2008]:

-
library(RDDtools)
-#> IMPORTANT, this is an ALPHA VERSION
-#>                         many changes to the API will follow
-#> 
-#> Attaching package: 'RDDtools'
-#> 
-#> The following objects are masked from 'package:rddtools':
-#> 
-#>     as.lm, as.npreg, as.npregbw, clusterInf, computePlacebo,
-#>     covarTest_dis, covarTest_mean, dens_test, gen_MC_IK,
-#>     plotPlacebo, plotPlaceboDens, plotSensi, RDDbw_IK, RDDbw_RSW,
-#>     RDDcoef, RDDdata, RDDgenreg, RDDpred, RDDreg_lm, RDDreg_np,
-#>     ROT_bw, vcovCluster, vcovCluster2
+
library(rddtools)
 data(Lee2008)

Declare the data to be a RDDdata object:

Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
From 3e4d5c6065b9d8ac31f28b899e9125d76fe9ab68 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 13:02:47 +0200 Subject: [PATCH 087/323] general cleanup --- R/covarTests.R | 1 - R/gen_MC_IK.R | 1 - man/covarTest_mean.Rd | 3 --- man/gen_MC_IK.Rd | 3 --- 4 files changed, 8 deletions(-) diff --git a/R/covarTests.R b/R/covarTests.R index af18112..6d11717 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -9,7 +9,6 @@ #' @param p.adjust Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function #' @param \ldots currently not used #' @return A data frame with, for each covariate, the mean on each size, the difference, t-stat and ts p-value. -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @seealso \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution #' @examples #' data(Lee2008) diff --git a/R/gen_MC_IK.R b/R/gen_MC_IK.R index 5bf3efa..ebc4cdb 100644 --- a/R/gen_MC_IK.R +++ b/R/gen_MC_IK.R @@ -7,7 +7,6 @@ #' @param output Whether to return a data-frame, or already a RDDdata #' @param size The size of the effect, this depends on the specific version, defaults are as in IK: 0.04, NULL, 0.1, 0.1 #' @return An data frame with x and y variables. -#' @references TODO #' @export #' @examples #' MC1_dat <- gen_MC_IK() diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index 01e04e3..68331a2 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -58,9 +58,6 @@ covarTest_dis(Lee2008_rdd_Z, bw=0.3) reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd_Z) covarTest_mean(reg_nonpara) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} \seealso{ \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution } diff --git a/man/gen_MC_IK.Rd b/man/gen_MC_IK.Rd index f507e50..70eb065 100644 --- a/man/gen_MC_IK.Rd +++ b/man/gen_MC_IK.Rd @@ -49,7 +49,4 @@ plotCu(version=3) plotCu(version=4) layout(matrix(1)) } -\references{ -TODO -} From ab48921a7586b59dd96e3400071f0e401fd35dce Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 14:56:43 +0200 Subject: [PATCH 088/323] general cleanup --- R/RDDcoef.R | 1 + R/RDDdata.R | 3 +- R/RDDdata_methods.R | 4 +- R/Waldci.R | 4 +- R/as.npreg.R | 4 -- R/bw_IK.R | 1 - R/placebo.R | 1 - R/plotBin.R | 6 +- R/plotSensi.R | 1 - R/var_estim.R | 155 -------------------------------------------- man/RDDbw_IK.Rd | 3 - man/RDDdata.Rd | 3 - man/RDDgenreg.Rd | 1 + man/RDDreg_lm.Rd | 1 + man/RDDreg_np.Rd | 1 + man/ROT_bw.Rd | 4 +- man/plot.RDDdata.Rd | 3 - man/plotBin.Rd | 6 +- man/plotPlacebo.Rd | 3 - man/plotSensi.Rd | 3 - man/waldci.Rd | 3 +- 21 files changed, 15 insertions(+), 196 deletions(-) diff --git a/R/RDDcoef.R b/R/RDDcoef.R index 4d149ea..c69d03e 100644 --- a/R/RDDcoef.R +++ b/R/RDDcoef.R @@ -9,6 +9,7 @@ #' its standard value, t test and p-value and #' @export + RDDcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) UseMethod("RDDcoef") diff --git a/R/RDDdata.R b/R/RDDdata.R index 029fc90..cabe5e6 100644 --- a/R/RDDdata.R +++ b/R/RDDdata.R @@ -1,4 +1,4 @@ -#'Construct RDDdata +#' Construct RDDdata #' #' Construct the base RDD object, containing x, y and the cutpoint, eventuallay covariates. #' @@ -12,7 +12,6 @@ #' @param z Assignment variable for the fuzzy case. #' @return Object of class \code{RDDdata}, inheriting from \code{data.frame} #' @export -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @examples #' data(Lee2008) #' rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) diff --git a/R/RDDdata_methods.R b/R/RDDdata_methods.R index 4f03723..66c6336 100644 --- a/R/RDDdata_methods.R +++ b/R/RDDdata_methods.R @@ -32,8 +32,7 @@ summary.RDDdata <- function(object, ...){ #' is specified with the argument \code{h}, specifying the whole binwidth (contrary to the usual bandwidth #' argument, that gives half of the length of the kernel window. #' When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{RDDbw_RSW}}. -#' -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> +#' @export #' @examples #' data(Lee2008) #' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) @@ -50,7 +49,6 @@ summary.RDDdata <- function(object, ...){ #' #' ## If the specified number of bins is odd, the larger number is given to side with largest range #' plot(Lee2008_rdd, nbins=21) -#' @export ### PLOT method diff --git a/R/Waldci.R b/R/Waldci.R index 153108e..fdb6d0c 100644 --- a/R/Waldci.R +++ b/R/Waldci.R @@ -6,8 +6,8 @@ #' @param level the confidence level required, see confint() #' @param vcov. Specific covariance function to pass to coeftest. See help of sandwich #' @param df Degrees of freedom -#' @param \ldots Further argument -#' @keywords internal +#' @param \ldots Further arguments + waldci <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) { diff --git a/R/as.npreg.R b/R/as.npreg.R index 731d313..ad7b9d9 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -28,10 +28,6 @@ #' all.equal(RDDcoef(reg_nonpara_gaus),RDDcoef(reg_nonpara_np)) - - - - as.npregbw <- function(x,...){ res <- as.npregbw_low(x=x, npreg=FALSE,...) res diff --git a/R/bw_IK.R b/R/bw_IK.R index 5f9e8a5..289fd5c 100644 --- a/R/bw_IK.R +++ b/R/bw_IK.R @@ -10,7 +10,6 @@ #' Review of Economic Studies (2012) 79, 933-959 #' @seealso \code{\link{RDDbw_RSW}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) #' @export -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @examples #' data(Lee2008) #' rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) diff --git a/R/placebo.R b/R/placebo.R index 99056c6..89db05f 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -8,7 +8,6 @@ #' @param plot Whether to actually plot the data. #' @param output Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object #' @return A data frame containing the cutpoints, their corresponding estimates and confidence intervals. -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @examples #' data(Lee2008) #' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) diff --git a/R/plotBin.R b/R/plotBin.R index fa29598..d59608b 100644 --- a/R/plotBin.R +++ b/R/plotBin.R @@ -5,6 +5,7 @@ #' @param x Forcing variable #' @param y Output #' @param h the bandwidth (defaults to \code{2*sd(runvar)*length(runvar)^(-.5)}) +#' @param nbins number of Bins #' @param cutpoint Cutpoint #' @param plot Logical. Whether to plot or only returned silently #' @param type Whether returns the y averages, or the x frequencies @@ -12,10 +13,9 @@ #' @param \ldots further arguments passed to plot. #' @return Returns silently values #' @references McCrary, Justin. -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> -#' @keywords internal -plotBin <- function(x, y, h=0.05, nbins=NULL, cutpoint=0, plot=TRUE, type=c("value", "number"),xlim=range(x, na.rm=TRUE), cex=0.9,main=NULL, xlab, ylab, ...){ + +plotBin <- function(x, y, h=0.05, nbins=NULL, cutpoint=0, plot=TRUE, type=c("value", "number"), xlim=range(x, na.rm=TRUE), cex=0.9,main=NULL, xlab, ylab, ...){ type <- match.arg(type) x_name <- if(missing(xlab)) deparse(substitute(x)) else xlab diff --git a/R/plotSensi.R b/R/plotSensi.R index 39fe150..754aa07 100644 --- a/R/plotSensi.R +++ b/R/plotSensi.R @@ -14,7 +14,6 @@ #' @param plot Whether to actually plot the data. #' @param \ldots Further arguments passed to specific methods #' @return A data frame containing the bandwidths and corresponding estimates and confidence intervals. -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @import methods #' @examples #' data(Lee2008) diff --git a/R/var_estim.R b/R/var_estim.R index f50fc6e..71167ec 100644 --- a/R/var_estim.R +++ b/R/var_estim.R @@ -169,158 +169,3 @@ all_var.RDDreg.np <- function(x){ res <- all_var_low(dat$x,dat$y, point=cutpoint, bw=bw, eachSide=TRUE, return="se") res } - - - - -#################################################################################### -############################ -#################################################################################### - -if(FALSE){ - - library(KernSmooth) - library(RDDtools) - library(locpol) - if(packageVersion("locpol")<=0.6) stop("Should get latest dev version of locpol") - - -environment(all_var.RDDreg.np) <- environment(RDDdata) - ## small test: - MC1_df <- gen_MC_IK() - - # true val - point <- 0 - dbeta((point+1)/2 , shape1=2, shape2=4)*1/2 - - dens_estim(x=MC1_df$x, point=point, bw=0.1) - dens_estim(x=MC1_df$x, point=point) - dens_estim2(x=MC1_df$x, point=point, bw=0.1) - dens_estim2(x=MC1_df$x, point=point) - -## should correspond? - dens_estim(x=MC1_df$x, point=point, bw=0.1, eachSide=FALSE) - dens_estim2(x=MC1_df$x, point=point, bw=0.1, kernel="rectangular") - d <- density(x=MC1_df$x, bw=0.1, kernel="rectangular") - d$y[which.min(abs(d$x-point))] - density(x=MC1_df$x, from=0, to=0, n=1,bw=0.1, kernel="rectangular")$y - - #### VARiance - sqrt(var_estim(x=MC1_df$x, y=MC1_df$y, point=0)) - - sqrt(var_estim(x=MC1_df$x, y=MC1_df$y, point=0, eachSide=FALSE)) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="var")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="NW_loc", kernel="Uniform")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="NW", kernel="Uniform")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="NW_loc",kernel="Normal")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="LL_kern")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="LL_loc")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="LL_loc", kernel="Uniform")) - sqrt(var_estim2(x=MC1_df$x, y=MC1_df$y, point=0, estim="var_loc")) - - - - all_var(x=MC1_df$x, y=MC1_df$y, point=0) - - ### test: - library(RDDtools) - - - MC1_df_rdd <- RDDdata(x=MC1_df$x, y=MC1_df$y, cutpoint=0) - - bw_ik <- RDDbw_IK(MC1_df_rdd) - RDD_est <- RDDreg_np(MC1_df_rdd, bw=bw_ik) - RDD_est_lmnp <- RDDreg_lm(MC1_df_rdd, weights=dnorm(MC1_df_rdd$x, sd=bw_ik)) - -all_var.RDDreg.np(x=RDD_est) - - ## with np: - library(np) - MC1_df_D <- data.frame(MC1_df, D=ifelse(MC1_df$x>=0, 1, 0), Dx=ifelse(MC1_df$x>=0, MC1_df$x, 0)) - bw_ik.np <- npregbw(bws=bw_ik, formula=y~x, data= MC1_df, bandwidth.compute=FALSE, regtype = "ll") - bw_ik.np_D <- npregbw(bws=rep(bw_ik,3), formula=y~x+D+Dx, data= MC1_df_D, bandwidth.compute=FALSE, regtype = "ll", - eval=data.frame(x=c(0,0), D=c(0,1), Dx=c(0,0))) - bw_ik.np_D_mixed <- npregbw(bws=c(bw_ik,0.49,bw_ik), formula=y~x+factor(D)+Dx, data= MC1_df_D, bandwidth.compute=FALSE, regtype = "ll", - eval=data.frame(x=c(0,0), D=c(0,1), Dx=c(0,0))) - - model.np <- npreg(bw_ik.np, exdat=0) - model.np_D <- npreg(bw_ik.np_D, exdat=data.frame(x=0,D=0, Dx=0)) - model.np_D_mix <- npreg(bw_ik.np_D_mixed) - model.np_left <- npreg(npregbw(bws=bw_ik, formula=y~x, data= subset(MC1_df,x<0), bandwidth.compute=FALSE, regtype = "ll")) - model.np_right <- npreg(npregbw(bws=bw_ik, formula=y~x, data= subset(MC1_df,x>=0), bandwidth.compute=FALSE, regtype = "ll")) - - - pred_np <- predict(model.np, newdata=data.frame(x=0), se.fit=TRUE) - pred_np_D0 <- predict(model.np_D, newdata=data.frame(x=0, D=0, Dx=0), se.fit=TRUE) - pred_np_mix_D0 <- predict(model.np_D_mix, newdata=data.frame(x=0, D=factor(0), Dx=0), se.fit=TRUE) - pred_np_D1 <- predict(model.np_D, newdata=data.frame(x=0, D=1, Dx=0), se.fit=TRUE) - pred_np_mix_D1 <- predict(model.np_D_mix, newdata=data.frame(x=0, D=factor(1), Dx=0), se.fit=TRUE) - pred_np_D1$fit -pred_np_D0$fit - - pred_left <- predict(model.np_left, newdata=data.frame(x=0), se.fit=TRUE) - pred_right <- predict(model.np_right, newdata=data.frame(x=0), se.fit=TRUE) - - pred_li <- list(pred_np=pred_np, pred_left=pred_left, pred_right=pred_right, - pred_np_D0=pred_np_D0, pred_np_D1=pred_np_D1, - pred_np_D0_mix=pred_np_mix_D0, pred_np_D1_mix=pred_np_mix_D1) - sapply(pred_li, function(x) c(fit=x$fit, se.fit=x$se.fit)) - - pred_right$fit-pred_left$fit - - summary(RDD_est ) - -## get same result with RDDreg_lm: - com_vals <-rbind( - left_point=c(RDD=coef(summary(RDD_est_lmnp))[1,1], np_1side=pred_left$fit, np_D0=pred_np_D0$fit), - left_point_se=c(RDD=coef(summary(RDD_est_lmnp))[1,2], np_1side=pred_left$se.fit, np_D0=pred_np_D0$se.fit), - right_point=c(RDD=sum(coef(summary(RDD_est_lmnp))[1:2,1]), np_1side=pred_right$fit, np_D1=pred_np_D1$fit), - right_point_se=c(RDD=sum(coef(summary(RDD_est_lmnp))[1:2,2]), np_1side=pred_right$se.fit, np_D1=pred_np_D1$se.fit), - diff=c(RDD=coef(summary(RDD_est_lmnp))[2,1], np_1side=pred_np_D1$fit -pred_np_D0$fit, np_D1=NA) - ) -com_vals - coef(summary(RDD_est_lmnp))[2,1] - -a<-plot(model.np_D, plot.errors.method="bootstrap", plot.behavior="plot-data", plot.errors.style="bar")#, plot.errors.center="bias") -str(a) -head(a$r2$eval) -head(a$r1$eval) - -## with liblocpol - library(locpol) - library(devtools) - - - model.liblocpol_both <- locpol(y~x, data=MC1_df, kernel=gaussK, xeval=0, bw=bw_ik, bwVar=1.2) - model.liblocpol_both_triK <- locpol(y~x, data=MC1_df, kernel=TrianK, xeval=0, bw=bw_ik, bwVar=1.2) - model.liblocpol_left <- locpol(y~x, data=subset(MC1_df,x<0), kernel=gaussK, xeval=0, bw=bw_ik, bwVar=1.2) - model.liblocpol_left_a <- locpol(y~x, data=subset(MC1_df,x<0), kernel=gaussK, xeval=0, bw=bw_ik, bwVar=1) - model.liblocpol_right <- locpol(y~x, data=subset(MC1_df,x>=0), kernel=gaussK, xeval=0, bw=bw_ik) - model.liblocpol_right_triK <- locpol(y~x, data=subset(MC1_df,x>=0), kernel=TrianK, xeval=0, bw=bw_ik) - - model_locpol_li <- list(liblocpol_both=model.liblocpol_both, - liblocpol_left=model.liblocpol_left, - liblocpol_left_a=model.liblocpol_left_a, - liblocpol_right=model.liblocpol_right) - -se.locpol <- function(x) sqrt(x$CIwidth * x$lpFit$var/x$lpFit$xDen) - -## Compare se of np and locpol on full, left and right: -round(sapply(model_locpol_li, function(x) c(fit=fitted(x), se.fit=se.locpol(x))),9) -round(sapply(pred_li, function(x) c(fit=x$fit, se.fit=x$se.fit)),9) - - -## Compare se of np and locpol on full: - a<- all_var(x=MC1_df$x, y=MC1_df$y, point=0, bw=bw_ik, return="all") - aa<- all_var(x=MC1_df$x, y=MC1_df$y, point=0, bw=bw_ik, eachSide=FALSE, return="all") - loc_right <- c(se.locpol(model.liblocpol_right_triK), model.liblocpol_right_triK$CIwidth, model.liblocpol_right_triK$lpFit$xDen,model.liblocpol_right_triK$lpFit$var) - loc_both <- c(se.locpol(model.liblocpol_both_triK), model.liblocpol_both_triK$CIwidth, model.liblocpol_both_triK$lpFit$xDen,model.liblocpol_both_triK$lpFit$var) - -pred_np -model.np$merr - -rbind(a, loc_right, aa, loc_both) - -computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=1), lower=0, upper=Inf)/(nrow(MC1_df)*bw_ik) -computeRK(equivKernel(TrianK, nu=0, deg=1, lower=-1, upper=1), lower=-Inf, upper=Inf)/(nrow(MC1_df)*bw_ik) - -} \ No newline at end of file diff --git a/man/RDDbw_IK.Rd b/man/RDDbw_IK.Rd index 4e8d065..ba8f128 100644 --- a/man/RDDbw_IK.Rd +++ b/man/RDDbw_IK.Rd @@ -23,9 +23,6 @@ data(Lee2008) rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) RDDbw_IK(rd) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} \references{ Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," Review of Economic Studies (2012) 79, 933-959 diff --git a/man/RDDdata.Rd b/man/RDDdata.Rd index 6fe3216..a8746f3 100644 --- a/man/RDDdata.Rd +++ b/man/RDDdata.Rd @@ -40,7 +40,4 @@ rd summary(rd) plot(rd) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd index 2216092..6ff5fc1 100644 --- a/man/RDDgenreg.Rd +++ b/man/RDDgenreg.Rd @@ -58,5 +58,6 @@ summary(reg_bin_glm) } \references{ TODO +# } diff --git a/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd index 9e4e9ff..97833c4 100644 --- a/man/RDDreg_lm.Rd +++ b/man/RDDreg_lm.Rd @@ -73,5 +73,6 @@ plot(reg_para_ik) } \references{ TODO +# } diff --git a/man/RDDreg_np.Rd b/man/RDDreg_np.Rd index 8d11d64..3e60874 100644 --- a/man/RDDreg_np.Rd +++ b/man/RDDreg_np.Rd @@ -40,6 +40,7 @@ plot(reg_nonpara) } \references{ TODO +# } \seealso{ \code{\link{RDDbw_IK}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012) diff --git a/man/ROT_bw.Rd b/man/ROT_bw.Rd index 70e169c..e58ba0d 100644 --- a/man/ROT_bw.Rd +++ b/man/ROT_bw.Rd @@ -15,10 +15,8 @@ implements dpill \examples{ #No discontinuity } -\author{ -Drew Dimmery <\email{drewd@nyu.edu}> -} \references{ McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +# } diff --git a/man/plot.RDDdata.Rd b/man/plot.RDDdata.Rd index 37d9f9a..8a1b947 100644 --- a/man/plot.RDDdata.Rd +++ b/man/plot.RDDdata.Rd @@ -53,7 +53,4 @@ plot(Lee2008_rdd, nbins=22) ## If the specified number of bins is odd, the larger number is given to side with largest range plot(Lee2008_rdd, nbins=21) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} diff --git a/man/plotBin.Rd b/man/plotBin.Rd index c690134..a68cac2 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -15,6 +15,8 @@ plotBin(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, \item{h}{the bandwidth (defaults to \code{2*sd(runvar)*length(runvar)^(-.5)})} +\item{nbins}{number of Bins} + \item{cutpoint}{Cutpoint} \item{plot}{Logical. Whether to plot or only returned silently} @@ -31,11 +33,7 @@ Returns silently values \description{ Do a "scatterplot bin smoothing" } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} \references{ McCrary, Justin. } -\keyword{internal} diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index 1b5d5e2..3a0a59b 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -64,7 +64,4 @@ reg_nonpara_lminf <- RDDreg_np(RDDobject=Lee2008_rdd, inference="lm") vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x) plotPlacebo(reg_nonpara_lminf, vcov. = vc) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index 66d78b6..b64fcbb 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -63,7 +63,4 @@ reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4, bw=bw_ik) plotSensi(reg_para_ik) plotSensi(reg_para_ik, type="facet") } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} diff --git a/man/waldci.Rd b/man/waldci.Rd index 51eacb8..0ca60b7 100644 --- a/man/waldci.Rd +++ b/man/waldci.Rd @@ -17,10 +17,9 @@ waldci(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) \item{df}{Degrees of freedom} -\item{\ldots}{Further argument} +\item{\ldots}{Further arguments} } \description{ Version of vcov allowing for confint } -\keyword{internal} From fcb1960d2012cd3c815cfdc9e10d0f432dee6fb1 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 14:56:56 +0200 Subject: [PATCH 089/323] unneed output from tests --- tests/RDDpred.Rout.save | 307 -------- tests/RDDtools_vs_rdd.Rout.save | 123 ---- tests/packageDemo.Rout.save | 1214 ------------------------------- tests/simple_MC.Rout.save | 179 ----- 4 files changed, 1823 deletions(-) delete mode 100644 tests/RDDpred.Rout.save delete mode 100644 tests/RDDtools_vs_rdd.Rout.save delete mode 100644 tests/packageDemo.Rout.save delete mode 100644 tests/simple_MC.Rout.save diff --git a/tests/RDDpred.Rout.save b/tests/RDDpred.Rout.save deleted file mode 100644 index df22569..0000000 --- a/tests/RDDpred.Rout.save +++ /dev/null @@ -1,307 +0,0 @@ - -R version 2.15.2 (2012-10-26) -- "Trick or Treat" -Copyright (C) 2012 The R Foundation for Statistical Computing -ISBN 3-900051-07-0 -Platform: x86_64-pc-linux-gnu (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(RDDtools) -Loading required package: AER -Loading required package: car -Loading required package: lmtest -Loading required package: zoo - -Attaching package: 'zoo' - -The following objects are masked from 'package:base': - - as.Date, as.Date.numeric - -Loading required package: sandwich -Loading required package: survival -Loading required package: splines -KernSmooth 2.23 loaded -Copyright M. P. Wand 1997-2009 - -RDDtools 0.22 -PLEASE NOTE THIS is currently only a development version. -Run vignette('RDDtools') for the documentation -> library(car) -> -> -> #### DATA -> data(Lee2008) -> Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) -> -> n_Lee <- nrow(Lee2008) -> -> set.seed(123) -> Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE)) -> Lee2008_rdd_z <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0) -> -> #### REGS -> bw_IK <- RDDbw_IK(Lee2008_rdd_z) -> w_IK <- RDDtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_IK) -> reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate")) -> reg_para4_cov_slSep_W <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK) -> reg_np_cov <- RDDreg_np(RDDobject=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm") -Warning message: -In RDDreg_np(RDDobject = Lee2008_rdd_z, covariates = "z1", bw = bw_IK, : - covariates not fully implemented for non-para reg -> -> -> -> -> reg_para4_cov_slSep_2Z <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1+z2", covar.opt=list(slope="separate")) -> -> reg_li <- list( reg_para4_cov_slSep=reg_para4_cov_slSep, -+ reg_para4_cov_slSep_W=reg_para4_cov_slSep_W, -+ reg_np_cov=reg_np_cov, -+ reg_para4_cov_slSep_2Z=reg_para4_cov_slSep_2Z) -> -> checkRDDmean <- function(x, n=5){ -+ covDF <- model.frame(x) -+ zDF <- grep("z", colnames(covDF), value=FALSE) -+ hasD <- zDF[-grep(":", colnames(covDF)[zDF])] -+ -+ DF_1 <- covDF[1:n,hasD, drop=FALSE] -+ DF_2 <- data.frame(t(colMeans(DF_1))) -+ -+ pred_1 <- RDDpred(x, covdata=DF_1, stat="mean") -+ pred_2 <- RDDpred(x, covdata=DF_2) -+ all.equal(pred_1, pred_2, check.attributes=FALSE) -+ } -> -> sapply(reg_li, checkRDDmean) - reg_para4_cov_slSep reg_para4_cov_slSep_W reg_np_cov - TRUE TRUE TRUE -reg_para4_cov_slSep_2Z - TRUE -> -> sapply(reg_li, function(x) all.equal(unlist(RDDpred(x)),RDDcoef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE)) - reg_para4_cov_slSep reg_para4_cov_slSep_W reg_np_cov - TRUE TRUE TRUE -reg_para4_cov_slSep_2Z - TRUE -> -> -> # -> # reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) -> # print(reg_para) -> # summary(reg_para) -> # plot(reg_para) -> # -> # formula(reg_para) -> # -> # update(as.formula("y ~ D + `x^1` + `x^1_right`"), reg_para) -> # reg_para_l <- as.lm(reg_para) -> # # update(reg_para_l, y ~ D + `x^1` + `x^1_right`) -> # -> # mf <- model.frame(reg_para) -> # -> # lm("y ~ D + `x^1` + `x^1_right`", mf) -> # a<-lm("y ~ -1 + D +I(1-D) + `x^1` + `x^1_right`", mf) -> # diff(coef(a)[2:1]) -> # coef(reg_para) -> # -> # # deltaMethod(a, "I(1-D) - D", parameterNames=paste("a", 1:4, sep="")) -> # deltaMethod(a, "a1 - a2", parameterNames=paste("a", 1:4, sep="")) -> # coef(summary(reg_para))[2,] -> # -> # reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate")) -> # -> mf_2 <- model.frame(reg_para4_cov_slSep) -> # formula(reg_para4_cov_slSep) -> # -> aa <- lm("y ~ D + `x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data=mf_2) -> aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data=mf_2) -> # -> # diff(coef(aaa)[2:1]) -> # RDDpred(reg_para4_cov_slSep) -> # RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=0)) -> # -> # RDDcoef(reg_para4_cov_slSep, allInfo=TRUE) -> -> ## compare RDDpred and Delta at 1: -> rdd_p_1 <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=1)) -> delta_1 <- deltaMethod(aaa, "a1 - a2 + a12", parameterNames=paste("a", 1:12, sep="")) -> rdd_p_1 -$fit - 1 -0.07886429 - -$se.fit -[1] 0.01361366 - -> delta_1 - Estimate SE -a1 - a2 + a12 0.07886429 0.01361366 -> all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes=FALSE) -[1] TRUE -> -> ## compare RDDpred and Delta at 0: -> rdd_p_0 <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=0)) -> rdd_c_0 <- RDDcoef(reg_para4_cov_slSep, allInfo=TRUE) -> delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames=paste("a", 1:12, sep="")) -> rdd_p_0 -$fit - 1 -0.07644637 - -$se.fit -[1] 0.01324368 - -> rdd_c_0 - Estimate Std. Error t value Pr(>|t|) -D 0.07644637 0.01324368 5.772289 8.178184e-09 -> delta_0 - Estimate SE -a1 - a2 0.07644637 0.01324368 -> all.equal(unlist(rdd_p_0), drop(as.matrix(delta_0[1:2])), check.attributes=FALSE) -[1] TRUE -> all.equal(unlist(rdd_p_0), drop(as.matrix(rdd_c_0[1:2])), check.attributes=FALSE) -[1] TRUE -> -> ## compare RDDpred and Delta at 2 points: -> rdd_p_01_AGG <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.5))) -> rdd_p_01_all <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1))) -> rdd_p_01_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="sum") -> rdd_p_01_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="mean") -> -> delta_01_S <- deltaMethod(aaa, "2*(a1 - a2) +1*a12", parameterNames=paste("a", 1:12, sep="")) -> delta_01_M <- deltaMethod(aaa, "(2*(a1 - a2) +1*a12)/2", parameterNames=paste("a", 1:12, sep="")) -> delta_01_S - Estimate SE -2 * (a1 - a2) + 1 * a12 0.1553107 0.02664323 -> delta_01_M - Estimate SE -(2 * (a1 - a2) + 1 * a12)/2 0.07765533 0.01332161 -> -> all(delta_01_S/2==delta_01_M) -[1] TRUE -> -> ## compare individuals (stat=ident) -> all.equal(rdd_p_01_all$fit, c(delta_0[1,1], delta_1[1,1])) -[1] TRUE -> all.equal(rdd_p_01_all$se.fit, c(delta_0[1,2], delta_1[1,2])) -[1] TRUE -> c(rdd_p_01_M$fit/2, rdd_p_01_AGG$fit) - 1 -0.03882766 0.07765533 -> -> ## compare sum (stat=sum) -> all.equal(unlist(rdd_p_01_S), drop(as.matrix(delta_01_S[1:2])), check.attributes=FALSE) -[1] TRUE -> -> ## compare mean (stat=mean) -> all.equal(unlist(rdd_p_01_M), drop(as.matrix(delta_01_M[1:2])), check.attributes=FALSE) -[1] TRUE -> all.equal(rdd_p_01_M$fit, rdd_p_01_S$fit/2) -[1] TRUE -> all.equal(rdd_p_01_M$fit, rdd_p_01_AGG$fit, check.attributes=FALSE) -[1] TRUE -> all.equal(rdd_p_01_M$se.fit, rdd_p_01_AGG$se.fit, check.attributes=FALSE) -[1] TRUE -> -> ## compare RDDpred and Delta at 5 first points: -> ind_z_pos <- head(which(Lee2008_rdd_z$z1>0),5) -> -> rdd_p_01_5z_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="sum") -> rdd_p_01_5z_Sb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[1:5])), stat="sum") -> rdd_p_01_5zPos_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[ind_z_pos]), stat="sum") -> rdd_p_01_5zPos_Sb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[ind_z_pos])), stat="sum") -> rdd_p_01_5z_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="mean") -> rdd_p_01_5z_Mb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1[1:5])), stat="mean") -> rdd_p_01_ALLz_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1), stat="mean") -> rdd_p_01_ALLz_Mb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1)), stat="mean") -> -> del <- function(x, mean=FALSE) { -+ n <- length(x) -+ res <- paste(c(paste(n, "*(a1-a2) "), paste(x, "*a12", sep="")), collapse=" +") -+ su <- sum(x) -+ sig <- if(sign(su)==1) "+" else NULL -+ res <- paste(n, "*(a1-a2) ", sig, su, "*a12", sep="") -+ if(mean) res <- paste("(", res, ")/", n, sep="") -+ res -+ } -> -> del(x=Lee2008_rdd_z$z1[1:5]) -[1] "5*(a1-a2) +0.967851304699154*a12" -> delta_01_5z_S <- deltaMethod(aaa, del(x=Lee2008_rdd_z$z1[1:5]), parameterNames=paste("a", 1:12, sep=""), func="RDD") -> delta_01_5z_M <- deltaMethod(aaa, del(x=Lee2008_rdd_z$z1[1:5], mean=TRUE), parameterNames=paste("a", 1:12, sep=""), func="RDD") -> -> all.equal(unlist(rdd_p_01_5z_S), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes=FALSE) -[1] TRUE -> all.equal(unlist(rdd_p_01_5z_Sb), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes=FALSE) -[1] "Mean relative difference: 3.880226" -> all.equal(unlist(rdd_p_01_5z_M), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes=FALSE) -[1] TRUE -> all.equal(unlist(rdd_p_01_5z_Mb), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes=FALSE) -[1] TRUE -> -> ## All z: -> # all.equal(rdd_p_01_ALLz_M, rdd_p_01_ALLz_Mb, check.attributes=FALSE) -> -> #### Weighted mean!! -> w_5 <- c(0.1, 0.2, 0.4, 0.2, 0.1) -> w <- c(0.4, 0.6) -> rdd_p_01_Sid <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="identity") -> wm <- weighted.mean(rdd_p_01_Sid$fit , w=w) -> -> delta_2z_w <- deltaMethod(aaa, "0.4*(a1 - a2) + 0.4*0.2*a12+0.6*(a1 - a2) + 0.6*a12", parameterNames=paste("a", 1:12, sep="")) -> delta_2z_w2 <- deltaMethod(aaa, "1*(a1 - a2) + 0.4*0.2*a12 + 0.6*a12", parameterNames=paste("a", 1:12, sep="")) -> delta_2z_w3 <- deltaMethod(aaa, "1*(a1 - a2) + a12*(0.4*0.2 + 0.6)", parameterNames=paste("a", 1:12, sep="")) -> all(delta_2z_w==delta_2z_w2) -[1] TRUE -> all.equal(delta_2z_w, delta_2z_w3, check.attributes=FALSE) -[1] TRUE -> all.equal(delta_2z_w[1,1],wm) -[1] TRUE -> -> rdd_p_01_W_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="sum", weights=w) -Warning message: -In RDDpred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, : - Providing weights for a sum makes little sense?! -> rdd_p_01_W_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="mean", weights=w) -> all.equal(rdd_p_01_W_M$fit,wm) -[1] TRUE -> -> all.equal(unlist(rdd_p_01_W_S), drop(as.matrix(delta_2z_w2[1:2])), check.attributes=FALSE) -[1] TRUE -> all.equal(unlist(rdd_p_01_W_M), drop(as.matrix(delta_2z_w2[1:2])), check.attributes=FALSE) -[1] TRUE -> -> -> ###### 2 Z: -> df_2Z_5z <- Lee2008_rdd_z[1:5, c("z1", "z2")] -> df_2Z_5z_M <- data.frame(t(colMeans(df_2Z_5z))) -> df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w=w_5))) -> -> rdd_p_sZ_5z_S <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="sum") -> rdd_p_sZ_5z_M <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean") -> rdd_p_sZ_5z_Mb <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_M, stat="sum") -> -> rdd_p_sZ_5z_MW <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean", weights=w_5) -> rdd_p_sZ_5z_MWb <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_Mw, stat="sum") -> -> all.equal(rdd_p_sZ_5z_M, rdd_p_sZ_5z_Mb, check.attributes=FALSE) -[1] TRUE -> all.equal(rdd_p_sZ_5z_MW, rdd_p_sZ_5z_MWb, check.attributes=FALSE) -[1] TRUE -> -> proc.time() -utilisateur système écoulé - 3.550 0.650 4.251 diff --git a/tests/RDDtools_vs_rdd.Rout.save b/tests/RDDtools_vs_rdd.Rout.save deleted file mode 100644 index 2c7973a..0000000 --- a/tests/RDDtools_vs_rdd.Rout.save +++ /dev/null @@ -1,123 +0,0 @@ - -R version 2.15.2 (2012-10-26) -- "Trick or Treat" -Copyright (C) 2012 The R Foundation for Statistical Computing -ISBN 3-900051-07-0 -Platform: x86_64-pc-linux-gnu (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(rdd) -Loading required package: sandwich -Loading required package: lmtest -Loading required package: zoo - -Attaching package: 'zoo' - -The following objects are masked from 'package:base': - - as.Date, as.Date.numeric - -Loading required package: AER -Loading required package: car -Loading required package: survival -Loading required package: splines -Loading required package: Formula -> library(RDDtools) -KernSmooth 2.23 loaded -Copyright M. P. Wand 1997-2009 - -RDDtools 0.22 -PLEASE NOTE THIS is currently only a development version. -Run vignette('RDDtools') for the documentation -> -> set.seed(1234) -> x<-runif(1000,-1,1) -> cov<-rnorm(1000) -> y<-3+2*x+3*cov+10*(x>=0)+rnorm(1000) -> -> RD <- RDDdata(x=x, y=y, cutpoint=0, covar=cov) -> -> ### Simple estimation: -> bw <- IKbandwidth(X=x, Y=y, cutpoint=0) -> bw -[1] 0.6442702 -> rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]] -> RDDtools_mod <- RDDreg_np(RD, bw=bw, inference="lm") -> -> rdd_co <- coef(summary(rdd_mod)) -> RDDtools_co <- RDDcoef(RDDtools_mod, allCo=TRUE, allInfo=TRUE) -> rdd_co - Estimate Std. Error t value Pr(>|t|) -(Intercept) 2.3870103 0.3039002 7.8545857 1.670299e-14 -Tr 10.8995093 0.4071983 26.7670789 7.187232e-107 -Xl 0.3076565 1.1003584 0.2795966 7.798762e-01 -Xr 1.0007232 1.0724028 0.9331599 3.510850e-01 -> RDDtools_co - Estimate Std. Error t value Pr(>|t|) -(Intercept) 2.3870103 0.3039002 7.8545857 1.670299e-14 -D 10.8995093 0.4071983 26.7670789 7.187232e-107 -x 0.3076565 1.1003584 0.2795966 7.798762e-01 -x_right 0.6930668 1.5365013 0.4510681 6.520914e-01 -> -> all.equal(rdd_co[-4,], RDDtools_co[1:3,], check.attributes=FALSE) -[1] TRUE -> all.equal(rdd_co[4,1], sum(RDDtools_co[3:4,1]), check.attributes=FALSE) -[1] TRUE -> -> -> ### Covariate estimation: -> rdd_mod_cov <- RDestimate(y~x|cov, kernel="rectangular", bw=5, model=TRUE, se.type="const")$model[[1]] -> RDDtools_mod_cov <- RDDreg_lm(RD, bw=5, covariates="cov", covar.opt=list(slope="separate")) -> -> rdd_co_cov <- coef(summary(rdd_mod_cov)) -> RDDtools_co_cov <- RDDcoef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE) -> rdd_co_cov - Estimate Std. Error t value Pr(>|t|) -(Intercept) 2.90737195 0.09660411 30.0957385 5.649434e-142 -Tr 10.20606095 0.13062887 78.1302094 0.000000e+00 -Xl 1.81515024 0.16640546 10.9079970 3.027120e-26 -Xr 1.86396889 0.15068992 12.3695656 8.602692e-33 -cov 3.04154403 0.05189778 58.6064361 0.000000e+00 -Tr:cov -0.03728164 0.06948406 -0.5365496 5.916988e-01 -> RDDtools_co_cov - Estimate Std. Error t value Pr(>|t|) -(Intercept) 2.90737195 0.09660411 30.0957385 5.649434e-142 -D 10.20606095 0.13062887 78.1302094 0.000000e+00 -x 1.81515024 0.16640546 10.9079970 3.027120e-26 -x_right 0.04881865 0.22449550 0.2174594 8.278950e-01 -cov 3.04154403 0.05189778 58.6064361 0.000000e+00 -`cov:D` -0.03728164 0.06948406 -0.5365496 5.916988e-01 -> -> all.equal(rdd_co_cov[-4,], RDDtools_co_cov[-4,], check.attributes=FALSE) -[1] TRUE -> -> ## Fuzzy -> set.seed(123) -> selec <- rbinom(nrow(RD), 1, prob=ifelse(RD$x<0, 0.1, 0.9)) -> RD_rdd_ins <- RDDdata(y=RD$y, x=RD$x, z=selec,cutpoint=0) -> -> RDDto_reg_fuz <- RDDreg_lm(RD_rdd_ins, bw=0.2) -> rdd_reg_fuz <- RDestimate(y~x+selec, data=RD_rdd_ins, kernel="rectangular", bw=0.2, model=TRUE, se.type="const")$model[[2]][[1]] -> -> all.equal(RDDcoef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1]) -[1] TRUE -> all.equal(RDDcoef(RDDto_reg_fuz, allCo=TRUE)[1:3],coef(summary(rdd_reg_fuz))[1:3,1], check.attributes=FALSE) -[1] TRUE -> -> -> proc.time() -utilisateur système écoulé - 1.248 0.076 1.325 diff --git a/tests/packageDemo.Rout.save b/tests/packageDemo.Rout.save deleted file mode 100644 index 27473e0..0000000 --- a/tests/packageDemo.Rout.save +++ /dev/null @@ -1,1214 +0,0 @@ - -R version 2.15.2 (2012-10-26) -- "Trick or Treat" -Copyright (C) 2012 The R Foundation for Statistical Computing -ISBN 3-900051-07-0 -Platform: x86_64-pc-linux-gnu (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(RDDtools) -Loading required package: AER -Loading required package: car -Loading required package: lmtest -Loading required package: zoo - -Attaching package: 'zoo' - -The following objects are masked from 'package:base': - - as.Date, as.Date.numeric - -Loading required package: sandwich -Loading required package: survival -Loading required package: splines -KernSmooth 2.23 loaded -Copyright M. P. Wand 1997-2009 - -RDDtools 0.22 -PLEASE NOTE THIS is currently only a development version. -Run vignette('RDDtools') for the documentation -> -> -> -> -> ############################################ -> ### STEP 0: Data Manipulation -> ############################################ -> data(Lee2008) -> head(Lee2008) - x y -1 0.1049 0.5810 -2 0.1393 0.4611 -3 -0.0736 0.5434 -4 0.0868 0.5846 -5 0.3994 0.5803 -6 0.1681 0.6244 -> -> Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) -> -> head(Lee2008_rdd) - x y -1 0.1049 0.5810 -2 0.1393 0.4611 -3 -0.0736 0.5434 -4 0.0868 0.5846 -5 0.3994 0.5803 -6 0.1681 0.6244 -> -> summary(Lee2008_rdd) -### RDDdata object ### - -Cutpoint: 0 -Sample size: - -Full : 6558 - -Left : 2740 - -Right: 3818 -Covariates: no -> -> ## With covariates -> -> n_Lee <- nrow(Lee2008) -> -> set.seed(123) -> Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE)) -> Lee2008_rdd_z <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0) -> -> head(Lee2008_rdd_z ) - x y z1 z2 z3 -1 0.1049 0.5810 -0.56047565 22.19827 a -2 0.1393 0.4611 -0.23017749 20.63967 a -3 -0.0736 0.5434 1.55870831 20.66365 a -4 0.0868 0.5846 0.07050839 19.47992 c -5 0.3994 0.5803 0.12928774 20.19964 a -6 0.1681 0.6244 1.71506499 20.01448 c -> summary(Lee2008_rdd_z ) -### RDDdata object ### - -Cutpoint: 0 -Sample size: - -Full : 6558 - -Left : 2740 - -Right: 3818 -Covariates: yes -> -> ### Fuzzy -> set.seed(123) -> ins <- rbinom(n_Lee, 1, prob=ifelse(Lee2008$x<0, 0.1, 0.9)) -> Lee2008_rdd_ins <- RDDdata(y=Lee2008$y, x=Lee2008$x, z=ins,cutpoint=0) -> table(Lee2008$x<0, ins==0) - - FALSE TRUE - FALSE 3474 344 - TRUE 283 2457 -> -> ############################################ -> ### STEP 2: Graphical inspection -> ############################################ -> -> ### Plot -> plot(Lee2008_rdd) -> plot(Lee2008_rdd, nplot=3, h=c(0.02, 0.03, 0.04)) -> plot(Lee2008_rdd, nplot=1, h=0.1) -> -> plot(Lee2008_rdd, xlim=c(-0.5, 0.5)) -> -> # plot(Lee2008_rdd, xlim=c(-0.5, 0.5), type="ggplot") -> -> -> ############################################ -> ### STEP 2: Regression -> ############################################ -> -> ## few bandwidths: -> RDDbw_RSW(Lee2008_rdd) -[1] 0.03863514 -> RDDbw_IK(Lee2008_rdd) - h_opt -0.2938561 -> -> -> ###### Parametric regression ###### -> # Simple polynomial of order 1: -> reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) -> print(reg_para) -### RDD regression: parametric ### - Polynomial order: 1 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.1182314 0.0056799 20.816 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_para) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.89406 -0.06189 0.00231 0.07129 0.86396 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.432948 0.004276 101.254 < 2e-16 *** -D 0.118231 0.005680 20.816 < 2e-16 *** -x 0.296906 0.011546 25.714 < 2e-16 *** -x_right 0.045978 0.013501 3.405 0.000665 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1384 on 6554 degrees of freedom -Multiple R-squared: 0.6707, Adjusted R-squared: 0.6706 -F-statistic: 4450 on 3 and 6554 DF, p-value: < 2.2e-16 - -> plot(reg_para) -> -> all.equal(unlist(RDDpred(reg_para)), RDDcoef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE) -[1] TRUE -> -> ## Difference in means regression: -> # Simple polynomial of order 0: -> reg_para_0 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=0) -> print(reg_para_0) -### RDD regression: parametric ### - Polynomial order: 0 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.3513582 0.0041954 83.748 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_para_0) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.69788 -0.10061 -0.00360 0.09631 0.65348 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.346522 0.003201 108.25 <2e-16 *** -D 0.351358 0.004195 83.75 <2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1676 on 6556 degrees of freedom -Multiple R-squared: 0.5169, Adjusted R-squared: 0.5168 -F-statistic: 7014 on 1 and 6556 DF, p-value: < 2.2e-16 - -> plot(reg_para_0) -> -> -> ## Simple polynomial of order 4: -> reg_para4 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4) -> reg_para4 -### RDD regression: parametric ### - Polynomial order: 4 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.076590 0.013239 5.7851 7.582e-09 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> plot(reg_para4) -> all.equal(unlist(RDDpred(reg_para4)), RDDcoef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE) -[1] TRUE -> -> ## Restrict sample to bandwidth area: -> bw_ik <- RDDbw_IK(Lee2008_rdd) -> reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4) -> reg_para_ik -### RDD regression: parametric ### - Polynomial order: 4 - Slopes: separate - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.059164 0.020596 2.8726 0.004098 ** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> plot(reg_para_ik) -> -> all.equal(unlist(RDDpred(reg_para_ik)), RDDcoef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE) -[1] TRUE -> -> ## Fuzzy reg -> reg_para_fuzz <- RDDreg_lm(Lee2008_rdd_ins) -> coef(reg_para_fuzz) -(Intercept) D x x_right - 0.41796288 0.14755375 0.29778248 0.04266442 -> summary(reg_para_fuzz) - -Call: -ivreg(formula = y ~ . - ins | . - D, data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.905964 -0.070958 0.004881 0.080950 0.879820 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.417963 0.005074 82.375 < 2e-16 *** -D 0.147554 0.007430 19.860 < 2e-16 *** -x 0.297782 0.012076 24.659 < 2e-16 *** -x_right 0.042664 0.014113 3.023 0.00251 ** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.145 on 6554 degrees of freedom -Multiple R-Squared: 0.6383, Adjusted R-squared: 0.6381 -Wald test: 4051 on 3 and 6554 DF, p-value: < 2.2e-16 - -> -> ## Covariates: -> reg_para4_cov <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".") -> reg_para4_cov -### RDD regression: parametric ### - Polynomial order: 4 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.076414 0.013244 5.7697 8.302e-09 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_para4_cov) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.87348 -0.06105 0.00116 0.06744 0.71549 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.4459926 0.0193546 23.043 < 2e-16 *** -D 0.0764143 0.0132440 5.770 8.30e-09 *** -x 0.5274483 0.1580923 3.336 0.000854 *** -`x^2` 1.5439437 0.7411612 2.083 0.037277 * -`x^3` 4.2383627 1.2489711 3.393 0.000694 *** -`x^4` 3.0522056 0.6642910 4.595 4.42e-06 *** -x_right 0.0154044 0.2092056 0.074 0.941305 -`x^2_right` -2.2468013 0.9487628 -2.368 0.017907 * -`x^3_right` -3.0056391 1.5522889 -1.936 0.052879 . -`x^4_right` -3.7808696 0.8093116 -4.672 3.05e-06 *** -z1 -0.0003927 0.0016820 -0.233 0.815420 -z2 0.0005547 0.0008365 0.663 0.507323 -z3b -0.0049158 0.0040657 -1.209 0.226671 -z3c -0.0032098 0.0041445 -0.774 0.438673 ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1357 on 6544 degrees of freedom -Multiple R-squared: 0.6839, Adjusted R-squared: 0.6833 -F-statistic: 1089 on 13 and 6544 DF, p-value: < 2.2e-16 - -> -> reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate")) -> summary(reg_para4_cov_slSep) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.87319 -0.06121 0.00152 0.06788 0.71590 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.4467816 0.0275921 16.192 < 2e-16 *** -D 0.0744082 0.0365414 2.036 0.041763 * -x 0.5314429 0.1581582 3.360 0.000783 *** -`x^2` 1.5607299 0.7414043 2.105 0.035321 * -`x^3` 4.2599536 1.2492983 3.410 0.000654 *** -`x^4` 3.0604662 0.6644491 4.606 4.18e-06 *** -x_right 0.0128643 0.2092782 0.061 0.950987 -`x^2_right` -2.2682981 0.9489665 -2.390 0.016864 * -`x^3_right` -3.0229759 1.5528584 -1.947 0.051611 . -`x^4_right` -3.7900473 0.8094190 -4.682 2.89e-06 *** -z1 -0.0019210 0.0025907 -0.741 0.458419 -z2 0.0007586 0.0012911 0.588 0.556863 -z3b -0.0144320 0.0062796 -2.298 0.021580 * -z3c -0.0076795 0.0064097 -1.198 0.230918 -`z1:D` 0.0025846 0.0034062 0.759 0.448015 -`z2:D` -0.0003170 0.0016953 -0.187 0.851664 -`z3b:D` 0.0163160 0.0082404 1.980 0.047745 * -`z3c:D` 0.0077248 0.0084028 0.919 0.357967 ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1357 on 6540 degrees of freedom -Multiple R-squared: 0.6841, Adjusted R-squared: 0.6833 -F-statistic: 833.1 on 17 and 6540 DF, p-value: < 2.2e-16 - -> RDDpred(reg_para4_cov_slSep) -$fit - 2 -0.0744082 - -$se.fit -[1] 0.03654137 - -> RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1))) -$fit -[1] 0.0744082 0.0849006 0.0763094 - -$se.fit -[1] 0.03654137 0.01406868 0.01412509 - -> -> -> reg_para4_cov_startR <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual")) -> reg_para4_cov_startR -### RDD regression: parametric ### - Polynomial order: 4 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.076400 0.013238 5.7713 8.225e-09 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_para4_cov_startR) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.87278 -0.06132 0.00093 0.06743 0.71605 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) -0.096767 0.009724 -9.951 < 2e-16 *** -D 0.076400 0.013238 5.771 8.22e-09 *** -x 0.526732 0.158000 3.334 0.000862 *** -`x^2` 1.542016 0.740778 2.082 0.037416 * -`x^3` 4.237801 1.248388 3.395 0.000691 *** -`x^4` 3.053121 0.663993 4.598 4.34e-06 *** -x_right 0.017573 0.209092 0.084 0.933026 -`x^2_right` -2.251672 0.948170 -2.375 0.017589 * -`x^3_right` -2.994779 1.551609 -1.930 0.053636 . -`x^4_right` -3.786702 0.808771 -4.682 2.90e-06 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1356 on 6548 degrees of freedom -Multiple R-squared: 0.6838, Adjusted R-squared: 0.6834 -F-statistic: 1574 on 9 and 6548 DF, p-value: < 2.2e-16 - -> -> plot(reg_para4_cov) -> -> reg_para4_cov_startR_sl2 <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual", slope="separate")) -> summary(reg_para4_cov_startR_sl2) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.87001 -0.06145 0.00138 0.06728 0.71762 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.108148 0.009721 11.125 < 2e-16 *** -D -0.275377 0.013234 -20.808 < 2e-16 *** -x 0.534391 0.157954 3.383 0.000721 *** -`x^2` 1.574893 0.740561 2.127 0.033489 * -`x^3` 4.282174 1.248022 3.431 0.000605 *** -`x^4` 3.071545 0.663799 4.627 3.78e-06 *** -x_right 0.011154 0.209031 0.053 0.957445 -`x^2_right` -2.286510 0.947892 -2.412 0.015884 * -`x^3_right` -3.042340 1.551154 -1.961 0.049882 * -`x^4_right` -3.801129 0.808534 -4.701 2.64e-06 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1356 on 6548 degrees of freedom -Multiple R-squared: 0.3453, Adjusted R-squared: 0.3444 -F-statistic: 383.7 on 9 and 6548 DF, p-value: < 2.2e-16 - -> -> reg_para4_cov_2 <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z3+I(z1^2)") -> reg_para4_cov_2 -### RDD regression: parametric ### - Polynomial order: 4 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.076407 0.013244 5.7691 8.331e-09 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_para4_cov_2) - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.87470 -0.06066 0.00094 0.06743 0.71537 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.4574160 0.0101073 45.256 < 2e-16 *** -D 0.0764072 0.0132441 5.769 8.33e-09 *** -x 0.5262757 0.1580735 3.329 0.000875 *** -`x^2` 1.5416896 0.7411354 2.080 0.037549 * -`x^3` 4.2382250 1.2489588 3.393 0.000694 *** -`x^4` 3.0532625 0.6642844 4.596 4.38e-06 *** -x_right 0.0187563 0.2091417 0.090 0.928543 -`x^2_right` -2.2565435 0.9490378 -2.378 0.017449 * -`x^3_right` -2.9839277 1.5519657 -1.923 0.054564 . -`x^4_right` -3.7936046 0.8094722 -4.687 2.84e-06 *** -z3b -0.0049255 0.0040650 -1.212 0.225675 -z3c -0.0032074 0.0041431 -0.774 0.438863 -`I(z1^2)` -0.0004387 0.0011923 -0.368 0.712926 ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1357 on 6545 degrees of freedom -Multiple R-squared: 0.6839, Adjusted R-squared: 0.6833 -F-statistic: 1180 on 12 and 6545 DF, p-value: < 2.2e-16 - -> -> ###### Non-parametric regression ###### -> reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) -> print(reg_nonpara) -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Coefficient: - Estimate Std. Error z value Pr(>|z|) -D 0.079924 0.009465 8.4443 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_nonpara) -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Weighted Residuals: - Min 1Q Median 3Q Max --0.97755 -0.06721 -0.00497 0.04504 0.93761 - - Coefficient: - Estimate Std. Error z value Pr(>|z|) -D 0.079924 0.009465 8.4443 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - - Local R squared: 0.3563 -> plot(x=reg_nonpara) -> -> reg_nonpara_inflm <- RDDreg_np(RDDobject=Lee2008_rdd, inference="lm") -> print(reg_nonpara_inflm) -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.0799245 0.0068213 11.717 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_nonpara_inflm) -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Weighted Residuals: - Min 1Q Median 3Q Max --0.97755 -0.06721 -0.00497 0.04504 0.93761 - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.0799245 0.0068213 11.717 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - - Local R squared: 0.3563 -> plot(x=reg_nonpara_inflm) -> -> -> reg_nonpara_sameSl <- RDDreg_np(RDDobject=Lee2008_rdd, slope="same") -> print(reg_nonpara_sameSl) -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Coefficient: - Estimate Std. Error z value Pr(>|z|) -D 0.079779 0.009465 8.4289 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> summary(reg_nonpara_sameSl) -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Weighted Residuals: - Min 1Q Median 3Q Max --0.95353 -0.06234 0.00085 0.05138 0.96204 - - Coefficient: - Estimate Std. Error z value Pr(>|z|) -D 0.079779 0.009465 8.4289 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - - Local R squared: 0.3562 -> -> -> ###### PLOT SENSI ###### -> plSe_reg_para <- plotSensi(reg_para_ik, order=4:6) -> plSe_reg_para_fac <- plotSensi(reg_para_ik, type="facet", order=4:6) -> plSe_reg_para - bw order LATE se CI_low CI_high -1 0.1938561 4 0.07247223 0.02382386 0.025778327 0.11916613 -2 0.2438561 4 0.04629929 0.02199743 0.003185119 0.08941345 -3 0.2938561 4 0.05916354 0.02059588 0.018796358 0.09953073 -4 0.3438561 4 0.05275995 0.01937224 0.014791068 0.09072884 -5 0.3938561 4 0.05989365 0.01843283 0.023765971 0.09602133 -6 0.1938561 5 0.08018637 0.02844931 0.024426748 0.13594599 -7 0.2438561 5 0.07228197 0.02645597 0.020429214 0.12413472 -8 0.2938561 5 0.04568221 0.02486321 -0.003048781 0.09441320 -9 0.3438561 5 0.05146888 0.02340468 0.005596542 0.09734122 -10 0.3938561 5 0.04623271 0.02228736 0.002550286 0.08991513 -11 0.1938561 6 0.10243475 0.03299585 0.037764063 0.16710544 -12 0.2438561 6 0.09506766 0.03067462 0.034946512 0.15518880 -13 0.2938561 6 0.08500551 0.02891942 0.028324485 0.14168653 -14 0.3438561 6 0.06514312 0.02737691 0.011485362 0.11880089 -15 0.3938561 6 0.06054718 0.02609533 0.009401274 0.11169308 -> plSe_reg_para_fac - bw order LATE se CI_low CI_high -1 0.1938561 4 0.07247223 0.02382386 0.025778327 0.11916613 -2 0.2438561 4 0.04629929 0.02199743 0.003185119 0.08941345 -3 0.2938561 4 0.05916354 0.02059588 0.018796358 0.09953073 -4 0.3438561 4 0.05275995 0.01937224 0.014791068 0.09072884 -5 0.3938561 4 0.05989365 0.01843283 0.023765971 0.09602133 -6 0.1938561 5 0.08018637 0.02844931 0.024426748 0.13594599 -7 0.2438561 5 0.07228197 0.02645597 0.020429214 0.12413472 -8 0.2938561 5 0.04568221 0.02486321 -0.003048781 0.09441320 -9 0.3438561 5 0.05146888 0.02340468 0.005596542 0.09734122 -10 0.3938561 5 0.04623271 0.02228736 0.002550286 0.08991513 -11 0.1938561 6 0.10243475 0.03299585 0.037764063 0.16710544 -12 0.2438561 6 0.09506766 0.03067462 0.034946512 0.15518880 -13 0.2938561 6 0.08500551 0.02891942 0.028324485 0.14168653 -14 0.3438561 6 0.06514312 0.02737691 0.011485362 0.11880089 -15 0.3938561 6 0.06054718 0.02609533 0.009401274 0.11169308 -> -> -> plSe_reg_nonpara <- plotSensi(reg_nonpara) -> plSe_reg_nonpara - bw LATE se p_value CI_low CI_high -1 0.1938561 0.07369768 0.010505222 2.293943e-12 0.05310782 0.09428753 -2 0.2438561 0.07661912 0.009878428 8.750794e-15 0.05725776 0.09598049 -3 0.2938561 0.07992454 0.009464965 3.060030e-17 0.06137355 0.09847553 -4 0.3438561 0.08182321 0.009054544 1.614710e-19 0.06407663 0.09956979 -5 0.3938561 0.08398642 0.008820583 1.704675e-21 0.06669839 0.10127444 -> -> plSe_reg_nonpara_HC <- plotSensi(reg_nonpara_inflm, vcov. =function(x) vcovCluster(x, clusterVar=model.frame(x)$x)) -> plSe_reg_nonpara_HC - bw LATE se p_value CI_low CI_high -1 0.1938561 0.07369768 0.004630858 5.028543e-57 0.06462136 0.08277399 -2 0.2438561 0.07661912 0.005058104 7.835161e-52 0.06670542 0.08653283 -3 0.2938561 0.07992454 0.005387560 8.698214e-50 0.06936511 0.09048396 -4 0.3438561 0.08182321 0.005704170 1.154034e-46 0.07064324 0.09300318 -5 0.3938561 0.08398642 0.005899981 5.553777e-46 0.07242267 0.09555017 -> -> plSe_reg_para_0 <- plotSensi(reg_para_0, plot=FALSE) -> plSe_reg_para_0 - bw order LATE se CI_low CI_high -1 NA 0 0.35135822 0.004195424 0.34313534 0.35958110 -2 NA 1 0.11823144 0.005679859 0.10709913 0.12936376 -3 NA 2 0.05186868 0.008087038 0.03601838 0.06771898 -> -> plSe_reg_para_0_gg <- plotSensi(reg_para_0, plot=FALSE, output="ggplot") -> str(plSe_reg_para_0_gg) -List of 9 - $ data :'data.frame': 3 obs. of 6 variables: - ..$ bw : num [1:3] NA NA NA - ..$ order : num [1:3] 0 1 2 - ..$ LATE : num [1:3] 0.3514 0.1182 0.0519 - ..$ se : num [1:3] 0.0042 0.00568 0.00809 - ..$ CI_low : num [1:3] 0.343 0.107 0.036 - ..$ CI_high: num [1:3] 0.3596 0.1294 0.0677 - $ layers :List of 3 - ..$ :Classes 'proto', 'environment' - ..$ :Classes 'proto', 'environment' - ..$ :Classes 'proto', 'environment' - $ scales :Reference class 'Scales' [package "ggplot2"] with 1 fields - ..$ scales: list() - ..and 21 methods, of which 9 are possibly relevant: - .. add, clone, find, get_scales, has_scale, initialize, input, n, - .. non_position_scales - $ mapping :List of 2 - ..$ x: symbol order - ..$ y: symbol LATE - $ theme : list() - $ coordinates:List of 1 - ..$ limits:List of 2 - .. ..$ x: NULL - .. ..$ y: NULL - ..- attr(*, "class")= chr [1:2] "cartesian" "coord" - $ facet :List of 1 - ..$ shrink: logi TRUE - ..- attr(*, "class")= chr [1:2] "null" "facet" - $ plot_env : - $ labels :List of 4 - ..$ x : chr "order" - ..$ y : chr "LATE" - ..$ ymin: chr "CI_low" - ..$ ymax: chr "CI_high" - - attr(*, "class")= chr [1:2] "gg" "ggplot" -> -> -> ###### Post-inference: ###### -> -> clusterInf(reg_para, clusterVar=model.frame(reg_para)$x, type="df-adj") - -t test of coefficients: - - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.4329479 0.0042758 101.2544 < 2.2e-16 *** -D 0.1182314 0.0056799 20.8159 < 2.2e-16 *** -x 0.2969065 0.0115464 25.7142 < 2.2e-16 *** -x_right 0.0459776 0.0135015 3.4054 0.0006663 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -> clusterInf(reg_para, clusterVar=model.frame(reg_para)$x, type="HC") - -t test of coefficients: - - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.432948 0.014242 30.3995 < 2.2e-16 *** -D 0.118231 0.015255 7.7502 1.056e-14 *** -x 0.296906 0.063726 4.6591 3.239e-06 *** -x_right 0.045978 0.066170 0.6948 0.4872 ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -> -> -> ############################################ -> ### STEP 3: Validty tests -> ############################################ -> -> ## Placebo test: -> placeb_dat_reg_nonpara <- computePlacebo(reg_nonpara) -> -> plotPlacebo(placeb_dat_reg_nonpara) -> plotPlacebo(placeb_dat_reg_nonpara, device="base") -> -> -> plotPlaceboDens(placeb_dat_reg_nonpara) -> -> ## check invisible return: -> ptPl_reg_nonpara <- plotPlacebo(reg_nonpara, plot=FALSE) -> ptPl_reg_nonpara - cutpoint position LATE se p_value CI_low -1 -0.403200 left -0.024718935 0.016759674 1.402379e-01 -0.05756729 -2 -0.303200 left -0.006342468 0.013352797 6.347928e-01 -0.03251347 -3 -0.203200 left -0.002383527 0.012701432 8.511446e-01 -0.02727788 -4 0.000000 True 0.079924537 0.009464965 3.060030e-17 0.06137355 -5 0.163925 right 0.014895056 0.014567666 3.065567e-01 -0.01365704 -6 0.263925 right 0.005435061 0.011726100 6.430052e-01 -0.01754767 -7 0.363925 right -0.011887068 0.011410501 2.975203e-01 -0.03425124 -8 0.463925 right 0.006736746 0.011407038 5.548032e-01 -0.01562064 -9 0.563925 right 0.010152920 0.012815014 4.282047e-01 -0.01496405 - CI_high bw -1 0.008129422 0.1898052 -2 0.019828532 0.1811187 -3 0.022510822 0.1432704 -4 0.098475528 0.2938561 -5 0.043447156 0.1385116 -6 0.028417795 0.2901109 -7 0.010477102 0.3783845 -8 0.029094130 0.4458358 -9 0.035269885 0.4358020 -> -> ptPl_reg_nonpara2 <- plotPlacebo(reg_nonpara, plot=FALSE, output="ggplot") -> ptPl_reg_nonpara2 - cutpoint position LATE se p_value CI_low -1 -0.403200 left -0.024718935 0.016759674 1.402379e-01 -0.05756729 -2 -0.303200 left -0.006342468 0.013352797 6.347928e-01 -0.03251347 -3 -0.203200 left -0.002383527 0.012701432 8.511446e-01 -0.02727788 -4 0.000000 True 0.079924537 0.009464965 3.060030e-17 0.06137355 -5 0.163925 right 0.014895056 0.014567666 3.065567e-01 -0.01365704 -6 0.263925 right 0.005435061 0.011726100 6.430052e-01 -0.01754767 -7 0.363925 right -0.011887068 0.011410501 2.975203e-01 -0.03425124 -8 0.463925 right 0.006736746 0.011407038 5.548032e-01 -0.01562064 -9 0.563925 right 0.010152920 0.012815014 4.282047e-01 -0.01496405 - CI_high bw -1 0.008129422 0.1898052 -2 0.019828532 0.1811187 -3 0.022510822 0.1432704 -4 0.098475528 0.2938561 -5 0.043447156 0.1385116 -6 0.028417795 0.2901109 -7 0.010477102 0.3783845 -8 0.029094130 0.4458358 -9 0.035269885 0.4358020 -> -> # with HC: -> ptPl_reg_nonpara_HC <- plotPlacebo(reg_nonpara_inflm, vcov. =function(x) vcovCluster(x, clusterVar=model.frame(x)$x)) -> ptPl_reg_nonpara_HC - cutpoint position LATE se p_value CI_low -1 -0.403200 left -0.024718935 0.007273330 6.773866e-04 -0.038974400 -2 -0.303200 left -0.006342468 0.007828474 4.178371e-01 -0.021685995 -3 -0.203200 left -0.002383527 0.007608807 7.540839e-01 -0.017296515 -4 0.000000 True 0.079924537 0.005387560 8.698214e-50 0.069365114 -5 0.163925 right 0.014895056 0.005079721 3.365062e-03 0.004938986 -6 0.263925 right 0.005435061 0.009521907 5.681383e-01 -0.013227534 -7 0.363925 right -0.011887068 0.009213640 1.969952e-01 -0.029945470 -8 0.463925 right 0.006736746 0.009332790 4.703951e-01 -0.011555186 -9 0.563925 right 0.010152920 0.008135788 2.120555e-01 -0.005792932 - CI_high bw -1 -0.010463470 0.1898052 -2 0.009001058 0.1811187 -3 0.012529460 0.1432704 -4 0.090483960 0.2938561 -5 0.024851125 0.1385116 -6 0.024097656 0.2901109 -7 0.006171334 0.3783845 -8 0.025028678 0.4458358 -9 0.026098771 0.4358020 -> -> ptPl_reg_para_0 <- plotPlacebo(reg_para_0) -> ptPl_reg_para_0 - cutpoint position LATE se p_value CI_low CI_high bw -1 -0.403200 left 0.1499229 0.005955616 5.847699e-126 0.1382450 0.1616009 NA -2 -0.303200 left 0.1278332 0.005309990 2.549019e-116 0.1174212 0.1382452 NA -3 -0.203200 left 0.1149348 0.005369786 4.164223e-94 0.1044055 0.1254640 NA -4 0.000000 True 0.3513582 0.004195424 0.000000e+00 0.3431338 0.3595826 NA -5 0.163925 right 0.1737790 0.006081606 6.603886e-163 0.1618555 0.1857025 NA -6 0.263925 right 0.1782578 0.005230703 1.806609e-222 0.1680025 0.1885130 NA -7 0.363925 right 0.1858280 0.004966625 2.751855e-261 0.1760905 0.1955655 NA -8 0.463925 right 0.1996953 0.005054746 1.795863e-286 0.1897850 0.2096056 NA -9 0.563925 right 0.2100091 0.005441955 2.277608e-275 0.1993396 0.2206785 NA -> -> -> -> ## density tests -> dens_test(Lee2008_rdd) - - McCrary Test for no discontinuity of density around cutpoint - -data: Lee2008_rdd -z-val = 1.2952, p-value = 0.1952 -alternative hypothesis: Density is discontinuous around cutpoint -sample estimates: -Discontinuity - 0.1035008 - -> dens_test(reg_para_0, plot=FALSE) - - McCrary Test for no discontinuity of density around cutpoint - -data: reg_para_0 -z-val = 1.2952, p-value = 0.1952 -alternative hypothesis: Density is discontinuous around cutpoint -sample estimates: -Discontinuity - 0.1035008 - -> dens_test(reg_nonpara, plot=FALSE)$test.output[c("theta", "se", "z", "p", "binsize", "bw", "cutpoint")] -$theta -[1] 0.1035008 - -$se -[1] 0.07990827 - -$z -[1] 1.295245 - -$p -[1] 0.1952357 - -$binsize -[1] 0.01124348 - -$bw -[1] 0.2422787 - -$cutpoint -[1] 0 - -> -> -> ## Covariates tests -> covarTest_mean(Lee2008_rdd_z) - mean of x mean of y Difference statistic p.value -z1 0.001423447 0.006434915 0.005011469 -0.2005416 0.8410639 -z2 20.0026 19.97715 -0.02544849 0.5065413 0.6124957 -z3 1.978102 1.989785 0.01168304 -0.5762938 0.5644386 -> covarTest_mean(Lee2008_rdd_z, bw=0.1) - mean of x mean of y Difference statistic p.value -z1 0.04586551 0.04336096 -0.002504545 0.04416868 0.9647773 -z2 19.9098 20.02098 0.1111845 -0.9421677 0.3462983 -z3 1.963605 2.006329 0.04272426 -0.9146029 0.3605844 -> covarTest_dis(Lee2008_rdd_z) - statistic p.value -z1 0.02251666 0.3936811 -z2 0.02684002 0.2006513 -z3 0.007305005 0.9999956 -Warning message: -In ks.test(x[regime], x[!regime], exact = exact) : - p-value will be approximate in the presence of ties -> covarTest_dis(Lee2008_rdd_z, bw=0.1) - statistic p.value -z1 0.03544633 0.8429655 -z2 0.04718864 0.512701 -z3 0.02398646 0.9950799 -Warning message: -In ks.test(x[regime], x[!regime], exact = exact) : - p-value will be approximate in the presence of ties -> -> covarTest_mean(reg_para4_cov) - mean of x mean of y Difference statistic p.value -z1 0.001423447 0.006434915 0.005011469 -0.2005416 0.8410639 -z2 20.0026 19.97715 -0.02544849 0.5065413 0.6124957 -z3 1.978102 1.989785 0.01168304 -0.5762938 0.5644386 -> covarTest_dis(reg_para4_cov) - statistic p.value -z1 0.02251666 0.3936811 -z2 0.02684002 0.2006513 -z3 0.007305005 0.9999956 -Warning message: -In ks.test(x[regime], x[!regime], exact = exact) : - p-value will be approximate in the presence of ties -> #### as npreg -> reg_nonpara_np <- as.npreg(reg_nonpara, adjustIK_bw=FALSE) -> reg_nonpara_np - -Regression Data: 6558 training points, and 2 evaluation points, in 3 variable(s) - x D Dx -Bandwidth(s): 0.2938561 19998 19998 - -Kernel Regression Estimator: Local-Linear -Bandwidth Type: Fixed - -Continuous Kernel Type: Second-Order Gaussian -No. Continuous Explanatory Vars.: 3 - -> RDDcoef(reg_nonpara_np) -[1] 0.08329576 -> RDDcoef(reg_nonpara_np, allCo=TRUE) -[1] 0.454912436 0.083295755 0.391398059 0.004460978 -> RDDcoef(reg_nonpara_np, allInfo=TRUE) - Estimate Std. Error z value Pr(>|z|) -D 0.08329576 0.00353085 23.59085 4.784535e-123 -> RDDcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE) - Estimate Std. Error z value Pr(>|z|) -(Intercept) 0.454912436 0.001765425 257.67872 0.000000e+00 -D 0.083295755 0.003530850 23.59085 4.784535e-123 -x_left 0.391398059 0.003995962 97.94840 0.000000e+00 -x_right 0.004460978 0.003995962 97.94840 0.000000e+00 -> -> ## Compare with result obtained with a Gaussian kernel: -> bw_lm <- dnorm(Lee2008_rdd$x, sd=RDDtools:::getBW(reg_nonpara)) -> reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm) -> all.equal(RDDcoef(reg_nonpara_gaus, allCo=TRUE),RDDcoef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) -[1] TRUE -> -> -> -> #### methods -> -> regs_all <- list(reg_para=reg_para, -+ reg_para_0=reg_para_0, -+ reg_para4=reg_para4, -+ reg_para_ik=reg_para_ik, -+ reg_para_fuzz=reg_para_fuzz, -+ reg_para4_cov=reg_para4_cov, -+ reg_para4_cov_slSep=reg_para4_cov_slSep, -+ reg_para4_cov_startR=reg_para4_cov_startR, -+ reg_para4_cov_startR_sl2=reg_para4_cov_startR_sl2, -+ reg_nonpara=reg_nonpara, -+ reg_nonpara_inflm=reg_nonpara_inflm, -+ reg_nonpara_sameSl=reg_nonpara_sameSl) -> capply <- function(x){ -+ n.obs <- sapply(x, length) -+ seq.max <- seq_len(max(n.obs)) -+ t(sapply(x, "[", i = seq.max)) -+ } -> -> capply(lapply(regs_all, coef)) - (Intercept) D x x_right -reg_para 0.43294793 0.11823144 0.2969065 0.04597763 -reg_para_0 0.34652219 0.35135822 NA NA -reg_para4 0.45416747 0.07659014 0.5235953 1.52921601 -reg_para_ik 0.46217139 0.05916354 0.5914869 -0.66227641 -reg_para_fuzz 0.41796288 0.14755375 0.2977825 0.04266442 -reg_para4_cov 0.44599255 0.07641430 0.5274483 1.54394367 -reg_para4_cov_slSep 0.44678156 0.07440820 0.5314429 1.56072992 -reg_para4_cov_startR -0.09676677 0.07640039 0.5267323 1.54201574 -reg_para4_cov_startR_sl2 0.10814791 -0.27537652 0.5343906 1.57489269 -reg_nonpara 0.07992454 NA NA NA -reg_nonpara_inflm 0.07992454 NA NA NA -reg_nonpara_sameSl 0.07977915 NA NA NA - -reg_para NA NA NA NA NA -reg_para_0 NA NA NA NA NA -reg_para4 4.220147 3.045197 0.01951445 -2.233991 -2.983991 -reg_para_ik -16.108618 -41.085077 0.31568244 -2.902856 21.503533 -reg_para_fuzz NA NA NA NA NA -reg_para4_cov 4.238363 3.052206 0.01540441 -2.246801 -3.005639 -reg_para4_cov_slSep 4.259954 3.060466 0.01286431 -2.268298 -3.022976 -reg_para4_cov_startR 4.237801 3.053121 0.01757250 -2.251672 -2.994779 -reg_para4_cov_startR_sl2 4.282174 3.071545 0.01115439 -2.286510 -3.042340 -reg_nonpara NA NA NA NA NA -reg_nonpara_inflm NA NA NA NA NA -reg_nonpara_sameSl NA NA NA NA NA - -reg_para NA NA NA NA -reg_para_0 NA NA NA NA -reg_para4 -3.775626 NA NA NA -reg_para_ik 49.167026 NA NA NA -reg_para_fuzz NA NA NA NA -reg_para4_cov -3.780870 -0.0003926535 0.0005546690 -0.004915837 -reg_para4_cov_slSep -3.790047 -0.0019209726 0.0007585763 -0.014431955 -reg_para4_cov_startR -3.786702 NA NA NA -reg_para4_cov_startR_sl2 -3.801129 NA NA NA -reg_nonpara NA NA NA NA -reg_nonpara_inflm NA NA NA NA -reg_nonpara_sameSl NA NA NA NA - -reg_para NA NA NA NA -reg_para_0 NA NA NA NA -reg_para4 NA NA NA NA -reg_para_ik NA NA NA NA -reg_para_fuzz NA NA NA NA -reg_para4_cov -0.003209824 NA NA NA -reg_para4_cov_slSep -0.007679517 0.002584555 -0.0003170247 0.01631598 -reg_para4_cov_startR NA NA NA NA -reg_para4_cov_startR_sl2 NA NA NA NA -reg_nonpara NA NA NA NA -reg_nonpara_inflm NA NA NA NA -reg_nonpara_sameSl NA NA NA NA - -reg_para NA -reg_para_0 NA -reg_para4 NA -reg_para_ik NA -reg_para_fuzz NA -reg_para4_cov NA -reg_para4_cov_slSep 0.007724786 -reg_para4_cov_startR NA -reg_para4_cov_startR_sl2 NA -reg_nonpara NA -reg_nonpara_inflm NA -reg_nonpara_sameSl NA -> sapply(regs_all, RDDcoef) - reg_para reg_para_0 reg_para4 - 0.11823144 0.35135822 0.07659014 - reg_para_ik reg_para_fuzz reg_para4_cov - 0.05916354 0.14755375 0.07641430 - reg_para4_cov_slSep reg_para4_cov_startR reg_para4_cov_startR_sl2 - 0.07440820 0.07640039 -0.27537652 - reg_nonpara reg_nonpara_inflm reg_nonpara_sameSl - 0.07992454 0.07992454 0.07977915 -> RDDpred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl") -> sapply(regs_all[!names(regs_all)%in%RDDpred_issue], RDDpred) - reg_para reg_para4 reg_para_ik reg_para4_cov reg_para4_cov_slSep -fit 0.1182314 0.07659014 0.05916354 0.0764143 0.0744082 -se.fit 0.005679859 0.01323924 0.02059588 0.01324397 0.03654137 - reg_para4_cov_startR reg_para4_cov_startR_sl2 reg_nonpara_inflm -fit 0.07640039 -0.2753765 0.07992454 -se.fit 0.01323793 0.01323405 0.006821266 -> -> sapply(regs_all, RDDtools:::getCutpoint) - reg_para reg_para_0 reg_para4 - 0 0 0 - reg_para_ik reg_para_fuzz reg_para4_cov - 0 0 0 - reg_para4_cov_slSep reg_para4_cov_startR reg_para4_cov_startR_sl2 - 0 0 0 - reg_nonpara reg_nonpara_inflm reg_nonpara_sameSl - 0 0 0 -> lapply(regs_all, plotSensi, plot=FALSE) -$reg_para - bw order LATE se CI_low CI_high -1 NA 0 0.35135822 0.004195424 0.34313534 0.35958110 -2 NA 1 0.11823144 0.005679859 0.10709913 0.12936376 -3 NA 2 0.05186868 0.008087038 0.03601838 0.06771898 -4 NA 3 0.11149993 0.010654624 0.09061725 0.13238261 - -$reg_para_0 - bw order LATE se CI_low CI_high -1 NA 0 0.35135822 0.004195424 0.34313534 0.35958110 -2 NA 1 0.11823144 0.005679859 0.10709913 0.12936376 -3 NA 2 0.05186868 0.008087038 0.03601838 0.06771898 - -$reg_para4 - bw order LATE se CI_low CI_high -1 NA 0 0.35135822 0.004195424 0.34313534 0.35958110 -2 NA 1 0.11823144 0.005679859 0.10709913 0.12936376 -3 NA 2 0.05186868 0.008087038 0.03601838 0.06771898 -4 NA 3 0.11149993 0.010654624 0.09061725 0.13238261 -5 NA 4 0.07659014 0.013239238 0.05064171 0.10253857 -6 NA 5 0.04333404 0.015859294 0.01225039 0.07441768 -7 NA 6 0.06722268 0.018524698 0.03091494 0.10353042 - -$reg_para_ik - bw order LATE se CI_low CI_high -1 0.1938561 0 0.16022027 0.004798330 0.150815718 0.16962483 -2 0.2438561 0 0.17760973 0.004510194 0.168769917 0.18644955 -3 0.2938561 0 0.19564717 0.004321442 0.187177301 0.20411704 -4 0.3438561 0 0.21248892 0.004135393 0.204383701 0.22059414 -5 0.3938561 0 0.22678759 0.004030799 0.218887370 0.23468781 -6 0.1938561 1 0.07701965 0.009222181 0.058944512 0.09509480 -7 0.2438561 1 0.08196492 0.008512997 0.065279753 0.09865009 -8 0.2938561 1 0.08233778 0.008023551 0.066611911 0.09806365 -9 0.3438561 1 0.08638108 0.007597806 0.071489657 0.10127251 -10 0.3938561 1 0.08860994 0.007320947 0.074261148 0.10295873 -11 0.1938561 2 0.06844548 0.014023370 0.040960175 0.09593078 -12 0.2438561 2 0.06854083 0.012874835 0.043306620 0.09377505 -13 0.2938561 2 0.07613674 0.012090479 0.052439841 0.09983365 -14 0.3438561 2 0.07460742 0.011398876 0.052266039 0.09694881 -15 0.3938561 2 0.07653994 0.010899510 0.055177294 0.09790259 -16 0.1938561 3 0.04015671 0.018945380 0.003024450 0.07728898 -17 0.2438561 3 0.05688732 0.017417241 0.022750156 0.09102449 -18 0.2938561 3 0.05385541 0.016296871 0.021914126 0.08579669 -19 0.3438561 3 0.06444855 0.015335541 0.034391440 0.09450566 -20 0.3938561 3 0.06563911 0.014610684 0.037002693 0.09427552 -21 0.1938561 4 0.07247223 0.023823856 0.025778327 0.11916613 -22 0.2438561 4 0.04629929 0.021997428 0.003185119 0.08941345 -23 0.2938561 4 0.05916354 0.020595882 0.018796358 0.09953073 -24 0.3438561 4 0.05275995 0.019372237 0.014791068 0.09072884 -25 0.3938561 4 0.05989365 0.018432829 0.023765971 0.09602133 -26 0.1938561 5 0.08018637 0.028449309 0.024426748 0.13594599 -27 0.2438561 5 0.07228197 0.026455973 0.020429214 0.12413472 -28 0.2938561 5 0.04568221 0.024863208 -0.003048781 0.09441320 -29 0.3438561 5 0.05146888 0.023404684 0.005596542 0.09734122 -30 0.3938561 5 0.04623271 0.022287360 0.002550286 0.08991513 -31 0.1938561 6 0.10243475 0.032995854 0.037764063 0.16710544 -32 0.2438561 6 0.09506766 0.030674617 0.034946512 0.15518880 -33 0.2938561 6 0.08500551 0.028919420 0.028324485 0.14168653 -34 0.3438561 6 0.06514312 0.027376913 0.011485362 0.11880089 -35 0.3938561 6 0.06054718 0.026095329 0.009401274 0.11169308 - -$reg_para_fuzz - bw order LATE se CI_low CI_high -1 NA 0 0.4355955 0.006528241 0.4228004 0.4483906 -2 NA 1 0.1475538 0.007429542 0.1329921 0.1621154 -3 NA 2 0.0656055 0.010332691 0.0453538 0.0858572 -4 NA 3 0.1404807 0.014040362 0.1129621 0.1679993 - -$reg_para4_cov - bw order LATE se CI_low CI_high -1 NA 0 0.35142357 0.004196158 0.34319925 0.35964788 -2 NA 1 0.11827016 0.005681765 0.10713410 0.12940621 -3 NA 2 0.05189855 0.008088796 0.03604480 0.06775230 -4 NA 3 0.11134675 0.010660840 0.09045189 0.13224161 -5 NA 4 0.07641430 0.013243972 0.05045659 0.10237201 -6 NA 5 0.04315957 0.015865526 0.01206371 0.07425543 -7 NA 6 0.06694689 0.018532763 0.03062334 0.10327044 - -$reg_para4_cov_slSep - bw order LATE se CI_low CI_high -1 NA 0 0.33478449 0.04249791 0.251490112 0.4180789 -2 NA 1 0.11802512 0.03533592 0.048767990 0.1872822 -3 NA 2 0.05691513 0.03538549 -0.012439161 0.1262694 -4 NA 3 0.10861931 0.03581943 0.038414520 0.1788241 -5 NA 4 0.07440820 0.03654137 0.002788442 0.1460280 -6 NA 5 0.04510758 0.03740477 -0.028204423 0.1184196 -7 NA 6 0.06879956 0.03859513 -0.006845514 0.1444446 - -$reg_para4_cov_startR - bw order LATE se CI_low CI_high -1 NA 0 0.35138670 0.004194893 0.34316486 0.35960854 -2 NA 1 0.11831288 0.005679290 0.10718168 0.12944409 -3 NA 2 0.05190991 0.008086098 0.03606145 0.06775837 -4 NA 3 0.11141562 0.010653686 0.09053478 0.13229646 -5 NA 4 0.07640039 0.013237935 0.05045452 0.10234627 -6 NA 5 0.04317996 0.015857875 0.01209909 0.07426082 -7 NA 6 0.06694821 0.018523221 0.03064337 0.10325306 - -$reg_para4_cov_startR_sl2 - bw order LATE se CI_low CI_high -1 NA 0 -6.185850e-19 0.004193136 -0.008218395 0.008218395 -2 NA 1 -2.329820e-01 0.005676838 -0.244108359 -0.221855561 -3 NA 2 -2.992057e-01 0.008083027 -0.315048158 -0.283363275 -4 NA 3 -2.402482e-01 0.010650758 -0.261123335 -0.219373129 -5 NA 4 -2.753765e-01 0.013234053 -0.301314786 -0.249438251 -6 NA 5 -3.078751e-01 0.015854218 -0.338948842 -0.276801448 -7 NA 6 -2.843114e-01 0.018519301 -0.320608600 -0.248014273 - -$reg_nonpara - bw LATE se p_value CI_low CI_high -1 0.1938561 0.07369768 0.010505222 2.293943e-12 0.05310782 0.09428753 -2 0.2438561 0.07661912 0.009878428 8.750794e-15 0.05725776 0.09598049 -3 0.2938561 0.07992454 0.009464965 3.060030e-17 0.06137355 0.09847553 -4 0.3438561 0.08182321 0.009054544 1.614710e-19 0.06407663 0.09956979 -5 0.3938561 0.08398642 0.008820583 1.704675e-21 0.06669839 0.10127444 - -$reg_nonpara_inflm - bw LATE se p_value CI_low CI_high -1 0.1938561 0.07369768 0.008226172 6.804965e-19 0.05757468 0.08982068 -2 0.2438561 0.07661912 0.007390799 1.010948e-24 0.06213342 0.09110482 -3 0.2938561 0.07992454 0.006821266 4.467779e-31 0.06655510 0.09329397 -4 0.3438561 0.08182321 0.006393962 1.014472e-36 0.06929127 0.09435515 -5 0.3938561 0.08398642 0.006131746 8.631145e-42 0.07196841 0.09600442 - -$reg_nonpara_sameSl - bw LATE se p_value CI_low CI_high -1 0.1938561 0.07367558 0.010505222 2.328712e-12 0.05308572 0.09426543 -2 0.2438561 0.07652761 0.009878428 9.413189e-15 0.05716625 0.09588898 -3 0.2938561 0.07977915 0.009464965 3.489595e-17 0.06122816 0.09833014 -4 0.3438561 0.08161463 0.009054544 1.992826e-19 0.06386805 0.09936121 -5 0.3938561 0.08370026 0.008820583 2.328193e-21 0.06641223 0.10098828 - -> -> sapply(regs_all, function(x) dens_test(x, plot=FALSE)[c("p.value", "statistic", "estimate")]) - reg_para reg_para_0 reg_para4 reg_para_ik reg_para_fuzz -p.value 0.1952357 0.1952357 0.1952357 0.1952357 0.1952357 -statistic 1.295245 1.295245 1.295245 1.295245 1.295245 -estimate 0.1035008 0.1035008 0.1035008 0.1035008 0.1035008 - reg_para4_cov reg_para4_cov_slSep reg_para4_cov_startR -p.value 0.1952357 0.1952357 0.1952357 -statistic 1.295245 1.295245 1.295245 -estimate 0.1035008 0.1035008 0.1035008 - reg_para4_cov_startR_sl2 reg_nonpara reg_nonpara_inflm -p.value 0.1952357 0.1952357 0.1952357 -statistic 1.295245 1.295245 1.295245 -estimate 0.1035008 0.1035008 0.1035008 - reg_nonpara_sameSl -p.value 0.1952357 -statistic 1.295245 -estimate 0.1035008 -> -> -> proc.time() -utilisateur système écoulé - 11.760 0.304 12.503 diff --git a/tests/simple_MC.Rout.save b/tests/simple_MC.Rout.save deleted file mode 100644 index f4e5548..0000000 --- a/tests/simple_MC.Rout.save +++ /dev/null @@ -1,179 +0,0 @@ - -R version 2.15.2 (2012-10-26) -- "Trick or Treat" -Copyright (C) 2012 The R Foundation for Statistical Computing -ISBN 3-900051-07-0 -Platform: x86_64-pc-linux-gnu (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(RDDtools) -Loading required package: AER -Loading required package: car -Loading required package: lmtest -Loading required package: zoo - -Attaching package: 'zoo' - -The following objects are masked from 'package:base': - - as.Date, as.Date.numeric - -Loading required package: sandwich -Loading required package: survival -Loading required package: splines -KernSmooth 2.23 loaded -Copyright M. P. Wand 1997-2009 - -RDDtools 0.22 -PLEASE NOTE THIS is currently only a development version. -Run vignette('RDDtools') for the documentation -> library(rdd) -Loading required package: Formula -> -> ## simple MC: -> set.seed(123) -> -> MC_simple <- function(n=200, CATE=0.3, HATE=0.1){ -+ x <- rnorm(n, mean=20, sd=5) -+ D <- x>= 20 -+ y <- 0.8 + CATE*D+ 0.3*x+HATE*x*D+rnorm(n, sd=0.1) -+ cat("effect", CATE+HATE*20, "\n") -+ RDDdata(x=x, y=y, cutpoint=20) -+ -+ } -> -> input_mc <- MC_simple(n=1000, CATE=0.4) -effect 2.4 -> plot(input_mc) -> -> RDD_bw <- RDDbw_IK(input_mc) -> -> RDD_np_sep <- RDDreg_np(input_mc, bw=RDD_bw) -> RDD_np_same <- RDDreg_np(input_mc, slope="same", bw=RDD_bw) -> RDD_np_sep_inflm <- RDDreg_np(input_mc, bw=RDD_bw, inf="lm") -> RDD_np_same_inflm <- RDDreg_np(input_mc, slope="same", bw=RDD_bw, inf="lm") -> RDD_lm_sep <- RDDreg_lm(input_mc, bw=RDD_bw) -> RDD_lm_same <- RDDreg_lm(input_mc, slope="same", bw=RDD_bw) -> rdd_RDe <- RDestimate(y~x, data=input_mc, cutpoint=20, model=TRUE, bw=RDD_bw) -> -> -> printCoefmat(coef(summary(RDD_np_sep_inflm$RDDslot$model))) - Estimate Std. Error t value Pr(>|t|) -(Intercept) 6.7943125 0.0074768 908.722 < 2.2e-16 *** -D 2.4175554 0.0106230 227.578 < 2.2e-16 *** -x 0.2984534 0.0022980 129.876 < 2.2e-16 *** -x_right 0.1007346 0.0032831 30.683 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> printCoefmat(coef(summary(RDD_np_same_inflm$RDDslot$model))) - Estimate Std. Error t value Pr(>|t|) -(Intercept) 6.9205374 0.0088024 786.21 < 2.2e-16 *** -D 2.4225702 0.0149756 161.77 < 2.2e-16 *** -x 0.3478051 0.0023140 150.31 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> printCoefmat(coef(summary(RDD_lm_sep))) - Estimate Std. Error t value Pr(>|t|) -(Intercept) 6.7962504 0.0079252 857.552 < 2.2e-16 *** -D 2.4109453 0.0112070 215.129 < 2.2e-16 *** -x 0.2992111 0.0017938 166.802 < 2.2e-16 *** -x_right 0.1018062 0.0025548 39.849 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> printCoefmat(coef(summary(RDD_lm_same))) - Estimate Std. Error t value Pr(>|t|) -(Intercept) 6.9762180 0.0106354 655.95 < 2.2e-16 *** -D 2.4137377 0.0183016 131.89 < 2.2e-16 *** -x 0.3494005 0.0020859 167.51 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> printCoefmat(coef(summary(rdd_RDe $model[[1]]))) - Estimate Std. Error t value Pr(>|t|) -(Intercept) 6.7943125 0.0074768 908.72 < 2.2e-16 *** -Tr 2.4175554 0.0106230 227.58 < 2.2e-16 *** -Xl 0.2984534 0.0022980 129.88 < 2.2e-16 *** -Xr 0.3991880 0.0023448 170.24 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> -> -> ## few checks: -> plse <- plotSensi(RDD_np_sep, from=5, to=20, by=0.5) -> plotPlacebo(RDD_np_sep) -> -> plotSensi(RDD_np_same, from=5, to=20, by=0.5) -> plotPlacebo(RDD_np_same) -> -> a<-plotSensi(RDD_lm_sep, from=5, to=20, by=0.5) -> plotPlacebo(RDD_lm_sep) -> -> plotSensi(RDD_lm_same, from=5, to=20, by=0.5) -> plotPlacebo(RDD_lm_same) -> -> #### Other MCs: -> set.seed(123) -> head(gen_MC_IK()) - x y -1 -0.5604223 0.0192401 -2 -0.4325322 0.2071696 -3 0.4824464 0.8091620 -4 -0.3013330 0.4993961 -5 -0.2740911 0.4570206 -6 -0.1112708 0.3558237 -> -> set.seed(123) -> head(gen_MC_IK(output="RDDdata")) - x y -1 -0.5604223 0.0192401 -2 -0.4325322 0.2071696 -3 0.4824464 0.8091620 -4 -0.3013330 0.4993961 -5 -0.2740911 0.4570206 -6 -0.1112708 0.3558237 -> -> set.seed(123) -> head(gen_MC_IK(version=2)) - x y -1 -0.5604223 0.775848845 -2 -0.4325322 0.486922823 -3 0.4824464 1.011047103 -4 -0.3013330 0.416130145 -5 -0.2740911 0.317010484 -6 -0.1112708 -0.009950054 -> -> set.seed(123) -> head(gen_MC_IK(version=3)) - x y -1 -0.5604223 -3.6512588 -2 -0.4325322 -1.5947076 -3 0.4824464 0.8091620 -4 -0.3013330 -0.2635494 -5 -0.2740911 -0.1648652 -6 -0.1112708 0.2298459 -> -> set.seed(123) -> head(gen_MC_IK(version=4)) - x y -1 -0.5604223 -2.709039228 -2 -0.4325322 -1.033455253 -3 0.4824464 1.507425459 -4 -0.3013330 0.008855458 -5 -0.2740911 0.060512581 -6 -0.1112708 0.266989475 -> -> proc.time() -utilisateur système écoulé - 1.23 0.07 1.46 From 31b9f429cc644972e76d529245a2bd290a17a0fc Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 15:10:05 +0200 Subject: [PATCH 090/323] renaming of RDDtools to rddtools --- R/as.npreg.R | 2 +- man/as.npregbw.Rd | 2 +- tests/packageDemo.R | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/R/as.npreg.R b/R/as.npreg.R index ad7b9d9..035c398 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -23,7 +23,7 @@ #' RDDcoef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE) #' #' ## Compare with result obtained with a Gaussian kernel: -#' bw_lm <- dnorm(Lee2008_rdd$x, sd=RDDtools:::getBW(reg_nonpara)) +#' bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara)) #' reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm) #' all.equal(RDDcoef(reg_nonpara_gaus),RDDcoef(reg_nonpara_np)) diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index ea73541..a41ce5c 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -39,7 +39,7 @@ is to set the bandwidth for x and Dx to a large number, so that they converge to RDDcoef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE) ## Compare with result obtained with a Gaussian kernel: - bw_lm <- dnorm(Lee2008_rdd$x, sd=RDDtools:::getBW(reg_nonpara)) + bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara)) reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm) all.equal(RDDcoef(reg_nonpara_gaus),RDDcoef(reg_nonpara_np)) } diff --git a/tests/packageDemo.R b/tests/packageDemo.R index 45fd54d..ecad086 100644 --- a/tests/packageDemo.R +++ b/tests/packageDemo.R @@ -210,7 +210,7 @@ covarTest_dis(reg_para4_cov) RDDcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE) ## Compare with result obtained with a Gaussian kernel: - bw_lm <- dnorm(Lee2008_rdd$x, sd=RDDtools:::getBW(reg_nonpara)) + bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara)) reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm) all.equal(RDDcoef(reg_nonpara_gaus, allCo=TRUE),RDDcoef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) From edc176402e9e7f6b9c0ceb1da78601114fef1aa0 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 15:14:19 +0200 Subject: [PATCH 091/323] remove @includes, no collate needed --- R/bw_ROT.R | 3 --- R/reg_gen.R | 1 - R/reg_lm.R | 4 +--- R/reg_np.R | 3 +-- man/RDDbw_RSW.Rd | 1 + man/RDDreg_lm.Rd | 5 +---- 6 files changed, 4 insertions(+), 13 deletions(-) diff --git a/R/bw_ROT.R b/R/bw_ROT.R index 89beaba..3c71a28 100644 --- a/R/bw_ROT.R +++ b/R/bw_ROT.R @@ -4,9 +4,7 @@ #' #' @param object object of class RDDdata #' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} -#' @include plotBin.R #' @export -#' @author Drew Dimmery <\email{drewd@@nyu.edu}> #' @examples #' #No discontinuity @@ -51,7 +49,6 @@ ROT_bw <- function(object){ #' or for each side (\code{sided}) #' @return One (or two for \code{sided}) bandwidth value. #' @references See \code{\link[KernSmooth]{dpill}} -#' @include plotBin.R #' @seealso \code{\link{RDDbw_IK}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) #' @import KernSmooth #' @export diff --git a/R/reg_gen.R b/R/reg_gen.R index 6e036a4..923cbd9 100644 --- a/R/reg_gen.R +++ b/R/reg_gen.R @@ -22,7 +22,6 @@ #' function for the class of the object returned by \code{fun}. #' @return An object of class RDDreg_lm and class lm, with specific print and plot methods #' @references TODO -#' @include plotBin.R #' @export RDDgenreg #' @examples #' ## Step 0: prepare data diff --git a/R/reg_lm.R b/R/reg_lm.R index ed2fd63..04998d9 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -25,9 +25,7 @@ #' #' The returned object is a classical \code{lm} object, augmented with a \code{RDDslot}, so usual methods can be applied. As is done in general in R, #' heteroskeadsticity-robust inference can be done later on with the usual function from package \pkg{sandwich}. For the case of clustered observations -#' a specific function \code{\link{clusterInf}} is provided. -#' @references TODO -#' @include plotBin.R +#' a specific function \code{\link{clusterInf}} is provided. #' @import Formula #' @importFrom AER ivreg #' @export diff --git a/R/reg_np.R b/R/reg_np.R index ab7a596..7755ca1 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -11,7 +11,6 @@ #' @return An object of class RDDreg_np and class lm, with specific print and plot methods #' @seealso \code{\link{RDDbw_IK}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012) #' @references TODO -#' @include plotBin.R #' @export RDDreg_np #' @examples #' ## Step 0: prepare data @@ -22,7 +21,7 @@ #' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) #' print(reg_nonpara) #' plot(reg_nonpara) -#' + RDDreg_np <- function(RDDobject, covariates=NULL, bw=RDDbw_IK(RDDobject), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){ diff --git a/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd index 10a71e7..19606e5 100644 --- a/man/RDDbw_RSW.Rd +++ b/man/RDDbw_RSW.Rd @@ -26,6 +26,7 @@ RDDbw_RSW(rd) } \references{ See \code{\link[KernSmooth]{dpill}} +# } \seealso{ \code{\link{RDDbw_IK}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) diff --git a/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd index 97833c4..3ab6ee7 100644 --- a/man/RDDreg_lm.Rd +++ b/man/RDDreg_lm.Rd @@ -49,6 +49,7 @@ the non-parametric local kernel \code{\link{RDDreg_np}}. Similarly, weights can The returned object is a classical \code{lm} object, augmented with a \code{RDDslot}, so usual methods can be applied. As is done in general in R, heteroskeadsticity-robust inference can be done later on with the usual function from package \pkg{sandwich}. For the case of clustered observations a specific function \code{\link{clusterInf}} is provided. +# } \examples{ ## Step 0: prepare data @@ -71,8 +72,4 @@ reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4) reg_para_ik plot(reg_para_ik) } -\references{ -TODO -# -} From 407a706eb77bd6c85c64d74b34791b1c022c3ddf Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 15:24:27 +0200 Subject: [PATCH 092/323] add basic test --- tests/testthat/test_rdddata.R | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/testthat/test_rdddata.R diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R new file mode 100644 index 0000000..54a300d --- /dev/null +++ b/tests/testthat/test_rdddata.R @@ -0,0 +1,27 @@ +# test_e2r.R + +# load the decompr package +library(rddtools) + +# load the example data set +data(Lee2008) + +# create RDDdata sets +rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) +rd2 <- RDDdata(x=x, y=y, data=Lee2008, cutpoint=0) + +# define context +context("rd: output format") + +test_that("output size matches", { + expect_equal( dim(rd), c(6558, 2) ) +}) + +test_that("output values match", { + expect_equal( rd[1 ,1], 0.1049 ) + expect_equal( rd[1 ,2], 0.581 ) + expect_equal( rd[4 ,1], 0.0868 ) + expect_equal( rd[4 ,2], 0.5846 ) + expect_equal( rd[6558,1], -0.1982 ) + expect_equal( rd[6558,2], 0.802 ) +}) From 6633b5fcfa99198004a059a34075395efc4b2a70 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 15:30:38 +0200 Subject: [PATCH 093/323] no idea --- man/RDDbw_RSW.Rd | 1 - man/RDDgenreg.Rd | 1 - man/RDDreg_lm.Rd | 1 - man/RDDreg_np.Rd | 1 - man/ROT_bw.Rd | 1 - 5 files changed, 5 deletions(-) diff --git a/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd index 19606e5..10a71e7 100644 --- a/man/RDDbw_RSW.Rd +++ b/man/RDDbw_RSW.Rd @@ -26,7 +26,6 @@ RDDbw_RSW(rd) } \references{ See \code{\link[KernSmooth]{dpill}} -# } \seealso{ \code{\link{RDDbw_IK}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd index 6ff5fc1..2216092 100644 --- a/man/RDDgenreg.Rd +++ b/man/RDDgenreg.Rd @@ -58,6 +58,5 @@ summary(reg_bin_glm) } \references{ TODO -# } diff --git a/man/RDDreg_lm.Rd b/man/RDDreg_lm.Rd index 3ab6ee7..852d666 100644 --- a/man/RDDreg_lm.Rd +++ b/man/RDDreg_lm.Rd @@ -49,7 +49,6 @@ the non-parametric local kernel \code{\link{RDDreg_np}}. Similarly, weights can The returned object is a classical \code{lm} object, augmented with a \code{RDDslot}, so usual methods can be applied. As is done in general in R, heteroskeadsticity-robust inference can be done later on with the usual function from package \pkg{sandwich}. For the case of clustered observations a specific function \code{\link{clusterInf}} is provided. -# } \examples{ ## Step 0: prepare data diff --git a/man/RDDreg_np.Rd b/man/RDDreg_np.Rd index 3e60874..8d11d64 100644 --- a/man/RDDreg_np.Rd +++ b/man/RDDreg_np.Rd @@ -40,7 +40,6 @@ plot(reg_nonpara) } \references{ TODO -# } \seealso{ \code{\link{RDDbw_IK}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012) diff --git a/man/ROT_bw.Rd b/man/ROT_bw.Rd index e58ba0d..30da6cf 100644 --- a/man/ROT_bw.Rd +++ b/man/ROT_bw.Rd @@ -17,6 +17,5 @@ implements dpill } \references{ McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} -# } From 52ba07535f51e15801048bbdb63d9baee7327774 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 6 May 2015 15:31:07 +0200 Subject: [PATCH 094/323] text input method ambivalence --- tests/testthat/test_rdddata.R | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R index 54a300d..c7fd5ea 100644 --- a/tests/testthat/test_rdddata.R +++ b/tests/testthat/test_rdddata.R @@ -10,14 +10,22 @@ data(Lee2008) rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) rd2 <- RDDdata(x=x, y=y, data=Lee2008, cutpoint=0) +# define context +context("input ambivalence") + +test_that("is rd equal to rd2?", { + expect_equal( rd, rd2) +} +) + # define context context("rd: output format") -test_that("output size matches", { +test_that("rd: output dimensions match", { expect_equal( dim(rd), c(6558, 2) ) }) -test_that("output values match", { +test_that("rd: output values match", { expect_equal( rd[1 ,1], 0.1049 ) expect_equal( rd[1 ,2], 0.581 ) expect_equal( rd[4 ,1], 0.0868 ) From 53fd869d085d6afc2685a03081de589b213c4a7d Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 7 May 2015 10:48:27 +0200 Subject: [PATCH 095/323] rename and move RDDdata to rdddata and RDDcoef to rddcoef --- NAMESPACE | 26 +++++++++++----------- R/Lee2008-data.R | 2 +- R/RDDpred.R | 12 +++++----- R/Waldci.R | 2 +- R/as.npreg.R | 8 +++---- R/bw_IK.R | 4 ++-- R/bw_ROT.R | 12 +++++----- R/clusterInf.R | 2 +- R/covarTests.R | 16 ++++++------- R/dens_test.R | 4 ++-- R/gen_MC_IK.R | 12 +++++----- R/get_methods.R | 22 +++++++++--------- R/model.matrix.RDD.R | 2 +- R/placebo.R | 10 ++++----- R/plotSensi.R | 12 +++++----- R/{RDDcoef.R => rddcoef.R} | 12 +++++----- R/{RDDdata.R => rdddata.R} | 24 ++++++++++---------- R/{RDDdata_methods.R => rdddata_methods.R} | 20 ++++++++--------- R/reg_gen.R | 8 +++---- R/reg_lm.R | 6 ++--- R/reg_np.R | 10 ++++----- man/Lee2008.Rd | 2 +- man/RDDbw_IK.Rd | 4 ++-- man/RDDbw_RSW.Rd | 4 ++-- man/RDDgenreg.Rd | 6 ++--- man/RDDpred.Rd | 10 ++++----- man/RDDreg_lm.Rd | 4 ++-- man/RDDreg_np.Rd | 4 ++-- man/ROT_bw.Rd | 2 +- man/as.lm.Rd | 4 ++-- man/as.npregbw.Rd | 6 ++--- man/clusterInf.Rd | 2 +- man/covarTest_dis.Rd | 8 +++---- man/covarTest_mean.Rd | 8 +++---- man/dens_test.Rd | 4 ++-- man/gen_MC_IK.Rd | 6 ++--- man/{plot.RDDdata.Rd => plot.rdddata.Rd} | 14 ++++++------ man/plotPlacebo.Rd | 2 +- man/plotSensi.Rd | 2 +- man/{RDDcoef.Rd => rddcoef.Rd} | 14 ++++++------ man/{RDDdata.Rd => rdddata.Rd} | 18 +++++++-------- tests/testthat/test_rdddata.R | 4 ++-- vignettes/rddtools.R | 4 ++-- vignettes/rddtools.Rmd | 5 ++--- vignettes/rddtools.html | 10 ++++----- 45 files changed, 186 insertions(+), 187 deletions(-) rename R/{RDDcoef.R => rddcoef.R} (76%) rename R/{RDDdata.R => rdddata.R} (87%) rename R/{RDDdata_methods.R => rdddata_methods.R} (89%) rename man/{plot.RDDdata.Rd => plot.rdddata.Rd} (84%) rename man/{RDDcoef.Rd => rddcoef.Rd} (72%) rename man/{RDDdata.Rd => rdddata.Rd} (67%) diff --git a/NAMESPACE b/NAMESPACE index 2700657..74a05a7 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,24 +1,21 @@ # Generated by roxygen2 (4.1.1): do not edit by hand -S3method("[",RDDdata) -S3method(RDDcoef,RDDreg_np) -S3method(RDDcoef,RDDreg_npreg) -S3method(RDDcoef,default) -S3method(as.data.frame,RDDdata) +S3method("[",rdddata) +S3method(as.data.frame,rdddata) S3method(as.lm,RDDreg) S3method(as.lm,RDDreg_np) S3method(bread,RDDreg_np) -S3method(covarTest_dis,RDDdata) S3method(covarTest_dis,RDDreg) -S3method(covarTest_mean,RDDdata) +S3method(covarTest_dis,rdddata) S3method(covarTest_mean,RDDreg) +S3method(covarTest_mean,rdddata) S3method(estfun,RDDreg_np) S3method(getCall,RDDreg) S3method(model.frame,RDDreg_np) -S3method(model.matrix,RDDdata) -S3method(plot,RDDdata) +S3method(model.matrix,rdddata) S3method(plot,RDDreg_lm) S3method(plot,RDDreg_np) +S3method(plot,rdddata) S3method(plotPlacebo,PlaceboVals) S3method(plotPlacebo,RDDreg) S3method(plotPlaceboDens,PlaceboVals) @@ -28,14 +25,15 @@ S3method(plotSensi,RDDreg_np) S3method(print,RDDreg_lm) S3method(print,RDDreg_np) S3method(print,summary.RDDreg_np) -S3method(subset,RDDdata) -S3method(summary,RDDdata) +S3method(rddcoef,RDDreg_np) +S3method(rddcoef,RDDreg_npreg) +S3method(rddcoef,default) +S3method(subset,rdddata) S3method(summary,RDDreg_np) +S3method(summary,rdddata) S3method(vcov,RDDreg_np) export(RDDbw_IK) export(RDDbw_RSW) -export(RDDcoef) -export(RDDdata) export(RDDgenreg) export(RDDpred) export(RDDreg_lm) @@ -53,6 +51,8 @@ export(gen_MC_IK) export(plotPlacebo) export(plotPlaceboDens) export(plotSensi) +export(rddcoef) +export(rdddata) export(vcovCluster) export(vcovCluster2) import(Formula) diff --git a/R/Lee2008-data.R b/R/Lee2008-data.R index 173727b..0425258 100644 --- a/R/Lee2008-data.R +++ b/R/Lee2008-data.R @@ -16,7 +16,7 @@ #' \emph{Journal of Econometrics}, 142, 675-697 #' @examples #' data(Lee2008) -#' RDDlee <- RDDdata(x=x, y=y, data=Lee2008, cutpoint=0) +#' RDDlee <- rdddata(x=x, y=y, data=Lee2008, cutpoint=0) #' summary(RDDlee) #' plot(RDDlee) diff --git a/R/RDDpred.R b/R/RDDpred.R index 440deb2..ab16f97 100644 --- a/R/RDDpred.R +++ b/R/RDDpred.R @@ -1,6 +1,6 @@ #' RDD coefficient prediction #' -#' Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{RDDcoef}}) +#' Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rddcoef}}) #' @param object A RDD regression object #' @param covdata New data.frame specifying the values of the covariates, can have multiple rows. #' @param se.fit A switch indicating if standard errors are required. @@ -11,7 +11,7 @@ #' @details The function \code{RDDpred} does a simple prediction of the RDD effect #' \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)} #' When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient, -#' shown in the outputs, or obtained with \code{\link{RDDcoef}}. If there were covariates, and if these covariates were estimated using the +#' shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the #' \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e. #' had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s). #' \code{RDDpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with @@ -34,13 +34,13 @@ #' data(Lee2008) #' n_Lee <- nrow(Lee2008) #' z1 <- runif(n_Lee) -#' Lee2008_rdd <- RDDdata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0) #' -#' # estimation without covariates: RDDpred is the same than RDDcoef: +#' # estimation without covariates: RDDpred is the same than rddcoef: #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) #' #' RDDpred(reg_para) -#' RDDcoef(reg_para, allInfo=TRUE) +#' rddcoef(reg_para, allInfo=TRUE) #' #' # estimation with covariates: #' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd, @@ -127,7 +127,7 @@ RDDpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c( ## preds: if(!multiN) { - pred_point <- drop(diff(X_i%*%RDDcoef(object, allCo=TRUE))) + pred_point <- drop(diff(X_i%*%rddcoef(object, allCo=TRUE))) if(se.fit) pred_se <- sqrt(sum(c(diag(mat), -2*mat[1,2]))) } else { d <- X_i%*%coef(object) diff --git a/R/Waldci.R b/R/Waldci.R index fdb6d0c..74d5f4c 100644 --- a/R/Waldci.R +++ b/R/Waldci.R @@ -72,7 +72,7 @@ waldci.RDDreg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...){ if(!is.null(vcov.)|!is.infinite(df)) {warning("Arg 'vcov.' and 'df' only work for RDDreg with inf='lm'") } ## code recycled from stats::confint.default - co <- RDDcoef(x, allInfo=TRUE) + co <- rddcoef(x, allInfo=TRUE) a <- (1 - level)/2 a <- c(a, 1 - a) fac <- qnorm(a) diff --git a/R/as.npreg.R b/R/as.npreg.R index 035c398..4b4dd92 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -14,18 +14,18 @@ #' @examples #' # Estimate ususal RDDreg: #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) #' #' ## Convert to npreg: #' reg_nonpara_np <- as.npreg(reg_nonpara) #' reg_nonpara_np -#' RDDcoef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE) +#' rddcoef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE) #' #' ## Compare with result obtained with a Gaussian kernel: #' bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara)) #' reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm) -#' all.equal(RDDcoef(reg_nonpara_gaus),RDDcoef(reg_nonpara_np)) +#' all.equal(rddcoef(reg_nonpara_gaus),rddcoef(reg_nonpara_np)) as.npregbw <- function(x,...){ @@ -91,7 +91,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){ #' @export -RDDcoef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){ +rddcoef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){ co <- diff(object$mean) if(allInfo) { diff --git a/R/bw_IK.R b/R/bw_IK.R index 289fd5c..4f74e3c 100644 --- a/R/bw_IK.R +++ b/R/bw_IK.R @@ -3,7 +3,7 @@ #' Imbens-Kalyanaraman optimal bandwidth #' for local linear regression in Regression discontinuity designs. #' -#' @param RDDobject of class RDDdata created by \code{\link{RDDdata}} +#' @param RDDobject of class rdddata created by \code{\link{rdddata}} #' @param kernel The type of kernel used: either \code{triangular} or \code{uniform}. #' @return The optimal bandwidth #' @references Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," @@ -12,7 +12,7 @@ #' @export #' @examples #' data(Lee2008) -#' rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) +#' rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) #' RDDbw_IK(rd) diff --git a/R/bw_ROT.R b/R/bw_ROT.R index 3c71a28..ecb83fc 100644 --- a/R/bw_ROT.R +++ b/R/bw_ROT.R @@ -2,7 +2,7 @@ #' #' implements dpill #' -#' @param object object of class RDDdata +#' @param object object of class rdddata #' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} #' @export #' @examples @@ -12,7 +12,7 @@ ROT_bw <- function(object){ - if(!inherits(object, "RDDdata")) stop("Only works for RDDdata objects") + if(!inherits(object, "rdddata")) stop("Only works for rdddata objects") cutpoint <- getCutpoint(object) x <- object$x y <- object$y @@ -44,7 +44,7 @@ ROT_bw <- function(object){ #' Uses the global bandwidth selector of Ruppert, Sheather and Wand (1995) #' either to the whole function, or to the functions below and above the cutpoint. #' -#' @param object object of class RDDdata created by \code{\link{RDDdata}} +#' @param object object of class rdddata created by \code{\link{rdddata}} #' @param type Whether to choose a global bandwidth for the whole function (\code{global}) #' or for each side (\code{sided}) #' @return One (or two for \code{sided}) bandwidth value. @@ -54,7 +54,7 @@ ROT_bw <- function(object){ #' @export #' @examples #' data(Lee2008) -#' rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) +#' rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) #' RDDbw_RSW(rd) @@ -63,7 +63,7 @@ RDDbw_RSW <- function(object, type=c("global", "sided")){ type <- match.arg(type) - if(!inherits(object, "RDDdata")) stop("Only works for RDDdata objects") + if(!inherits(object, "rdddata")) stop("Only works for rdddata objects") cutpoint <- getCutpoint(object) x <- object$x y <- object$y @@ -88,7 +88,7 @@ RDDbw_RSW <- function(object, type=c("global", "sided")){ if(FALSE){ # lee_dat4 <- read.csv("/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv", header=FALSE) # head(lee_dat4) -# a<-RDDdata(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0) +# a<-rdddata(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0) # ROT_bw(object=a) # RDDbw_RSW(object=a) RDDbw_RSW(object=a, type="sided") diff --git a/R/clusterInf.R b/R/clusterInf.R index c1af134..36008ba 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -16,7 +16,7 @@ #' @import lmtest #' @examples #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) #' #' # here we just generate randomly a cluster variable: diff --git a/R/covarTests.R b/R/covarTests.R index 6d11717..d270e2c 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -2,7 +2,7 @@ #' #' Tests equality of means by a t-test for each covariate, between the two full groups or around the discontinuity threshold #' -#' @param object object of class RDDdata +#' @param object object of class rdddata #' @param bw a bandwidth #' @param paired Argument of the \code{\link{t.test}} function: logical indicating whether you want paired t-tests. #' @param var.equal Argument of the \code{\link{t.test}} function: logical variable indicating whether to treat the two variances as being equal @@ -19,7 +19,7 @@ #' Z <- data.frame(z1 = rnorm(n_Lee, sd=2), #' z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), #' z3 = sample(letters, size = n_Lee, replace = TRUE)) -#' Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) +#' Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) #' #' ## test for equality of means around cutoff: #' covarTest_mean(Lee2008_rdd_Z, bw=0.3) @@ -41,7 +41,7 @@ covarTest_mean <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p #' @rdname covarTest_mean #' @export -covarTest_mean.RDDdata <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { +covarTest_mean.rdddata <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) covar <- getCovar(object) @@ -57,7 +57,7 @@ covarTest_mean.RDDdata <- function(object, bw=NULL, paired = FALSE, var.equal = covarTest_mean.RDDreg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) - dat <- object$RDDslot$RDDdata + dat <- object$RDDslot$rdddata covar <- getCovar(dat) cutvar <- dat$x if(is.null(bw)) bw <- getBW(object) @@ -103,7 +103,7 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE, #' #' Tests equality of distribution with a Kolmogorov-Smirnov for each covariates, between the two full groups or around the discontinuity threshold #' -#' @param object object of class RDDdata +#' @param object object of class rdddata #' @param bw a bandwidth #' @param exact Argument of the \code{\link{ks.test}} function: NULL or a logical indicating whether an exact p-value should be computed. #' @param p.adjust Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function @@ -120,7 +120,7 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE, #' Z <- data.frame(z1 = rnorm(n_Lee, sd=2), #' z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), #' z3 = sample(letters, size = n_Lee, replace = TRUE)) -#' Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) +#' Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0) #' #' ## Kolmogorov-Smirnov test of equality in distribution: #' covarTest_dis(Lee2008_rdd_Z, bw=0.3) @@ -137,7 +137,7 @@ covarTest_dis <- function(object, bw, exact=NULL, p.adjust=c("none", "holm", "B #' @rdname covarTest_dis #' @export -covarTest_dis.RDDdata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { +covarTest_dis.rdddata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) covar <- getCovar(object) @@ -152,7 +152,7 @@ covarTest_dis.RDDdata <- function(object, bw=NULL, exact = FALSE, p.adjust=c("n covarTest_dis.RDDreg <- function(object, bw=NULL, exact = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) - dat <- object$RDDslot$RDDdata + dat <- object$RDDslot$rdddata covar <- getCovar(dat) cutvar <- dat$x if(is.null(bw)) bw <- getBW(object) diff --git a/R/dens_test.R b/R/dens_test.R index d43caba..1a08275 100644 --- a/R/dens_test.R +++ b/R/dens_test.R @@ -2,7 +2,7 @@ #' #' Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{RDDobject}. #' -#' @param RDDobject object of class RDDdata +#' @param RDDobject object of class rdddata #' @param bin Argument of the \code{\link{DCdensity}} function, the binwidth #' @param bw Argument of the \code{\link{DCdensity}} function, the bandwidth #' @param plot Whether to return a plot. Logical, default ot TRUE. @@ -11,7 +11,7 @@ #' @import rdd #' @examples #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' dens_test(Lee2008_rdd) diff --git a/R/gen_MC_IK.R b/R/gen_MC_IK.R index ebc4cdb..aab35e7 100644 --- a/R/gen_MC_IK.R +++ b/R/gen_MC_IK.R @@ -4,13 +4,13 @@ #' @param n The size of sampel to generate #' @param version The MC version of Imbens and Kalnayaraman (between 1 and 4). #' @param sd The standard deviation of the error term. -#' @param output Whether to return a data-frame, or already a RDDdata +#' @param output Whether to return a data-frame, or already a rdddata #' @param size The size of the effect, this depends on the specific version, defaults are as in IK: 0.04, NULL, 0.1, 0.1 #' @return An data frame with x and y variables. #' @export #' @examples #' MC1_dat <- gen_MC_IK() -#' MC1_rdd <- RDDdata(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0) +#' MC1_rdd <- rdddata(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0) #' #' ## Use np regression: #' reg_nonpara <- RDDreg_np(RDDobject=MC1_rdd) @@ -33,7 +33,7 @@ #' plotCu(version=4) #' layout(matrix(1)) -gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "RDDdata"), size){ +gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdddata"), size){ output <- match.arg(output) if(!version%in% c(1:4) |length(version) !=1) stop("arg 'version' should be between 1 and 4") @@ -51,8 +51,8 @@ gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "RDDda "4"=0.1) } res <- foo(n=n, sd=sd, size=size) - if(output=="RDDdata"){ - res <- RDDdata(x=res$x, y=res$y, cutpoint=0) + if(output=="rdddata"){ + res <- rdddata(x=res$x, y=res$y, cutpoint=0) } res } @@ -154,6 +154,6 @@ gen_MC_simple <- function(n=200, LATE=0.3){ x <- rnorm(n) D <- x>= 0 y <- 0.8 + LATE*D+ 0.3*x+0.1*x*D+rnorm(n) - RDDdata(x=x, y=y, cutpoint=0) + rdddata(x=x, y=y, cutpoint=0) } \ No newline at end of file diff --git a/R/get_methods.R b/R/get_methods.R index 818eabd..af7d670 100644 --- a/R/get_methods.R +++ b/R/get_methods.R @@ -1,12 +1,12 @@ -# checkIsRDD <- function(object) if(!inherits(object, "RDDdata")) stop("Only works for RDDdata objects") -# checkIsAnyRDD <- function(object) if(!inherits(object, c("RDDdata", "RDDreg_np"))) stop("Only works for RDDdata objects") +# checkIsRDD <- function(object) if(!inherits(object, "rdddata")) stop("Only works for rdddata objects") +# checkIsAnyRDD <- function(object) if(!inherits(object, c("rdddata", "RDDreg_np"))) stop("Only works for rdddata objects") -# function(object) if(!inherits(object, "RDDdata")) stop("Only works for RDDdata objects") +# function(object) if(!inherits(object, "rdddata")) stop("Only works for rdddata objects") checkIsAnyRDD <- checkIsRDD <- function(object) { - classesOk <- c("RDDdata", "RDDreg_np", "RDDreg_lm") - if(!inherits(object, classesOk)) stop("Only works for RDDdata objects") + classesOk <- c("rdddata", "RDDreg_np", "RDDreg_lm") + if(!inherits(object, classesOk)) stop("Only works for rdddata objects") } getType <- function(object){ @@ -56,7 +56,7 @@ infType <- function(x) { hasCovar <- function(object) UseMethod("hasCovar") -hasCovar.RDDdata <- function(object) attr(object, "hasCovar") +hasCovar.rdddata <- function(object) attr(object, "hasCovar") hasCovar.RDDreg <- function(object) { call <- getCall(object) @@ -64,7 +64,7 @@ hasCovar.RDDreg <- function(object) { } getCovar <- function(object){ - if(!inherits(object, "RDDdata")) stop("Only works for RDDdata objects") + if(!inherits(object, "rdddata")) stop("Only works for rdddata objects") if(!hasCovar(object)) stop("object has no covariates") rem <- if(isFuzzy(object)) 1:3 else 1:2 @@ -73,7 +73,7 @@ getCovar <- function(object){ } getCovarNames <- function(object){ - if(!inherits(object, "RDDdata")) stop("Only works for RDDdata objects") + if(!inherits(object, "rdddata")) stop("Only works for rdddata objects") if(!hasCovar(object)) stop("object has no covariates") rem <- if(isFuzzy(object)) 1:3 else 1:2 @@ -93,10 +93,10 @@ getOriginalX <- function(object) getOriginalX.RDDreg <- function(object){ - object$RDDslot$RDDdata[, "x"] + object$RDDslot$rdddata[, "x"] } -getOriginalX.RDDdata <- function(object){ +getOriginalX.rdddata <- function(object){ object[, "x"] } @@ -126,7 +126,7 @@ getOriginalData <- function(object, na.rm=TRUE, classRDD=TRUE) getOriginalData.RDDreg <- function(object, na.rm=TRUE, classRDD=TRUE){ - res <- object$RDDslot$RDDdata + res <- object$RDDslot$rdddata if(na.rm) res <- res[apply(res, 1, function(x) all(!is.na(x))),] # remove na rows if(!classRDD) res <- as.data.frame(res) res diff --git a/R/model.matrix.RDD.R b/R/model.matrix.RDD.R index efa3b9d..7e29855 100644 --- a/R/model.matrix.RDD.R +++ b/R/model.matrix.RDD.R @@ -1,6 +1,6 @@ #' @export -model.matrix.RDDdata <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){ +model.matrix.rdddata <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){ checkIsRDD(object) RDDobject <- object diff --git a/R/placebo.R b/R/placebo.R index 89db05f..9b1bbf7 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -10,7 +10,7 @@ #' @return A data frame containing the cutpoints, their corresponding estimates and confidence intervals. #' @examples #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd) #' plotPlacebo(reg_nonpara) #' @@ -244,11 +244,11 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_ # load the lmtest package # require("lmtest") - seq_vals[i,"LATE"] <- RDDcoef(object_new) + seq_vals[i,"LATE"] <- rddcoef(object_new) if(!is.null(vcov.)) { co <- lmtest::coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE] } else { - co <- RDDcoef(object_new, allInfo=TRUE) + co <- rddcoef(object_new, allInfo=TRUE) } seq_vals[i,"se"] <- co[,"Std. Error"] seq_vals[i,"p_value"] <- co[,4] @@ -262,10 +262,10 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_ if(!is.null(vcov.)) { true_co <- coeftest(object, vcov.=vcov.)["D",, drop=FALSE] } else { - true_co <- RDDcoef(object, allInfo=TRUE) + true_co <- rddcoef(object, allInfo=TRUE) } true_confint <- as.numeric(waldci(object, level=level, vcov.=vcov.)["D",]) - true <- data.frame(cutpoint=cutpoint, position="True", LATE=RDDcoef(object), + true <- data.frame(cutpoint=cutpoint, position="True", LATE=rddcoef(object), se=true_co["D","Std. Error"], p_value=true_co["D",4], CI_low=true_confint[1], CI_high=true_confint[2], bw=bw) diff --git a/R/plotSensi.R b/R/plotSensi.R index 754aa07..9f92b52 100644 --- a/R/plotSensi.R +++ b/R/plotSensi.R @@ -17,7 +17,7 @@ #' @import methods #' @examples #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' #' #Non-parametric estimate #' bw_ik <- RDDbw_IK(Lee2008_rdd) @@ -52,7 +52,7 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out object <- RDDregobject bw <- getBW(object) - est <- RDDcoef(object) + est <- rddcoef(object) ## set grid: if(missing(from)) from <- max(1e-3, bw-0.1) @@ -74,11 +74,11 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out object_call$bw <- seq_bw[i] object_new <- try(eval(object_call), silent=TRUE) if(!inherits(object_new, "try-error")){ - seq_vals[i,"LATE"] <- RDDcoef(object_new) + seq_vals[i,"LATE"] <- rddcoef(object_new) if(!is.null(vcov.)) { co <- coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE] } else { - co <- RDDcoef(object_new, allInfo=TRUE) + co <- rddcoef(object_new, allInfo=TRUE) } seq_vals[i,"se"] <- co[,"Std. Error"] seq_vals[i,"p_value"] <- co[,4] @@ -123,7 +123,7 @@ plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, out type <- match.arg(type) output <- match.arg(output) object <- RDDregobject - est <- RDDcoef(object) + est <- rddcoef(object) bw <- getBW(object) origOrder <- getOrder(object) hasBw <- !is.null(bw) @@ -170,7 +170,7 @@ plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, out # put output estim/se into matrix: if(!inherits(object_new, "try-error")){ - co <- RDDcoef(object_new, allInfo=TRUE) + co <- rddcoef(object_new, allInfo=TRUE) seq_vals[i+(j-1)*n_seq_bw,"LATE"] <- co[,1] seq_vals[i+(j-1)*n_seq_bw,"se"] <- co[,2] } else { diff --git a/R/RDDcoef.R b/R/rddcoef.R similarity index 76% rename from R/RDDcoef.R rename to R/rddcoef.R index c69d03e..2af0987 100644 --- a/R/RDDcoef.R +++ b/R/rddcoef.R @@ -10,21 +10,21 @@ #' @export -RDDcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) - UseMethod("RDDcoef") +rddcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...) + UseMethod("rddcoef") -#' @rdname RDDcoef +#' @rdname rddcoef #' @export -RDDcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ +rddcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res <- coef(summary(object)) if(!allCo) res <- res["D",, drop=FALSE] if(!allInfo) res <- res[,"Estimate"] res } -#' @rdname RDDcoef +#' @rdname rddcoef #' @export -RDDcoef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){ +rddcoef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){ res<- object$coefMat if(!allCo) res <- res["D",, drop=FALSE] if(!allInfo) res <- res[,"Estimate"] diff --git a/R/RDDdata.R b/R/rdddata.R similarity index 87% rename from R/RDDdata.R rename to R/rdddata.R index cabe5e6..3d3df8d 100644 --- a/R/RDDdata.R +++ b/R/rdddata.R @@ -1,4 +1,4 @@ -#' Construct RDDdata +#' Construct rdddata #' #' Construct the base RDD object, containing x, y and the cutpoint, eventuallay covariates. #' @@ -10,22 +10,22 @@ #' @param data A data-frame for the \code{x} and \code{y} variables. If this is provided, #' the column names can be entered directly for argument \code{x} and \code{y} #' @param z Assignment variable for the fuzzy case. -#' @return Object of class \code{RDDdata}, inheriting from \code{data.frame} +#' @return Object of class \code{rdddata}, inheriting from \code{data.frame} #' @export #' @examples #' data(Lee2008) -#' rd<- RDDdata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) -#' rd2 <- RDDdata(x=x, y=y, data=Lee2008, cutpoint=0) +#' rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0) +#' rd2 <- rdddata(x=x, y=y, data=Lee2008, cutpoint=0) #' #' # The print() function is the same as the print.data.frame: #' rd #' -#' # The summary() and plot() function are specific to RDDdata +#' # The summary() and plot() function are specific to rdddata #' summary(rd) #' plot(rd) -RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ +rdddata <- function(y, x, covar, cutpoint, z, labels, data){ ## check args @@ -86,7 +86,7 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ } ## return - class(RDDdat) <- c("RDDdata", "data.frame") + class(RDDdat) <- c("rdddata", "data.frame") attr(RDDdat, "hasCovar") <- hasCovar attr(RDDdat, "labels") <- labels attr(RDDdat, "cutpoint") <- cutpoint @@ -98,12 +98,12 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ ### Specific subsetting methods -# as.data.frame.RDDdata <- function(x) { +# as.data.frame.rdddata <- function(x) { # subset(x, y> # }as.data.frame.default(x) #' @export -'[.RDDdata' <- function(x,i,...){ +'[.rdddata' <- function(x,i,...){ attr_x <- attributes(x) r <- NextMethod("[", object=as.data.frame(x)) @@ -115,7 +115,7 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ attributes(r) <- attributes(r)[match(names(attr_x), names(attributes(r)))] } # newCla <- class(r) -# if(any(grepl("RDDdata", newCla))) newCla <- newCla[-grepl("RDDdata", newCla)] +# if(any(grepl("rdddata", newCla))) newCla <- newCla[-grepl("rdddata", newCla)] # print(names(attributes(newCla))) # # if(!inherits(newCla, "data.frame")) attr(r, "class")[which(attr(r, "class")=="data.frame")] <- newCla @@ -123,7 +123,7 @@ RDDdata <- function(y, x, covar, cutpoint, z, labels, data){ } #' @export -subset.RDDdata <- function (x, subset, select, drop = FALSE, ...) { +subset.rdddata <- function (x, subset, select, drop = FALSE, ...) { attr_x <- attributes(x) ### subset code: start @@ -159,7 +159,7 @@ subset.RDDdata <- function (x, subset, select, drop = FALSE, ...) { } #' @export -as.data.frame.RDDdata <- function(x,...){ +as.data.frame.rdddata <- function(x,...){ class(x) <- "data.frame" attr(x, "hasCovar") <- NULL attr(x, "labels") <- NULL diff --git a/R/RDDdata_methods.R b/R/rdddata_methods.R similarity index 89% rename from R/RDDdata_methods.R rename to R/rdddata_methods.R index 66c6336..c1cd30e 100644 --- a/R/RDDdata_methods.R +++ b/R/rdddata_methods.R @@ -2,11 +2,11 @@ ### SUMMARY method #' @export -summary.RDDdata <- function(object, ...){ +summary.rdddata <- function(object, ...){ cutpoint <- getCutpoint(object) hasCovar_eng <- ifelse(hasCovar(object), "yes", "no") - cat("### RDDdata object ###\n") + cat("### rdddata object ###\n") cat("\nCutpoint:", cutpoint, "\n") cat("Sample size:", "\n\t-Full :", nrow(object), @@ -15,11 +15,11 @@ summary.RDDdata <- function(object, ...){ cat("\nCovariates:", hasCovar_eng, "\n") } -#' Plot RDDdata +#' Plot rdddata #' #' Binned plot of the forcing and outcome variable #' -#' @param x Object of class RDDdata +#' @param x Object of class rdddata #' @param h The binwidth parameter (note this differs from the bandwidth parameter!) #' @param nbins Alternative to h, the total number of bins in the plot. #' @param xlim The range of the x data @@ -35,7 +35,7 @@ summary.RDDdata <- function(object, ...){ #' @export #' @examples #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' plot(Lee2008_rdd) #' #' ## Specify manually the bandwidth: @@ -52,7 +52,7 @@ summary.RDDdata <- function(object, ...){ ### PLOT method -plot.RDDdata <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=1, device=c("base", "ggplot"),...){ +plot.rdddata <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=1, device=c("base", "ggplot"),...){ object <- x cutpoint <- getCutpoint(object) @@ -118,7 +118,7 @@ plot.RDDdata <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex #' @seealso \code{\link{as.npreg}} which converts \code{RDDreg} objects into \code{npreg} from package \code{np}. #' @examples #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd) #' reg_para_lm <- as.lm(reg_para) #' reg_para_lm @@ -146,7 +146,7 @@ as.lm.RDDreg <- function(x) as.lm_RDD(x) -# subset.RDDdata <- function(x,...){ +# subset.rdddata <- function(x,...){ # # res <- subset.data.frame(x,...) # attributes(res) <- attributes(x) @@ -160,9 +160,9 @@ if(FALSE){ # data(Lee2008) - environment(plot.RDDdata) <- environment(RDDdata) + environment(plot.rdddata) <- environment(rdddata) - Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) + Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) plot(Lee2008_rdd) plot(Lee2008_rdd, h=0.2) diff --git a/R/reg_gen.R b/R/reg_gen.R index 923cbd9..5bd984d 100644 --- a/R/reg_gen.R +++ b/R/reg_gen.R @@ -2,7 +2,7 @@ #' #' Compute RDD estimate allowing a locally kernel weighted version of any estimation function #' possibly on the range specified by bandwidth -#' @param RDDobject Object of class RDDdata created by \code{\link{RDDdata}} +#' @param RDDobject Object of class rdddata created by \code{\link{rdddata}} #' @param covariates Formula to include covariates #' @param order Order of the polynomial regression. #' @param bw A bandwidth to specify the subset on which the kernel weighted regression is estimated @@ -18,7 +18,7 @@ #' \item A \code{weight} argument #' \item A coef(summary(x)) returning a data-frame containing a column Estimate #' } -#' Note that for the last requirement, this can be accomodated by writing a specific \code{\link{RDDcoef}} +#' Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rddcoef}} #' function for the class of the object returned by \code{fun}. #' @return An object of class RDDreg_lm and class lm, with specific print and plot methods #' @references TODO @@ -26,7 +26,7 @@ #' @examples #' ## Step 0: prepare data #' data(Lee2008) -#' Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) +#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0) #' #' ## Estimate a local probit: #' Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y - + rddtools @@ -54,7 +54,7 @@ @@ -65,10 +65,10 @@

Data Preparation and Visualisation

library(rddtools)
 data(Lee2008)

Declare the data to be a RDDdata object:

-
Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+
Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)

You can now directly summarise and visualise this data:

summary(Lee2008_rdd)
-#> ### RDDdata object ###
+#> ### rdddata object ###
 #> 
 #> Cutpoint: 0 
 #> Sample size: 
@@ -156,7 +156,7 @@ 

Discontinuity comes from covariates: covariates balance tests

Z <- data.frame(z1 = rnorm(n_Lee, sd=2), z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), z3 = sample(letters, size = n_Lee, replace = TRUE)) -Lee2008_rdd_Z <- RDDdata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)

Run the tests:

## test for equality of means around cutoff:
 covarTest_mean(Lee2008_rdd_Z, bw=0.3)

From a137961003dc21b8a462e0defdb9fea3a4418fea Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 10:49:22 +0200
Subject: [PATCH 096/323] from previous

---
 man/rddcoef.Rd | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/man/rddcoef.Rd b/man/rddcoef.Rd
index 874605b..c0346a8 100644
--- a/man/rddcoef.Rd
+++ b/man/rddcoef.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/RDDcoef.R
+% Please edit documentation in R/rddcoef.R
 \name{rddcoef}
 \alias{rddcoef}
 \alias{rddcoef.RDDreg_np}

From 73cd778a3577aeb21c8a9e945aeb634365049e7a Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 10:49:35 +0200
Subject: [PATCH 097/323] rename file

---
 R/{RDDtools.R => rddtools.R} | 0
 man/rddtools.Rd              | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename R/{RDDtools.R => rddtools.R} (100%)

diff --git a/R/RDDtools.R b/R/rddtools.R
similarity index 100%
rename from R/RDDtools.R
rename to R/rddtools.R
diff --git a/man/rddtools.Rd b/man/rddtools.Rd
index 388707d..080251d 100644
--- a/man/rddtools.Rd
+++ b/man/rddtools.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/RDDtools.R
+% Please edit documentation in R/rddtools.R
 \docType{package}
 \name{rddtools}
 \alias{rddtools}

From 6919518d7b5e7404235b1e610996e287c29720b1 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 10:56:52 +0200
Subject: [PATCH 098/323] RDDpred to rddpred

---
 NAMESPACE                      |  2 +-
 R/{RDDpred.R => rddpred.R}     | 14 +++++++-------
 man/{RDDpred.Rd => rddpred.Rd} | 20 ++++++++++----------
 3 files changed, 18 insertions(+), 18 deletions(-)
 rename R/{RDDpred.R => rddpred.R} (94%)
 rename man/{RDDpred.Rd => rddpred.Rd} (88%)

diff --git a/NAMESPACE b/NAMESPACE
index 74a05a7..b073f2a 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -35,7 +35,6 @@ S3method(vcov,RDDreg_np)
 export(RDDbw_IK)
 export(RDDbw_RSW)
 export(RDDgenreg)
-export(RDDpred)
 export(RDDreg_lm)
 export(RDDreg_np)
 export(ROT_bw)
@@ -53,6 +52,7 @@ export(plotPlaceboDens)
 export(plotSensi)
 export(rddcoef)
 export(rdddata)
+export(rddpred)
 export(vcovCluster)
 export(vcovCluster2)
 import(Formula)
diff --git a/R/RDDpred.R b/R/rddpred.R
similarity index 94%
rename from R/RDDpred.R
rename to R/rddpred.R
index ab16f97..d89a054 100644
--- a/R/RDDpred.R
+++ b/R/rddpred.R
@@ -8,13 +8,13 @@
 #' @param newdata Another data on which to evaluate the x/D variables. Useful in very few cases. 
 #' @param stat The statistic to use if there are multiple predictions, 'identity' just returns the single values, 'mean' averages them 
 #' @param weights Eventual weights for the averaging of the predicted values. 
-#' @details The function \code{RDDpred} does a simple prediction of the RDD effect
+#' @details The function \code{rddpred} does a simple prediction of the RDD effect
 #'  \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)}
 #' When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient, 
 #' shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the 
 #' \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e.
 #' had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s). 
-#' \code{RDDpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
+#' \code{rddpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
 #' the values for the covariates. Note that the effect can be evaluated at multiple points, if you provide multiple rows of \code{covdata}. 
 #'
 #' In pressence of covariate-specific RDD effect, one may wish to estimate an average effect. This can be done by setting the argument \code{stat="mean"}. 
@@ -36,10 +36,10 @@
 #' z1 <- runif(n_Lee)
 #' Lee2008_rdd <- rdddata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 #' 
-#' # estimation without covariates: RDDpred is the same than rddcoef:
+#' # estimation without covariates: rddpred is the same than rddcoef:
 #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 #' 
-#' RDDpred(reg_para)
+#' rddpred(reg_para)
 #' rddcoef(reg_para, allInfo=TRUE)
 #' 
 #' # estimation with covariates: 
@@ -48,12 +48,12 @@
 #'                           covar.opt=list(slope="separate") )
 #'
 #' # should obtain same result as with RDestimate                             
-#' RDDpred(reg_para_cov, covdata=data.frame(z1=0)) 
+#' rddpred(reg_para_cov, covdata=data.frame(z1=0)) 
 #'   
 #' # evaluate at mean of z1 (as comes from uniform)
-#' RDDpred(reg_para_cov, covdata=data.frame(z1=0.5))
+#' rddpred(reg_para_cov, covdata=data.frame(z1=0.5))
 
-RDDpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){
+rddpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){
 
   stat <- match.arg(stat)
 
diff --git a/man/RDDpred.Rd b/man/rddpred.Rd
similarity index 88%
rename from man/RDDpred.Rd
rename to man/rddpred.Rd
index bb903ca..8242e8a 100644
--- a/man/RDDpred.Rd
+++ b/man/rddpred.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/RDDpred.R
-\name{RDDpred}
-\alias{RDDpred}
+% Please edit documentation in R/rddpred.R
+\name{rddpred}
+\alias{rddpred}
 \title{RDD coefficient prediction}
 \usage{
-RDDpred(object, covdata, se.fit = TRUE, vcov. = NULL, newdata,
+rddpred(object, covdata, se.fit = TRUE, vcov. = NULL, newdata,
   stat = c("identity", "sum", "mean"), weights)
 }
 \arguments{
@@ -29,13 +29,13 @@ Returns the predicted value(s), and, if se.fit=TRUE, their standard errors.
 Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rddcoef}})
 }
 \details{
-The function \code{RDDpred} does a simple prediction of the RDD effect
+The function \code{rddpred} does a simple prediction of the RDD effect
  \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)}
 When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient,
 shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the
 \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e.
 had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s).
-\code{RDDpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
+\code{rddpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
 the values for the covariates. Note that the effect can be evaluated at multiple points, if you provide multiple rows of \code{covdata}.
 
 In pressence of covariate-specific RDD effect, one may wish to estimate an average effect. This can be done by setting the argument \code{stat="mean"}.
@@ -55,10 +55,10 @@ n_Lee <- nrow(Lee2008)
 z1 <- runif(n_Lee)
 Lee2008_rdd <- rdddata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 
-# estimation without covariates: RDDpred is the same than rddcoef:
+# estimation without covariates: rddpred is the same than rddcoef:
 reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 
-RDDpred(reg_para)
+rddpred(reg_para)
 rddcoef(reg_para, allInfo=TRUE)
 
 # estimation with covariates:
@@ -67,10 +67,10 @@ reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd,
                           covar.opt=list(slope="separate") )
 
 # should obtain same result as with RDestimate
-RDDpred(reg_para_cov, covdata=data.frame(z1=0))
+rddpred(reg_para_cov, covdata=data.frame(z1=0))
 
 # evaluate at mean of z1 (as comes from uniform)
-RDDpred(reg_para_cov, covdata=data.frame(z1=0.5))
+rddpred(reg_para_cov, covdata=data.frame(z1=0.5))
 }
 \references{
 Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024

From 68c830d1c3a9cc1abb102b31a21dec94949f608b Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:06:33 +0200
Subject: [PATCH 099/323] update to lower case, fix last call to RDDtools

---
 tests/RDDpred.R               | 70 +++++++++++++++++------------------
 tests/RDDtools_vs_rdd.R       | 12 +++---
 tests/packageDemo.R           | 34 ++++++++---------
 tests/simple_MC.R             |  4 +-
 tests/testthat/test_rdddata.R |  2 +-
 5 files changed, 61 insertions(+), 61 deletions(-)

diff --git a/tests/RDDpred.R b/tests/RDDpred.R
index 7f0c8ae..403b221 100644
--- a/tests/RDDpred.R
+++ b/tests/RDDpred.R
@@ -4,13 +4,13 @@ library(car)
 
 #### DATA
 data(Lee2008)
-Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 n_Lee <- nrow(Lee2008)
 
 set.seed(123)
 Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE))
-Lee2008_rdd_z <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
+Lee2008_rdd_z <- rdddata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 
 #### REGS
 bw_IK <- RDDbw_IK(Lee2008_rdd_z)
@@ -37,14 +37,14 @@ checkRDDmean <- function(x, n=5){
   DF_1 <- covDF[1:n,hasD, drop=FALSE]
   DF_2 <- data.frame(t(colMeans(DF_1)))
 
-  pred_1 <- RDDpred(x, covdata=DF_1, stat="mean")
-  pred_2 <- RDDpred(x, covdata=DF_2)
+  pred_1 <- rddpred(x, covdata=DF_1, stat="mean")
+  pred_2 <- rddpred(x, covdata=DF_2)
   all.equal(pred_1, pred_2, check.attributes=FALSE)
 }
 
 sapply(reg_li, checkRDDmean)
 
-sapply(reg_li, function(x) all.equal(unlist(RDDpred(x)),RDDcoef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
+sapply(reg_li, function(x) all.equal(unlist(rddpred(x)),rddcoef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
 
 
 # 
@@ -79,21 +79,21 @@ aa <- lm("y ~ D + `x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_r
 aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data=mf_2)
 # 
 # diff(coef(aaa)[2:1])
-# RDDpred(reg_para4_cov_slSep)
-# RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
+# rddpred(reg_para4_cov_slSep)
+# rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
 # 
-# RDDcoef(reg_para4_cov_slSep, allInfo=TRUE)
+# rddcoef(reg_para4_cov_slSep, allInfo=TRUE)
 
-## compare RDDpred and Delta at 1:
-rdd_p_1 <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=1))
+## compare rddpred and Delta at 1:
+rdd_p_1 <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=1))
 delta_1 <- deltaMethod(aaa, "a1 - a2 + a12", parameterNames=paste("a", 1:12, sep=""))
 rdd_p_1
 delta_1
 all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes=FALSE)
 
-## compare RDDpred and Delta at 0:
-rdd_p_0 <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
-rdd_c_0 <- RDDcoef(reg_para4_cov_slSep, allInfo=TRUE)
+## compare rddpred and Delta at 0:
+rdd_p_0 <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
+rdd_c_0 <- rddcoef(reg_para4_cov_slSep, allInfo=TRUE)
 delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames=paste("a", 1:12, sep=""))
 rdd_p_0
 rdd_c_0
@@ -101,11 +101,11 @@ delta_0
 all.equal(unlist(rdd_p_0), drop(as.matrix(delta_0[1:2])), check.attributes=FALSE)
 all.equal(unlist(rdd_p_0), drop(as.matrix(rdd_c_0[1:2])), check.attributes=FALSE)
 
-## compare RDDpred and Delta at 2 points:
-rdd_p_01_AGG <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.5)))
-rdd_p_01_all <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)))
-rdd_p_01_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="sum")
-rdd_p_01_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="mean")
+## compare rddpred and Delta at 2 points:
+rdd_p_01_AGG <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.5)))
+rdd_p_01_all <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)))
+rdd_p_01_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="sum")
+rdd_p_01_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="mean")
 
 delta_01_S <- deltaMethod(aaa, "2*(a1 - a2) +1*a12", parameterNames=paste("a", 1:12, sep=""))
 delta_01_M <- deltaMethod(aaa, "(2*(a1 - a2) +1*a12)/2", parameterNames=paste("a", 1:12, sep=""))
@@ -128,17 +128,17 @@ all.equal(rdd_p_01_M$fit, rdd_p_01_S$fit/2)
 all.equal(rdd_p_01_M$fit, rdd_p_01_AGG$fit, check.attributes=FALSE)
 all.equal(rdd_p_01_M$se.fit, rdd_p_01_AGG$se.fit, check.attributes=FALSE)
 
-## compare RDDpred and Delta at 5 first points:
+## compare rddpred and Delta at 5 first points:
 ind_z_pos <- head(which(Lee2008_rdd_z$z1>0),5)
 
-rdd_p_01_5z_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="sum")
-rdd_p_01_5z_Sb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[1:5])), stat="sum")
-rdd_p_01_5zPos_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[ind_z_pos]), stat="sum")
-rdd_p_01_5zPos_Sb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[ind_z_pos])), stat="sum")
-rdd_p_01_5z_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="mean")
-rdd_p_01_5z_Mb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1[1:5])), stat="mean")
-rdd_p_01_ALLz_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1), stat="mean")
-rdd_p_01_ALLz_Mb <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1)), stat="mean")
+rdd_p_01_5z_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="sum")
+rdd_p_01_5z_Sb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[1:5])), stat="sum")
+rdd_p_01_5zPos_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[ind_z_pos]), stat="sum")
+rdd_p_01_5zPos_Sb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[ind_z_pos])), stat="sum")
+rdd_p_01_5z_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="mean")
+rdd_p_01_5z_Mb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1[1:5])), stat="mean")
+rdd_p_01_ALLz_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1), stat="mean")
+rdd_p_01_ALLz_Mb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1)), stat="mean")
 
 del <- function(x, mean=FALSE) {
   n <- length(x)
@@ -165,7 +165,7 @@ all.equal(unlist(rdd_p_01_5z_Mb), drop(as.matrix(delta_01_5z_M[1:2])), check.att
 #### Weighted mean!!
 w_5 <- c(0.1, 0.2, 0.4, 0.2, 0.1)
 w <- c(0.4, 0.6)
-rdd_p_01_Sid <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="identity")
+rdd_p_01_Sid <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="identity")
 wm <- weighted.mean(rdd_p_01_Sid$fit , w=w)
 
 delta_2z_w <- deltaMethod(aaa, "0.4*(a1 - a2) + 0.4*0.2*a12+0.6*(a1 - a2) + 0.6*a12", parameterNames=paste("a", 1:12, sep=""))
@@ -175,8 +175,8 @@ all(delta_2z_w==delta_2z_w2)
 all.equal(delta_2z_w, delta_2z_w3, check.attributes=FALSE)
 all.equal(delta_2z_w[1,1],wm)
 
-rdd_p_01_W_S <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="sum", weights=w)
-rdd_p_01_W_M <- RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="mean", weights=w)
+rdd_p_01_W_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="sum", weights=w)
+rdd_p_01_W_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="mean", weights=w)
 all.equal(rdd_p_01_W_M$fit,wm)
 
 all.equal(unlist(rdd_p_01_W_S), drop(as.matrix(delta_2z_w2[1:2])), check.attributes=FALSE)
@@ -188,12 +188,12 @@ df_2Z_5z <- Lee2008_rdd_z[1:5, c("z1", "z2")]
 df_2Z_5z_M <- data.frame(t(colMeans(df_2Z_5z)))
 df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w=w_5)))
 
-rdd_p_sZ_5z_S <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="sum")
-rdd_p_sZ_5z_M <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean")
-rdd_p_sZ_5z_Mb <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_M, stat="sum")
+rdd_p_sZ_5z_S <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="sum")
+rdd_p_sZ_5z_M <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean")
+rdd_p_sZ_5z_Mb <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_M, stat="sum")
 
-rdd_p_sZ_5z_MW <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean", weights=w_5)
-rdd_p_sZ_5z_MWb <- RDDpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_Mw, stat="sum")
+rdd_p_sZ_5z_MW <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean", weights=w_5)
+rdd_p_sZ_5z_MWb <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_Mw, stat="sum")
 
 all.equal(rdd_p_sZ_5z_M, rdd_p_sZ_5z_Mb, check.attributes=FALSE)
 all.equal(rdd_p_sZ_5z_MW, rdd_p_sZ_5z_MWb, check.attributes=FALSE)
diff --git a/tests/RDDtools_vs_rdd.R b/tests/RDDtools_vs_rdd.R
index 9cdcaad..a974bfd 100644
--- a/tests/RDDtools_vs_rdd.R
+++ b/tests/RDDtools_vs_rdd.R
@@ -7,7 +7,7 @@ x<-runif(1000,-1,1)
 cov<-rnorm(1000)
 y<-3+2*x+3*cov+10*(x>=0)+rnorm(1000)
 
-RD <- RDDdata(x=x, y=y, cutpoint=0, covar=cov)
+RD <- rdddata(x=x, y=y, cutpoint=0, covar=cov)
 
 ### Simple estimation:
 bw <- IKbandwidth(X=x, Y=y, cutpoint=0)
@@ -16,7 +16,7 @@ rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]]
 RDDtools_mod <- RDDreg_np(RD, bw=bw, inference="lm")
 
 rdd_co <- coef(summary(rdd_mod))
-RDDtools_co <- RDDcoef(RDDtools_mod, allCo=TRUE, allInfo=TRUE)
+RDDtools_co <- rddcoef(RDDtools_mod, allCo=TRUE, allInfo=TRUE)
 rdd_co
 RDDtools_co
 
@@ -29,7 +29,7 @@ rdd_mod_cov <- RDestimate(y~x|cov, kernel="rectangular", bw=5, model=TRUE, se.ty
 RDDtools_mod_cov <- RDDreg_lm(RD, bw=5, covariates="cov", covar.opt=list(slope="separate"))
 
 rdd_co_cov <- coef(summary(rdd_mod_cov))
-RDDtools_co_cov <- RDDcoef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE)
+RDDtools_co_cov <- rddcoef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE)
 rdd_co_cov
 RDDtools_co_cov
 
@@ -38,11 +38,11 @@ all.equal(rdd_co_cov[-4,], RDDtools_co_cov[-4,], check.attributes=FALSE)
 ## Fuzzy
 set.seed(123)
 selec <- rbinom(nrow(RD), 1, prob=ifelse(RD$x<0, 0.1, 0.9))
-RD_rdd_ins <- RDDdata(y=RD$y, x=RD$x, z=selec,cutpoint=0)
+RD_rdd_ins <- rdddata(y=RD$y, x=RD$x, z=selec,cutpoint=0)
 
 RDDto_reg_fuz <- RDDreg_lm(RD_rdd_ins, bw=0.2)
 rdd_reg_fuz <- RDestimate(y~x+selec, data=RD_rdd_ins, kernel="rectangular", bw=0.2, model=TRUE, se.type="const")$model[[2]][[1]]
 
-all.equal(RDDcoef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1])
-all.equal(RDDcoef(RDDto_reg_fuz, allCo=TRUE)[1:3],coef(summary(rdd_reg_fuz))[1:3,1], check.attributes=FALSE)
+all.equal(rddcoef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1])
+all.equal(rddcoef(RDDto_reg_fuz, allCo=TRUE)[1:3],coef(summary(rdd_reg_fuz))[1:3,1], check.attributes=FALSE)
 
diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index ecad086..42e41f4 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -9,7 +9,7 @@ library(rddtools)
 data(Lee2008)
 head(Lee2008)
 
-Lee2008_rdd <- RDDdata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 head(Lee2008_rdd)
 
@@ -21,7 +21,7 @@ n_Lee <- nrow(Lee2008)
 
 set.seed(123)
 Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE))
-Lee2008_rdd_z <- RDDdata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
+Lee2008_rdd_z <- rdddata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 
 head(Lee2008_rdd_z )
 summary(Lee2008_rdd_z )
@@ -29,7 +29,7 @@ summary(Lee2008_rdd_z )
 ### Fuzzy
 set.seed(123)
 ins <- rbinom(n_Lee, 1, prob=ifelse(Lee2008$x<0, 0.1, 0.9))
-Lee2008_rdd_ins <- RDDdata(y=Lee2008$y, x=Lee2008$x, z=ins,cutpoint=0)
+Lee2008_rdd_ins <- rdddata(y=Lee2008$y, x=Lee2008$x, z=ins,cutpoint=0)
 table(Lee2008$x<0, ins==0)
 
 ############################################
@@ -62,7 +62,7 @@ print(reg_para)
 summary(reg_para)
 plot(reg_para)
 
-all.equal(unlist(RDDpred(reg_para)), RDDcoef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rddpred(reg_para)), rddcoef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Difference in means regression:
 # Simple polynomial of order 0:
@@ -76,7 +76,7 @@ plot(reg_para_0)
 reg_para4 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
 reg_para4
 plot(reg_para4)
-all.equal(unlist(RDDpred(reg_para4)), RDDcoef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rddpred(reg_para4)), rddcoef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Restrict sample to bandwidth area:
 bw_ik <- RDDbw_IK(Lee2008_rdd)
@@ -84,7 +84,7 @@ reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
 
-all.equal(unlist(RDDpred(reg_para_ik)), RDDcoef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rddpred(reg_para_ik)), rddcoef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Fuzzy reg
 reg_para_fuzz <- RDDreg_lm(Lee2008_rdd_ins)
@@ -98,8 +98,8 @@ summary(reg_para4_cov)
 
 reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
 summary(reg_para4_cov_slSep)
-RDDpred(reg_para4_cov_slSep)
-RDDpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
+rddpred(reg_para4_cov_slSep)
+rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
 
 
 reg_para4_cov_startR <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
@@ -204,15 +204,15 @@ covarTest_dis(reg_para4_cov)
 #### as npreg
   reg_nonpara_np <- as.npreg(reg_nonpara, adjustIK_bw=FALSE)
   reg_nonpara_np
-  RDDcoef(reg_nonpara_np)
-  RDDcoef(reg_nonpara_np, allCo=TRUE)
-  RDDcoef(reg_nonpara_np, allInfo=TRUE)
-  RDDcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE)
+  rddcoef(reg_nonpara_np)
+  rddcoef(reg_nonpara_np, allCo=TRUE)
+  rddcoef(reg_nonpara_np, allInfo=TRUE)
+  rddcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE)
 
 ## Compare with result obtained with a Gaussian kernel:
   bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
   reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm)
-  all.equal(RDDcoef(reg_nonpara_gaus, allCo=TRUE),RDDcoef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
+  all.equal(rddcoef(reg_nonpara_gaus, allCo=TRUE),rddcoef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
 
 
 
@@ -237,11 +237,11 @@ capply <- function(x){
 }
 
 capply(lapply(regs_all, coef))
-sapply(regs_all, RDDcoef)
-RDDpred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
-sapply(regs_all[!names(regs_all)%in%RDDpred_issue], RDDpred)
+sapply(regs_all, rddcoef)
+rddpred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
+sapply(regs_all[!names(regs_all)%in%rddpred_issue], rddpred)
 
-sapply(regs_all, RDDtools:::getCutpoint)
+sapply(regs_all, rddtools:::getCutpoint)
 lapply(regs_all, plotSensi, plot=FALSE)
 
 sapply(regs_all, function(x) dens_test(x, plot=FALSE)[c("p.value", "statistic", "estimate")])
diff --git a/tests/simple_MC.R b/tests/simple_MC.R
index 6e714b0..cf2aa6a 100644
--- a/tests/simple_MC.R
+++ b/tests/simple_MC.R
@@ -10,7 +10,7 @@ MC_simple <- function(n=200, CATE=0.3, HATE=0.1){
   D <- x>= 20
   y <- 0.8 + CATE*D+ 0.3*x+HATE*x*D+rnorm(n, sd=0.1)
   cat("effect", CATE+HATE*20, "\n")
-  RDDdata(x=x, y=y, cutpoint=20)
+  rdddata(x=x, y=y, cutpoint=20)
 
 }
 
@@ -53,7 +53,7 @@ set.seed(123)
 head(gen_MC_IK())
 
 set.seed(123)
-head(gen_MC_IK(output="RDDdata"))
+head(gen_MC_IK(output="rdddata"))
 
 set.seed(123)
 head(gen_MC_IK(version=2))
diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R
index c59ab68..bdb9a19 100644
--- a/tests/testthat/test_rdddata.R
+++ b/tests/testthat/test_rdddata.R
@@ -6,7 +6,7 @@ library(rddtools)
 # load the example data set
 data(Lee2008)
 
-# create RDDdata sets
+# create rdddata sets
 rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
 rd2 <- rdddata(x=x, y=y, data=Lee2008, cutpoint=0)
 

From 43241ef0e494fbe0b62395d0af08174987ed5ac9 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:09:08 +0200
Subject: [PATCH 100/323] rename

---
 R/{Waldci.R => waldci.R} | 0
 man/waldci.Rd            | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename R/{Waldci.R => waldci.R} (100%)

diff --git a/R/Waldci.R b/R/waldci.R
similarity index 100%
rename from R/Waldci.R
rename to R/waldci.R
diff --git a/man/waldci.Rd b/man/waldci.Rd
index 0ca60b7..84b5f76 100644
--- a/man/waldci.Rd
+++ b/man/waldci.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/Waldci.R
+% Please edit documentation in R/waldci.R
 \name{waldci}
 \alias{waldci}
 \title{Confint allowing vcov}

From b83ae6ff4f875c34c0420a4b78c317684668a00b Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:09:20 +0200
Subject: [PATCH 101/323] this time really last call

---
 tests/RDDpred.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/RDDpred.R b/tests/RDDpred.R
index 403b221..52b9870 100644
--- a/tests/RDDpred.R
+++ b/tests/RDDpred.R
@@ -14,7 +14,7 @@ Lee2008_rdd_z <- rdddata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 
 #### REGS
 bw_IK <- RDDbw_IK(Lee2008_rdd_z)
-w_IK <- RDDtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_IK)
+w_IK <- rddtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_IK)
 reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
 reg_para4_cov_slSep_W <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK)
 reg_np_cov <- RDDreg_np(RDDobject=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm")

From ff3e1996305351b52774e805b19a60356dbf1051 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:12:48 +0200
Subject: [PATCH 102/323] rename rdddata to rdd_data

---
 NAMESPACE                                 | 18 ++++++++---------
 R/Lee2008-data.R                          |  2 +-
 R/as.npreg.R                              |  2 +-
 R/bw_IK.R                                 |  4 ++--
 R/bw_ROT.R                                | 12 ++++++------
 R/clusterInf.R                            |  2 +-
 R/covarTests.R                            | 16 +++++++--------
 R/dens_test.R                             |  4 ++--
 R/gen_MC_IK.R                             | 12 ++++++------
 R/get_methods.R                           | 22 ++++++++++-----------
 R/model.matrix.RDD.R                      |  2 +-
 R/placebo.R                               |  2 +-
 R/plotSensi.R                             |  2 +-
 R/rdddata.R                               | 24 +++++++++++------------
 R/rdddata_methods.R                       | 20 +++++++++----------
 R/rddpred.R                               |  2 +-
 R/reg_gen.R                               |  6 +++---
 R/reg_lm.R                                |  6 +++---
 R/reg_np.R                                |  6 +++---
 man/Lee2008.Rd                            |  2 +-
 man/RDDbw_IK.Rd                           |  4 ++--
 man/RDDbw_RSW.Rd                          |  4 ++--
 man/RDDgenreg.Rd                          |  4 ++--
 man/RDDreg_lm.Rd                          |  4 ++--
 man/RDDreg_np.Rd                          |  4 ++--
 man/ROT_bw.Rd                             |  2 +-
 man/as.lm.Rd                              |  2 +-
 man/as.npregbw.Rd                         |  2 +-
 man/clusterInf.Rd                         |  2 +-
 man/covarTest_dis.Rd                      |  8 ++++----
 man/covarTest_mean.Rd                     |  8 ++++----
 man/dens_test.Rd                          |  4 ++--
 man/gen_MC_IK.Rd                          |  6 +++---
 man/{plot.rdddata.Rd => plot.rdd_data.Rd} | 12 ++++++------
 man/plotPlacebo.Rd                        |  2 +-
 man/plotSensi.Rd                          |  2 +-
 man/{rdddata.Rd => rdd_data.Rd}           | 16 +++++++--------
 man/rddpred.Rd                            |  2 +-
 tests/RDDpred.R                           |  4 ++--
 tests/RDDtools_vs_rdd.R                   |  4 ++--
 tests/packageDemo.R                       |  6 +++---
 tests/simple_MC.R                         |  4 ++--
 tests/testthat/test_rdddata.R             |  6 +++---
 43 files changed, 139 insertions(+), 139 deletions(-)
 rename man/{plot.rdddata.Rd => plot.rdd_data.Rd} (86%)
 rename man/{rdddata.Rd => rdd_data.Rd} (70%)

diff --git a/NAMESPACE b/NAMESPACE
index b073f2a..b1d1e9a 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,21 +1,21 @@
 # Generated by roxygen2 (4.1.1): do not edit by hand
 
-S3method("[",rdddata)
-S3method(as.data.frame,rdddata)
+S3method("[",rdd_data)
+S3method(as.data.frame,rdd_data)
 S3method(as.lm,RDDreg)
 S3method(as.lm,RDDreg_np)
 S3method(bread,RDDreg_np)
 S3method(covarTest_dis,RDDreg)
-S3method(covarTest_dis,rdddata)
+S3method(covarTest_dis,rdd_data)
 S3method(covarTest_mean,RDDreg)
-S3method(covarTest_mean,rdddata)
+S3method(covarTest_mean,rdd_data)
 S3method(estfun,RDDreg_np)
 S3method(getCall,RDDreg)
 S3method(model.frame,RDDreg_np)
-S3method(model.matrix,rdddata)
+S3method(model.matrix,rdd_data)
 S3method(plot,RDDreg_lm)
 S3method(plot,RDDreg_np)
-S3method(plot,rdddata)
+S3method(plot,rdd_data)
 S3method(plotPlacebo,PlaceboVals)
 S3method(plotPlacebo,RDDreg)
 S3method(plotPlaceboDens,PlaceboVals)
@@ -28,9 +28,9 @@ S3method(print,summary.RDDreg_np)
 S3method(rddcoef,RDDreg_np)
 S3method(rddcoef,RDDreg_npreg)
 S3method(rddcoef,default)
-S3method(subset,rdddata)
+S3method(subset,rdd_data)
 S3method(summary,RDDreg_np)
-S3method(summary,rdddata)
+S3method(summary,rdd_data)
 S3method(vcov,RDDreg_np)
 export(RDDbw_IK)
 export(RDDbw_RSW)
@@ -50,8 +50,8 @@ export(gen_MC_IK)
 export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
+export(rdd_data)
 export(rddcoef)
-export(rdddata)
 export(rddpred)
 export(vcovCluster)
 export(vcovCluster2)
diff --git a/R/Lee2008-data.R b/R/Lee2008-data.R
index 0425258..5bce681 100644
--- a/R/Lee2008-data.R
+++ b/R/Lee2008-data.R
@@ -16,7 +16,7 @@
 #' \emph{Journal of Econometrics}, 142, 675-697
 #' @examples 
 #' data(Lee2008)
-#' RDDlee <- rdddata(x=x, y=y, data=Lee2008, cutpoint=0)
+#' RDDlee <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
 #' summary(RDDlee)
 #' plot(RDDlee)
 
diff --git a/R/as.npreg.R b/R/as.npreg.R
index 4b4dd92..5b852ad 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -14,7 +14,7 @@
 #' @examples
 #' # Estimate ususal RDDreg:
 #'  data(Lee2008)
-#'  Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#'  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #'  reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd)
 #' 
 #' ## Convert to npreg:
diff --git a/R/bw_IK.R b/R/bw_IK.R
index 4f74e3c..56bb7d3 100644
--- a/R/bw_IK.R
+++ b/R/bw_IK.R
@@ -3,7 +3,7 @@
 #' Imbens-Kalyanaraman optimal bandwidth
 #' for local linear regression in Regression discontinuity designs.
 #' 
-#' @param RDDobject of class rdddata created by \code{\link{rdddata}}
+#' @param RDDobject of class rdd_data created by \code{\link{rdd_data}}
 #' @param kernel The type of kernel used: either \code{triangular} or \code{uniform}. 
 #' @return The optimal bandwidth
 #' @references Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," 
@@ -12,7 +12,7 @@
 #' @export
 #' @examples
 #' data(Lee2008)
-#' rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
+#' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
 #' RDDbw_IK(rd)
 
 
diff --git a/R/bw_ROT.R b/R/bw_ROT.R
index ecb83fc..0c6bf4a 100644
--- a/R/bw_ROT.R
+++ b/R/bw_ROT.R
@@ -2,7 +2,7 @@
 #' 
 #' implements dpill
 #' 
-#' @param object object of class rdddata
+#' @param object object of class rdd_data
 #' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005}
 #' @export
 #' @examples
@@ -12,7 +12,7 @@
 
 ROT_bw <- function(object){
 
-  if(!inherits(object, "rdddata")) stop("Only works for rdddata objects")
+  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
   cutpoint <- getCutpoint(object)
   x <- object$x
   y <- object$y
@@ -44,7 +44,7 @@ ROT_bw <- function(object){
 #' Uses the global bandwidth selector of Ruppert, Sheather and Wand (1995) 
 #' either to the whole function, or to the functions below and above the cutpoint. 
 #' 
-#' @param object object of class rdddata created by \code{\link{rdddata}}
+#' @param object object of class rdd_data created by \code{\link{rdd_data}}
 #' @param type Whether to choose a global bandwidth for the whole function (\code{global}) 
 #' or for each side (\code{sided})
 #' @return One (or two for \code{sided}) bandwidth value. 
@@ -54,7 +54,7 @@ ROT_bw <- function(object){
 #' @export
 #' @examples
 #' data(Lee2008)
-#' rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
+#' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
 #' RDDbw_RSW(rd)
 
 
@@ -63,7 +63,7 @@ RDDbw_RSW <- function(object, type=c("global", "sided")){
 
   type <- match.arg(type)
 
-  if(!inherits(object, "rdddata")) stop("Only works for rdddata objects")
+  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
   cutpoint <- getCutpoint(object)
   x <- object$x
   y <- object$y
@@ -88,7 +88,7 @@ RDDbw_RSW <- function(object, type=c("global", "sided")){
 if(FALSE){
 #   lee_dat4 <- read.csv("/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv", header=FALSE)
 #   head(lee_dat4)
-#   a<-rdddata(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0)
+#   a<-rdd_data(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0)
 # ROT_bw(object=a)
 # RDDbw_RSW(object=a)
 RDDbw_RSW(object=a, type="sided")
diff --git a/R/clusterInf.R b/R/clusterInf.R
index 36008ba..3757637 100644
--- a/R/clusterInf.R
+++ b/R/clusterInf.R
@@ -16,7 +16,7 @@
 #' @import lmtest
 #' @examples
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 #' 
 #' # here we just generate randomly a cluster variable:
diff --git a/R/covarTests.R b/R/covarTests.R
index d270e2c..c7d584a 100644
--- a/R/covarTests.R
+++ b/R/covarTests.R
@@ -2,7 +2,7 @@
 #' 
 #' Tests equality of means by a t-test for each covariate, between the two full groups or around the discontinuity threshold 
 #' 
-#' @param object object of class rdddata
+#' @param object object of class rdd_data
 #' @param bw a bandwidth
 #' @param paired Argument of the \code{\link{t.test}} function: logical indicating whether you want paired t-tests.
 #' @param var.equal Argument of the \code{\link{t.test}} function:  logical variable indicating whether to treat the two variances as being equal
@@ -19,7 +19,7 @@
 #' Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
 #'                 z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
 #'                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-#' Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+#' Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
 #' 
 #' ## test for equality of means around cutoff:
 #' covarTest_mean(Lee2008_rdd_Z, bw=0.3)
@@ -41,7 +41,7 @@ covarTest_mean <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p
 
 #' @rdname covarTest_mean
 #' @export
-covarTest_mean.rdddata <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
+covarTest_mean.rdd_data <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
 
   cutpoint <- getCutpoint(object)
   covar <- getCovar(object)
@@ -57,7 +57,7 @@ covarTest_mean.rdddata <- function(object, bw=NULL, paired = FALSE, var.equal =
 covarTest_mean.RDDreg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
   
   cutpoint <- getCutpoint(object)
-  dat <- object$RDDslot$rdddata
+  dat <- object$RDDslot$rdd_data
   covar <- getCovar(dat)
   cutvar <- dat$x
   if(is.null(bw)) bw <- getBW(object)
@@ -103,7 +103,7 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE,
 #' 
 #' Tests equality of distribution with a Kolmogorov-Smirnov for each covariates, between the two full groups or around the discontinuity threshold 
 #' 
-#' @param object object of class rdddata
+#' @param object object of class rdd_data
 #' @param bw a bandwidth
 #' @param exact Argument of the \code{\link{ks.test}} function: NULL or a logical indicating whether an exact p-value should be computed.
 #' @param p.adjust Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function
@@ -120,7 +120,7 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE,
 #' Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
 #'                 z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
 #'                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-#' Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+#' Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
 #' 
 #' ## Kolmogorov-Smirnov test of equality in distribution:
 #' covarTest_dis(Lee2008_rdd_Z, bw=0.3)
@@ -137,7 +137,7 @@ covarTest_dis <- function(object, bw,  exact=NULL, p.adjust=c("none", "holm", "B
 
 #' @rdname covarTest_dis
 #' @export
-covarTest_dis.rdddata <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
+covarTest_dis.rdd_data <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
 
   cutpoint <- getCutpoint(object)
   covar <- getCovar(object)
@@ -152,7 +152,7 @@ covarTest_dis.rdddata <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("n
 covarTest_dis.RDDreg <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
   
   cutpoint <- getCutpoint(object)
-  dat <- object$RDDslot$rdddata
+  dat <- object$RDDslot$rdd_data
   covar <- getCovar(dat)
   cutvar <- dat$x
   if(is.null(bw)) bw <- getBW(object)
diff --git a/R/dens_test.R b/R/dens_test.R
index 1a08275..00b6d57 100644
--- a/R/dens_test.R
+++ b/R/dens_test.R
@@ -2,7 +2,7 @@
 #' 
 #' Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{RDDobject}.
 #' 
-#' @param RDDobject object of class rdddata
+#' @param RDDobject object of class rdd_data
 #' @param bin Argument of the \code{\link{DCdensity}} function, the binwidth
 #' @param bw Argument of the \code{\link{DCdensity}} function, the bandwidth
 #' @param plot Whether to return a plot. Logical, default ot TRUE. 
@@ -11,7 +11,7 @@
 #' @import rdd
 #' @examples
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' dens_test(Lee2008_rdd)
 
 
diff --git a/R/gen_MC_IK.R b/R/gen_MC_IK.R
index aab35e7..b3ec8ca 100644
--- a/R/gen_MC_IK.R
+++ b/R/gen_MC_IK.R
@@ -4,13 +4,13 @@
 #' @param n The size of sampel to generate
 #' @param version The MC version of Imbens and Kalnayaraman (between 1 and 4).
 #' @param sd The standard deviation of the error term.
-#' @param output Whether to return a data-frame, or already a rdddata
+#' @param output Whether to return a data-frame, or already a rdd_data
 #' @param size The size of the effect, this depends on the specific version, defaults are as in IK: 0.04, NULL, 0.1, 0.1
 #' @return An data frame with x and y variables. 
 #' @export
 #' @examples
 #' MC1_dat <- gen_MC_IK()
-#' MC1_rdd <- rdddata(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
+#' MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
 #' 
 #' ## Use np regression:
 #' reg_nonpara <- RDDreg_np(RDDobject=MC1_rdd)
@@ -33,7 +33,7 @@
 #' plotCu(version=4)
 #' layout(matrix(1))
 
-gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdddata"), size){
+gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdd_data"), size){
  
   output <- match.arg(output)
   if(!version%in% c(1:4) |length(version) !=1) stop("arg 'version' should be between 1 and 4")
@@ -51,8 +51,8 @@ gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rddda
 		    "4"=0.1)
   }
   res <- foo(n=n, sd=sd, size=size)
-  if(output=="rdddata"){
-    res <- rdddata(x=res$x, y=res$y, cutpoint=0)
+  if(output=="rdd_data"){
+    res <- rdd_data(x=res$x, y=res$y, cutpoint=0)
   }
   res
 }
@@ -154,6 +154,6 @@ gen_MC_simple <- function(n=200, LATE=0.3){
   x <- rnorm(n)
   D <- x>= 0
   y <- 0.8 + LATE*D+ 0.3*x+0.1*x*D+rnorm(n)
-  rdddata(x=x, y=y, cutpoint=0)
+  rdd_data(x=x, y=y, cutpoint=0)
 
 }
\ No newline at end of file
diff --git a/R/get_methods.R b/R/get_methods.R
index af7d670..7373186 100644
--- a/R/get_methods.R
+++ b/R/get_methods.R
@@ -1,12 +1,12 @@
 
 
-# checkIsRDD <- function(object)  if(!inherits(object, "rdddata")) stop("Only works for rdddata objects")
-# checkIsAnyRDD <- function(object)  if(!inherits(object, c("rdddata", "RDDreg_np"))) stop("Only works for rdddata objects")
+# checkIsRDD <- function(object)  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
+# checkIsAnyRDD <- function(object)  if(!inherits(object, c("rdd_data", "RDDreg_np"))) stop("Only works for rdd_data objects")
 
-# function(object)  if(!inherits(object, "rdddata")) stop("Only works for rdddata objects")
+# function(object)  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
 checkIsAnyRDD <- checkIsRDD <- function(object)  {
-  classesOk <- c("rdddata", "RDDreg_np", "RDDreg_lm")
-  if(!inherits(object, classesOk)) stop("Only works for rdddata objects")
+  classesOk <- c("rdd_data", "RDDreg_np", "RDDreg_lm")
+  if(!inherits(object, classesOk)) stop("Only works for rdd_data objects")
 }
 
 getType <- function(object){
@@ -56,7 +56,7 @@ infType <- function(x) {
 hasCovar <- function(object)
   UseMethod("hasCovar")
 
-hasCovar.rdddata <- function(object)  attr(object, "hasCovar")
+hasCovar.rdd_data <- function(object)  attr(object, "hasCovar")
 
 hasCovar.RDDreg <- function(object) { 
   call <- getCall(object)
@@ -64,7 +64,7 @@ hasCovar.RDDreg <- function(object) {
 }
 
 getCovar <- function(object){
-  if(!inherits(object, "rdddata")) stop("Only works for rdddata objects")
+  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
   if(!hasCovar(object)) stop("object has no covariates")
   
   rem <- if(isFuzzy(object)) 1:3 else  1:2
@@ -73,7 +73,7 @@ getCovar <- function(object){
 }
 
 getCovarNames <- function(object){
-  if(!inherits(object, "rdddata")) stop("Only works for rdddata objects")
+  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
   if(!hasCovar(object)) stop("object has no covariates")
   
   rem <- if(isFuzzy(object)) 1:3 else  1:2
@@ -93,10 +93,10 @@ getOriginalX <- function(object)
 
 
 getOriginalX.RDDreg <- function(object){
-  object$RDDslot$rdddata[, "x"]
+  object$RDDslot$rdd_data[, "x"]
 }
 
-getOriginalX.rdddata <- function(object){
+getOriginalX.rdd_data <- function(object){
   object[, "x"]
 }
 
@@ -126,7 +126,7 @@ getOriginalData <- function(object, na.rm=TRUE, classRDD=TRUE)
 
 
 getOriginalData.RDDreg <- function(object, na.rm=TRUE, classRDD=TRUE){
-  res <- object$RDDslot$rdddata
+  res <- object$RDDslot$rdd_data
   if(na.rm) res <- res[apply(res, 1, function(x) all(!is.na(x))),] # remove na rows
   if(!classRDD) res <- as.data.frame(res)
   res
diff --git a/R/model.matrix.RDD.R b/R/model.matrix.RDD.R
index 7e29855..763560c 100644
--- a/R/model.matrix.RDD.R
+++ b/R/model.matrix.RDD.R
@@ -1,6 +1,6 @@
 #' @export
 
-model.matrix.rdddata <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){
+model.matrix.rdd_data <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){
 
   checkIsRDD(object)
   RDDobject <- object
diff --git a/R/placebo.R b/R/placebo.R
index 9b1bbf7..5e39104 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -10,7 +10,7 @@
 #' @return A data frame containing the cutpoints, their corresponding estimates and confidence intervals. 
 #' @examples
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd)
 #' plotPlacebo(reg_nonpara)
 #' 
diff --git a/R/plotSensi.R b/R/plotSensi.R
index 9f92b52..87ce966 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -17,7 +17,7 @@
 #' @import methods
 #' @examples
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' 
 #' #Non-parametric estimate 
 #' bw_ik <- RDDbw_IK(Lee2008_rdd)
diff --git a/R/rdddata.R b/R/rdddata.R
index 3d3df8d..85623a6 100644
--- a/R/rdddata.R
+++ b/R/rdddata.R
@@ -1,4 +1,4 @@
-#' Construct rdddata
+#' Construct rdd_data
 #' 
 #' Construct the base RDD object, containing x, y and the cutpoint, eventuallay covariates. 
 #' 
@@ -10,22 +10,22 @@
 #' @param data A data-frame for the \code{x} and \code{y} variables. If this is provided, 
 #' the column names can be entered directly for argument \code{x} and \code{y}
 #' @param z Assignment variable for the fuzzy case. 
-#' @return Object of class \code{rdddata}, inheriting from \code{data.frame}
+#' @return Object of class \code{rdd_data}, inheriting from \code{data.frame}
 #' @export
 #' @examples
 #' data(Lee2008)
-#' rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-#' rd2 <- rdddata(x=x, y=y, data=Lee2008, cutpoint=0)
+#' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
+#' rd2 <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
 #' 
 #' # The print() function is the same as the print.data.frame:
 #' rd
 #'
-#' # The summary() and plot() function are specific to rdddata
+#' # The summary() and plot() function are specific to rdd_data
 #' summary(rd)
 #' plot(rd)
 
 
-rdddata <- function(y, x, covar, cutpoint, z, labels, data){
+rdd_data <- function(y, x, covar, cutpoint, z, labels, data){
 
   
 ## check args
@@ -86,7 +86,7 @@ rdddata <- function(y, x, covar, cutpoint, z, labels, data){
   }
 
 ## return
-  class(RDDdat) <- c("rdddata", "data.frame")
+  class(RDDdat) <- c("rdd_data", "data.frame")
   attr(RDDdat, "hasCovar") <- hasCovar
   attr(RDDdat, "labels") <- labels
   attr(RDDdat, "cutpoint") <- cutpoint
@@ -98,12 +98,12 @@ rdddata <- function(y, x, covar, cutpoint, z, labels, data){
 
 ### Specific subsetting methods
 
-# as.data.frame.rdddata <- function(x) {
+# as.data.frame.rdd_data <- function(x) {
 # subset(x, y>
 # }as.data.frame.default(x)
 
 #' @export
-'[.rdddata' <- function(x,i,...){
+'[.rdd_data' <- function(x,i,...){
   attr_x <- attributes(x)
   r <- NextMethod("[", object=as.data.frame(x))
 
@@ -115,7 +115,7 @@ rdddata <- function(y, x, covar, cutpoint, z, labels, data){
     attributes(r) <- attributes(r)[match(names(attr_x), names(attributes(r)))]
   }
 #   newCla <- class(r)
-#   if(any(grepl("rdddata", newCla))) newCla <- newCla[-grepl("rdddata", newCla)]
+#   if(any(grepl("rdd_data", newCla))) newCla <- newCla[-grepl("rdd_data", newCla)]
 #   print(names(attributes(newCla)))
 # 
 #   if(!inherits(newCla, "data.frame")) attr(r, "class")[which(attr(r, "class")=="data.frame")] <- newCla
@@ -123,7 +123,7 @@ rdddata <- function(y, x, covar, cutpoint, z, labels, data){
 }
 
 #' @export
-subset.rdddata <- function (x, subset, select, drop = FALSE, ...) {
+subset.rdd_data <- function (x, subset, select, drop = FALSE, ...) {
   attr_x <- attributes(x)
 
 ### subset code: start
@@ -159,7 +159,7 @@ subset.rdddata <- function (x, subset, select, drop = FALSE, ...) {
 }
 
 #' @export 
-as.data.frame.rdddata <- function(x,...){
+as.data.frame.rdd_data <- function(x,...){
   class(x) <- "data.frame"
   attr(x, "hasCovar") <- NULL
   attr(x, "labels")   <- NULL 
diff --git a/R/rdddata_methods.R b/R/rdddata_methods.R
index c1cd30e..4c4875c 100644
--- a/R/rdddata_methods.R
+++ b/R/rdddata_methods.R
@@ -2,11 +2,11 @@
 
 ### SUMMARY method
 #' @export
-summary.rdddata <- function(object, ...){
+summary.rdd_data <- function(object, ...){
 
   cutpoint <- getCutpoint(object)
   hasCovar_eng <- ifelse(hasCovar(object), "yes", "no")
-  cat("### rdddata object ###\n")
+  cat("### rdd_data object ###\n")
   cat("\nCutpoint:", cutpoint, "\n")
   cat("Sample size:",
 	"\n\t-Full :", nrow(object), 
@@ -15,11 +15,11 @@ summary.rdddata <- function(object, ...){
   cat("\nCovariates:", hasCovar_eng, "\n")
 }
 
-#' Plot rdddata
+#' Plot rdd_data
 #' 
 #' Binned plot of the forcing and outcome variable
 #' 
-#' @param x Object of class rdddata
+#' @param x Object of class rdd_data
 #' @param h The binwidth parameter (note this differs from the bandwidth parameter!)
 #' @param nbins Alternative to h, the total number of bins in the plot.
 #' @param xlim The range of the x data
@@ -35,7 +35,7 @@ summary.rdddata <- function(object, ...){
 #' @export
 #' @examples
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' plot(Lee2008_rdd)
 #' 
 #' ## Specify manually the bandwidth:
@@ -52,7 +52,7 @@ summary.rdddata <- function(object, ...){
 
 
 ### PLOT method
-plot.rdddata <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=1, device=c("base", "ggplot"),...){
+plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=1, device=c("base", "ggplot"),...){
 
   object <- x
   cutpoint <- getCutpoint(object)
@@ -118,7 +118,7 @@ plot.rdddata <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex
 #' @seealso \code{\link{as.npreg}} which converts \code{RDDreg} objects into \code{npreg} from package \code{np}.
 #' @examples 
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 #' reg_para_lm <- as.lm(reg_para)
 #' reg_para_lm
@@ -146,7 +146,7 @@ as.lm.RDDreg <- function(x) as.lm_RDD(x)
 
 
 
-# subset.rdddata <- function(x,...){
+# subset.rdd_data <- function(x,...){
 # 
 #   res <- subset.data.frame(x,...)
 #   attributes(res) <- attributes(x)
@@ -160,9 +160,9 @@ if(FALSE){
 #   data(Lee2008)
 
 
-  environment(plot.rdddata) <- environment(rdddata)
+  environment(plot.rdd_data) <- environment(rdd_data)
 
-  Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
   plot(Lee2008_rdd)
 
   plot(Lee2008_rdd, h=0.2)
diff --git a/R/rddpred.R b/R/rddpred.R
index d89a054..04a0f52 100644
--- a/R/rddpred.R
+++ b/R/rddpred.R
@@ -34,7 +34,7 @@
 #' data(Lee2008)
 #' n_Lee <- nrow(Lee2008)
 #' z1 <- runif(n_Lee)
-#' Lee2008_rdd <- rdddata(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 #' 
 #' # estimation without covariates: rddpred is the same than rddcoef:
 #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 5bd984d..4d70ca8 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -2,7 +2,7 @@
 #' 
 #' Compute RDD estimate allowing a locally kernel weighted version of any estimation function
 #' possibly on the range specified by bandwidth
-#' @param RDDobject Object of class rdddata created by \code{\link{rdddata}}
+#' @param RDDobject Object of class rdd_data created by \code{\link{rdd_data}}
 #' @param covariates Formula to include covariates
 #' @param order Order of the polynomial regression. 
 #' @param bw A bandwidth to specify the subset on which the kernel weighted regression is estimated
@@ -26,7 +26,7 @@
 #' @examples
 #' ## Step 0: prepare data
 #' data(Lee2008)
-#' Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' 
 #' ## Estimate a local probit:
 #' Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y=0)+rnorm(1000)
 
-RD <- rdddata(x=x, y=y, cutpoint=0, covar=cov)
+RD <- rdd_data(x=x, y=y, cutpoint=0, covar=cov)
 
 ### Simple estimation:
 bw <- IKbandwidth(X=x, Y=y, cutpoint=0)
@@ -38,7 +38,7 @@ all.equal(rdd_co_cov[-4,], RDDtools_co_cov[-4,], check.attributes=FALSE)
 ## Fuzzy
 set.seed(123)
 selec <- rbinom(nrow(RD), 1, prob=ifelse(RD$x<0, 0.1, 0.9))
-RD_rdd_ins <- rdddata(y=RD$y, x=RD$x, z=selec,cutpoint=0)
+RD_rdd_ins <- rdd_data(y=RD$y, x=RD$x, z=selec,cutpoint=0)
 
 RDDto_reg_fuz <- RDDreg_lm(RD_rdd_ins, bw=0.2)
 rdd_reg_fuz <- RDestimate(y~x+selec, data=RD_rdd_ins, kernel="rectangular", bw=0.2, model=TRUE, se.type="const")$model[[2]][[1]]
diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index 42e41f4..447e002 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -9,7 +9,7 @@ library(rddtools)
 data(Lee2008)
 head(Lee2008)
 
-Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 head(Lee2008_rdd)
 
@@ -21,7 +21,7 @@ n_Lee <- nrow(Lee2008)
 
 set.seed(123)
 Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE))
-Lee2008_rdd_z <- rdddata(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
+Lee2008_rdd_z <- rdd_data(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 
 head(Lee2008_rdd_z )
 summary(Lee2008_rdd_z )
@@ -29,7 +29,7 @@ summary(Lee2008_rdd_z )
 ### Fuzzy
 set.seed(123)
 ins <- rbinom(n_Lee, 1, prob=ifelse(Lee2008$x<0, 0.1, 0.9))
-Lee2008_rdd_ins <- rdddata(y=Lee2008$y, x=Lee2008$x, z=ins,cutpoint=0)
+Lee2008_rdd_ins <- rdd_data(y=Lee2008$y, x=Lee2008$x, z=ins,cutpoint=0)
 table(Lee2008$x<0, ins==0)
 
 ############################################
diff --git a/tests/simple_MC.R b/tests/simple_MC.R
index cf2aa6a..904db8e 100644
--- a/tests/simple_MC.R
+++ b/tests/simple_MC.R
@@ -10,7 +10,7 @@ MC_simple <- function(n=200, CATE=0.3, HATE=0.1){
   D <- x>= 20
   y <- 0.8 + CATE*D+ 0.3*x+HATE*x*D+rnorm(n, sd=0.1)
   cat("effect", CATE+HATE*20, "\n")
-  rdddata(x=x, y=y, cutpoint=20)
+  rdd_data(x=x, y=y, cutpoint=20)
 
 }
 
@@ -53,7 +53,7 @@ set.seed(123)
 head(gen_MC_IK())
 
 set.seed(123)
-head(gen_MC_IK(output="rdddata"))
+head(gen_MC_IK(output="rdd_data"))
 
 set.seed(123)
 head(gen_MC_IK(version=2))
diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R
index bdb9a19..a1bfe21 100644
--- a/tests/testthat/test_rdddata.R
+++ b/tests/testthat/test_rdddata.R
@@ -6,9 +6,9 @@ library(rddtools)
 # load the example data set
 data(Lee2008)
 
-# create rdddata sets
-rd<- rdddata(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-rd2 <- rdddata(x=x, y=y, data=Lee2008, cutpoint=0)
+# create rdd_data sets
+rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
+rd2 <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
 
 # define context
 context("input ambivalence")

From 6963680e85ab4ebfee7568bc9a2437c66a77c6b0 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:13:22 +0200
Subject: [PATCH 103/323] rename file

---
 R/{rdddata.R => rdd_data.R} | 0
 man/rdd_data.Rd             | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename R/{rdddata.R => rdd_data.R} (100%)

diff --git a/R/rdddata.R b/R/rdd_data.R
similarity index 100%
rename from R/rdddata.R
rename to R/rdd_data.R
diff --git a/man/rdd_data.Rd b/man/rdd_data.Rd
index d7cacf4..9ec9c67 100644
--- a/man/rdd_data.Rd
+++ b/man/rdd_data.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/rdddata.R
+% Please edit documentation in R/rdd_data.R
 \name{rdd_data}
 \alias{rdd_data}
 \title{Construct rdd_data}

From 24ce120fbef4bc01ed960981cb136e7883a50a42 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:14:22 +0200
Subject: [PATCH 104/323] rddpred -> rdd_pred

---
 R/rddpred.R         | 14 +++++-----
 tests/RDDpred.R     | 62 ++++++++++++++++++++++-----------------------
 tests/packageDemo.R | 14 +++++-----
 3 files changed, 45 insertions(+), 45 deletions(-)

diff --git a/R/rddpred.R b/R/rddpred.R
index 04a0f52..a6fba6c 100644
--- a/R/rddpred.R
+++ b/R/rddpred.R
@@ -8,13 +8,13 @@
 #' @param newdata Another data on which to evaluate the x/D variables. Useful in very few cases. 
 #' @param stat The statistic to use if there are multiple predictions, 'identity' just returns the single values, 'mean' averages them 
 #' @param weights Eventual weights for the averaging of the predicted values. 
-#' @details The function \code{rddpred} does a simple prediction of the RDD effect
+#' @details The function \code{rdd_pred} does a simple prediction of the RDD effect
 #'  \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)}
 #' When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient, 
 #' shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the 
 #' \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e.
 #' had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s). 
-#' \code{rddpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
+#' \code{rdd_pred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
 #' the values for the covariates. Note that the effect can be evaluated at multiple points, if you provide multiple rows of \code{covdata}. 
 #'
 #' In pressence of covariate-specific RDD effect, one may wish to estimate an average effect. This can be done by setting the argument \code{stat="mean"}. 
@@ -36,10 +36,10 @@
 #' z1 <- runif(n_Lee)
 #' Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 #' 
-#' # estimation without covariates: rddpred is the same than rddcoef:
+#' # estimation without covariates: rdd_pred is the same than rddcoef:
 #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 #' 
-#' rddpred(reg_para)
+#' rdd_pred(reg_para)
 #' rddcoef(reg_para, allInfo=TRUE)
 #' 
 #' # estimation with covariates: 
@@ -48,12 +48,12 @@
 #'                           covar.opt=list(slope="separate") )
 #'
 #' # should obtain same result as with RDestimate                             
-#' rddpred(reg_para_cov, covdata=data.frame(z1=0)) 
+#' rdd_pred(reg_para_cov, covdata=data.frame(z1=0)) 
 #'   
 #' # evaluate at mean of z1 (as comes from uniform)
-#' rddpred(reg_para_cov, covdata=data.frame(z1=0.5))
+#' rdd_pred(reg_para_cov, covdata=data.frame(z1=0.5))
 
-rddpred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){
+rdd_pred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){
 
   stat <- match.arg(stat)
 
diff --git a/tests/RDDpred.R b/tests/RDDpred.R
index 7929232..4617851 100644
--- a/tests/RDDpred.R
+++ b/tests/RDDpred.R
@@ -37,14 +37,14 @@ checkRDDmean <- function(x, n=5){
   DF_1 <- covDF[1:n,hasD, drop=FALSE]
   DF_2 <- data.frame(t(colMeans(DF_1)))
 
-  pred_1 <- rddpred(x, covdata=DF_1, stat="mean")
-  pred_2 <- rddpred(x, covdata=DF_2)
+  pred_1 <- rdd_pred(x, covdata=DF_1, stat="mean")
+  pred_2 <- rdd_pred(x, covdata=DF_2)
   all.equal(pred_1, pred_2, check.attributes=FALSE)
 }
 
 sapply(reg_li, checkRDDmean)
 
-sapply(reg_li, function(x) all.equal(unlist(rddpred(x)),rddcoef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
+sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rddcoef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
 
 
 # 
@@ -79,20 +79,20 @@ aa <- lm("y ~ D + `x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_r
 aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data=mf_2)
 # 
 # diff(coef(aaa)[2:1])
-# rddpred(reg_para4_cov_slSep)
-# rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
+# rdd_pred(reg_para4_cov_slSep)
+# rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
 # 
 # rddcoef(reg_para4_cov_slSep, allInfo=TRUE)
 
-## compare rddpred and Delta at 1:
-rdd_p_1 <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=1))
+## compare rdd_pred and Delta at 1:
+rdd_p_1 <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=1))
 delta_1 <- deltaMethod(aaa, "a1 - a2 + a12", parameterNames=paste("a", 1:12, sep=""))
 rdd_p_1
 delta_1
 all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes=FALSE)
 
-## compare rddpred and Delta at 0:
-rdd_p_0 <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
+## compare rdd_pred and Delta at 0:
+rdd_p_0 <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
 rdd_c_0 <- rddcoef(reg_para4_cov_slSep, allInfo=TRUE)
 delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames=paste("a", 1:12, sep=""))
 rdd_p_0
@@ -101,11 +101,11 @@ delta_0
 all.equal(unlist(rdd_p_0), drop(as.matrix(delta_0[1:2])), check.attributes=FALSE)
 all.equal(unlist(rdd_p_0), drop(as.matrix(rdd_c_0[1:2])), check.attributes=FALSE)
 
-## compare rddpred and Delta at 2 points:
-rdd_p_01_AGG <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.5)))
-rdd_p_01_all <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)))
-rdd_p_01_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="sum")
-rdd_p_01_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="mean")
+## compare rdd_pred and Delta at 2 points:
+rdd_p_01_AGG <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.5)))
+rdd_p_01_all <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)))
+rdd_p_01_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="sum")
+rdd_p_01_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="mean")
 
 delta_01_S <- deltaMethod(aaa, "2*(a1 - a2) +1*a12", parameterNames=paste("a", 1:12, sep=""))
 delta_01_M <- deltaMethod(aaa, "(2*(a1 - a2) +1*a12)/2", parameterNames=paste("a", 1:12, sep=""))
@@ -128,17 +128,17 @@ all.equal(rdd_p_01_M$fit, rdd_p_01_S$fit/2)
 all.equal(rdd_p_01_M$fit, rdd_p_01_AGG$fit, check.attributes=FALSE)
 all.equal(rdd_p_01_M$se.fit, rdd_p_01_AGG$se.fit, check.attributes=FALSE)
 
-## compare rddpred and Delta at 5 first points:
+## compare rdd_pred and Delta at 5 first points:
 ind_z_pos <- head(which(Lee2008_rdd_z$z1>0),5)
 
-rdd_p_01_5z_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="sum")
-rdd_p_01_5z_Sb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[1:5])), stat="sum")
-rdd_p_01_5zPos_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[ind_z_pos]), stat="sum")
-rdd_p_01_5zPos_Sb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[ind_z_pos])), stat="sum")
-rdd_p_01_5z_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="mean")
-rdd_p_01_5z_Mb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1[1:5])), stat="mean")
-rdd_p_01_ALLz_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1), stat="mean")
-rdd_p_01_ALLz_Mb <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1)), stat="mean")
+rdd_p_01_5z_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="sum")
+rdd_p_01_5z_Sb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[1:5])), stat="sum")
+rdd_p_01_5zPos_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[ind_z_pos]), stat="sum")
+rdd_p_01_5zPos_Sb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[ind_z_pos])), stat="sum")
+rdd_p_01_5z_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="mean")
+rdd_p_01_5z_Mb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1[1:5])), stat="mean")
+rdd_p_01_ALLz_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1), stat="mean")
+rdd_p_01_ALLz_Mb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1)), stat="mean")
 
 del <- function(x, mean=FALSE) {
   n <- length(x)
@@ -165,7 +165,7 @@ all.equal(unlist(rdd_p_01_5z_Mb), drop(as.matrix(delta_01_5z_M[1:2])), check.att
 #### Weighted mean!!
 w_5 <- c(0.1, 0.2, 0.4, 0.2, 0.1)
 w <- c(0.4, 0.6)
-rdd_p_01_Sid <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="identity")
+rdd_p_01_Sid <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="identity")
 wm <- weighted.mean(rdd_p_01_Sid$fit , w=w)
 
 delta_2z_w <- deltaMethod(aaa, "0.4*(a1 - a2) + 0.4*0.2*a12+0.6*(a1 - a2) + 0.6*a12", parameterNames=paste("a", 1:12, sep=""))
@@ -175,8 +175,8 @@ all(delta_2z_w==delta_2z_w2)
 all.equal(delta_2z_w, delta_2z_w3, check.attributes=FALSE)
 all.equal(delta_2z_w[1,1],wm)
 
-rdd_p_01_W_S <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="sum", weights=w)
-rdd_p_01_W_M <- rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="mean", weights=w)
+rdd_p_01_W_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="sum", weights=w)
+rdd_p_01_W_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="mean", weights=w)
 all.equal(rdd_p_01_W_M$fit,wm)
 
 all.equal(unlist(rdd_p_01_W_S), drop(as.matrix(delta_2z_w2[1:2])), check.attributes=FALSE)
@@ -188,12 +188,12 @@ df_2Z_5z <- Lee2008_rdd_z[1:5, c("z1", "z2")]
 df_2Z_5z_M <- data.frame(t(colMeans(df_2Z_5z)))
 df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w=w_5)))
 
-rdd_p_sZ_5z_S <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="sum")
-rdd_p_sZ_5z_M <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean")
-rdd_p_sZ_5z_Mb <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_M, stat="sum")
+rdd_p_sZ_5z_S <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="sum")
+rdd_p_sZ_5z_M <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean")
+rdd_p_sZ_5z_Mb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_M, stat="sum")
 
-rdd_p_sZ_5z_MW <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean", weights=w_5)
-rdd_p_sZ_5z_MWb <- rddpred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_Mw, stat="sum")
+rdd_p_sZ_5z_MW <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean", weights=w_5)
+rdd_p_sZ_5z_MWb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_Mw, stat="sum")
 
 all.equal(rdd_p_sZ_5z_M, rdd_p_sZ_5z_Mb, check.attributes=FALSE)
 all.equal(rdd_p_sZ_5z_MW, rdd_p_sZ_5z_MWb, check.attributes=FALSE)
diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index 447e002..db53aaf 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -62,7 +62,7 @@ print(reg_para)
 summary(reg_para)
 plot(reg_para)
 
-all.equal(unlist(rddpred(reg_para)), rddcoef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para)), rddcoef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Difference in means regression:
 # Simple polynomial of order 0:
@@ -76,7 +76,7 @@ plot(reg_para_0)
 reg_para4 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
 reg_para4
 plot(reg_para4)
-all.equal(unlist(rddpred(reg_para4)), rddcoef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para4)), rddcoef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Restrict sample to bandwidth area:
 bw_ik <- RDDbw_IK(Lee2008_rdd)
@@ -84,7 +84,7 @@ reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
 
-all.equal(unlist(rddpred(reg_para_ik)), rddcoef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para_ik)), rddcoef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Fuzzy reg
 reg_para_fuzz <- RDDreg_lm(Lee2008_rdd_ins)
@@ -98,8 +98,8 @@ summary(reg_para4_cov)
 
 reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
 summary(reg_para4_cov_slSep)
-rddpred(reg_para4_cov_slSep)
-rddpred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
+rdd_pred(reg_para4_cov_slSep)
+rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
 
 
 reg_para4_cov_startR <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
@@ -238,8 +238,8 @@ capply <- function(x){
 
 capply(lapply(regs_all, coef))
 sapply(regs_all, rddcoef)
-rddpred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
-sapply(regs_all[!names(regs_all)%in%rddpred_issue], rddpred)
+rdd_pred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
+sapply(regs_all[!names(regs_all)%in%rdd_pred_issue], rdd_pred)
 
 sapply(regs_all, rddtools:::getCutpoint)
 lapply(regs_all, plotSensi, plot=FALSE)

From e56a08c14fefb73181fd0d483ea7ec3210662985 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:15:05 +0200
Subject: [PATCH 105/323] rename files regard last commit

---
 NAMESPACE                       |  2 +-
 R/{rddpred.R => rdd_pred.R}     |  0
 man/{rddpred.Rd => rdd_pred.Rd} | 20 ++++++++++----------
 3 files changed, 11 insertions(+), 11 deletions(-)
 rename R/{rddpred.R => rdd_pred.R} (100%)
 rename man/{rddpred.Rd => rdd_pred.Rd} (86%)

diff --git a/NAMESPACE b/NAMESPACE
index b1d1e9a..034c304 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -51,8 +51,8 @@ export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
 export(rdd_data)
+export(rdd_pred)
 export(rddcoef)
-export(rddpred)
 export(vcovCluster)
 export(vcovCluster2)
 import(Formula)
diff --git a/R/rddpred.R b/R/rdd_pred.R
similarity index 100%
rename from R/rddpred.R
rename to R/rdd_pred.R
diff --git a/man/rddpred.Rd b/man/rdd_pred.Rd
similarity index 86%
rename from man/rddpred.Rd
rename to man/rdd_pred.Rd
index a2b9bb8..e58f035 100644
--- a/man/rddpred.Rd
+++ b/man/rdd_pred.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/rddpred.R
-\name{rddpred}
-\alias{rddpred}
+% Please edit documentation in R/rdd_pred.R
+\name{rdd_pred}
+\alias{rdd_pred}
 \title{RDD coefficient prediction}
 \usage{
-rddpred(object, covdata, se.fit = TRUE, vcov. = NULL, newdata,
+rdd_pred(object, covdata, se.fit = TRUE, vcov. = NULL, newdata,
   stat = c("identity", "sum", "mean"), weights)
 }
 \arguments{
@@ -29,13 +29,13 @@ Returns the predicted value(s), and, if se.fit=TRUE, their standard errors.
 Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rddcoef}})
 }
 \details{
-The function \code{rddpred} does a simple prediction of the RDD effect
+The function \code{rdd_pred} does a simple prediction of the RDD effect
  \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)}
 When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient,
 shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the
 \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e.
 had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s).
-\code{rddpred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
+\code{rdd_pred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
 the values for the covariates. Note that the effect can be evaluated at multiple points, if you provide multiple rows of \code{covdata}.
 
 In pressence of covariate-specific RDD effect, one may wish to estimate an average effect. This can be done by setting the argument \code{stat="mean"}.
@@ -55,10 +55,10 @@ n_Lee <- nrow(Lee2008)
 z1 <- runif(n_Lee)
 Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 
-# estimation without covariates: rddpred is the same than rddcoef:
+# estimation without covariates: rdd_pred is the same than rddcoef:
 reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 
-rddpred(reg_para)
+rdd_pred(reg_para)
 rddcoef(reg_para, allInfo=TRUE)
 
 # estimation with covariates:
@@ -67,10 +67,10 @@ reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd,
                           covar.opt=list(slope="separate") )
 
 # should obtain same result as with RDestimate
-rddpred(reg_para_cov, covdata=data.frame(z1=0))
+rdd_pred(reg_para_cov, covdata=data.frame(z1=0))
 
 # evaluate at mean of z1 (as comes from uniform)
-rddpred(reg_para_cov, covdata=data.frame(z1=0.5))
+rdd_pred(reg_para_cov, covdata=data.frame(z1=0.5))
 }
 \references{
 Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024

From a022bd99a0bba9ae9e43f605f5092fc1c2553266 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:15:44 +0200
Subject: [PATCH 106/323] rddcoef -> rdd_coef

---
 R/as.npreg.R            |  6 +++---
 R/placebo.R             |  8 ++++----
 R/plotSensi.R           | 10 +++++-----
 R/rdd_pred.R            | 10 +++++-----
 R/rddcoef.R             | 12 ++++++------
 R/reg_gen.R             |  2 +-
 R/reg_np.R              |  4 ++--
 R/waldci.R              |  2 +-
 tests/RDDpred.R         |  6 +++---
 tests/RDDtools_vs_rdd.R |  8 ++++----
 tests/packageDemo.R     | 18 +++++++++---------
 11 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/R/as.npreg.R b/R/as.npreg.R
index 5b852ad..3620b5a 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -20,12 +20,12 @@
 #' ## Convert to npreg:
 #'  reg_nonpara_np <- as.npreg(reg_nonpara)
 #'  reg_nonpara_np
-#'  rddcoef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE)
+#'  rdd_coef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE)
 #' 
 #' ## Compare with result obtained with a Gaussian kernel:
 #'  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
 #'  reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm)
-#'  all.equal(rddcoef(reg_nonpara_gaus),rddcoef(reg_nonpara_np)) 
+#'  all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) 
 
 
 as.npregbw <- function(x,...){
@@ -91,7 +91,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
 
 
 #' @export
-rddcoef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){
+rdd_coef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){
 
   co <- diff(object$mean)
   if(allInfo) {
diff --git a/R/placebo.R b/R/placebo.R
index 5e39104..9397047 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -244,11 +244,11 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_
       # load the lmtest package
       # require("lmtest")
 
-      seq_vals[i,"LATE"] <- rddcoef(object_new)
+      seq_vals[i,"LATE"] <- rdd_coef(object_new)
       if(!is.null(vcov.)) {
         co <- lmtest::coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE]
       } else {
-        co <- rddcoef(object_new, allInfo=TRUE)
+        co <- rdd_coef(object_new, allInfo=TRUE)
       }
       seq_vals[i,"se"] <- co[,"Std. Error"]
       seq_vals[i,"p_value"] <- co[,4]
@@ -262,10 +262,10 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_
   if(!is.null(vcov.)) {
     true_co <- coeftest(object, vcov.=vcov.)["D",, drop=FALSE]
   } else {
-    true_co <- rddcoef(object, allInfo=TRUE)
+    true_co <- rdd_coef(object, allInfo=TRUE)
   }
   true_confint <- as.numeric(waldci(object, level=level, vcov.=vcov.)["D",])
-  true <- data.frame(cutpoint=cutpoint, position="True", LATE=rddcoef(object), 
+  true <- data.frame(cutpoint=cutpoint, position="True", LATE=rdd_coef(object), 
 		      se=true_co["D","Std. Error"], p_value=true_co["D",4], 
 		      CI_low=true_confint[1], CI_high=true_confint[2], bw=bw)
 
diff --git a/R/plotSensi.R b/R/plotSensi.R
index 87ce966..02c3bcb 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -52,7 +52,7 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out
 
   object <- RDDregobject
   bw <- getBW(object)
-  est <- rddcoef(object)
+  est <- rdd_coef(object)
 
 ## set grid:
   if(missing(from))  from <- max(1e-3, bw-0.1)
@@ -74,11 +74,11 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out
     object_call$bw <- seq_bw[i]
     object_new <- try(eval(object_call), silent=TRUE)
     if(!inherits(object_new, "try-error")){
-      seq_vals[i,"LATE"] <- rddcoef(object_new)
+      seq_vals[i,"LATE"] <- rdd_coef(object_new)
       if(!is.null(vcov.)) {
 	co <- coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE]
       } else {
-	co <- rddcoef(object_new, allInfo=TRUE)
+	co <- rdd_coef(object_new, allInfo=TRUE)
       }
       seq_vals[i,"se"] <- co[,"Std. Error"]
       seq_vals[i,"p_value"] <- co[,4]
@@ -123,7 +123,7 @@ plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, out
   type <- match.arg(type)
   output <- match.arg(output)
   object <- RDDregobject
-  est <- rddcoef(object)
+  est <- rdd_coef(object)
   bw <- getBW(object)
   origOrder <- getOrder(object)
   hasBw <- !is.null(bw)
@@ -170,7 +170,7 @@ plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, out
 
       # put output estim/se into matrix:
       if(!inherits(object_new, "try-error")){
-        co <- rddcoef(object_new, allInfo=TRUE)
+        co <- rdd_coef(object_new, allInfo=TRUE)
         seq_vals[i+(j-1)*n_seq_bw,"LATE"] <- co[,1]
         seq_vals[i+(j-1)*n_seq_bw,"se"] <- co[,2]
       } else {
diff --git a/R/rdd_pred.R b/R/rdd_pred.R
index a6fba6c..abb4e51 100644
--- a/R/rdd_pred.R
+++ b/R/rdd_pred.R
@@ -1,6 +1,6 @@
 #' RDD coefficient prediction
 #'
-#' Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rddcoef}})
+#' Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rdd_coef}})
 #' @param object A RDD regression object
 #' @param covdata New data.frame specifying the values of the covariates, can have multiple rows. 
 #' @param se.fit A switch indicating if standard errors are required.
@@ -11,7 +11,7 @@
 #' @details The function \code{rdd_pred} does a simple prediction of the RDD effect
 #'  \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)}
 #' When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient, 
-#' shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the 
+#' shown in the outputs, or obtained with \code{\link{rdd_coef}}. If there were covariates, and if these covariates were estimated using the 
 #' \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e.
 #' had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s). 
 #' \code{rdd_pred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
@@ -36,11 +36,11 @@
 #' z1 <- runif(n_Lee)
 #' Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 #' 
-#' # estimation without covariates: rdd_pred is the same than rddcoef:
+#' # estimation without covariates: rdd_pred is the same than rdd_coef:
 #' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 #' 
 #' rdd_pred(reg_para)
-#' rddcoef(reg_para, allInfo=TRUE)
+#' rdd_coef(reg_para, allInfo=TRUE)
 #' 
 #' # estimation with covariates: 
 #' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd,
@@ -127,7 +127,7 @@ rdd_pred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c
 ## preds:
 
   if(!multiN) {
-    pred_point <- drop(diff(X_i%*%rddcoef(object, allCo=TRUE)))
+    pred_point <- drop(diff(X_i%*%rdd_coef(object, allCo=TRUE)))
     if(se.fit) pred_se    <- sqrt(sum(c(diag(mat), -2*mat[1,2])))
   } else {
     d <- X_i%*%coef(object)
diff --git a/R/rddcoef.R b/R/rddcoef.R
index 2af0987..9c74bdc 100644
--- a/R/rddcoef.R
+++ b/R/rddcoef.R
@@ -10,21 +10,21 @@
 #' @export
 
 
-rddcoef <- function(object, allInfo=FALSE, allCo=FALSE, ...)
-  UseMethod("rddcoef")
+rdd_coef <- function(object, allInfo=FALSE, allCo=FALSE, ...)
+  UseMethod("rdd_coef")
 
-#' @rdname rddcoef
+#' @rdname rdd_coef
 #' @export
-rddcoef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){
+rdd_coef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){
   res <- coef(summary(object))
   if(!allCo) res <- res["D",, drop=FALSE]
   if(!allInfo) res <- res[,"Estimate"]
   res
 }
 
-#' @rdname rddcoef
+#' @rdname rdd_coef
 #' @export
-rddcoef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){
+rdd_coef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){
   res<- object$coefMat
   if(!allCo) res <- res["D",, drop=FALSE]
   if(!allInfo) res <- res[,"Estimate"]
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 4d70ca8..2b62c71 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -18,7 +18,7 @@
 #'   \item A \code{weight} argument
 #'   \item A coef(summary(x)) returning a data-frame containing a column Estimate
 #' }
-#' Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rddcoef}} 
+#' Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rdd_coef}} 
 #' function for the class of the object returned by \code{fun}. 
 #' @return An object of class RDDreg_lm and class lm, with specific print and plot methods
 #' @references TODO
diff --git a/R/reg_np.R b/R/reg_np.R
index c362323..36bd891 100644
--- a/R/reg_np.R
+++ b/R/reg_np.R
@@ -98,7 +98,7 @@ print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), ..
 
   cat("\n\tCoefficient:\n")
 
-  printCoefmat(rddcoef(x, allInfo=TRUE), signif.stars=signif.stars)
+  printCoefmat(rdd_coef(x, allInfo=TRUE), signif.stars=signif.stars)
 
 }
 
@@ -148,7 +148,7 @@ print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3),
 
   cat("\n\tCoefficient:\n")
 
-  printCoefmat(rddcoef(x, allInfo=TRUE), signif.stars=signif.stars)
+  printCoefmat(rdd_coef(x, allInfo=TRUE), signif.stars=signif.stars)
 
   cat("\n\tLocal R squared:",  formatC(x$r.squared, digits = digits), "\n")
 
diff --git a/R/waldci.R b/R/waldci.R
index 74d5f4c..a7f8f48 100644
--- a/R/waldci.R
+++ b/R/waldci.R
@@ -72,7 +72,7 @@ waldci.RDDreg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...){
     if(!is.null(vcov.)|!is.infinite(df)) {warning("Arg 'vcov.' and 'df' only work for RDDreg with inf='lm'")
     }
     ## code recycled from stats::confint.default
-    co <- rddcoef(x, allInfo=TRUE)
+    co <- rdd_coef(x, allInfo=TRUE)
     a <- (1 - level)/2
     a <- c(a, 1 - a)
     fac <- qnorm(a)
diff --git a/tests/RDDpred.R b/tests/RDDpred.R
index 4617851..2ff1ff3 100644
--- a/tests/RDDpred.R
+++ b/tests/RDDpred.R
@@ -44,7 +44,7 @@ checkRDDmean <- function(x, n=5){
 
 sapply(reg_li, checkRDDmean)
 
-sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rddcoef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
+sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rdd_coef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
 
 
 # 
@@ -82,7 +82,7 @@ aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_rig
 # rdd_pred(reg_para4_cov_slSep)
 # rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
 # 
-# rddcoef(reg_para4_cov_slSep, allInfo=TRUE)
+# rdd_coef(reg_para4_cov_slSep, allInfo=TRUE)
 
 ## compare rdd_pred and Delta at 1:
 rdd_p_1 <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=1))
@@ -93,7 +93,7 @@ all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes=FALSE
 
 ## compare rdd_pred and Delta at 0:
 rdd_p_0 <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
-rdd_c_0 <- rddcoef(reg_para4_cov_slSep, allInfo=TRUE)
+rdd_c_0 <- rdd_coef(reg_para4_cov_slSep, allInfo=TRUE)
 delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames=paste("a", 1:12, sep=""))
 rdd_p_0
 rdd_c_0
diff --git a/tests/RDDtools_vs_rdd.R b/tests/RDDtools_vs_rdd.R
index bb4b71e..4268f4a 100644
--- a/tests/RDDtools_vs_rdd.R
+++ b/tests/RDDtools_vs_rdd.R
@@ -16,7 +16,7 @@ rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]]
 RDDtools_mod <- RDDreg_np(RD, bw=bw, inference="lm")
 
 rdd_co <- coef(summary(rdd_mod))
-RDDtools_co <- rddcoef(RDDtools_mod, allCo=TRUE, allInfo=TRUE)
+RDDtools_co <- rdd_coef(RDDtools_mod, allCo=TRUE, allInfo=TRUE)
 rdd_co
 RDDtools_co
 
@@ -29,7 +29,7 @@ rdd_mod_cov <- RDestimate(y~x|cov, kernel="rectangular", bw=5, model=TRUE, se.ty
 RDDtools_mod_cov <- RDDreg_lm(RD, bw=5, covariates="cov", covar.opt=list(slope="separate"))
 
 rdd_co_cov <- coef(summary(rdd_mod_cov))
-RDDtools_co_cov <- rddcoef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE)
+RDDtools_co_cov <- rdd_coef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE)
 rdd_co_cov
 RDDtools_co_cov
 
@@ -43,6 +43,6 @@ RD_rdd_ins <- rdd_data(y=RD$y, x=RD$x, z=selec,cutpoint=0)
 RDDto_reg_fuz <- RDDreg_lm(RD_rdd_ins, bw=0.2)
 rdd_reg_fuz <- RDestimate(y~x+selec, data=RD_rdd_ins, kernel="rectangular", bw=0.2, model=TRUE, se.type="const")$model[[2]][[1]]
 
-all.equal(rddcoef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1])
-all.equal(rddcoef(RDDto_reg_fuz, allCo=TRUE)[1:3],coef(summary(rdd_reg_fuz))[1:3,1], check.attributes=FALSE)
+all.equal(rdd_coef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1])
+all.equal(rdd_coef(RDDto_reg_fuz, allCo=TRUE)[1:3],coef(summary(rdd_reg_fuz))[1:3,1], check.attributes=FALSE)
 
diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index db53aaf..c67e645 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -62,7 +62,7 @@ print(reg_para)
 summary(reg_para)
 plot(reg_para)
 
-all.equal(unlist(rdd_pred(reg_para)), rddcoef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para)), rdd_coef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Difference in means regression:
 # Simple polynomial of order 0:
@@ -76,7 +76,7 @@ plot(reg_para_0)
 reg_para4 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
 reg_para4
 plot(reg_para4)
-all.equal(unlist(rdd_pred(reg_para4)), rddcoef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Restrict sample to bandwidth area:
 bw_ik <- RDDbw_IK(Lee2008_rdd)
@@ -84,7 +84,7 @@ reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
 
-all.equal(unlist(rdd_pred(reg_para_ik)), rddcoef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para_ik)), rdd_coef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Fuzzy reg
 reg_para_fuzz <- RDDreg_lm(Lee2008_rdd_ins)
@@ -204,15 +204,15 @@ covarTest_dis(reg_para4_cov)
 #### as npreg
   reg_nonpara_np <- as.npreg(reg_nonpara, adjustIK_bw=FALSE)
   reg_nonpara_np
-  rddcoef(reg_nonpara_np)
-  rddcoef(reg_nonpara_np, allCo=TRUE)
-  rddcoef(reg_nonpara_np, allInfo=TRUE)
-  rddcoef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE)
+  rdd_coef(reg_nonpara_np)
+  rdd_coef(reg_nonpara_np, allCo=TRUE)
+  rdd_coef(reg_nonpara_np, allInfo=TRUE)
+  rdd_coef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE)
 
 ## Compare with result obtained with a Gaussian kernel:
   bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
   reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm)
-  all.equal(rddcoef(reg_nonpara_gaus, allCo=TRUE),rddcoef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
+  all.equal(rdd_coef(reg_nonpara_gaus, allCo=TRUE),rdd_coef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
 
 
 
@@ -237,7 +237,7 @@ capply <- function(x){
 }
 
 capply(lapply(regs_all, coef))
-sapply(regs_all, rddcoef)
+sapply(regs_all, rdd_coef)
 rdd_pred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
 sapply(regs_all[!names(regs_all)%in%rdd_pred_issue], rdd_pred)
 

From 531c56a2e5f1f08c706f5e12c29c7cf945574164 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:16:39 +0200
Subject: [PATCH 107/323] documentation regarding last commit

---
 man/RDDgenreg.Rd  | 2 +-
 man/as.npregbw.Rd | 4 ++--
 man/rdd_pred.Rd   | 8 ++++----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd
index d491457..2d04c6d 100644
--- a/man/RDDgenreg.Rd
+++ b/man/RDDgenreg.Rd
@@ -42,7 +42,7 @@ It is assumed that the custom funciton has following behaviour:
   \item A \code{weight} argument
   \item A coef(summary(x)) returning a data-frame containing a column Estimate
 }
-Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rddcoef}}
+Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rdd_coef}}
 function for the class of the object returned by \code{fun}.
 }
 \examples{
diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd
index cf61364..def3ffa 100644
--- a/man/as.npregbw.Rd
+++ b/man/as.npregbw.Rd
@@ -36,12 +36,12 @@ is to set the bandwidth for x and Dx to a large number, so that they converge to
 ## Convert to npreg:
  reg_nonpara_np <- as.npreg(reg_nonpara)
  reg_nonpara_np
- rddcoef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE)
+ rdd_coef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE)
 
 ## Compare with result obtained with a Gaussian kernel:
  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
  reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm)
- all.equal(rddcoef(reg_nonpara_gaus),rddcoef(reg_nonpara_np))
+ all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np))
 }
 \seealso{
 \code{\link{as.lm}} which converts \code{RDDreg} objects into \code{lm}.
diff --git a/man/rdd_pred.Rd b/man/rdd_pred.Rd
index e58f035..ddecbef 100644
--- a/man/rdd_pred.Rd
+++ b/man/rdd_pred.Rd
@@ -26,13 +26,13 @@ rdd_pred(object, covdata, se.fit = TRUE, vcov. = NULL, newdata,
 Returns the predicted value(s), and, if se.fit=TRUE, their standard errors.
 }
 \description{
-Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rddcoef}})
+Function to predict the RDD coefficient in presence of covariate (without covariates, returns the same than \code{\link{rdd_coef}})
 }
 \details{
 The function \code{rdd_pred} does a simple prediction of the RDD effect
  \deqn{RDDeffect= \mu(x, z, D=1) - \mu(x, z, D=0)}
 When there are no covariates (and z is irrelevant in the equation above), this amounts exactly to the usual RDD coefficient,
-shown in the outputs, or obtained with \code{\link{rddcoef}}. If there were covariates, and if these covariates were estimated using the
+shown in the outputs, or obtained with \code{\link{rdd_coef}}. If there were covariates, and if these covariates were estimated using the
 \dQuote{include} \emph{strategy} and with different coefficients left and right to the cutoff (i.e.
 had argument \emph{slope} = \dQuote{separate}), than the RDD effect is also dependent on the value of the covariate(s).
 \code{rdd_pred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
@@ -55,11 +55,11 @@ n_Lee <- nrow(Lee2008)
 z1 <- runif(n_Lee)
 Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 
-# estimation without covariates: rdd_pred is the same than rddcoef:
+# estimation without covariates: rdd_pred is the same than rdd_coef:
 reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
 
 rdd_pred(reg_para)
-rddcoef(reg_para, allInfo=TRUE)
+rdd_coef(reg_para, allInfo=TRUE)
 
 # estimation with covariates:
 reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd,

From b4607a79d99bcdaf3e9740a76d34a19ae99dadbf Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:16:57 +0200
Subject: [PATCH 108/323] renaming regarding commit 2 back

---
 NAMESPACE                       |  8 ++++----
 R/{rddcoef.R => rdd_coef.R}     |  0
 man/{rddcoef.Rd => rdd_coef.Rd} | 16 ++++++++--------
 3 files changed, 12 insertions(+), 12 deletions(-)
 rename R/{rddcoef.R => rdd_coef.R} (100%)
 rename man/{rddcoef.Rd => rdd_coef.Rd} (65%)

diff --git a/NAMESPACE b/NAMESPACE
index 034c304..c8da900 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -25,9 +25,9 @@ S3method(plotSensi,RDDreg_np)
 S3method(print,RDDreg_lm)
 S3method(print,RDDreg_np)
 S3method(print,summary.RDDreg_np)
-S3method(rddcoef,RDDreg_np)
-S3method(rddcoef,RDDreg_npreg)
-S3method(rddcoef,default)
+S3method(rdd_coef,RDDreg_np)
+S3method(rdd_coef,RDDreg_npreg)
+S3method(rdd_coef,default)
 S3method(subset,rdd_data)
 S3method(summary,RDDreg_np)
 S3method(summary,rdd_data)
@@ -50,9 +50,9 @@ export(gen_MC_IK)
 export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
+export(rdd_coef)
 export(rdd_data)
 export(rdd_pred)
-export(rddcoef)
 export(vcovCluster)
 export(vcovCluster2)
 import(Formula)
diff --git a/R/rddcoef.R b/R/rdd_coef.R
similarity index 100%
rename from R/rddcoef.R
rename to R/rdd_coef.R
diff --git a/man/rddcoef.Rd b/man/rdd_coef.Rd
similarity index 65%
rename from man/rddcoef.Rd
rename to man/rdd_coef.Rd
index c0346a8..339dda6 100644
--- a/man/rddcoef.Rd
+++ b/man/rdd_coef.Rd
@@ -1,16 +1,16 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/rddcoef.R
-\name{rddcoef}
-\alias{rddcoef}
-\alias{rddcoef.RDDreg_np}
-\alias{rddcoef.default}
+% Please edit documentation in R/rdd_coef.R
+\name{rdd_coef}
+\alias{rdd_coef}
+\alias{rdd_coef.RDDreg_np}
+\alias{rdd_coef.default}
 \title{RDD coefficient}
 \usage{
-rddcoef(object, allInfo = FALSE, allCo = FALSE, ...)
+rdd_coef(object, allInfo = FALSE, allCo = FALSE, ...)
 
-\method{rddcoef}{default}(object, allInfo = FALSE, allCo = FALSE, ...)
+\method{rdd_coef}{default}(object, allInfo = FALSE, allCo = FALSE, ...)
 
-\method{rddcoef}{RDDreg_np}(object, allInfo = FALSE, allCo = FALSE, ...)
+\method{rdd_coef}{RDDreg_np}(object, allInfo = FALSE, allCo = FALSE, ...)
 }
 \arguments{
 \item{object}{A RDD regression object}

From 07ababbdc50469614302c30e667f13f3313879e0 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:19:11 +0200
Subject: [PATCH 109/323] update to rdd_data

---
 vignettes/rddtools.R    | 4 ++--
 vignettes/rddtools.Rmd  | 4 ++--
 vignettes/rddtools.html | 6 +++---
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R
index 3583c68..671f37e 100644
--- a/vignettes/rddtools.R
+++ b/vignettes/rddtools.R
@@ -6,7 +6,7 @@ library(rddtools)
 data(Lee2008)
 
 ## ------------------------------------------------------------------------
-Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 ## ----dataPlot------------------------------------------------------------
 summary(Lee2008_rdd)
@@ -39,7 +39,7 @@ n_Lee <- nrow(Lee2008)
 Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
                 z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
 
 ## ------------------------------------------------------------------------
 ## test for equality of means around cutoff:
diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd
index cc6545e..bc3285d 100644
--- a/vignettes/rddtools.Rmd
+++ b/vignettes/rddtools.Rmd
@@ -27,7 +27,7 @@ data(Lee2008)
 Declare the data to be a *RDDdata* object:
 
 ```{r}
-Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 ```
 
 
@@ -104,7 +104,7 @@ n_Lee <- nrow(Lee2008)
 Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
                 z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
 ```
 
 
diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html
index 7fab108..d32c3fc 100644
--- a/vignettes/rddtools.html
+++ b/vignettes/rddtools.html
@@ -65,10 +65,10 @@ 

Data Preparation and Visualisation

library(rddtools)
 data(Lee2008)

Declare the data to be a RDDdata object:

-
Lee2008_rdd <- rdddata(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+
Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)

You can now directly summarise and visualise this data:

summary(Lee2008_rdd)
-#> ### rdddata object ###
+#> ### rdd_data object ###
 #> 
 #> Cutpoint: 0 
 #> Sample size: 
@@ -156,7 +156,7 @@ 

Discontinuity comes from covariates: covariates balance tests

Z <- data.frame(z1 = rnorm(n_Lee, sd=2), z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), z3 = sample(letters, size = n_Lee, replace = TRUE)) -Lee2008_rdd_Z <- rdddata(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)

Run the tests:

## test for equality of means around cutoff:
 covarTest_mean(Lee2008_rdd_Z, bw=0.3)

From 5247c459954ae6a33b018878aedc603b5892f9a1 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:23:55 +0200
Subject: [PATCH 110/323] also rename this file

---
 R/{rdddata_methods.R => rdd_data_methods.R} | 0
 man/as.lm.Rd                                | 2 +-
 man/plot.rdd_data.Rd                        | 2 +-
 3 files changed, 2 insertions(+), 2 deletions(-)
 rename R/{rdddata_methods.R => rdd_data_methods.R} (100%)

diff --git a/R/rdddata_methods.R b/R/rdd_data_methods.R
similarity index 100%
rename from R/rdddata_methods.R
rename to R/rdd_data_methods.R
diff --git a/man/as.lm.Rd b/man/as.lm.Rd
index 7d8107d..4cf1da9 100644
--- a/man/as.lm.Rd
+++ b/man/as.lm.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/rdddata_methods.R
+% Please edit documentation in R/rdd_data_methods.R
 \name{as.lm}
 \alias{as.lm}
 \title{Convert a rdd object to lm}
diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd
index 1895fd4..6e0ea72 100644
--- a/man/plot.rdd_data.Rd
+++ b/man/plot.rdd_data.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/rdddata_methods.R
+% Please edit documentation in R/rdd_data_methods.R
 \name{plot.rdd_data}
 \alias{plot.rdd_data}
 \title{Plot rdd_data}

From 4cd43030111a1e1abc92b1eb52c23bbc9a570b0e Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:25:58 +0200
Subject: [PATCH 111/323] RDDobject rdd_object

---
 R/as.npreg.R          |  6 +++---
 R/bw_IK.R             | 34 +++++++++++++++++-----------------
 R/clusterInf.R        |  2 +-
 R/covarTests.R        |  4 ++--
 R/dens_test.R         | 22 +++++++++++-----------
 R/gen_MC_IK.R         |  2 +-
 R/model.matrix.RDD.R  | 10 +++++-----
 R/placebo.R           |  8 ++++----
 R/plotSensi.R         |  4 ++--
 R/rdd_data_methods.R  |  2 +-
 R/rdd_pred.R          |  4 ++--
 R/reg_gen.R           | 24 ++++++++++++------------
 R/reg_lm.R            | 22 +++++++++++-----------
 R/reg_np.R            | 16 ++++++++--------
 man/RDDbw_IK.Rd       |  4 ++--
 man/RDDgenreg.Rd      | 11 ++++++-----
 man/RDDreg_lm.Rd      | 10 +++++-----
 man/RDDreg_np.Rd      |  6 +++---
 man/as.lm.Rd          |  2 +-
 man/as.npregbw.Rd     |  6 +++---
 man/clusterInf.Rd     |  2 +-
 man/covarTest_dis.Rd  |  2 +-
 man/covarTest_mean.Rd |  2 +-
 man/dens_test.Rd      |  6 +++---
 man/gen_MC_IK.Rd      |  2 +-
 man/plotPlacebo.Rd    |  4 ++--
 man/plotSensi.Rd      |  4 ++--
 man/rdd_pred.Rd       |  4 ++--
 28 files changed, 113 insertions(+), 112 deletions(-)

diff --git a/R/as.npreg.R b/R/as.npreg.R
index 3620b5a..c1209a3 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -1,6 +1,6 @@
 #' Convert an RDDreg object to a  \code{npreg} object
 #' 
-#' Convert an RDDobject to a non-parametric regression \code{npreg} from package \code{np}
+#' Convert an rdd_object to a non-parametric regression \code{npreg} from package \code{np}
 #' @param x Object of class \code{RDDreg} created by \code{\link{RDDreg_np}} or \code{\link{RDDreg_lm}}
 #' @param \ldots Further arguments passed to the \code{\link{npregbw}} or \code{\link{npreg}}
 #' @details This function converts an RDDreg object into an \code{npreg} object from package \code{np}
@@ -15,7 +15,7 @@
 #' # Estimate ususal RDDreg:
 #'  data(Lee2008)
 #'  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#'  reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd)
+#'  reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
 #' 
 #' ## Convert to npreg:
 #'  reg_nonpara_np <- as.npreg(reg_nonpara)
@@ -24,7 +24,7 @@
 #' 
 #' ## Compare with result obtained with a Gaussian kernel:
 #'  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
-#'  reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm)
+#'  reg_nonpara_gaus <- RDDreg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
 #'  all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) 
 
 
diff --git a/R/bw_IK.R b/R/bw_IK.R
index 56bb7d3..5c1beeb 100644
--- a/R/bw_IK.R
+++ b/R/bw_IK.R
@@ -3,7 +3,7 @@
 #' Imbens-Kalyanaraman optimal bandwidth
 #' for local linear regression in Regression discontinuity designs.
 #' 
-#' @param RDDobject of class rdd_data created by \code{\link{rdd_data}}
+#' @param rdd_object of class rdd_data created by \code{\link{rdd_data}}
 #' @param kernel The type of kernel used: either \code{triangular} or \code{uniform}. 
 #' @return The optimal bandwidth
 #' @references Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," 
@@ -16,24 +16,24 @@
 #' RDDbw_IK(rd)
 
 
-RDDbw_IK <-function(RDDobject, kernel=c("Triangular", "Uniform", "Normal")) {
+RDDbw_IK <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal")) {
 
   kernel <- match.arg(kernel)
-  checkIsRDD(RDDobject)
-  cutpoint <- getCutpoint(RDDobject)
+  checkIsRDD(rdd_object)
+  cutpoint <- getCutpoint(rdd_object)
 
-  res <- RDDbw_IK_low(X=RDDobject$x,Y=RDDobject$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=FALSE, kernel=kernel)
+  res <- RDDbw_IK_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=FALSE, kernel=kernel)
   return(res)
 
 }
 
-IK_bias <-function(RDDobject, kernel=c("Triangular", "Uniform", "Normal"), bw) {
+IK_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
   kernel <- match.arg(kernel)
-  checkIsRDD(RDDobject)
-  cutpoint <- getCutpoint(RDDobject)
+  checkIsRDD(rdd_object)
+  cutpoint <- getCutpoint(rdd_object)
 
-  resB <- RDDbw_IK_low(X=RDDobject$x,Y=RDDobject$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
+  resB <- RDDbw_IK_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
 
 ## compute C1: see IK equ 5, and Fan Jijbels (1996, 3.23)
 # is done in R with locpol, computeMu(i=2, equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
@@ -47,13 +47,13 @@ IK_bias <-function(RDDobject, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
 }
 
-IK_var <-function(RDDobject, kernel=c("Triangular", "Uniform", "Normal"), bw) {
+IK_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
   kernel <- match.arg(kernel)
-  checkIsRDD(RDDobject)
-  cutpoint <- getCutpoint(RDDobject)
+  checkIsRDD(rdd_object)
+  cutpoint <- getCutpoint(rdd_object)
 
-  resB <- RDDbw_IK_low(X=RDDobject$x,Y=RDDobject$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
+  resB <- RDDbw_IK_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
 
 ## compute C2: see IK equ 5, and Fan Jijbels (1996, 3.23)
 # is done in R with locpol, computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
@@ -62,15 +62,15 @@ IK_var <-function(RDDobject, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 ## Compute var as in IK equ:5, 
   if(missing(bw))  bw <- resB$h_op
   elem1 <- (resB$var_inh_left+resB$var_inh_right)/resB$f_cu
-  elem2 <- C2/(nrow(RDDobject)*bw)
+  elem2 <- C2/(nrow(rdd_object)*bw)
   res <- elem1*elem2
   res
 }
 
-IK_amse <- function(RDDobject, kernel=c("Triangular", "Uniform", "Normal"), bw) {
+IK_amse <- function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
-  var <- IK_var(RDDobject=RDDobject, kernel=kernel, bw=bw)
-  bias <- IK_bias(RDDobject=RDDobject, kernel=kernel, bw=bw)
+  var <- IK_var(rdd_object=rdd_object, kernel=kernel, bw=bw)
+  bias <- IK_bias(rdd_object=rdd_object, kernel=kernel, bw=bw)
   res <- bias^2+var
   res
 }
diff --git a/R/clusterInf.R b/R/clusterInf.R
index 3757637..330b50c 100644
--- a/R/clusterInf.R
+++ b/R/clusterInf.R
@@ -17,7 +17,7 @@
 #' @examples
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
+#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
 #' 
 #' # here we just generate randomly a cluster variable:
 #' nlet <- sort(c(outer(letters, letters, paste, sep="")))
diff --git a/R/covarTests.R b/R/covarTests.R
index c7d584a..c3a918e 100644
--- a/R/covarTests.R
+++ b/R/covarTests.R
@@ -28,7 +28,7 @@
 #' covarTest_dis(Lee2008_rdd_Z, bw=0.3)
 #' 
 #' ## covarTest_mean works also on regression outputs (bw will be taken from the model)
-#' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd_Z)
+#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd_Z)
 #' covarTest_mean(reg_nonpara)
 
 
@@ -128,7 +128,7 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE,
 #' ## Can also use function covarTest_dis() for a t-test for equality of means around cutoff:
 #' covarTest_mean(Lee2008_rdd_Z, bw=0.3)
 #' ## covarTest_dis works also on regression outputs (bw will be taken from the model)
-#' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd_Z)
+#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd_Z)
 #' covarTest_dis(reg_nonpara)
 
 #' @export
diff --git a/R/dens_test.R b/R/dens_test.R
index 00b6d57..0394fd1 100644
--- a/R/dens_test.R
+++ b/R/dens_test.R
@@ -1,8 +1,8 @@
 #' Run the McCracy test for manipulation of the forcing variable
 #' 
-#' Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{RDDobject}.
+#' Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{rdd_object}.
 #' 
-#' @param RDDobject object of class rdd_data
+#' @param rdd_object object of class rdd_data
 #' @param bin Argument of the \code{\link{DCdensity}} function, the binwidth
 #' @param bw Argument of the \code{\link{DCdensity}} function, the bandwidth
 #' @param plot Whether to return a plot. Logical, default ot TRUE. 
@@ -16,28 +16,28 @@
 
 
 
-dens_test <- function(RDDobject, bin=NULL, bw=NULL, plot=TRUE,...){
-  checkIsRDD(RDDobject)
-  cutpoint <- getCutpoint(RDDobject)
-  x <- getOriginalX(RDDobject)
+dens_test <- function(rdd_object, bin=NULL, bw=NULL, plot=TRUE,...){
+  checkIsRDD(rdd_object)
+  cutpoint <- getCutpoint(rdd_object)
+  x <- getOriginalX(rdd_object)
   test <- try(DCdensity(runvar=x, cutpoint=cutpoint, bin = bin, bw = bw, plot=plot, ext.out=TRUE, ...), silent=TRUE)
   if(inherits(test, "try-error")){
     warning("Error in computing the density, returning a simple histogram", if(is.null(bin)) " with arbitrary bin" else NULL)
     if(is.null(bin)) {
-      test <- try(DCdensity(RDDobject$x, cutpoint, bin = bin, bw = 0.2, ext.out=TRUE, plot=FALSE), silent=TRUE)
+      test <- try(DCdensity(rdd_object$x, cutpoint, bin = bin, bw = 0.2, ext.out=TRUE, plot=FALSE), silent=TRUE)
       bin <- test$binsize
     }
-    max_x <- max(RDDobject$x, na.rm=TRUE)
-    seq_breaks <- seq(from=min(RDDobject$x, na.rm=TRUE), to=max_x, by=bin)
+    max_x <- max(rdd_object$x, na.rm=TRUE)
+    seq_breaks <- seq(from=min(rdd_object$x, na.rm=TRUE), to=max_x, by=bin)
     if(max_x>max(seq_breaks)) seq_breaks <- c(seq_breaks, max_x+0.001)
-    hist(RDDobject$x, breaks=seq_breaks)
+    hist(rdd_object$x, breaks=seq_breaks)
     abline(v=cutpoint, col=2, lty=2)
   }
   
   test.htest <- list()
   test.htest$statistic <- c("z-val"=test$z)
   test.htest$p.value <- test$p
-  test.htest$data.name <- deparse(substitute(RDDobject))
+  test.htest$data.name <- deparse(substitute(rdd_object))
   test.htest$method <- "McCrary Test for no discontinuity of density around cutpoint"
   test.htest$alternative <- "Density is discontinuous around cutpoint"
   test.htest$estimate <- c(Discontinuity=test$theta)
diff --git a/R/gen_MC_IK.R b/R/gen_MC_IK.R
index b3ec8ca..9302825 100644
--- a/R/gen_MC_IK.R
+++ b/R/gen_MC_IK.R
@@ -13,7 +13,7 @@
 #' MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
 #' 
 #' ## Use np regression:
-#' reg_nonpara <- RDDreg_np(RDDobject=MC1_rdd)
+#' reg_nonpara <- RDDreg_np(rdd_object=MC1_rdd)
 #' reg_nonpara
 #' 
 #' # Represent the curves:
diff --git a/R/model.matrix.RDD.R b/R/model.matrix.RDD.R
index 763560c..8ab921a 100644
--- a/R/model.matrix.RDD.R
+++ b/R/model.matrix.RDD.R
@@ -3,7 +3,7 @@
 model.matrix.rdd_data <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){
 
   checkIsRDD(object)
-  RDDobject <- object
+  rdd_object <- object
   type <- getType(object)
 
   if(!missing(covar.strat)) warning("covar.strat is (soon) deprecated arg!")
@@ -12,11 +12,11 @@ model.matrix.rdd_data <- function(object, covariates=NULL, order=1, bw=NULL, slo
   covar.strat <- match.arg(covar.opt$strategy, choices=c("include", "residual"))
   covar.slope <- match.arg(covar.opt$slope, choices=c("same", "separate"))
   
-  cutpoint <- getCutpoint(RDDobject)
-  if(!is.null(covariates) & !hasCovar(RDDobject))  stop("Arg 'covariates' was specified, but no covariates found in 'RDDobject'.")
+  cutpoint <- getCutpoint(rdd_object)
+  if(!is.null(covariates) & !hasCovar(rdd_object))  stop("Arg 'covariates' was specified, but no covariates found in 'rdd_object'.")
 
 ## Construct data
-  dat <- as.data.frame(RDDobject)
+  dat <- as.data.frame(rdd_object)
 
   dat_step1 <- dat[, c("y", "x")]
   dat_step1$x <- dat_step1$x -cutpoint
@@ -39,7 +39,7 @@ model.matrix.rdd_data <- function(object, covariates=NULL, order=1, bw=NULL, slo
 
 ## Covariates
   if(!is.null(covariates)){
-    covar <- getCovar(RDDobject)
+    covar <- getCovar(rdd_object)
     formu.cova <- covariates
 
     if(grepl("\\.", formu.cova)) formu.cova <- paste(colnames(covar), collapse=" + ")
diff --git a/R/placebo.R b/R/placebo.R
index 9397047..d0f335e 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -11,11 +11,11 @@
 #' @examples
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd)
+#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
 #' plotPlacebo(reg_nonpara)
 #' 
 #' # Use with another vcov function; cluster case
-#' reg_nonpara_lminf <- RDDreg_np(RDDobject=Lee2008_rdd, inference="lm")
+#' reg_nonpara_lminf <- RDDreg_np(rdd_object=Lee2008_rdd, inference="lm")
 #' # need to be a function applied to updated object!
 #' vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 #' plotPlacebo(reg_nonpara_lminf, vcov. = vc)
@@ -208,7 +208,7 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_
   object_call <- getCall(object)
 
 ## original dataset:
-  dat_orig <- eval(object_call$RDDobject)
+  dat_orig <- eval(object_call$rdd_object)
   hasCov <- hasCovar(dat_orig)
 
 ## run each time:
@@ -224,7 +224,7 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_
     
     ## change the cutpoint, reattribute new data:
     attr(dat_sides, "cutpoint") <- seqi[i]
-    object_call$RDDobject <- dat_sides
+    object_call$rdd_object <- dat_sides
 
     ## Change bw if(same_bw=FALSE)
     if(hasBw) object_call$bw <- if(!same_bw) RDDbw_IK(dat_sides) else bw
diff --git a/R/plotSensi.R b/R/plotSensi.R
index 02c3bcb..6a16594 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -21,12 +21,12 @@
 #' 
 #' #Non-parametric estimate 
 #' bw_ik <- RDDbw_IK(Lee2008_rdd)
-#' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik)
+#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 #' plotSensi(reg_nonpara)
 #' plotSensi(reg_nonpara, device="base")
 #'
 #' #Parametric estimate:
-#' reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4, bw=bw_ik)
+#' reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
 #' plotSensi(reg_para_ik)
 #' plotSensi(reg_para_ik, type="facet")
 
diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index 4c4875c..e22e64a 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -119,7 +119,7 @@ plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), ce
 #' @examples 
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
+#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
 #' reg_para_lm <- as.lm(reg_para)
 #' reg_para_lm
 #' plot(reg_para_lm, which=4)
diff --git a/R/rdd_pred.R b/R/rdd_pred.R
index abb4e51..0d72b03 100644
--- a/R/rdd_pred.R
+++ b/R/rdd_pred.R
@@ -37,13 +37,13 @@
 #' Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 #' 
 #' # estimation without covariates: rdd_pred is the same than rdd_coef:
-#' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
+#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
 #' 
 #' rdd_pred(reg_para)
 #' rdd_coef(reg_para, allInfo=TRUE)
 #' 
 #' # estimation with covariates: 
-#' reg_para_cov <- RDDreg_lm(RDDobject=Lee2008_rdd,
+#' reg_para_cov <- RDDreg_lm(rdd_object=Lee2008_rdd,
 #'                           covariates="z1",
 #'                           covar.opt=list(slope="separate") )
 #'
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 2b62c71..97de15e 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -2,7 +2,7 @@
 #' 
 #' Compute RDD estimate allowing a locally kernel weighted version of any estimation function
 #' possibly on the range specified by bandwidth
-#' @param RDDobject Object of class rdd_data created by \code{\link{rdd_data}}
+#' @param rdd_object Object of class rdd_data created by \code{\link{rdd_data}}
 #' @param covariates Formula to include covariates
 #' @param order Order of the polynomial regression. 
 #' @param bw A bandwidth to specify the subset on which the kernel weighted regression is estimated
@@ -30,15 +30,15 @@
 #' 
 #' ## Estimate a local probit:
 #' Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y= cutpoint -bw & dat$x <= cutpoint +bw, 1, 0)
@@ -58,7 +58,7 @@ RDDgenreg <- function(RDDobject, fun=glm, covariates=NULL, order=1, bw=NULL, slo
 
 ## Construct data
   if(missing(weights)) weights <- NULL
-  dat_step1 <- model.matrix(RDDobject, covariates=covariates, order=order, bw=bw, 
+  dat_step1 <- model.matrix(rdd_object, covariates=covariates, order=order, bw=bw, 
 			    slope=slope, covar.opt=covar.opt)
 
 ## Regression
@@ -66,7 +66,7 @@ RDDgenreg <- function(RDDobject, fun=glm, covariates=NULL, order=1, bw=NULL, slo
   
   ##Return
   RDDslot <- list()
-  RDDslot$rdd_data <- RDDobject
+  RDDslot$rdd_data <- rdd_object
   reg$RDDslot <- RDDslot 
   class(reg) <- c("RDDreg_lm", "RDDreg", class(reg))
   attr(reg, "PolyOrder") <- order
@@ -77,15 +77,15 @@ RDDgenreg <- function(RDDobject, fun=glm, covariates=NULL, order=1, bw=NULL, slo
   reg
 }
 
-RDDgenreg_old <- function(RDDobject, covariates=".", bw=RDDbw_IK(RDDobject), slope=c("separate", "same"), fun=glm, ...){
+RDDgenreg_old <- function(rdd_object, covariates=".", bw=RDDbw_IK(rdd_object), slope=c("separate", "same"), fun=glm, ...){
 
   slope <- match.arg(slope)
-  checkIsRDD(RDDobject)
+  checkIsRDD(rdd_object)
   if(!is.function(fun)) stop("Arg 'fun' should be a function")
-  cutpoint <- getCutpoint(RDDobject)
+  cutpoint <- getCutpoint(rdd_object)
 
 ## Construct data
-  dat <- as.data.frame(RDDobject)
+  dat <- as.data.frame(rdd_object)
 
   dat_step1 <- dat[, c("y", "x")]
   dat_step1$x <- dat_step1$x -cutpoint
diff --git a/R/reg_lm.R b/R/reg_lm.R
index f2958fb..ffb5550 100644
--- a/R/reg_lm.R
+++ b/R/reg_lm.R
@@ -2,7 +2,7 @@
 #' 
 #' Compute a parametric polynomial regression of the ATE, 
 #' possibly on the range specified by bandwidth
-#' @param RDDobject Object of class rdd_data created by \code{\link{rdd_data}}
+#' @param rdd_object Object of class rdd_data created by \code{\link{rdd_data}}
 #' @param covariates Formula to include covariates
 #' @param order Order of the polynomial regression. 
 #' @param bw A bandwidth to specify the subset on which the parametric regression is estimated
@@ -35,27 +35,27 @@
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' ## Step 2: regression
 #' # Simple polynomial of order 1:
-#' reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
+#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
 #' print(reg_para)
 #' plot(reg_para)
 #'
 #' # Simple polynomial of order 4:
-#' reg_para4 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
+#' reg_para4 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
 #' reg_para4
 #' plot(reg_para4)
 #'
 #' # Restrict sample to bandwidth area:
 #' bw_ik <- RDDbw_IK(Lee2008_rdd)
-#' reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4)
+#' reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 #' reg_para_ik
 #' plot(reg_para_ik)
 
 
-RDDreg_lm <- function(RDDobject, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), weights){
+RDDreg_lm <- function(rdd_object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), weights){
 
-  checkIsRDD(RDDobject)
-  cutpoint <- getCutpoint(RDDobject)
-  type <- getType(RDDobject)
+  checkIsRDD(rdd_object)
+  cutpoint <- getCutpoint(rdd_object)
+  type <- getType(rdd_object)
 
   slope <- match.arg(slope)
 
@@ -63,7 +63,7 @@ RDDreg_lm <- function(RDDobject, covariates=NULL, order=1, bw=NULL, slope=c("sep
   if(!missing(weights)&!is.null(bw)) stop("Cannot give both 'bw' and 'weights'")
 
 ## Subsetting
-  dat <- as.data.frame(RDDobject)
+  dat <- as.data.frame(rdd_object)
 
   if(!is.null(bw)){
     weights <- ifelse(dat$x >= cutpoint -bw & dat$x <= cutpoint +bw, 1, 0)
@@ -75,7 +75,7 @@ RDDreg_lm <- function(RDDobject, covariates=NULL, order=1, bw=NULL, slope=c("sep
 
 ## Construct data
   if(missing(weights)) weights <- NULL
-  dat_step1 <- model.matrix(RDDobject, covariates=covariates, order=order, bw=bw, 
+  dat_step1 <- model.matrix(rdd_object, covariates=covariates, order=order, bw=bw, 
 			    slope=slope, covar.opt=covar.opt)
 
 ## Regression
@@ -91,7 +91,7 @@ RDDreg_lm <- function(RDDobject, covariates=NULL, order=1, bw=NULL, slope=c("sep
 
 ##Return
   RDDslot <- list()
-  RDDslot$rdd_data <- RDDobject
+  RDDslot$rdd_data <- rdd_object
   reg$RDDslot <- RDDslot 
   class(reg) <- c("RDDreg_lm", "RDDreg", class_reg)
   attr(reg, "PolyOrder") <- order
diff --git a/R/reg_np.R b/R/reg_np.R
index 36bd891..8d5a1fa 100644
--- a/R/reg_np.R
+++ b/R/reg_np.R
@@ -2,7 +2,7 @@
 #' 
 #' Compute a parametric polynomial regression of the ATE, 
 #' possibly on the range specified by bandwidth
-#' @param RDDobject Object of class rdd_data created by \code{\link{rdd_data}}
+#' @param rdd_object Object of class rdd_data created by \code{\link{rdd_data}}
 #' @param covariates TODO
 #' @param bw A bandwidth to specify the subset on which the parametric regression is estimated
 #' @param inference Type of inference to conduct: non-parametric one (\code{np}) or standard (\code{lm}). See details. 
@@ -18,25 +18,25 @@
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' ## Step 2: regression
 #' # Simple polynomial of order 1:
-#' reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd)
+#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
 #' print(reg_nonpara)
 #' plot(reg_nonpara)
 
 
-RDDreg_np <- function(RDDobject, covariates=NULL, bw=RDDbw_IK(RDDobject), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
+RDDreg_np <- function(rdd_object, covariates=NULL, bw=RDDbw_IK(rdd_object), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
 
   slope <- match.arg(slope)
   inference <- match.arg(inference)
-  checkIsRDD(RDDobject)
-  cutpoint <- getCutpoint(RDDobject)
+  checkIsRDD(rdd_object)
+  cutpoint <- getCutpoint(rdd_object)
 
   if(!is.null(covariates)) warning("covariates not fully implemented for non-para reg")
 
 ## Construct data
   if("strategy"%in%names(covar.opt)) warning("Arg 'strategy' should not be used for ")
   covar.opt$strategy <- "include"
-  dat <- as.data.frame(RDDobject)
-  dat_step1 <- model.matrix(RDDobject, covariates=covariates, order=1, bw=bw, 
+  dat <- as.data.frame(rdd_object)
+  dat_step1 <- model.matrix(rdd_object, covariates=covariates, order=1, bw=bw, 
 			    slope=slope, covar.opt=covar.opt)
 
 
@@ -65,7 +65,7 @@ RDDreg_np <- function(RDDobject, covariates=NULL, bw=RDDbw_IK(RDDobject), slope=
 ##Return
   res <- list()
   RDDslot <- list()
-  RDDslot$rdd_data <- RDDobject
+  RDDslot$rdd_data <- rdd_object
   RDDslot$model <- reg
   res$coefficients <- coef(reg)["D"]
   res$coefMat <- coefmat 
diff --git a/man/RDDbw_IK.Rd b/man/RDDbw_IK.Rd
index 38532ef..f02a257 100644
--- a/man/RDDbw_IK.Rd
+++ b/man/RDDbw_IK.Rd
@@ -4,10 +4,10 @@
 \alias{RDDbw_IK}
 \title{Imbens-Kalyanaraman Optimal Bandwidth Calculation}
 \usage{
-RDDbw_IK(RDDobject, kernel = c("Triangular", "Uniform", "Normal"))
+RDDbw_IK(rdd_object, kernel = c("Triangular", "Uniform", "Normal"))
 }
 \arguments{
-\item{RDDobject}{of class rdd_data created by \code{\link{rdd_data}}}
+\item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}}
 
 \item{kernel}{The type of kernel used: either \code{triangular} or \code{uniform}.}
 }
diff --git a/man/RDDgenreg.Rd b/man/RDDgenreg.Rd
index 2d04c6d..0f688e8 100644
--- a/man/RDDgenreg.Rd
+++ b/man/RDDgenreg.Rd
@@ -4,12 +4,13 @@
 \alias{RDDgenreg}
 \title{General polynomial estimator of the regression discontinuity}
 \usage{
-RDDgenreg(RDDobject, fun = glm, covariates = NULL, order = 1, bw = NULL,
-  slope = c("separate", "same"), covar.opt = list(strategy = c("include",
-  "residual"), slope = c("same", "separate"), bw = NULL), weights, ...)
+RDDgenreg(rdd_object, fun = glm, covariates = NULL, order = 1,
+  bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy =
+  c("include", "residual"), slope = c("same", "separate"), bw = NULL), weights,
+  ...)
 }
 \arguments{
-\item{RDDobject}{Object of class rdd_data created by \code{\link{rdd_data}}}
+\item{rdd_object}{Object of class rdd_data created by \code{\link{rdd_data}}}
 
 \item{fun}{The function to estimate the parameters}
 
@@ -52,7 +53,7 @@ Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 ## Estimate a local probit:
 Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y
Date: Thu, 7 May 2015 11:28:13 +0200
Subject: [PATCH 112/323] RDDdata -> rdd_data, RDDobject -> rdd_object

---
 vignettes/rddtools.R    | 4 ++--
 vignettes/rddtools.Rmd  | 8 ++++----
 vignettes/rddtools.html | 8 ++++----
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R
index 671f37e..177e7da 100644
--- a/vignettes/rddtools.R
+++ b/vignettes/rddtools.R
@@ -13,14 +13,14 @@ summary(Lee2008_rdd)
 plot(Lee2008_rdd)
 
 ## ----reg_para------------------------------------------------------------
-reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
+reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para
 
 plot(reg_para)
 
 ## ----RegPlot-------------------------------------------------------------
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
 
diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd
index bc3285d..862e6d6 100644
--- a/vignettes/rddtools.Rmd
+++ b/vignettes/rddtools.Rmd
@@ -14,7 +14,7 @@ vignette: >
 knitr::opts_chunk$set(collapse = T, comment = "#>")
 ```
 
-**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *RDDdata* object, on which different anaylsis tools can be applied. 
+**RDDtools** works in an object-oriented way: the user has to define once the characteristic of the data, creating a *rdd_data* object, on which different anaylsis tools can be applied. 
 
 # Data Preparation and Visualisation
 Load the package, and load the built-in dataset from [Lee 2008]:
@@ -24,7 +24,7 @@ library(rddtools)
 data(Lee2008)
 ```
 
-Declare the data to be a *RDDdata* object:
+Declare the data to be a *rdd_data* object:
 
 ```{r}
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
@@ -44,7 +44,7 @@ plot(Lee2008_rdd)
 Estimate parametrically, by fitting a 4th order polynomial.
 
 ```{r reg_para}
-reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
+reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para
 
 plot(reg_para)
@@ -57,7 +57,7 @@ Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidt
 
 ```{r RegPlot}
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
 ```
diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html
index d32c3fc..1a28b58 100644
--- a/vignettes/rddtools.html
+++ b/vignettes/rddtools.html
@@ -58,13 +58,13 @@ 

2015-05-07

-

RDDtools works in an object-oriented way: the user has to define once the characteristic of the data, creating a RDDdata object, on which different anaylsis tools can be applied.

+

RDDtools works in an object-oriented way: the user has to define once the characteristic of the data, creating a rdd_data object, on which different anaylsis tools can be applied.

Data Preparation and Visualisation

Load the package, and load the built-in dataset from [Lee 2008]:

library(rddtools)
 data(Lee2008)
-

Declare the data to be a RDDdata object:

+

Declare the data to be a rdd_data object:

Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)

You can now directly summarise and visualise this data:

summary(Lee2008_rdd)
@@ -82,7 +82,7 @@ 

Data Preparation and Visualisation

Parametric Estimation

Estimate parametrically, by fitting a 4th order polynomial.

-
reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
+
reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para
 #> ### RDD regression: parametric ###
 #>  Polynomial order:  4 
@@ -102,7 +102,7 @@ 

Parametric Estimation

Non-parametric Estimation

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 #> ### RDD regression: nonparametric local linear###
 #>  Bandwidth:  0.2938561 

From 8bf6de6798ac8642e1536362c3c28beb14702db2 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:28:54 +0200
Subject: [PATCH 113/323] regarding last commit

---
 tests/RDDpred.R     | 12 ++++++------
 tests/packageDemo.R | 26 +++++++++++++-------------
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/tests/RDDpred.R b/tests/RDDpred.R
index 2ff1ff3..10e2c15 100644
--- a/tests/RDDpred.R
+++ b/tests/RDDpred.R
@@ -15,14 +15,14 @@ Lee2008_rdd_z <- rdd_data(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 #### REGS
 bw_IK <- RDDbw_IK(Lee2008_rdd_z)
 w_IK <- rddtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_IK)
-reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
-reg_para4_cov_slSep_W <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK)
-reg_np_cov <- RDDreg_np(RDDobject=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm")
+reg_para4_cov_slSep <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep_W <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK)
+reg_np_cov <- RDDreg_np(rdd_object=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm")
 
 
 
 
-reg_para4_cov_slSep_2Z <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1+z2", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep_2Z <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1+z2", covar.opt=list(slope="separate"))
 
 reg_li <- list( reg_para4_cov_slSep=reg_para4_cov_slSep, 
 		reg_para4_cov_slSep_W=reg_para4_cov_slSep_W,
@@ -48,7 +48,7 @@ sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rdd_coef(x, allInfo=TRU
 
 
 # 
-# reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
+# reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
 # print(reg_para)
 # summary(reg_para)
 # plot(reg_para)
@@ -70,7 +70,7 @@ sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rdd_coef(x, allInfo=TRU
 # deltaMethod(a, "a1 - a2", parameterNames=paste("a", 1:4, sep=""))
 # coef(summary(reg_para))[2,]
 # 
-# reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
+# reg_para4_cov_slSep <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
 # 
 mf_2 <- model.frame(reg_para4_cov_slSep)
 # formula(reg_para4_cov_slSep)
diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index c67e645..ad9834f 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -57,7 +57,7 @@ RDDbw_IK(Lee2008_rdd)
 
 ###### Parametric regression ######
 # Simple polynomial of order 1:
-reg_para <- RDDreg_lm(RDDobject=Lee2008_rdd)
+reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
 print(reg_para)
 summary(reg_para)
 plot(reg_para)
@@ -66,21 +66,21 @@ all.equal(unlist(rdd_pred(reg_para)), rdd_coef(reg_para, allInfo=TRUE)[1:2], che
 
 ## Difference in means regression:
 # Simple polynomial of order 0:
-reg_para_0 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=0)
+reg_para_0 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=0)
 print(reg_para_0)
 summary(reg_para_0)
 plot(reg_para_0)
 
 
 ## Simple polynomial of order 4:
-reg_para4 <- RDDreg_lm(RDDobject=Lee2008_rdd, order=4)
+reg_para4 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para4
 plot(reg_para4)
 all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Restrict sample to bandwidth area:
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_para_ik <- RDDreg_lm(RDDobject=Lee2008_rdd, bw=bw_ik, order=4)
+reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
 
@@ -92,42 +92,42 @@ coef(reg_para_fuzz)
 summary(reg_para_fuzz)
 
 ## Covariates:
-reg_para4_cov <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".")
+reg_para4_cov <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".")
 reg_para4_cov
 summary(reg_para4_cov)
 
-reg_para4_cov_slSep <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
 summary(reg_para4_cov_slSep)
 rdd_pred(reg_para4_cov_slSep)
 rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
 
 
-reg_para4_cov_startR <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
+reg_para4_cov_startR <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
 reg_para4_cov_startR
 summary(reg_para4_cov_startR)
 
 plot(reg_para4_cov)
 
-reg_para4_cov_startR_sl2 <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual", slope="separate"))
+reg_para4_cov_startR_sl2 <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual", slope="separate"))
 summary(reg_para4_cov_startR_sl2)
 
-reg_para4_cov_2 <- RDDreg_lm(RDDobject=Lee2008_rdd_z, order=4, covariates="z3+I(z1^2)")
+reg_para4_cov_2 <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z3+I(z1^2)")
 reg_para4_cov_2
 summary(reg_para4_cov_2)
 
 ###### Non-parametric regression ######
-reg_nonpara <- RDDreg_np(RDDobject=Lee2008_rdd)
+reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
 print(reg_nonpara)
 summary(reg_nonpara)
 plot(x=reg_nonpara)
 
-reg_nonpara_inflm <- RDDreg_np(RDDobject=Lee2008_rdd, inference="lm")
+reg_nonpara_inflm <- RDDreg_np(rdd_object=Lee2008_rdd, inference="lm")
 print(reg_nonpara_inflm)
 summary(reg_nonpara_inflm)
 plot(x=reg_nonpara_inflm)
 
 
-reg_nonpara_sameSl <- RDDreg_np(RDDobject=Lee2008_rdd, slope="same")
+reg_nonpara_sameSl <- RDDreg_np(rdd_object=Lee2008_rdd, slope="same")
 print(reg_nonpara_sameSl)
 summary(reg_nonpara_sameSl)
 
@@ -211,7 +211,7 @@ covarTest_dis(reg_para4_cov)
 
 ## Compare with result obtained with a Gaussian kernel:
   bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
-  reg_nonpara_gaus <- RDDreg_lm(RDDobject=Lee2008_rdd, w=bw_lm)
+  reg_nonpara_gaus <- RDDreg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
   all.equal(rdd_coef(reg_nonpara_gaus, allCo=TRUE),rdd_coef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
 
 

From 3b4b16b0731e18370059a2e1c3cc6156c20f3156 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:30:21 +0200
Subject: [PATCH 114/323] is.even -> is_even, since not a method

---
 R/qplot_experim.R    | 4 ++--
 R/rdd_data_methods.R | 4 ++--
 R/various_code.R     | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/R/qplot_experim.R b/R/qplot_experim.R
index f8459b3..737f5ce 100644
--- a/R/qplot_experim.R
+++ b/R/qplot_experim.R
@@ -10,7 +10,7 @@ gplot <- function(x,  h, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=3,type
       object <- subset(object, object$x> min(xlim) & object$x< max(xlim))
     }
     h <- RDDbw_RSW(object) 
-    if(is.even(nplot)) {
+    if(is_even(nplot)) {
       se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
     } else {
       se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
@@ -18,7 +18,7 @@ gplot <- function(x,  h, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=3,type
     hs <- if(nplot==1) h else se *h
   } else {
     if(length(h)==1){
-      if(is.even(nplot)) {
+      if(is_even(nplot)) {
 	se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
       } else {
 	se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index e22e64a..e3575b1 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -64,7 +64,7 @@ plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), ce
       object <- subset(object, x> min(xlim) & x< max(xlim))
     }
     h <- RDDbw_RSW(object) 
-    if(is.even(nplot)) {
+    if(is_even(nplot)) {
       se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
     } else {
       se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
@@ -72,7 +72,7 @@ plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), ce
     hs <- if(nplot==1) h else se *h
   } else if(!missing(h) & is.null(nbins)){
     if(length(h)==1){
-      if(is.even(nplot)) {
+      if(is_even(nplot)) {
 	se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
       } else {
 	se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
diff --git a/R/various_code.R b/R/various_code.R
index fb8e80a..66f4665 100644
--- a/R/various_code.R
+++ b/R/various_code.R
@@ -1,5 +1,5 @@
 ### MISC
-is.even <- function (a) {
+is_even <- function (a) {
   a%%2 == 0
 }
 

From aaea88c343cd81ac4c21d5dc37d5a7edb371ffbd Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:33:01 +0200
Subject: [PATCH 115/323] RDDreggen -> rdd_reg_gen

---
 NAMESPACE                            | 2 +-
 R/reg_gen.R                          | 8 ++++----
 man/{RDDgenreg.Rd => rdd_gen_reg.Rd} | 8 ++++----
 3 files changed, 9 insertions(+), 9 deletions(-)
 rename man/{RDDgenreg.Rd => rdd_gen_reg.Rd} (91%)

diff --git a/NAMESPACE b/NAMESPACE
index c8da900..afdd504 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -34,7 +34,6 @@ S3method(summary,rdd_data)
 S3method(vcov,RDDreg_np)
 export(RDDbw_IK)
 export(RDDbw_RSW)
-export(RDDgenreg)
 export(RDDreg_lm)
 export(RDDreg_np)
 export(ROT_bw)
@@ -52,6 +51,7 @@ export(plotPlaceboDens)
 export(plotSensi)
 export(rdd_coef)
 export(rdd_data)
+export(rdd_gen_reg)
 export(rdd_pred)
 export(vcovCluster)
 export(vcovCluster2)
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 97de15e..9ebfc29 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -22,7 +22,7 @@
 #' function for the class of the object returned by \code{fun}. 
 #' @return An object of class RDDreg_lm and class lm, with specific print and plot methods
 #' @references TODO
-#' @export RDDgenreg 
+#' @export rdd_gen_reg 
 #' @examples
 #' ## Step 0: prepare data
 #' data(Lee2008)
@@ -30,12 +30,12 @@
 #' 
 #' ## Estimate a local probit:
 #' Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y
Date: Thu, 7 May 2015 11:34:32 +0200
Subject: [PATCH 116/323] RDDreg -> rdd_reg

---
 NAMESPACE                           | 46 ++++++++++++++---------------
 R/as.npreg.R                        | 22 +++++++-------
 R/clusterInf.R                      | 16 +++++-----
 R/covarTests.R                      |  8 ++---
 R/gen_MC_IK.R                       |  2 +-
 R/get_methods.R                     | 18 +++++------
 R/placebo.R                         | 10 +++----
 R/plotSensi.R                       | 22 +++++++-------
 R/rdd_coef.R                        |  2 +-
 R/rdd_data_methods.R                |  8 ++---
 R/rdd_pred.R                        |  4 +--
 R/reg_gen.R                         |  6 ++--
 R/reg_lm.R                          | 18 +++++------
 R/reg_np.R                          | 26 ++++++++--------
 R/var_estim.R                       |  2 +-
 R/waldci.R                          |  4 +--
 man/as.lm.Rd                        |  4 +--
 man/as.npregbw.Rd                   | 16 +++++-----
 man/clusterInf.Rd                   |  4 +--
 man/covarTest_dis.Rd                |  6 ++--
 man/covarTest_mean.Rd               |  6 ++--
 man/gen_MC_IK.Rd                    |  2 +-
 man/plotPlacebo.Rd                  | 12 ++++----
 man/plotSensi.Rd                    | 20 ++++++-------
 man/rdd_coef.Rd                     |  4 +--
 man/rdd_gen_reg.Rd                  |  2 +-
 man/rdd_pred.Rd                     |  4 +--
 man/{RDDreg_lm.Rd => rdd_reg_lm.Rd} | 16 +++++-----
 man/{RDDreg_np.Rd => rdd_reg_np.Rd} | 10 +++----
 man/vcovCluster.Rd                  |  2 +-
 tests/RDDpred.R                     | 12 ++++----
 tests/RDDtools_vs_rdd.R             |  6 ++--
 tests/packageDemo.R                 | 28 +++++++++---------
 tests/simple_MC.R                   | 12 ++++----
 34 files changed, 190 insertions(+), 190 deletions(-)
 rename man/{RDDreg_lm.Rd => rdd_reg_lm.Rd} (86%)
 rename man/{RDDreg_np.Rd => rdd_reg_np.Rd} (85%)

diff --git a/NAMESPACE b/NAMESPACE
index afdd504..a70c545 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -2,40 +2,38 @@
 
 S3method("[",rdd_data)
 S3method(as.data.frame,rdd_data)
-S3method(as.lm,RDDreg)
-S3method(as.lm,RDDreg_np)
-S3method(bread,RDDreg_np)
-S3method(covarTest_dis,RDDreg)
+S3method(as.lm,rdd_reg)
+S3method(as.lm,rdd_reg_np)
+S3method(bread,rdd_reg_np)
 S3method(covarTest_dis,rdd_data)
-S3method(covarTest_mean,RDDreg)
+S3method(covarTest_dis,rdd_reg)
 S3method(covarTest_mean,rdd_data)
-S3method(estfun,RDDreg_np)
-S3method(getCall,RDDreg)
-S3method(model.frame,RDDreg_np)
+S3method(covarTest_mean,rdd_reg)
+S3method(estfun,rdd_reg_np)
+S3method(getCall,rdd_reg)
+S3method(model.frame,rdd_reg_np)
 S3method(model.matrix,rdd_data)
-S3method(plot,RDDreg_lm)
-S3method(plot,RDDreg_np)
 S3method(plot,rdd_data)
+S3method(plot,rdd_reg_lm)
+S3method(plot,rdd_reg_np)
 S3method(plotPlacebo,PlaceboVals)
-S3method(plotPlacebo,RDDreg)
+S3method(plotPlacebo,rdd_reg)
 S3method(plotPlaceboDens,PlaceboVals)
-S3method(plotPlaceboDens,RDDreg)
-S3method(plotSensi,RDDreg_lm)
-S3method(plotSensi,RDDreg_np)
-S3method(print,RDDreg_lm)
-S3method(print,RDDreg_np)
-S3method(print,summary.RDDreg_np)
-S3method(rdd_coef,RDDreg_np)
-S3method(rdd_coef,RDDreg_npreg)
+S3method(plotPlaceboDens,rdd_reg)
+S3method(plotSensi,rdd_reg_lm)
+S3method(plotSensi,rdd_reg_np)
+S3method(print,rdd_reg_lm)
+S3method(print,rdd_reg_np)
+S3method(print,summary.rdd_reg_np)
 S3method(rdd_coef,default)
+S3method(rdd_coef,rdd_reg_np)
+S3method(rdd_coef,rdd_reg_npreg)
 S3method(subset,rdd_data)
-S3method(summary,RDDreg_np)
 S3method(summary,rdd_data)
-S3method(vcov,RDDreg_np)
+S3method(summary,rdd_reg_np)
+S3method(vcov,rdd_reg_np)
 export(RDDbw_IK)
 export(RDDbw_RSW)
-export(RDDreg_lm)
-export(RDDreg_np)
 export(ROT_bw)
 export(as.lm)
 export(as.npreg)
@@ -53,6 +51,8 @@ export(rdd_coef)
 export(rdd_data)
 export(rdd_gen_reg)
 export(rdd_pred)
+export(rdd_reg_lm)
+export(rdd_reg_np)
 export(vcovCluster)
 export(vcovCluster2)
 import(Formula)
diff --git a/R/as.npreg.R b/R/as.npreg.R
index c1209a3..572736b 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -1,21 +1,21 @@
-#' Convert an RDDreg object to a  \code{npreg} object
+#' Convert an rdd_reg object to a  \code{npreg} object
 #' 
 #' Convert an rdd_object to a non-parametric regression \code{npreg} from package \code{np}
-#' @param x Object of class \code{RDDreg} created by \code{\link{RDDreg_np}} or \code{\link{RDDreg_lm}}
+#' @param x Object of class \code{rdd_reg} created by \code{\link{rdd_reg_np}} or \code{\link{rdd_reg_lm}}
 #' @param \ldots Further arguments passed to the \code{\link{npregbw}} or \code{\link{npreg}}
-#' @details This function converts an RDDreg object into an \code{npreg} object from package \code{np}
+#' @details This function converts an rdd_reg object into an \code{npreg} object from package \code{np}
 #' Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one. 
-#' Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while RDDreg 
+#' Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while rdd_reg 
 #' proceeds as if the kernel was univariate. A simple solution to make the multivariate kernel similar to the  univariate one 
 #' is to set the bandwidth for x and Dx to a large number, so that they converge towards a constant, and one obtains back the univariate kernel. 
 #' @export
 #' @return An object of class \code{npreg} or \code{npregbw}
-#' @seealso \code{\link{as.lm}} which converts \code{RDDreg} objects into \code{lm}.
+#' @seealso \code{\link{as.lm}} which converts \code{rdd_reg} objects into \code{lm}.
 #' @examples
-#' # Estimate ususal RDDreg:
+#' # Estimate ususal rdd_reg:
 #'  data(Lee2008)
 #'  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#'  reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+#'  reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 #' 
 #' ## Convert to npreg:
 #'  reg_nonpara_np <- as.npreg(reg_nonpara)
@@ -24,7 +24,7 @@
 #' 
 #' ## Compare with result obtained with a Gaussian kernel:
 #'  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
-#'  reg_nonpara_gaus <- RDDreg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
+#'  reg_nonpara_gaus <- rdd_reg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
 #'  all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) 
 
 
@@ -66,7 +66,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
 ## start npregbw
   res <- np::npregbw(bws=bws, formula=y~x+D+Dx, data= dat_np,  regtype = "ll",
 			eval=dataPoints, bandwidth.compute=FALSE, gradients=TRUE,...)
-  class(res) <- c("RDDreg_npregbw", class(res))
+  class(res) <- c("rdd_reg_npregbw", class(res))
 
 ## if npreg, return instead model_np <- npreg(bw_np, newdata=dataPoints, gradients=TRUE)
   if(npreg==TRUE) {
@@ -81,7 +81,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
     # requireNamespace("np", quietly = TRUE)
     options(np.messages = TRUE) ## otherwise got warnings messages... probably because comes only if loaded!
     res <- np::npreg(res, newdata=dataPoints, gradients=TRUE, ...)
-    class(res) <- c("RDDreg_npreg", class(res))
+    class(res) <- c("rdd_reg_npreg", class(res))
   }
   
   attr(res, "RDDdf") <- dat_np
@@ -91,7 +91,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
 
 
 #' @export
-rdd_coef.RDDreg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){
+rdd_coef.rdd_reg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){
 
   co <- diff(object$mean)
   if(allInfo) {
diff --git a/R/clusterInf.R b/R/clusterInf.R
index 330b50c..d171357 100644
--- a/R/clusterInf.R
+++ b/R/clusterInf.R
@@ -2,7 +2,7 @@
 #' 
 #' Correct standard-errors to account for clustered data, doing either a degrees of freedom correction or using a heteroskedasticidty-cluster robust covariance matrix
 #' possibly on the range specified by bandwidth
-#' @param object Object of class lm, from which RDDreg also inherits.
+#' @param object Object of class lm, from which rdd_reg also inherits.
 #' @param clusterVar The variable containing the cluster attributions. 
 #' @param vcov. Specific covariance function to pass to coeftest. See help of sandwich
 #' @param type The type of cluster correction to use: either the degrees of freedom, or a HC matrix. 
@@ -17,7 +17,7 @@
 #' @examples
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 #' 
 #' # here we just generate randomly a cluster variable:
 #' nlet <- sort(c(outer(letters, letters, paste, sep="")))
@@ -45,34 +45,34 @@ clusterInf <- function(object, clusterVar, vcov. = NULL, type=c("df-adj", "HC"),
 }
 
 #' @export
-estfun.RDDreg_np <- function(x,...){
+estfun.rdd_reg_np <- function(x,...){
   inf_met <- infType(x) ## def in Misc.R
   if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
   estfun(x$RDDslot$model)
 }
 
 #' @export
-bread.RDDreg_np <- function(x,...){
+bread.rdd_reg_np <- function(x,...){
   inf_met <- infType(x) ## def in Misc.R
   if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
   bread(x$RDDslot$model)
 } 
 
 
-# sandwich.RDDreg_np <- function (x, bread. = bread, meat. = meat, ...){
+# sandwich.rdd_reg_np <- function (x, bread. = bread, meat. = meat, ...){
 #   inf_met <- infType(x) ## def in Misc.R
 #   if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
 #   sandwich(x$RDDslot$model, bread.=bread., meat.=meat., ...)
 # }
 
 #' @export
-model.frame.RDDreg_np <- function (formula, ...) 
+model.frame.rdd_reg_np <- function (formula, ...) 
   model.frame(formula$RDDslot$model)
 
 #' Cluster Heteroskedasticity-consistent estimation of the covariance matrix. 
 #' 
 #' Offer a cluster variant of the usual Heteroskedasticity-consistent 
-#' @param object Object of class lm, from which RDDreg also inherits.
+#' @param object Object of class lm, from which rdd_reg also inherits.
 #' @param clusterVar The variable containing the cluster attributions. 
 #' @return A matrix containing the covariance matrix estimate.
 #' @author Mahmood Arai, see \url{http://people.su.se/~ma/econometrics.html}
@@ -145,4 +145,4 @@ getModelRank <- function(object,...)
 
 getModelRank.default <- function(object,...) object$rank
 
-getModelRank.RDDreg_np <- function(object,...) getModelRank.default(object$RDDslot$model)
+getModelRank.rdd_reg_np <- function(object,...) getModelRank.default(object$RDDslot$model)
diff --git a/R/covarTests.R b/R/covarTests.R
index c3a918e..49d876d 100644
--- a/R/covarTests.R
+++ b/R/covarTests.R
@@ -28,7 +28,7 @@
 #' covarTest_dis(Lee2008_rdd_Z, bw=0.3)
 #' 
 #' ## covarTest_mean works also on regression outputs (bw will be taken from the model)
-#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd_Z)
+#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd_Z)
 #' covarTest_mean(reg_nonpara)
 
 
@@ -54,7 +54,7 @@ covarTest_mean.rdd_data <- function(object, bw=NULL, paired = FALSE, var.equal =
 
 #' @rdname covarTest_mean
 #' @export
-covarTest_mean.RDDreg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
+covarTest_mean.rdd_reg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
   
   cutpoint <- getCutpoint(object)
   dat <- object$RDDslot$rdd_data
@@ -128,7 +128,7 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE,
 #' ## Can also use function covarTest_dis() for a t-test for equality of means around cutoff:
 #' covarTest_mean(Lee2008_rdd_Z, bw=0.3)
 #' ## covarTest_dis works also on regression outputs (bw will be taken from the model)
-#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd_Z)
+#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd_Z)
 #' covarTest_dis(reg_nonpara)
 
 #' @export
@@ -149,7 +149,7 @@ covarTest_dis.rdd_data <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("
 
 #' @rdname covarTest_dis
 #' @export
-covarTest_dis.RDDreg <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
+covarTest_dis.rdd_reg <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
   
   cutpoint <- getCutpoint(object)
   dat <- object$RDDslot$rdd_data
diff --git a/R/gen_MC_IK.R b/R/gen_MC_IK.R
index 9302825..841e18b 100644
--- a/R/gen_MC_IK.R
+++ b/R/gen_MC_IK.R
@@ -13,7 +13,7 @@
 #' MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
 #' 
 #' ## Use np regression:
-#' reg_nonpara <- RDDreg_np(rdd_object=MC1_rdd)
+#' reg_nonpara <- rdd_reg_np(rdd_object=MC1_rdd)
 #' reg_nonpara
 #' 
 #' # Represent the curves:
diff --git a/R/get_methods.R b/R/get_methods.R
index 7373186..37ba86d 100644
--- a/R/get_methods.R
+++ b/R/get_methods.R
@@ -1,11 +1,11 @@
 
 
 # checkIsRDD <- function(object)  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-# checkIsAnyRDD <- function(object)  if(!inherits(object, c("rdd_data", "RDDreg_np"))) stop("Only works for rdd_data objects")
+# checkIsAnyRDD <- function(object)  if(!inherits(object, c("rdd_data", "rdd_reg_np"))) stop("Only works for rdd_data objects")
 
 # function(object)  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
 checkIsAnyRDD <- checkIsRDD <- function(object)  {
-  classesOk <- c("rdd_data", "RDDreg_np", "RDDreg_lm")
+  classesOk <- c("rdd_data", "rdd_reg_np", "rdd_reg_lm")
   if(!inherits(object, classesOk)) stop("Only works for rdd_data objects")
 }
 
@@ -47,7 +47,7 @@ getBW <- function(object, force.na=FALSE){
 
 
 
-## return the type of inference used by RDDreg_np
+## return the type of inference used by rdd_reg_np
 infType <- function(x) {
   if(is.null(getCall(x)$inference)) "se" else getCall(x)$inference
 }
@@ -58,7 +58,7 @@ hasCovar <- function(object)
 
 hasCovar.rdd_data <- function(object)  attr(object, "hasCovar")
 
-hasCovar.RDDreg <- function(object) { 
+hasCovar.rdd_reg <- function(object) { 
   call <- getCall(object)
   !is.null(call$covariates)
 }
@@ -92,7 +92,7 @@ getOriginalX <- function(object)
   UseMethod("getOriginalX")
 
 
-getOriginalX.RDDreg <- function(object){
+getOriginalX.rdd_reg <- function(object){
   object$RDDslot$rdd_data[, "x"]
 }
 
@@ -100,7 +100,7 @@ getOriginalX.rdd_data <- function(object){
   object[, "x"]
 }
 
-# getOriginalX.RDDreg_np <- function(object){
+# getOriginalX.rdd_reg_np <- function(object){
 # 
 #   cutpoint <- getCutpoint(object)
 #   Xnam <- getXname(object) 
@@ -113,7 +113,7 @@ getOriginalX.rdd_data <- function(object){
 getOriginalData <- function(object, na.rm=TRUE, classRDD=TRUE)
   UseMethod("getOriginalData")
 
-# getOriginalData.RDDreg_np <- function(object, na.rm=TRUE){
+# getOriginalData.rdd_reg_np <- function(object, na.rm=TRUE){
 # 
 #   cutpoint <- getCutpoint(object)
 #   Xnam <- getXname(object) 
@@ -125,7 +125,7 @@ getOriginalData <- function(object, na.rm=TRUE, classRDD=TRUE)
 
 
 
-getOriginalData.RDDreg <- function(object, na.rm=TRUE, classRDD=TRUE){
+getOriginalData.rdd_reg <- function(object, na.rm=TRUE, classRDD=TRUE){
   res <- object$RDDslot$rdd_data
   if(na.rm) res <- res[apply(res, 1, function(x) all(!is.na(x))),] # remove na rows
   if(!classRDD) res <- as.data.frame(res)
@@ -136,7 +136,7 @@ getOriginalData.RDDreg <- function(object, na.rm=TRUE, classRDD=TRUE){
 
 #' @importFrom stats getCall
 #' @export
-getCall.RDDreg <- function(x,...) attr(x, "RDDcall")
+getCall.rdd_reg <- function(x,...) attr(x, "RDDcall")
 
 
 #format(Sys.Date(), "%A %Y-%m-%d")
diff --git a/R/placebo.R b/R/placebo.R
index d0f335e..dd9ecf2 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -11,11 +11,11 @@
 #' @examples
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 #' plotPlacebo(reg_nonpara)
 #' 
 #' # Use with another vcov function; cluster case
-#' reg_nonpara_lminf <- RDDreg_np(rdd_object=Lee2008_rdd, inference="lm")
+#' reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference="lm")
 #' # need to be a function applied to updated object!
 #' vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 #' plotPlacebo(reg_nonpara_lminf, vcov. = vc)
@@ -32,7 +32,7 @@ plotPlacebo <- function(object, device=c("ggplot", "base"), ...)
 #' @param by Increments of the from-to sequence
 #' @param level Level of the confidence interval shown
 #' @param same_bw Whether to re-estimate the bandwidth at each point
-plotPlacebo.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, plot=TRUE, output=c("data", "ggplot"), ...){
+plotPlacebo.rdd_reg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, plot=TRUE, output=c("data", "ggplot"), ...){
 
   device <- match.arg(device)
   output <- match.arg(output)
@@ -122,7 +122,7 @@ plotPlaceboDens <- function(object, device=c("ggplot", "base"), ...)
 
 #' @rdname plotPlacebo
 #' @export
-plotPlaceboDens.RDDreg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, ...){
+plotPlaceboDens.rdd_reg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, ...){
 
   device <- match.arg(device)
 
@@ -230,7 +230,7 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_
     if(hasBw) object_call$bw <- if(!same_bw) RDDbw_IK(dat_sides) else bw
     
     ## Re-estimate model with new cutpoint/bw
-    object_new <- eval(object_call) # RDDreg_np(dat_sides, bw=bw_reg)
+    object_new <- eval(object_call) # rdd_reg_np(dat_sides, bw=bw_reg)
 
     ## assign results (LATE and se)
     if(!inherits(object_new, "try-error")){
diff --git a/R/plotSensi.R b/R/plotSensi.R
index 6a16594..b91f573 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -2,13 +2,13 @@
 #' 
 #' Draw a plot showing the LATE estimates depending on multiple bandwidths
 #' 
-#' @param RDDregobject object of a RDD regression, from either \code{\link{RDDreg_lm}} or \code{\link{RDDreg_np}}
+#' @param rdd_regobject object of a RDD regression, from either \code{\link{rdd_reg_lm}} or \code{\link{rdd_reg_np}}
 #' @param from First bandwidth point. Default value is max(1e-3, bw-0.1)
 #' @param to Last bandwidth point. Default value is bw+0.1
 #' @param by Increments in the \code{from} \code{to} sequence
 #' @param level Level of the confidence interval
-#' @param order For parametric models (from \code{\link{RDDreg_lm}}), the order of the polynomial.
-#' @param type For parametric models (from \code{\link{RDDreg_lm}}) whether different orders are represented as different colour or as different facets.
+#' @param order For parametric models (from \code{\link{rdd_reg_lm}}), the order of the polynomial.
+#' @param type For parametric models (from \code{\link{rdd_reg_lm}}) whether different orders are represented as different colour or as different facets.
 #' @param device Whether to draw a base or a ggplot graph.
 #' @param output Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object
 #' @param plot Whether to actually plot the data. 
@@ -21,12 +21,12 @@
 #' 
 #' #Non-parametric estimate 
 #' bw_ik <- RDDbw_IK(Lee2008_rdd)
-#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 #' plotSensi(reg_nonpara)
 #' plotSensi(reg_nonpara, device="base")
 #'
 #' #Parametric estimate:
-#' reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
+#' reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
 #' plotSensi(reg_para_ik)
 #' plotSensi(reg_para_ik, type="facet")
 
@@ -37,20 +37,20 @@
 ###################################
 
 #' @export
-plotSensi <- function(RDDregobject, from, to, by=0.01, level=0.95, output=c("data", "ggplot"), plot=TRUE, ...)
+plotSensi <- function(rdd_regobject, from, to, by=0.01, level=0.95, output=c("data", "ggplot"), plot=TRUE, ...)
   UseMethod("plotSensi")
 
 #' @rdname plotSensi
 #' @export
 #' @param vcov. Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}
-plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, device=c("ggplot", "base"), vcov.=NULL, ...){
+plotSensi.rdd_reg_np <- function(rdd_regobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, device=c("ggplot", "base"), vcov.=NULL, ...){
 
   device <- match.arg(device)
   output <- match.arg(output)
   if(!is.null(vcov.)&& !is.function(vcov.)) stop("'arg' vcov. should be a function (so can be updated at each step, not a matrix")
   if(device=="base"&&output=="ggplot") stop("Arg 'output=ggplot' only relevant for 'device=ggplot'")
 
-  object <- RDDregobject
+  object <- rdd_regobject
   bw <- getBW(object)
   est <- rdd_coef(object)
 
@@ -118,11 +118,11 @@ plotSensi.RDDreg_np <- function(RDDregobject, from, to, by=0.05, level=0.95, out
 
 #' @rdname plotSensi
 #' @export
-plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, order, type=c("colour", "facet"),  ...){
+plotSensi.rdd_reg_lm <- function(rdd_regobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, order, type=c("colour", "facet"),  ...){
 
   type <- match.arg(type)
   output <- match.arg(output)
-  object <- RDDregobject
+  object <- rdd_regobject
   est <- rdd_coef(object)
   bw <- getBW(object)
   origOrder <- getOrder(object)
@@ -142,7 +142,7 @@ plotSensi.RDDreg_lm <- function(RDDregobject, from, to, by=0.05, level=0.95, out
     seq_bw <- NULL
   }
 
-  if(missing(order)) order <- 0:(getOrder(RDDregobject)+2)
+  if(missing(order)) order <- 0:(getOrder(rdd_regobject)+2)
   seq_ord <- order
   n_seq_ord <- length(seq_ord)
 
diff --git a/R/rdd_coef.R b/R/rdd_coef.R
index 9c74bdc..282ae30 100644
--- a/R/rdd_coef.R
+++ b/R/rdd_coef.R
@@ -24,7 +24,7 @@ rdd_coef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){
 
 #' @rdname rdd_coef
 #' @export
-rdd_coef.RDDreg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){
+rdd_coef.rdd_reg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){
   res<- object$coefMat
   if(!allCo) res <- res["D",, drop=FALSE]
   if(!allInfo) res <- res[,"Estimate"]
diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index e3575b1..51ea5b0 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -115,11 +115,11 @@ plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), ce
 #' Convert a rdd object to lm
 #' @param x An object to convert to lm
 #' @return An object of class \code{lm}
-#' @seealso \code{\link{as.npreg}} which converts \code{RDDreg} objects into \code{npreg} from package \code{np}.
+#' @seealso \code{\link{as.npreg}} which converts \code{rdd_reg} objects into \code{npreg} from package \code{np}.
 #' @examples 
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 #' reg_para_lm <- as.lm(reg_para)
 #' reg_para_lm
 #' plot(reg_para_lm, which=4)
@@ -138,10 +138,10 @@ as.lm_RDD <- function(x){
 }
 
 #' @export
-as.lm.RDDreg_np <- function(x) as.lm_RDD(x)
+as.lm.rdd_reg_np <- function(x) as.lm_RDD(x)
 
 #' @export
-as.lm.RDDreg <- function(x) as.lm_RDD(x)
+as.lm.rdd_reg <- function(x) as.lm_RDD(x)
 
 
 
diff --git a/R/rdd_pred.R b/R/rdd_pred.R
index 0d72b03..7b689a8 100644
--- a/R/rdd_pred.R
+++ b/R/rdd_pred.R
@@ -37,13 +37,13 @@
 #' Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 #' 
 #' # estimation without covariates: rdd_pred is the same than rdd_coef:
-#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 #' 
 #' rdd_pred(reg_para)
 #' rdd_coef(reg_para, allInfo=TRUE)
 #' 
 #' # estimation with covariates: 
-#' reg_para_cov <- RDDreg_lm(rdd_object=Lee2008_rdd,
+#' reg_para_cov <- rdd_reg_lm(rdd_object=Lee2008_rdd,
 #'                           covariates="z1",
 #'                           covar.opt=list(slope="separate") )
 #'
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 9ebfc29..57d4a26 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -20,7 +20,7 @@
 #' }
 #' Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rdd_coef}} 
 #' function for the class of the object returned by \code{fun}. 
-#' @return An object of class RDDreg_lm and class lm, with specific print and plot methods
+#' @return An object of class rdd_reg_lm and class lm, with specific print and plot methods
 #' @references TODO
 #' @export rdd_gen_reg 
 #' @examples
@@ -68,7 +68,7 @@ rdd_gen_reg <- function(rdd_object, fun=glm, covariates=NULL, order=1, bw=NULL,
   RDDslot <- list()
   RDDslot$rdd_data <- rdd_object
   reg$RDDslot <- RDDslot 
-  class(reg) <- c("RDDreg_lm", "RDDreg", class(reg))
+  class(reg) <- c("rdd_reg_lm", "rdd_reg", class(reg))
   attr(reg, "PolyOrder") <- order
   attr(reg, "cutpoint") <- cutpoint
   attr(reg, "slope") <- slope
@@ -101,7 +101,7 @@ rdd_gen_reg_old <- function(rdd_object, covariates=".", bw=RDDbw_IK(rdd_object),
   reg <- fun(y~., data=dat_step1, weights=kernel_w,...)
 
 ##Return
-  class(reg) <- c("RDDreg_gen", "RDDreg", class(reg))
+  class(reg) <- c("rdd_reg_gen", "rdd_reg", class(reg))
   attr(reg, "RDDcall") <- match.call()
   attr(reg, "cutpoint") <- cutpoint
   attr(reg, "bw") <- bw
diff --git a/R/reg_lm.R b/R/reg_lm.R
index ffb5550..34176ac 100644
--- a/R/reg_lm.R
+++ b/R/reg_lm.R
@@ -10,7 +10,7 @@
 #' @param covar.opt Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}). 
 #' @param weights Optional weights to pass to the lm function. Note this cannot be entered together with \code{bw}
 #' @param slope Whether slopes should be different on left or right (separate), or the same.
-#' @return An object of class RDDreg_lm and class lm, with specific print and plot methods
+#' @return An object of class rdd_reg_lm and class lm, with specific print and plot methods
 #' @details This function estimates the standard \emph{discontinuity regression}:
 #' \deqn{Y=\alpha+\tau D+\beta_{1}(X-c)+\beta_{2}D(X-c)+\epsilon}
 #' with \eqn{\tau} the main parameter of interest. Several versions of the regression can be estimated, either restricting the slopes to be the same, 
@@ -21,7 +21,7 @@
 #' \item{include}{Covariates are simply added as supplementary regressors in the RD equation}
 #' \item{residual}{The dependent variable is first regressed on the covariates only, then the RDD equation is applied on the residuals from this first step}}
 #' The regression can also be estimated in a neighborhood of the cutpoint with the argument \code{bw}. This make the parametric regression resemble 
-#' the non-parametric local kernel \code{\link{RDDreg_np}}. Similarly, weights can also be provided (but not simultaneously to \code{bw}). 
+#' the non-parametric local kernel \code{\link{rdd_reg_np}}. Similarly, weights can also be provided (but not simultaneously to \code{bw}). 
 #'
 #' The returned object is a classical \code{lm} object, augmented with a \code{RDDslot}, so usual methods can be applied. As is done in general in R, 
 #' heteroskeadsticity-robust inference can be done later on with the usual function from package \pkg{sandwich}. For the case of clustered observations
@@ -35,23 +35,23 @@
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' ## Step 2: regression
 #' # Simple polynomial of order 1:
-#' reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 #' print(reg_para)
 #' plot(reg_para)
 #'
 #' # Simple polynomial of order 4:
-#' reg_para4 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
+#' reg_para4 <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
 #' reg_para4
 #' plot(reg_para4)
 #'
 #' # Restrict sample to bandwidth area:
 #' bw_ik <- RDDbw_IK(Lee2008_rdd)
-#' reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
+#' reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 #' reg_para_ik
 #' plot(reg_para_ik)
 
 
-RDDreg_lm <- function(rdd_object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), weights){
+rdd_reg_lm <- function(rdd_object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), weights){
 
   checkIsRDD(rdd_object)
   cutpoint <- getCutpoint(rdd_object)
@@ -93,7 +93,7 @@ RDDreg_lm <- function(rdd_object, covariates=NULL, order=1, bw=NULL, slope=c("se
   RDDslot <- list()
   RDDslot$rdd_data <- rdd_object
   reg$RDDslot <- RDDslot 
-  class(reg) <- c("RDDreg_lm", "RDDreg", class_reg)
+  class(reg) <- c("rdd_reg_lm", "rdd_reg", class_reg)
   attr(reg, "PolyOrder") <- order
   attr(reg, "cutpoint") <- cutpoint
   attr(reg, "slope") <- slope
@@ -104,7 +104,7 @@ RDDreg_lm <- function(rdd_object, covariates=NULL, order=1, bw=NULL, slope=c("se
 
 
 #' @export 
-print.RDDreg_lm <- function(x,...) {
+print.rdd_reg_lm <- function(x,...) {
 
   order <- getOrder(x)
   cutpoint <- getCutpoint(x)
@@ -131,7 +131,7 @@ print.RDDreg_lm <- function(x,...) {
 
 
 #' @export
-plot.RDDreg_lm <- function(x,...) {
+plot.rdd_reg_lm <- function(x,...) {
 
 ## data
   dat <- getOriginalData(x)
diff --git a/R/reg_np.R b/R/reg_np.R
index 8d5a1fa..0656dd9 100644
--- a/R/reg_np.R
+++ b/R/reg_np.R
@@ -8,22 +8,22 @@
 #' @param inference Type of inference to conduct: non-parametric one (\code{np}) or standard (\code{lm}). See details. 
 #' @param slope Whether slopes should be different on left or right (separate), or the same.
 #' @param covar.opt Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}). 
-#' @return An object of class RDDreg_np and class lm, with specific print and plot methods
+#' @return An object of class rdd_reg_np and class lm, with specific print and plot methods
 #' @seealso \code{\link{RDDbw_IK}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012)
 #' @references TODO
-#' @export RDDreg_np
+#' @export rdd_reg_np
 #' @examples
 #' ## Step 0: prepare data
 #' data(Lee2008)
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' ## Step 2: regression
 #' # Simple polynomial of order 1:
-#' reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 #' print(reg_nonpara)
 #' plot(reg_nonpara)
 
 
-RDDreg_np <- function(rdd_object, covariates=NULL, bw=RDDbw_IK(rdd_object), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
+rdd_reg_np <- function(rdd_object, covariates=NULL, bw=RDDbw_IK(rdd_object), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
 
   slope <- match.arg(slope)
   inference <- match.arg(inference)
@@ -73,7 +73,7 @@ RDDreg_np <- function(rdd_object, covariates=NULL, bw=RDDbw_IK(rdd_object), slop
   res$fitted <- fitted(reg)
   res$RDDslot <- RDDslot
 
-  class(res) <- c("RDDreg_np", "RDDreg", "lm")
+  class(res) <- c("rdd_reg_np", "rdd_reg", "lm")
   attr(res, "RDDcall") <- match.call()
   attr(res, "cutpoint") <- cutpoint
   attr(res, "bw") <- bw
@@ -82,7 +82,7 @@ RDDreg_np <- function(rdd_object, covariates=NULL, bw=RDDbw_IK(rdd_object), slop
 
 
 #' @export 
-print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), ...) {
+print.rdd_reg_np <- function(x, signif.stars = getOption("show.signif.stars"), ...) {
 
   RDDcall <- attr(x, "RDDcall")
   bw <- getBW(x)
@@ -104,7 +104,7 @@ print.RDDreg_np <- function(x, signif.stars = getOption("show.signif.stars"), ..
 
 
 #' @export
-summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) {
+summary.rdd_reg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) {
 
   x <- object
   bw <- getBW(x)
@@ -122,19 +122,19 @@ summary.RDDreg_np <- function(object, digits = max(3, getOption("digits") - 3),
 ## compute R^2
   r.squared <- summary(x$RDDslot$model)$r.squared
 
-## Extend the RDDreg_no output with new computaations:
+## Extend the rdd_reg_no output with new computaations:
 
   object$r.squared <- r.squared
   object$res_quant <- res_quant
   object$n_obs <- list(n_left=n_left, n_right=n_right, total=n_left+n_right)
 
-  class(object) <- c("summary.RDDreg_np", class(object))
+  class(object) <- c("summary.rdd_reg_np", class(object))
   object
 }
 
 
 #' @export
-print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) {
+print.summary.rdd_reg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) {
 
   bw <- getBW(x)
 
@@ -156,7 +156,7 @@ print.summary.RDDreg_np <- function(x, digits = max(3, getOption("digits") - 3),
 
 
 #' @export
-plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) {
+plot.rdd_reg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) {
 
   chart <- match.arg(chart)
   cutpoint <- getCutpoint(x)
@@ -203,11 +203,11 @@ plot.RDDreg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) {
 }
 
 #' @export 
-vcov.RDDreg_np <- function(object, ...){
+vcov.rdd_reg_np <- function(object, ...){
 
   infType <- infType(object)
   if(infType=="np") {
-    warning("No vcov() available when RDDreg_np() was called with infType='np'")
+    warning("No vcov() available when rdd_reg_np() was called with infType='np'")
     res <- NULL
   } else {
     res <- vcov(object$RDDslot$model)
diff --git a/R/var_estim.R b/R/var_estim.R
index 71167ec..94fa909 100644
--- a/R/var_estim.R
+++ b/R/var_estim.R
@@ -161,7 +161,7 @@ all_var_low <- function(x,y, point, bw, eachSide=TRUE, return=c("se", "all")){
 
 all_var <- function(...) all_var_low(...)
 
-all_var.RDDreg.np <- function(x){
+all_var.rdd_reg.np <- function(x){
 
   bw <- getBW(x)
   dat <- getOriginalData(x)
diff --git a/R/waldci.R b/R/waldci.R
index a7f8f48..77e7863 100644
--- a/R/waldci.R
+++ b/R/waldci.R
@@ -65,11 +65,11 @@ format.perc <- function (probs, digits)
   paste(format(100 * probs, trim = TRUE, scientific = FALSE, digits = digits), 
         "%")
 
-waldci.RDDreg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...){
+waldci.rdd_reg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...){
 
   inf_met <- infType(x) ## def in Misc.R
   if(inf_met=="se"){
-    if(!is.null(vcov.)|!is.infinite(df)) {warning("Arg 'vcov.' and 'df' only work for RDDreg with inf='lm'")
+    if(!is.null(vcov.)|!is.infinite(df)) {warning("Arg 'vcov.' and 'df' only work for rdd_reg with inf='lm'")
     }
     ## code recycled from stats::confint.default
     co <- rdd_coef(x, allInfo=TRUE)
diff --git a/man/as.lm.Rd b/man/as.lm.Rd
index f67e8a7..f4b9725 100644
--- a/man/as.lm.Rd
+++ b/man/as.lm.Rd
@@ -18,12 +18,12 @@ Convert a rdd object to lm
 \examples{
 data(Lee2008)
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 reg_para_lm <- as.lm(reg_para)
 reg_para_lm
 plot(reg_para_lm, which=4)
 }
 \seealso{
-\code{\link{as.npreg}} which converts \code{RDDreg} objects into \code{npreg} from package \code{np}.
+\code{\link{as.npreg}} which converts \code{rdd_reg} objects into \code{npreg} from package \code{np}.
 }
 
diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd
index bc1dd79..d797b38 100644
--- a/man/as.npregbw.Rd
+++ b/man/as.npregbw.Rd
@@ -3,14 +3,14 @@
 \name{as.npregbw}
 \alias{as.npreg}
 \alias{as.npregbw}
-\title{Convert an RDDreg object to a  \code{npreg} object}
+\title{Convert an rdd_reg object to a  \code{npreg} object}
 \usage{
 as.npregbw(x, ...)
 
 as.npreg(x, ...)
 }
 \arguments{
-\item{x}{Object of class \code{RDDreg} created by \code{\link{RDDreg_np}} or \code{\link{RDDreg_lm}}}
+\item{x}{Object of class \code{rdd_reg} created by \code{\link{rdd_reg_np}} or \code{\link{rdd_reg_lm}}}
 
 \item{\ldots}{Further arguments passed to the \code{\link{npregbw}} or \code{\link{npreg}}}
 }
@@ -21,17 +21,17 @@ An object of class \code{npreg} or \code{npregbw}
 Convert an rdd_object to a non-parametric regression \code{npreg} from package \code{np}
 }
 \details{
-This function converts an RDDreg object into an \code{npreg} object from package \code{np}
+This function converts an rdd_reg object into an \code{npreg} object from package \code{np}
 Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one.
-Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while RDDreg
+Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while rdd_reg
 proceeds as if the kernel was univariate. A simple solution to make the multivariate kernel similar to the  univariate one
 is to set the bandwidth for x and Dx to a large number, so that they converge towards a constant, and one obtains back the univariate kernel.
 }
 \examples{
-# Estimate ususal RDDreg:
+# Estimate ususal rdd_reg:
  data(Lee2008)
  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
- reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+ reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 
 ## Convert to npreg:
  reg_nonpara_np <- as.npreg(reg_nonpara)
@@ -40,10 +40,10 @@ is to set the bandwidth for x and Dx to a large number, so that they converge to
 
 ## Compare with result obtained with a Gaussian kernel:
  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
- reg_nonpara_gaus <- RDDreg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
+ reg_nonpara_gaus <- rdd_reg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
  all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np))
 }
 \seealso{
-\code{\link{as.lm}} which converts \code{RDDreg} objects into \code{lm}.
+\code{\link{as.lm}} which converts \code{rdd_reg} objects into \code{lm}.
 }
 
diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd
index 92b039e..2744c30 100644
--- a/man/clusterInf.Rd
+++ b/man/clusterInf.Rd
@@ -7,7 +7,7 @@
 clusterInf(object, clusterVar, vcov. = NULL, type = c("df-adj", "HC"), ...)
 }
 \arguments{
-\item{object}{Object of class lm, from which RDDreg also inherits.}
+\item{object}{Object of class lm, from which rdd_reg also inherits.}
 
 \item{clusterVar}{The variable containing the cluster attributions.}
 
@@ -27,7 +27,7 @@ possibly on the range specified by bandwidth
 \examples{
 data(Lee2008)
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 
 # here we just generate randomly a cluster variable:
 nlet <- sort(c(outer(letters, letters, paste, sep="")))
diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd
index 63e037d..6fdb7b2 100644
--- a/man/covarTest_dis.Rd
+++ b/man/covarTest_dis.Rd
@@ -2,8 +2,8 @@
 % Please edit documentation in R/covarTests.R
 \name{covarTest_dis}
 \alias{covarTest_dis}
-\alias{covarTest_dis.RDDreg}
 \alias{covarTest_dis.rdd_data}
+\alias{covarTest_dis.rdd_reg}
 \title{Testing for balanced covariates: equality of distribution}
 \usage{
 covarTest_dis(object, bw, exact = NULL, p.adjust = c("none", "holm", "BH",
@@ -13,7 +13,7 @@ covarTest_dis(object, bw, exact = NULL, p.adjust = c("none", "holm", "BH",
   p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel",
   "bonferroni"))
 
-\method{covarTest_dis}{RDDreg}(object, bw = NULL, exact = FALSE,
+\method{covarTest_dis}{rdd_reg}(object, bw = NULL, exact = FALSE,
   p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel",
   "bonferroni"))
 }
@@ -51,7 +51,7 @@ covarTest_dis(Lee2008_rdd_Z, bw=0.3)
 ## Can also use function covarTest_dis() for a t-test for equality of means around cutoff:
 covarTest_mean(Lee2008_rdd_Z, bw=0.3)
 ## covarTest_dis works also on regression outputs (bw will be taken from the model)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd_Z)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd_Z)
 covarTest_dis(reg_nonpara)
 }
 \author{
diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd
index 4933e05..9eac0f0 100644
--- a/man/covarTest_mean.Rd
+++ b/man/covarTest_mean.Rd
@@ -2,8 +2,8 @@
 % Please edit documentation in R/covarTests.R
 \name{covarTest_mean}
 \alias{covarTest_mean}
-\alias{covarTest_mean.RDDreg}
 \alias{covarTest_mean.rdd_data}
+\alias{covarTest_mean.rdd_reg}
 \title{Testing for balanced covariates: equality of means with t-test}
 \usage{
 covarTest_mean(object, bw = NULL, paired = FALSE, var.equal = FALSE,
@@ -14,7 +14,7 @@ covarTest_mean(object, bw = NULL, paired = FALSE, var.equal = FALSE,
   var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg",
   "hommel", "bonferroni"))
 
-\method{covarTest_mean}{RDDreg}(object, bw = NULL, paired = FALSE,
+\method{covarTest_mean}{rdd_reg}(object, bw = NULL, paired = FALSE,
   var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg",
   "hommel", "bonferroni"))
 }
@@ -55,7 +55,7 @@ covarTest_mean(Lee2008_rdd_Z, bw=0.3)
 covarTest_dis(Lee2008_rdd_Z, bw=0.3)
 
 ## covarTest_mean works also on regression outputs (bw will be taken from the model)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd_Z)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd_Z)
 covarTest_mean(reg_nonpara)
 }
 \seealso{
diff --git a/man/gen_MC_IK.Rd b/man/gen_MC_IK.Rd
index 04df2bd..73c375d 100644
--- a/man/gen_MC_IK.Rd
+++ b/man/gen_MC_IK.Rd
@@ -29,7 +29,7 @@ MC1_dat <- gen_MC_IK()
 MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
 
 ## Use np regression:
-reg_nonpara <- RDDreg_np(rdd_object=MC1_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=MC1_rdd)
 reg_nonpara
 
 # Represent the curves:
diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd
index 74c3170..4eecd69 100644
--- a/man/plotPlacebo.Rd
+++ b/man/plotPlacebo.Rd
@@ -3,20 +3,20 @@
 \name{plotPlacebo}
 \alias{computePlacebo}
 \alias{plotPlacebo}
-\alias{plotPlacebo.RDDreg}
+\alias{plotPlacebo.rdd_reg}
 \alias{plotPlaceboDens}
-\alias{plotPlaceboDens.RDDreg}
+\alias{plotPlaceboDens.rdd_reg}
 \title{Draw a (density) plot of placebo tests}
 \usage{
 plotPlacebo(object, device = c("ggplot", "base"), ...)
 
-\method{plotPlacebo}{RDDreg}(object, device = c("ggplot", "base"),
+\method{plotPlacebo}{rdd_reg}(object, device = c("ggplot", "base"),
   from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE,
   vcov. = NULL, plot = TRUE, output = c("data", "ggplot"), ...)
 
 plotPlaceboDens(object, device = c("ggplot", "base"), ...)
 
-\method{plotPlaceboDens}{RDDreg}(object, device = c("ggplot", "base"),
+\method{plotPlaceboDens}{rdd_reg}(object, device = c("ggplot", "base"),
   from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE,
   vcov. = NULL, ...)
 
@@ -55,11 +55,11 @@ Draw a plot of placebo tests, estimating the impact on fake cutpoints
 \examples{
 data(Lee2008)
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 plotPlacebo(reg_nonpara)
 
 # Use with another vcov function; cluster case
-reg_nonpara_lminf <- RDDreg_np(rdd_object=Lee2008_rdd, inference="lm")
+reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference="lm")
 # need to be a function applied to updated object!
 vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 plotPlacebo(reg_nonpara_lminf, vcov. = vc)
diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd
index 6eff37d..7e4e9d6 100644
--- a/man/plotSensi.Rd
+++ b/man/plotSensi.Rd
@@ -2,23 +2,23 @@
 % Please edit documentation in R/plotSensi.R
 \name{plotSensi}
 \alias{plotSensi}
-\alias{plotSensi.RDDreg_lm}
-\alias{plotSensi.RDDreg_np}
+\alias{plotSensi.rdd_reg_lm}
+\alias{plotSensi.rdd_reg_np}
 \title{Plot the sensitivity to the bandwidth}
 \usage{
-plotSensi(RDDregobject, from, to, by = 0.01, level = 0.95,
+plotSensi(rdd_regobject, from, to, by = 0.01, level = 0.95,
   output = c("data", "ggplot"), plot = TRUE, ...)
 
-\method{plotSensi}{RDDreg_np}(RDDregobject, from, to, by = 0.05,
+\method{plotSensi}{rdd_reg_np}(rdd_regobject, from, to, by = 0.05,
   level = 0.95, output = c("data", "ggplot"), plot = TRUE,
   device = c("ggplot", "base"), vcov. = NULL, ...)
 
-\method{plotSensi}{RDDreg_lm}(RDDregobject, from, to, by = 0.05,
+\method{plotSensi}{rdd_reg_lm}(rdd_regobject, from, to, by = 0.05,
   level = 0.95, output = c("data", "ggplot"), plot = TRUE, order,
   type = c("colour", "facet"), ...)
 }
 \arguments{
-\item{RDDregobject}{object of a RDD regression, from either \code{\link{RDDreg_lm}} or \code{\link{RDDreg_np}}}
+\item{rdd_regobject}{object of a RDD regression, from either \code{\link{rdd_reg_lm}} or \code{\link{rdd_reg_np}}}
 
 \item{from}{First bandwidth point. Default value is max(1e-3, bw-0.1)}
 
@@ -36,9 +36,9 @@ plotSensi(RDDregobject, from, to, by = 0.01, level = 0.95,
 
 \item{vcov.}{Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}}
 
-\item{order}{For parametric models (from \code{\link{RDDreg_lm}}), the order of the polynomial.}
+\item{order}{For parametric models (from \code{\link{rdd_reg_lm}}), the order of the polynomial.}
 
-\item{type}{For parametric models (from \code{\link{RDDreg_lm}}) whether different orders are represented as different colour or as different facets.}
+\item{type}{For parametric models (from \code{\link{rdd_reg_lm}}) whether different orders are represented as different colour or as different facets.}
 
 \item{\ldots}{Further arguments passed to specific methods}
 }
@@ -54,12 +54,12 @@ Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 #Non-parametric estimate
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 plotSensi(reg_nonpara)
 plotSensi(reg_nonpara, device="base")
 
 #Parametric estimate:
-reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
+reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
 plotSensi(reg_para_ik)
 plotSensi(reg_para_ik, type="facet")
 }
diff --git a/man/rdd_coef.Rd b/man/rdd_coef.Rd
index 339dda6..298c08a 100644
--- a/man/rdd_coef.Rd
+++ b/man/rdd_coef.Rd
@@ -2,15 +2,15 @@
 % Please edit documentation in R/rdd_coef.R
 \name{rdd_coef}
 \alias{rdd_coef}
-\alias{rdd_coef.RDDreg_np}
 \alias{rdd_coef.default}
+\alias{rdd_coef.rdd_reg_np}
 \title{RDD coefficient}
 \usage{
 rdd_coef(object, allInfo = FALSE, allCo = FALSE, ...)
 
 \method{rdd_coef}{default}(object, allInfo = FALSE, allCo = FALSE, ...)
 
-\method{rdd_coef}{RDDreg_np}(object, allInfo = FALSE, allCo = FALSE, ...)
+\method{rdd_coef}{rdd_reg_np}(object, allInfo = FALSE, allCo = FALSE, ...)
 }
 \arguments{
 \item{object}{A RDD regression object}
diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd
index 2d9a658..e9e3577 100644
--- a/man/rdd_gen_reg.Rd
+++ b/man/rdd_gen_reg.Rd
@@ -29,7 +29,7 @@ rdd_gen_reg(rdd_object, fun = glm, covariates = NULL, order = 1,
 \item{\ldots}{Further arguments passed to fun. See the example.}
 }
 \value{
-An object of class RDDreg_lm and class lm, with specific print and plot methods
+An object of class rdd_reg_lm and class lm, with specific print and plot methods
 }
 \description{
 Compute RDD estimate allowing a locally kernel weighted version of any estimation function
diff --git a/man/rdd_pred.Rd b/man/rdd_pred.Rd
index db6f05d..6b138df 100644
--- a/man/rdd_pred.Rd
+++ b/man/rdd_pred.Rd
@@ -56,13 +56,13 @@ z1 <- runif(n_Lee)
 Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
 
 # estimation without covariates: rdd_pred is the same than rdd_coef:
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 
 rdd_pred(reg_para)
 rdd_coef(reg_para, allInfo=TRUE)
 
 # estimation with covariates:
-reg_para_cov <- RDDreg_lm(rdd_object=Lee2008_rdd,
+reg_para_cov <- rdd_reg_lm(rdd_object=Lee2008_rdd,
                           covariates="z1",
                           covar.opt=list(slope="separate") )
 
diff --git a/man/RDDreg_lm.Rd b/man/rdd_reg_lm.Rd
similarity index 86%
rename from man/RDDreg_lm.Rd
rename to man/rdd_reg_lm.Rd
index 7d56363..52c9a8f 100644
--- a/man/RDDreg_lm.Rd
+++ b/man/rdd_reg_lm.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
 % Please edit documentation in R/reg_lm.R
-\name{RDDreg_lm}
-\alias{RDDreg_lm}
+\name{rdd_reg_lm}
+\alias{rdd_reg_lm}
 \title{Parametric polynomial estimator of the regression discontinuity}
 \usage{
-RDDreg_lm(rdd_object, covariates = NULL, order = 1, bw = NULL,
+rdd_reg_lm(rdd_object, covariates = NULL, order = 1, bw = NULL,
   slope = c("separate", "same"), covar.opt = list(strategy = c("include",
   "residual"), slope = c("same", "separate"), bw = NULL),
   covar.strat = c("include", "residual"), weights)
@@ -27,7 +27,7 @@ RDDreg_lm(rdd_object, covariates = NULL, order = 1, bw = NULL,
 \item{weights}{Optional weights to pass to the lm function. Note this cannot be entered together with \code{bw}}
 }
 \value{
-An object of class RDDreg_lm and class lm, with specific print and plot methods
+An object of class rdd_reg_lm and class lm, with specific print and plot methods
 }
 \description{
 Compute a parametric polynomial regression of the ATE,
@@ -44,7 +44,7 @@ Covariates can also be added in the regression, according to the two strategies
 \item{include}{Covariates are simply added as supplementary regressors in the RD equation}
 \item{residual}{The dependent variable is first regressed on the covariates only, then the RDD equation is applied on the residuals from this first step}}
 The regression can also be estimated in a neighborhood of the cutpoint with the argument \code{bw}. This make the parametric regression resemble
-the non-parametric local kernel \code{\link{RDDreg_np}}. Similarly, weights can also be provided (but not simultaneously to \code{bw}).
+the non-parametric local kernel \code{\link{rdd_reg_np}}. Similarly, weights can also be provided (but not simultaneously to \code{bw}).
 
 The returned object is a classical \code{lm} object, augmented with a \code{RDDslot}, so usual methods can be applied. As is done in general in R,
 heteroskeadsticity-robust inference can be done later on with the usual function from package \pkg{sandwich}. For the case of clustered observations
@@ -56,18 +56,18 @@ data(Lee2008)
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 ## Step 2: regression
 # Simple polynomial of order 1:
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 print(reg_para)
 plot(reg_para)
 
 # Simple polynomial of order 4:
-reg_para4 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para4 <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para4
 plot(reg_para4)
 
 # Restrict sample to bandwidth area:
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
+reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
 }
diff --git a/man/RDDreg_np.Rd b/man/rdd_reg_np.Rd
similarity index 85%
rename from man/RDDreg_np.Rd
rename to man/rdd_reg_np.Rd
index e78ac9c..bdcc940 100644
--- a/man/RDDreg_np.Rd
+++ b/man/rdd_reg_np.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
 % Please edit documentation in R/reg_np.R
-\name{RDDreg_np}
-\alias{RDDreg_np}
+\name{rdd_reg_np}
+\alias{rdd_reg_np}
 \title{Parametric polynomial estimator of the regression discontinuity}
 \usage{
-RDDreg_np(rdd_object, covariates = NULL, bw = RDDbw_IK(rdd_object),
+rdd_reg_np(rdd_object, covariates = NULL, bw = RDDbw_IK(rdd_object),
   slope = c("separate", "same"), inference = c("np", "lm"),
   covar.opt = list(slope = c("same", "separate"), bw = NULL))
 }
@@ -22,7 +22,7 @@ RDDreg_np(rdd_object, covariates = NULL, bw = RDDbw_IK(rdd_object),
 \item{covar.opt}{Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}).}
 }
 \value{
-An object of class RDDreg_np and class lm, with specific print and plot methods
+An object of class rdd_reg_np and class lm, with specific print and plot methods
 }
 \description{
 Compute a parametric polynomial regression of the ATE,
@@ -34,7 +34,7 @@ data(Lee2008)
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 ## Step 2: regression
 # Simple polynomial of order 1:
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 print(reg_nonpara)
 plot(reg_nonpara)
 }
diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd
index 7bf789d..dcac008 100644
--- a/man/vcovCluster.Rd
+++ b/man/vcovCluster.Rd
@@ -10,7 +10,7 @@ vcovCluster(object, clusterVar)
 vcovCluster2(object, clusterVar1, clusterVar2)
 }
 \arguments{
-\item{object}{Object of class lm, from which RDDreg also inherits.}
+\item{object}{Object of class lm, from which rdd_reg also inherits.}
 
 \item{clusterVar}{The variable containing the cluster attributions.}
 
diff --git a/tests/RDDpred.R b/tests/RDDpred.R
index 10e2c15..f51bc1c 100644
--- a/tests/RDDpred.R
+++ b/tests/RDDpred.R
@@ -15,14 +15,14 @@ Lee2008_rdd_z <- rdd_data(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 #### REGS
 bw_IK <- RDDbw_IK(Lee2008_rdd_z)
 w_IK <- rddtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_IK)
-reg_para4_cov_slSep <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
-reg_para4_cov_slSep_W <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK)
-reg_np_cov <- RDDreg_np(rdd_object=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm")
+reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep_W <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK)
+reg_np_cov <- rdd_reg_np(rdd_object=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm")
 
 
 
 
-reg_para4_cov_slSep_2Z <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1+z2", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep_2Z <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1+z2", covar.opt=list(slope="separate"))
 
 reg_li <- list( reg_para4_cov_slSep=reg_para4_cov_slSep, 
 		reg_para4_cov_slSep_W=reg_para4_cov_slSep_W,
@@ -48,7 +48,7 @@ sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rdd_coef(x, allInfo=TRU
 
 
 # 
-# reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+# reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 # print(reg_para)
 # summary(reg_para)
 # plot(reg_para)
@@ -70,7 +70,7 @@ sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rdd_coef(x, allInfo=TRU
 # deltaMethod(a, "a1 - a2", parameterNames=paste("a", 1:4, sep=""))
 # coef(summary(reg_para))[2,]
 # 
-# reg_para4_cov_slSep <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
+# reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
 # 
 mf_2 <- model.frame(reg_para4_cov_slSep)
 # formula(reg_para4_cov_slSep)
diff --git a/tests/RDDtools_vs_rdd.R b/tests/RDDtools_vs_rdd.R
index 4268f4a..26ed5e4 100644
--- a/tests/RDDtools_vs_rdd.R
+++ b/tests/RDDtools_vs_rdd.R
@@ -13,7 +13,7 @@ RD <- rdd_data(x=x, y=y, cutpoint=0, covar=cov)
 bw <- IKbandwidth(X=x, Y=y, cutpoint=0)
 bw
 rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]]
-RDDtools_mod <- RDDreg_np(RD, bw=bw, inference="lm")
+RDDtools_mod <- rdd_reg_np(RD, bw=bw, inference="lm")
 
 rdd_co <- coef(summary(rdd_mod))
 RDDtools_co <- rdd_coef(RDDtools_mod, allCo=TRUE, allInfo=TRUE)
@@ -26,7 +26,7 @@ all.equal(rdd_co[4,1], sum(RDDtools_co[3:4,1]), check.attributes=FALSE)
 
 ### Covariate estimation:
 rdd_mod_cov <- RDestimate(y~x|cov, kernel="rectangular", bw=5, model=TRUE, se.type="const")$model[[1]]
-RDDtools_mod_cov <- RDDreg_lm(RD, bw=5, covariates="cov", covar.opt=list(slope="separate"))
+RDDtools_mod_cov <- rdd_reg_lm(RD, bw=5, covariates="cov", covar.opt=list(slope="separate"))
 
 rdd_co_cov <- coef(summary(rdd_mod_cov))
 RDDtools_co_cov <- rdd_coef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE)
@@ -40,7 +40,7 @@ set.seed(123)
 selec <- rbinom(nrow(RD), 1, prob=ifelse(RD$x<0, 0.1, 0.9))
 RD_rdd_ins <- rdd_data(y=RD$y, x=RD$x, z=selec,cutpoint=0)
 
-RDDto_reg_fuz <- RDDreg_lm(RD_rdd_ins, bw=0.2)
+RDDto_reg_fuz <- rdd_reg_lm(RD_rdd_ins, bw=0.2)
 rdd_reg_fuz <- RDestimate(y~x+selec, data=RD_rdd_ins, kernel="rectangular", bw=0.2, model=TRUE, se.type="const")$model[[2]][[1]]
 
 all.equal(rdd_coef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1])
diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index ad9834f..7124df6 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -57,7 +57,7 @@ RDDbw_IK(Lee2008_rdd)
 
 ###### Parametric regression ######
 # Simple polynomial of order 1:
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 print(reg_para)
 summary(reg_para)
 plot(reg_para)
@@ -66,68 +66,68 @@ all.equal(unlist(rdd_pred(reg_para)), rdd_coef(reg_para, allInfo=TRUE)[1:2], che
 
 ## Difference in means regression:
 # Simple polynomial of order 0:
-reg_para_0 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=0)
+reg_para_0 <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=0)
 print(reg_para_0)
 summary(reg_para_0)
 plot(reg_para_0)
 
 
 ## Simple polynomial of order 4:
-reg_para4 <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para4 <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para4
 plot(reg_para4)
 all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Restrict sample to bandwidth area:
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_para_ik <- RDDreg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
+reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
 
 all.equal(unlist(rdd_pred(reg_para_ik)), rdd_coef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Fuzzy reg
-reg_para_fuzz <- RDDreg_lm(Lee2008_rdd_ins)
+reg_para_fuzz <- rdd_reg_lm(Lee2008_rdd_ins)
 coef(reg_para_fuzz)
 summary(reg_para_fuzz)
 
 ## Covariates:
-reg_para4_cov <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".")
+reg_para4_cov <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".")
 reg_para4_cov
 summary(reg_para4_cov)
 
-reg_para4_cov_slSep <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
 summary(reg_para4_cov_slSep)
 rdd_pred(reg_para4_cov_slSep)
 rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
 
 
-reg_para4_cov_startR <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
+reg_para4_cov_startR <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
 reg_para4_cov_startR
 summary(reg_para4_cov_startR)
 
 plot(reg_para4_cov)
 
-reg_para4_cov_startR_sl2 <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual", slope="separate"))
+reg_para4_cov_startR_sl2 <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual", slope="separate"))
 summary(reg_para4_cov_startR_sl2)
 
-reg_para4_cov_2 <- RDDreg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z3+I(z1^2)")
+reg_para4_cov_2 <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z3+I(z1^2)")
 reg_para4_cov_2
 summary(reg_para4_cov_2)
 
 ###### Non-parametric regression ######
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 print(reg_nonpara)
 summary(reg_nonpara)
 plot(x=reg_nonpara)
 
-reg_nonpara_inflm <- RDDreg_np(rdd_object=Lee2008_rdd, inference="lm")
+reg_nonpara_inflm <- rdd_reg_np(rdd_object=Lee2008_rdd, inference="lm")
 print(reg_nonpara_inflm)
 summary(reg_nonpara_inflm)
 plot(x=reg_nonpara_inflm)
 
 
-reg_nonpara_sameSl <- RDDreg_np(rdd_object=Lee2008_rdd, slope="same")
+reg_nonpara_sameSl <- rdd_reg_np(rdd_object=Lee2008_rdd, slope="same")
 print(reg_nonpara_sameSl)
 summary(reg_nonpara_sameSl)
 
@@ -211,7 +211,7 @@ covarTest_dis(reg_para4_cov)
 
 ## Compare with result obtained with a Gaussian kernel:
   bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
-  reg_nonpara_gaus <- RDDreg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
+  reg_nonpara_gaus <- rdd_reg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
   all.equal(rdd_coef(reg_nonpara_gaus, allCo=TRUE),rdd_coef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
 
 
diff --git a/tests/simple_MC.R b/tests/simple_MC.R
index 904db8e..b294f81 100644
--- a/tests/simple_MC.R
+++ b/tests/simple_MC.R
@@ -19,12 +19,12 @@ plot(input_mc)
 
 RDD_bw <- RDDbw_IK(input_mc)
 
-RDD_np_sep <- RDDreg_np(input_mc, bw=RDD_bw)
-RDD_np_same <- RDDreg_np(input_mc, slope="same", bw=RDD_bw)
-RDD_np_sep_inflm <- RDDreg_np(input_mc, bw=RDD_bw, inf="lm")
-RDD_np_same_inflm <- RDDreg_np(input_mc, slope="same", bw=RDD_bw, inf="lm")
-RDD_lm_sep <- RDDreg_lm(input_mc, bw=RDD_bw)
-RDD_lm_same <- RDDreg_lm(input_mc, slope="same", bw=RDD_bw)
+RDD_np_sep <- rdd_reg_np(input_mc, bw=RDD_bw)
+RDD_np_same <- rdd_reg_np(input_mc, slope="same", bw=RDD_bw)
+RDD_np_sep_inflm <- rdd_reg_np(input_mc, bw=RDD_bw, inf="lm")
+RDD_np_same_inflm <- rdd_reg_np(input_mc, slope="same", bw=RDD_bw, inf="lm")
+RDD_lm_sep <- rdd_reg_lm(input_mc, bw=RDD_bw)
+RDD_lm_same <- rdd_reg_lm(input_mc, slope="same", bw=RDD_bw)
 rdd_RDe <- RDestimate(y~x, data=input_mc, cutpoint=20, model=TRUE, bw=RDD_bw)
 
 

From 334807032cd1b538185b5c503b14029520f7a536 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:35:49 +0200
Subject: [PATCH 117/323] RDD -> rdd

---
 R/{model.matrix.RDD.R => model.matrix.rdd.R} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename R/{model.matrix.RDD.R => model.matrix.rdd.R} (100%)

diff --git a/R/model.matrix.RDD.R b/R/model.matrix.rdd.R
similarity index 100%
rename from R/model.matrix.RDD.R
rename to R/model.matrix.rdd.R

From d1723bd3c9e547248bb3fa5a14c8dd7d30c8e2bb Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:37:46 +0200
Subject: [PATCH 118/323] update new function names rdd_reg

---
 vignettes/rddtools.R    | 4 ++--
 vignettes/rddtools.Rmd  | 4 ++--
 vignettes/rddtools.html | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R
index 177e7da..10d1367 100644
--- a/vignettes/rddtools.R
+++ b/vignettes/rddtools.R
@@ -13,14 +13,14 @@ summary(Lee2008_rdd)
 plot(Lee2008_rdd)
 
 ## ----reg_para------------------------------------------------------------
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para
 
 plot(reg_para)
 
 ## ----RegPlot-------------------------------------------------------------
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
 
diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd
index 862e6d6..b7cac45 100644
--- a/vignettes/rddtools.Rmd
+++ b/vignettes/rddtools.Rmd
@@ -44,7 +44,7 @@ plot(Lee2008_rdd)
 Estimate parametrically, by fitting a 4th order polynomial.
 
 ```{r reg_para}
-reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para
 
 plot(reg_para)
@@ -57,7 +57,7 @@ Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidt
 
 ```{r RegPlot}
 bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
 ```
diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html
index 1a28b58..6a5e5af 100644
--- a/vignettes/rddtools.html
+++ b/vignettes/rddtools.html
@@ -82,7 +82,7 @@ 

Data Preparation and Visualisation

Parametric Estimation

Estimate parametrically, by fitting a 4th order polynomial.

-
reg_para <- RDDreg_lm(rdd_object=Lee2008_rdd, order=4)
+
reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
 reg_para
 #> ### RDD regression: parametric ###
 #>  Polynomial order:  4 
@@ -102,7 +102,7 @@ 

Parametric Estimation

Non-parametric Estimation

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

bw_ik <- RDDbw_IK(Lee2008_rdd)
-reg_nonpara <- RDDreg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 #> ### RDD regression: nonparametric local linear###
 #>  Bandwidth:  0.2938561 

From e32168639a6a82afc317e45beff8e0a8d17d1427 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:41:53 +0200
Subject: [PATCH 119/323] reflect function names

---
 tests/{RDDpred.R => rdd_pred.R}                | 0
 tests/{RDDtools_vs_rdd.R => rddtools_vs_rdd.R} | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename tests/{RDDpred.R => rdd_pred.R} (100%)
 rename tests/{RDDtools_vs_rdd.R => rddtools_vs_rdd.R} (100%)

diff --git a/tests/RDDpred.R b/tests/rdd_pred.R
similarity index 100%
rename from tests/RDDpred.R
rename to tests/rdd_pred.R
diff --git a/tests/RDDtools_vs_rdd.R b/tests/rddtools_vs_rdd.R
similarity index 100%
rename from tests/RDDtools_vs_rdd.R
rename to tests/rddtools_vs_rdd.R

From 1985af2d597c87c7a08af29a69c4ce83641e97a7 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:42:07 +0200
Subject: [PATCH 120/323] run testthat test with R CMD

---
 tests/testthat.R | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 tests/testthat.R

diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000..25efbb9
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,4 @@
+library(testthat)
+library(rddtools)
+
+test_check("rddtools")

From 10796f4c8456c8eef550998abbe6e1ff14daf04e Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:42:44 +0200
Subject: [PATCH 121/323] RDDbw_IK -> rdd_bw_ik

---
 NAMESPACE                         |  2 +-
 R/as.npreg.R                      |  2 +-
 R/bw_IK.R                         | 12 ++++++------
 R/bw_ROT.R                        |  2 +-
 R/placebo.R                       |  2 +-
 R/plotSensi.R                     |  2 +-
 R/reg_gen.R                       |  2 +-
 R/reg_lm.R                        |  2 +-
 R/reg_np.R                        |  4 ++--
 man/RDDbw_RSW.Rd                  |  2 +-
 man/plotSensi.Rd                  |  2 +-
 man/{RDDbw_IK.Rd => rdd_bw_ik.Rd} |  8 ++++----
 man/rdd_reg_lm.Rd                 |  2 +-
 man/rdd_reg_np.Rd                 |  4 ++--
 14 files changed, 24 insertions(+), 24 deletions(-)
 rename man/{RDDbw_IK.Rd => rdd_bw_ik.Rd} (87%)

diff --git a/NAMESPACE b/NAMESPACE
index a70c545..3036217 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -32,7 +32,6 @@ S3method(subset,rdd_data)
 S3method(summary,rdd_data)
 S3method(summary,rdd_reg_np)
 S3method(vcov,rdd_reg_np)
-export(RDDbw_IK)
 export(RDDbw_RSW)
 export(ROT_bw)
 export(as.lm)
@@ -47,6 +46,7 @@ export(gen_MC_IK)
 export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
+export(rdd_bw_ik)
 export(rdd_coef)
 export(rdd_data)
 export(rdd_gen_reg)
diff --git a/R/as.npreg.R b/R/as.npreg.R
index 572736b..2bde407 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -57,7 +57,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
   ## bw:
   range.x <- range(dat$x, na.rm=TRUE, finite=TRUE)
   if(adjustIK_bw ){ ## & names(bw) =="h_opt"
-    bw <- RDDbw_IK(dat, kernel="Normal")
+    bw <- rdd_bw_ik(dat, kernel="Normal")
   }
   bw_other <- 9999*diff(range.x)
   bws <- c(bw, rep(bw_other, 2))
diff --git a/R/bw_IK.R b/R/bw_IK.R
index 5c1beeb..6c2211f 100644
--- a/R/bw_IK.R
+++ b/R/bw_IK.R
@@ -13,16 +13,16 @@
 #' @examples
 #' data(Lee2008)
 #' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-#' RDDbw_IK(rd)
+#' rdd_bw_ik(rd)
 
 
-RDDbw_IK <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal")) {
+rdd_bw_ik <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal")) {
 
   kernel <- match.arg(kernel)
   checkIsRDD(rdd_object)
   cutpoint <- getCutpoint(rdd_object)
 
-  res <- RDDbw_IK_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=FALSE, kernel=kernel)
+  res <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=FALSE, kernel=kernel)
   return(res)
 
 }
@@ -33,7 +33,7 @@ IK_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw)
   checkIsRDD(rdd_object)
   cutpoint <- getCutpoint(rdd_object)
 
-  resB <- RDDbw_IK_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
+  resB <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
 
 ## compute C1: see IK equ 5, and Fan Jijbels (1996, 3.23)
 # is done in R with locpol, computeMu(i=2, equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
@@ -53,7 +53,7 @@ IK_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
   checkIsRDD(rdd_object)
   cutpoint <- getCutpoint(rdd_object)
 
-  resB <- RDDbw_IK_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
+  resB <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
 
 ## compute C2: see IK equ 5, and Fan Jijbels (1996, 3.23)
 # is done in R with locpol, computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
@@ -76,7 +76,7 @@ IK_amse <- function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw)
 }
 
 
-RDDbw_IK_low <-function (X,Y,threshold=0,verbose=FALSE, type=c("RES", "RES_imp","WP"), returnBig=FALSE, kernel=c("Triangular", "Uniform", "Normal")) {
+rdd_bw_ik_low <-function (X,Y,threshold=0,verbose=FALSE, type=c("RES", "RES_imp","WP"), returnBig=FALSE, kernel=c("Triangular", "Uniform", "Normal")) {
   
   type <- match.arg(type)
   kernel <- match.arg(kernel)
diff --git a/R/bw_ROT.R b/R/bw_ROT.R
index 0c6bf4a..7e6e325 100644
--- a/R/bw_ROT.R
+++ b/R/bw_ROT.R
@@ -49,7 +49,7 @@ ROT_bw <- function(object){
 #' or for each side (\code{sided})
 #' @return One (or two for \code{sided}) bandwidth value. 
 #' @references See \code{\link[KernSmooth]{dpill}}
-#' @seealso \code{\link{RDDbw_IK}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012)
+#' @seealso \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012)
 #' @import KernSmooth
 #' @export
 #' @examples
diff --git a/R/placebo.R b/R/placebo.R
index dd9ecf2..0e68416 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -227,7 +227,7 @@ computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_
     object_call$rdd_object <- dat_sides
 
     ## Change bw if(same_bw=FALSE)
-    if(hasBw) object_call$bw <- if(!same_bw) RDDbw_IK(dat_sides) else bw
+    if(hasBw) object_call$bw <- if(!same_bw) rdd_bw_ik(dat_sides) else bw
     
     ## Re-estimate model with new cutpoint/bw
     object_new <- eval(object_call) # rdd_reg_np(dat_sides, bw=bw_reg)
diff --git a/R/plotSensi.R b/R/plotSensi.R
index b91f573..efbd43e 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -20,7 +20,7 @@
 #' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 #' 
 #' #Non-parametric estimate 
-#' bw_ik <- RDDbw_IK(Lee2008_rdd)
+#' bw_ik <- rdd_bw_ik(Lee2008_rdd)
 #' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 #' plotSensi(reg_nonpara)
 #' plotSensi(reg_nonpara, device="base")
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 57d4a26..7278e01 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -77,7 +77,7 @@ rdd_gen_reg <- function(rdd_object, fun=glm, covariates=NULL, order=1, bw=NULL,
   reg
 }
 
-rdd_gen_reg_old <- function(rdd_object, covariates=".", bw=RDDbw_IK(rdd_object), slope=c("separate", "same"), fun=glm, ...){
+rdd_gen_reg_old <- function(rdd_object, covariates=".", bw=rdd_bw_ik(rdd_object), slope=c("separate", "same"), fun=glm, ...){
 
   slope <- match.arg(slope)
   checkIsRDD(rdd_object)
diff --git a/R/reg_lm.R b/R/reg_lm.R
index 34176ac..a68b373 100644
--- a/R/reg_lm.R
+++ b/R/reg_lm.R
@@ -45,7 +45,7 @@
 #' plot(reg_para4)
 #'
 #' # Restrict sample to bandwidth area:
-#' bw_ik <- RDDbw_IK(Lee2008_rdd)
+#' bw_ik <- rdd_bw_ik(Lee2008_rdd)
 #' reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 #' reg_para_ik
 #' plot(reg_para_ik)
diff --git a/R/reg_np.R b/R/reg_np.R
index 0656dd9..d09522d 100644
--- a/R/reg_np.R
+++ b/R/reg_np.R
@@ -9,7 +9,7 @@
 #' @param slope Whether slopes should be different on left or right (separate), or the same.
 #' @param covar.opt Options for the inclusion of covariates. Way to include covariates, either in the main regression (\code{include}) or as regressors of y in a first step (\code{residual}). 
 #' @return An object of class rdd_reg_np and class lm, with specific print and plot methods
-#' @seealso \code{\link{RDDbw_IK}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012)
+#' @seealso \code{\link{rdd_bw_ik}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012)
 #' @references TODO
 #' @export rdd_reg_np
 #' @examples
@@ -23,7 +23,7 @@
 #' plot(reg_nonpara)
 
 
-rdd_reg_np <- function(rdd_object, covariates=NULL, bw=RDDbw_IK(rdd_object), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
+rdd_reg_np <- function(rdd_object, covariates=NULL, bw=rdd_bw_ik(rdd_object), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
 
   slope <- match.arg(slope)
   inference <- match.arg(inference)
diff --git a/man/RDDbw_RSW.Rd b/man/RDDbw_RSW.Rd
index 08b345c..ecd467e 100644
--- a/man/RDDbw_RSW.Rd
+++ b/man/RDDbw_RSW.Rd
@@ -28,6 +28,6 @@ RDDbw_RSW(rd)
 See \code{\link[KernSmooth]{dpill}}
 }
 \seealso{
-\code{\link{RDDbw_IK}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012)
+\code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012)
 }
 
diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd
index 7e4e9d6..2ab374b 100644
--- a/man/plotSensi.Rd
+++ b/man/plotSensi.Rd
@@ -53,7 +53,7 @@ data(Lee2008)
 Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 #Non-parametric estimate
-bw_ik <- RDDbw_IK(Lee2008_rdd)
+bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 plotSensi(reg_nonpara)
 plotSensi(reg_nonpara, device="base")
diff --git a/man/RDDbw_IK.Rd b/man/rdd_bw_ik.Rd
similarity index 87%
rename from man/RDDbw_IK.Rd
rename to man/rdd_bw_ik.Rd
index f02a257..59881a6 100644
--- a/man/RDDbw_IK.Rd
+++ b/man/rdd_bw_ik.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
 % Please edit documentation in R/bw_IK.R
-\name{RDDbw_IK}
-\alias{RDDbw_IK}
+\name{rdd_bw_ik}
+\alias{rdd_bw_ik}
 \title{Imbens-Kalyanaraman Optimal Bandwidth Calculation}
 \usage{
-RDDbw_IK(rdd_object, kernel = c("Triangular", "Uniform", "Normal"))
+rdd_bw_ik(rdd_object, kernel = c("Triangular", "Uniform", "Normal"))
 }
 \arguments{
 \item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}}
@@ -21,7 +21,7 @@ for local linear regression in Regression discontinuity designs.
 \examples{
 data(Lee2008)
 rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-RDDbw_IK(rd)
+rdd_bw_ik(rd)
 }
 \references{
 Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator,"
diff --git a/man/rdd_reg_lm.Rd b/man/rdd_reg_lm.Rd
index 52c9a8f..3bbf71a 100644
--- a/man/rdd_reg_lm.Rd
+++ b/man/rdd_reg_lm.Rd
@@ -66,7 +66,7 @@ reg_para4
 plot(reg_para4)
 
 # Restrict sample to bandwidth area:
-bw_ik <- RDDbw_IK(Lee2008_rdd)
+bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
diff --git a/man/rdd_reg_np.Rd b/man/rdd_reg_np.Rd
index bdcc940..7e348bf 100644
--- a/man/rdd_reg_np.Rd
+++ b/man/rdd_reg_np.Rd
@@ -4,7 +4,7 @@
 \alias{rdd_reg_np}
 \title{Parametric polynomial estimator of the regression discontinuity}
 \usage{
-rdd_reg_np(rdd_object, covariates = NULL, bw = RDDbw_IK(rdd_object),
+rdd_reg_np(rdd_object, covariates = NULL, bw = rdd_bw_ik(rdd_object),
   slope = c("separate", "same"), inference = c("np", "lm"),
   covar.opt = list(slope = c("same", "separate"), bw = NULL))
 }
@@ -42,6 +42,6 @@ plot(reg_nonpara)
 TODO
 }
 \seealso{
-\code{\link{RDDbw_IK}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012)
+\code{\link{rdd_bw_ik}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012)
 }
 

From b1eb8af5298fc7aed41b349a9feed2e7b47d6d01 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:43:17 +0200
Subject: [PATCH 122/323] rename file previous commit

---
 R/{bw_IK.R => bw_ik.R} | 0
 man/rdd_bw_ik.Rd       | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename R/{bw_IK.R => bw_ik.R} (100%)

diff --git a/R/bw_IK.R b/R/bw_ik.R
similarity index 100%
rename from R/bw_IK.R
rename to R/bw_ik.R
diff --git a/man/rdd_bw_ik.Rd b/man/rdd_bw_ik.Rd
index 59881a6..a9ee263 100644
--- a/man/rdd_bw_ik.Rd
+++ b/man/rdd_bw_ik.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/bw_IK.R
+% Please edit documentation in R/bw_ik.R
 \name{rdd_bw_ik}
 \alias{rdd_bw_ik}
 \title{Imbens-Kalyanaraman Optimal Bandwidth Calculation}

From 3f6d90682ab4317e1a411176973455f3c8e0b47a Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:51:08 +0200
Subject: [PATCH 123/323] more stuff to smalls

---
 NAMESPACE                          |  2 +-
 R/as.npreg.R                       |  4 ++--
 R/bw_ik.R                          | 20 ++++++++++----------
 R/gen_MC_IK.R                      | 28 ++++++++++++++--------------
 R/plotSensi.R                      |  4 ++--
 man/{gen_MC_IK.Rd => gen_MC_ik.Rd} | 12 ++++++------
 6 files changed, 35 insertions(+), 35 deletions(-)
 rename man/{gen_MC_IK.Rd => gen_MC_ik.Rd} (84%)

diff --git a/NAMESPACE b/NAMESPACE
index 3036217..9d91684 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -42,7 +42,7 @@ export(computePlacebo)
 export(covarTest_dis)
 export(covarTest_mean)
 export(dens_test)
-export(gen_MC_IK)
+export(gen_MC_ik)
 export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
diff --git a/R/as.npreg.R b/R/as.npreg.R
index 2bde407..d57a470 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -41,7 +41,7 @@ as.npreg <- function(x, ...){
 }
 
 
-as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
+as.npregbw_low <- function(x, npreg=FALSE, adjustik_bw=TRUE, ...){
 
   dat <- getOriginalData(x)
   bw <- getBW(x)
@@ -56,7 +56,7 @@ as.npregbw_low <- function(x, npreg=FALSE, adjustIK_bw=TRUE, ...){
 
   ## bw:
   range.x <- range(dat$x, na.rm=TRUE, finite=TRUE)
-  if(adjustIK_bw ){ ## & names(bw) =="h_opt"
+  if(adjustik_bw ){ ## & names(bw) =="h_opt"
     bw <- rdd_bw_ik(dat, kernel="Normal")
   }
   bw_other <- 9999*diff(range.x)
diff --git a/R/bw_ik.R b/R/bw_ik.R
index 6c2211f..42f452f 100644
--- a/R/bw_ik.R
+++ b/R/bw_ik.R
@@ -27,7 +27,7 @@ rdd_bw_ik <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal")) {
 
 }
 
-IK_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
+ik_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
   kernel <- match.arg(kernel)
   checkIsRDD(rdd_object)
@@ -35,11 +35,11 @@ IK_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw)
 
   resB <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
 
-## compute C1: see IK equ 5, and Fan Jijbels (1996, 3.23)
+## compute C1: see ik equ 5, and Fan Jijbels (1996, 3.23)
 # is done in R with locpol, computeMu(i=2, equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
   C1 <- switch(kernel, "Triangular"= -0.1, "Uniform"= -0.1666667, "Normal"= -0.7519384) ## from: 
 
-## Compute bias as in IK equ:5, 
+## Compute bias as in ik equ:5, 
 # note here 1/4 is outside C1
   if(missing(bw))  bw <- resB$h_opt
   res<-  C1 * 1/2 * bw^2 *(resB$m2_right-resB$m2_left)
@@ -47,7 +47,7 @@ IK_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw)
 
 }
 
-IK_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
+ik_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
   kernel <- match.arg(kernel)
   checkIsRDD(rdd_object)
@@ -55,11 +55,11 @@ IK_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
   resB <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
 
-## compute C2: see IK equ 5, and Fan Jijbels (1996, 3.23)
+## compute C2: see ik equ 5, and Fan Jijbels (1996, 3.23)
 # is done in R with locpol, computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
   C2 <- switch(kernel, "Triangular"= 4.8, "Uniform"= 4, "Normal"=1.785961) ## from: 
 
-## Compute var as in IK equ:5, 
+## Compute var as in ik equ:5, 
   if(missing(bw))  bw <- resB$h_op
   elem1 <- (resB$var_inh_left+resB$var_inh_right)/resB$f_cu
   elem2 <- C2/(nrow(rdd_object)*bw)
@@ -67,10 +67,10 @@ IK_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
   res
 }
 
-IK_amse <- function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
+ik_amse <- function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
 
-  var <- IK_var(rdd_object=rdd_object, kernel=kernel, bw=bw)
-  bias <- IK_bias(rdd_object=rdd_object, kernel=kernel, bw=bw)
+  var <- ik_var(rdd_object=rdd_object, kernel=kernel, bw=bw)
+  bias <- ik_bias(rdd_object=rdd_object, kernel=kernel, bw=bw)
   res <- bias^2+var
   res
 }
@@ -170,7 +170,7 @@ rdd_bw_ik_low <-function (X,Y,threshold=0,verbose=FALSE, type=c("RES", "RES_imp"
 
   if(verbose)   cat("\n-Reg left:", r_left, "\n-Reg right:", r_right)
 
-## Compute kernel dependent constant: (see file ~/Dropbox/HEI/rdd/Rcode/IK bandwidth/bandwidth_comput.R)
+## Compute kernel dependent constant: (see file ~/Dropbox/HEI/rdd/Rcode/ik bandwidth/bandwidth_comput.R)
   Ck <- switch(kernel, "Triangular"=3.4375, "Uniform"=2.70192, "Normal"=1.25864) # is not 5.4 as in paper since our kernel is on I(|x|<1), not <1/2
 
 ## Final bandwidth: Equ (17) 
diff --git a/R/gen_MC_IK.R b/R/gen_MC_IK.R
index 841e18b..4ae7dab 100644
--- a/R/gen_MC_IK.R
+++ b/R/gen_MC_IK.R
@@ -5,12 +5,12 @@
 #' @param version The MC version of Imbens and Kalnayaraman (between 1 and 4).
 #' @param sd The standard deviation of the error term.
 #' @param output Whether to return a data-frame, or already a rdd_data
-#' @param size The size of the effect, this depends on the specific version, defaults are as in IK: 0.04, NULL, 0.1, 0.1
+#' @param size The size of the effect, this depends on the specific version, defaults are as in ik: 0.04, NULL, 0.1, 0.1
 #' @return An data frame with x and y variables. 
 #' @export
 #' @examples
-#' MC1_dat <- gen_MC_IK()
-#' MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
+#' mc1_dat <- gen_mc_ik()
+#' MC1_rdd <- rdd_data(y=mc1_dat$y, x=mc1_dat$x, cutpoint=0)
 #' 
 #' ## Use np regression:
 #' reg_nonpara <- rdd_reg_np(rdd_object=MC1_rdd)
@@ -18,7 +18,7 @@
 #' 
 #' # Represent the curves:
 #' plotCu <- function(version=1, xlim=c(-0.1,0.1)){
-#'   res <- gen_MC_IK(sd=0.0000001, n=1000, version=version)
+#'   res <- gen_mc_ik(sd=0.0000001, n=1000, version=version)
 #'   res <- res[order(res$x),]
 #'   ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), "y"))
 #'   plot(res, type="l", xlim=xlim, ylim=ylim, main=paste("DGP", version))
@@ -33,16 +33,16 @@
 #' plotCu(version=4)
 #' layout(matrix(1))
 
-gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdd_data"), size){
+gen_mc_ik <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdd_data"), size){
  
   output <- match.arg(output)
   if(!version%in% c(1:4) |length(version) !=1) stop("arg 'version' should be between 1 and 4")
 
   foo <- switch(version, 
-			"1"=gen_MC_IK_1,
-			"2"=gen_MC_IK_2,
-			"3"=gen_MC_IK_3,
-			"4"=gen_MC_IK_4)
+			"1"=gen_mc_ik_1,
+			"2"=gen_mc_ik_2,
+			"3"=gen_mc_ik_3,
+			"4"=gen_mc_ik_4)
   if(missing(size)) {
     size <- switch(version, 
 		    "1"=0.04,
@@ -62,7 +62,7 @@ gen_MC_IK <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdd_d
 ######### MC 1
 ####################################
 
-gen_MC_IK_1 <- function(n=200,  sd=0.1295, size=0.04){
+gen_mc_ik_1 <- function(n=200,  sd=0.1295, size=0.04){
 
 ## Regressor:
   Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
@@ -88,9 +88,9 @@ gen_MC_IK_1 <- function(n=200,  sd=0.1295, size=0.04){
 ######### MC 2
 ####################################
 
-gen_MC_IK_2 <- function(n=200,  sd=0.1295, size=0){
+gen_mc_ik_2 <- function(n=200,  sd=0.1295, size=0){
 
-#   if(!missing(size) && !is.null(size)) warning("Argument 'size' ignored for gen_MC_IK_2")
+#   if(!missing(size) && !is.null(size)) warning("Argument 'size' ignored for gen_mc_ik_2")
 ## Regressor:
   Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
   X <- 2*Z-1
@@ -109,7 +109,7 @@ gen_MC_IK_2 <- function(n=200,  sd=0.1295, size=0){
 ######### MC 3
 ####################################
 
-gen_MC_IK_3 <- function(n=200,  sd=0.1295, size=0.1){
+gen_mc_ik_3 <- function(n=200,  sd=0.1295, size=0.1){
 
 ## Regressor:
   Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
@@ -128,7 +128,7 @@ gen_MC_IK_3 <- function(n=200,  sd=0.1295, size=0.1){
 ######### MC 4
 ####################################
 
-gen_MC_IK_4 <- function(n=200,  sd=0.1295, size=0.1){
+gen_mc_ik_4 <- function(n=200,  sd=0.1295, size=0.1){
 
 ## Regressor:
   Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
diff --git a/R/plotSensi.R b/R/plotSensi.R
index efbd43e..3b1498f 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -153,8 +153,8 @@ plotSensi.rdd_reg_lm <- function(rdd_regobject, from, to, by=0.05, level=0.95, o
 ## get call:
   object_call <- attr(object, "RDDcall")
 
-## guess if obtained with IKbandwidth? (trick: call$bw would be empty)
-#   is_IKband <- is.null(object_call$bw)
+## guess if obtained with ikbandwidth? (trick: call$bw would be empty)
+#   is_ikband <- is.null(object_call$bw)
 
 ## run each time:
   for(j in 1:length(seq_ord)){
diff --git a/man/gen_MC_IK.Rd b/man/gen_MC_ik.Rd
similarity index 84%
rename from man/gen_MC_IK.Rd
rename to man/gen_MC_ik.Rd
index 73c375d..f1c8053 100644
--- a/man/gen_MC_IK.Rd
+++ b/man/gen_MC_ik.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
 % Please edit documentation in R/gen_MC_IK.R
-\name{gen_MC_IK}
-\alias{gen_MC_IK}
+\name{gen_MC_ik}
+\alias{gen_MC_ik}
 \title{Generate Monte Carlo simulations of Imbens and Kalyanaraman}
 \usage{
-gen_MC_IK(n = 200, version = 1, sd = 0.1295, output = c("data.frame",
+gen_MC_ik(n = 200, version = 1, sd = 0.1295, output = c("data.frame",
   "rdd_data"), size)
 }
 \arguments{
@@ -16,7 +16,7 @@ gen_MC_IK(n = 200, version = 1, sd = 0.1295, output = c("data.frame",
 
 \item{output}{Whether to return a data-frame, or already a rdd_data}
 
-\item{size}{The size of the effect, this depends on the specific version, defaults are as in IK: 0.04, NULL, 0.1, 0.1}
+\item{size}{The size of the effect, this depends on the specific version, defaults are as in ik: 0.04, NULL, 0.1, 0.1}
 }
 \value{
 An data frame with x and y variables.
@@ -25,7 +25,7 @@ An data frame with x and y variables.
 Generate the simulations reported in Imbens and Kalyanaraman (2012)
 }
 \examples{
-MC1_dat <- gen_MC_IK()
+MC1_dat <- gen_MC_ik()
 MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
 
 ## Use np regression:
@@ -34,7 +34,7 @@ reg_nonpara
 
 # Represent the curves:
 plotCu <- function(version=1, xlim=c(-0.1,0.1)){
-  res <- gen_MC_IK(sd=0.0000001, n=1000, version=version)
+  res <- gen_MC_ik(sd=0.0000001, n=1000, version=version)
   res <- res[order(res$x),]
   ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), "y"))
   plot(res, type="l", xlim=xlim, ylim=ylim, main=paste("DGP", version))

From b62aa171cb3a9d488d2d7f24bdb6cde96581a7d8 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:53:32 +0200
Subject: [PATCH 124/323] rename file

---
 R/{gen_MC_IK.R => gen_mc_ik.R}     |  0
 man/{gen_MC_ik.Rd => gen_mc_ik.Rd} | 14 +++++++-------
 2 files changed, 7 insertions(+), 7 deletions(-)
 rename R/{gen_MC_IK.R => gen_mc_ik.R} (100%)
 rename man/{gen_MC_ik.Rd => gen_mc_ik.Rd} (81%)

diff --git a/R/gen_MC_IK.R b/R/gen_mc_ik.R
similarity index 100%
rename from R/gen_MC_IK.R
rename to R/gen_mc_ik.R
diff --git a/man/gen_MC_ik.Rd b/man/gen_mc_ik.Rd
similarity index 81%
rename from man/gen_MC_ik.Rd
rename to man/gen_mc_ik.Rd
index f1c8053..01548f1 100644
--- a/man/gen_MC_ik.Rd
+++ b/man/gen_mc_ik.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/gen_MC_IK.R
-\name{gen_MC_ik}
-\alias{gen_MC_ik}
+% Please edit documentation in R/gen_mc_ik.R
+\name{gen_mc_ik}
+\alias{gen_mc_ik}
 \title{Generate Monte Carlo simulations of Imbens and Kalyanaraman}
 \usage{
-gen_MC_ik(n = 200, version = 1, sd = 0.1295, output = c("data.frame",
+gen_mc_ik(n = 200, version = 1, sd = 0.1295, output = c("data.frame",
   "rdd_data"), size)
 }
 \arguments{
@@ -25,8 +25,8 @@ An data frame with x and y variables.
 Generate the simulations reported in Imbens and Kalyanaraman (2012)
 }
 \examples{
-MC1_dat <- gen_MC_ik()
-MC1_rdd <- rdd_data(y=MC1_dat$y, x=MC1_dat$x, cutpoint=0)
+mc1_dat <- gen_mc_ik()
+MC1_rdd <- rdd_data(y=mc1_dat$y, x=mc1_dat$x, cutpoint=0)
 
 ## Use np regression:
 reg_nonpara <- rdd_reg_np(rdd_object=MC1_rdd)
@@ -34,7 +34,7 @@ reg_nonpara
 
 # Represent the curves:
 plotCu <- function(version=1, xlim=c(-0.1,0.1)){
-  res <- gen_MC_ik(sd=0.0000001, n=1000, version=version)
+  res <- gen_mc_ik(sd=0.0000001, n=1000, version=version)
   res <- res[order(res$x),]
   ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), "y"))
   plot(res, type="l", xlim=xlim, ylim=ylim, main=paste("DGP", version))

From 0d291273ad327b73a9e20306cece0a886de86330 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:53:44 +0200
Subject: [PATCH 125/323] to smalls

---
 R/bw_ROT.R                   | 4 ++--
 man/{ROT_bw.Rd => rot_bw.Rd} | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)
 rename man/{ROT_bw.Rd => rot_bw.Rd} (91%)

diff --git a/R/bw_ROT.R b/R/bw_ROT.R
index 7e6e325..f4c17a7 100644
--- a/R/bw_ROT.R
+++ b/R/bw_ROT.R
@@ -10,7 +10,7 @@
 
 ### Crary bw
 
-ROT_bw <- function(object){
+rot_bw <- function(object){
 
   if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
   cutpoint <- getCutpoint(object)
@@ -89,7 +89,7 @@ if(FALSE){
 #   lee_dat4 <- read.csv("/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv", header=FALSE)
 #   head(lee_dat4)
 #   a<-rdd_data(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0)
-# ROT_bw(object=a)
+# rot_bw(object=a)
 # RDDbw_RSW(object=a)
 RDDbw_RSW(object=a, type="sided")
 }
diff --git a/man/ROT_bw.Rd b/man/rot_bw.Rd
similarity index 91%
rename from man/ROT_bw.Rd
rename to man/rot_bw.Rd
index 5ef4623..19f5055 100644
--- a/man/ROT_bw.Rd
+++ b/man/rot_bw.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
 % Please edit documentation in R/bw_ROT.R
-\name{ROT_bw}
-\alias{ROT_bw}
+\name{rot_bw}
+\alias{rot_bw}
 \title{Bandwidth selector}
 \usage{
-ROT_bw(object)
+rot_bw(object)
 }
 \arguments{
 \item{object}{object of class rdd_data}

From 7f30f5c6a1e1fec78461ab60bd53a85b01a58b41 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:54:07 +0200
Subject: [PATCH 126/323] to smalls

---
 NAMESPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/NAMESPACE b/NAMESPACE
index 9d91684..881c99d 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -33,7 +33,6 @@ S3method(summary,rdd_data)
 S3method(summary,rdd_reg_np)
 S3method(vcov,rdd_reg_np)
 export(RDDbw_RSW)
-export(ROT_bw)
 export(as.lm)
 export(as.npreg)
 export(as.npregbw)
@@ -42,7 +41,7 @@ export(computePlacebo)
 export(covarTest_dis)
 export(covarTest_mean)
 export(dens_test)
-export(gen_MC_ik)
+export(gen_mc_ik)
 export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
@@ -53,6 +52,7 @@ export(rdd_gen_reg)
 export(rdd_pred)
 export(rdd_reg_lm)
 export(rdd_reg_np)
+export(rot_bw)
 export(vcovCluster)
 export(vcovCluster2)
 import(Formula)

From 5ae5e2d3ac9a496c53aaae3533589b0ae194a77f Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:58:02 +0200
Subject: [PATCH 127/323] alignment

---
 R/reg_gen.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/R/reg_gen.R b/R/reg_gen.R
index 7278e01..0778579 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -84,7 +84,7 @@ rdd_gen_reg_old <- function(rdd_object, covariates=".", bw=rdd_bw_ik(rdd_object)
   if(!is.function(fun)) stop("Arg 'fun' should be a function")
   cutpoint <- getCutpoint(rdd_object)
 
-## Construct data
+  ## Construct data
   dat <- as.data.frame(rdd_object)
 
   dat_step1 <- dat[, c("y", "x")]

From 06c2e4108ef341cd1de4e19cc1b98679801be389 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:58:13 +0200
Subject: [PATCH 128/323] update function names

---
 vignettes/rddtools.R    | 2 +-
 vignettes/rddtools.Rmd  | 2 +-
 vignettes/rddtools.html | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R
index 10d1367..18072d8 100644
--- a/vignettes/rddtools.R
+++ b/vignettes/rddtools.R
@@ -19,7 +19,7 @@ reg_para
 plot(reg_para)
 
 ## ----RegPlot-------------------------------------------------------------
-bw_ik <- RDDbw_IK(Lee2008_rdd)
+bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd
index b7cac45..a1da6e4 100644
--- a/vignettes/rddtools.Rmd
+++ b/vignettes/rddtools.Rmd
@@ -56,7 +56,7 @@ plot(reg_para)
 Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.
 
 ```{r RegPlot}
-bw_ik <- RDDbw_IK(Lee2008_rdd)
+bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html
index 6a5e5af..39e13d8 100644
--- a/vignettes/rddtools.html
+++ b/vignettes/rddtools.html
@@ -101,7 +101,7 @@ 

Parametric Estimation

Non-parametric Estimation

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

-
bw_ik <- RDDbw_IK(Lee2008_rdd)
+
bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 print(reg_nonpara)
 #> ### RDD regression: nonparametric local linear###

From dda0571fd87b3b6f51e1563a1bf58104393e4a50 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 11:59:24 +0200
Subject: [PATCH 129/323] update function names

---
 tests/packageDemo.R     |  6 +++---
 tests/rdd_pred.R        |  8 ++++----
 tests/rddtools_vs_rdd.R |  2 +-
 tests/simple_MC.R       | 12 ++++++------
 4 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index 7124df6..65bbbab 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -52,7 +52,7 @@ plot(Lee2008_rdd, xlim=c(-0.5, 0.5))
 
 ## few bandwidths:
 RDDbw_RSW(Lee2008_rdd)
-RDDbw_IK(Lee2008_rdd)
+rdd_bw_ik(Lee2008_rdd)
 
 
 ###### Parametric regression ######
@@ -79,7 +79,7 @@ plot(reg_para4)
 all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
 
 ## Restrict sample to bandwidth area:
-bw_ik <- RDDbw_IK(Lee2008_rdd)
+bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
 reg_para_ik
 plot(reg_para_ik)
@@ -202,7 +202,7 @@ covarTest_dis(Lee2008_rdd_z, bw=0.1)
 covarTest_mean(reg_para4_cov)
 covarTest_dis(reg_para4_cov)
 #### as npreg
-  reg_nonpara_np <- as.npreg(reg_nonpara, adjustIK_bw=FALSE)
+  reg_nonpara_np <- as.npreg(reg_nonpara, adjustik_bw=FALSE)
   reg_nonpara_np
   rdd_coef(reg_nonpara_np)
   rdd_coef(reg_nonpara_np, allCo=TRUE)
diff --git a/tests/rdd_pred.R b/tests/rdd_pred.R
index f51bc1c..766d2ef 100644
--- a/tests/rdd_pred.R
+++ b/tests/rdd_pred.R
@@ -13,11 +13,11 @@ Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letter
 Lee2008_rdd_z <- rdd_data(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
 
 #### REGS
-bw_IK <- RDDbw_IK(Lee2008_rdd_z)
-w_IK <- rddtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_IK)
+bw_ik <- rdd_bw_ik(Lee2008_rdd_z)
+w_ik <- rddtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_ik)
 reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
-reg_para4_cov_slSep_W <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_IK)
-reg_np_cov <- rdd_reg_np(rdd_object=Lee2008_rdd_z, covariates="z1", bw=bw_IK, inference="lm")
+reg_para4_cov_slSep_W <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_ik)
+reg_np_cov <- rdd_reg_np(rdd_object=Lee2008_rdd_z, covariates="z1", bw=bw_ik, inference="lm")
 
 
 
diff --git a/tests/rddtools_vs_rdd.R b/tests/rddtools_vs_rdd.R
index 26ed5e4..513590a 100644
--- a/tests/rddtools_vs_rdd.R
+++ b/tests/rddtools_vs_rdd.R
@@ -10,7 +10,7 @@ y<-3+2*x+3*cov+10*(x>=0)+rnorm(1000)
 RD <- rdd_data(x=x, y=y, cutpoint=0, covar=cov)
 
 ### Simple estimation:
-bw <- IKbandwidth(X=x, Y=y, cutpoint=0)
+bw <- ikbandwidth(X=x, Y=y, cutpoint=0)
 bw
 rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]]
 RDDtools_mod <- rdd_reg_np(RD, bw=bw, inference="lm")
diff --git a/tests/simple_MC.R b/tests/simple_MC.R
index b294f81..eab4c02 100644
--- a/tests/simple_MC.R
+++ b/tests/simple_MC.R
@@ -17,7 +17,7 @@ MC_simple <- function(n=200, CATE=0.3, HATE=0.1){
 input_mc <- MC_simple(n=1000, CATE=0.4)
 plot(input_mc)
 
-RDD_bw <- RDDbw_IK(input_mc)
+RDD_bw <- rdd_bw_ik(input_mc)
 
 RDD_np_sep <- rdd_reg_np(input_mc, bw=RDD_bw)
 RDD_np_same <- rdd_reg_np(input_mc, slope="same", bw=RDD_bw)
@@ -50,16 +50,16 @@ plotPlacebo(RDD_lm_same)
 
 #### Other MCs:
 set.seed(123)
-head(gen_MC_IK())
+head(gen_mc_ik())
 
 set.seed(123)
-head(gen_MC_IK(output="rdd_data"))
+head(gen_mc_ik(output="rdd_data"))
 
 set.seed(123)
-head(gen_MC_IK(version=2))
+head(gen_mc_ik(version=2))
 
 set.seed(123)
-head(gen_MC_IK(version=3))
+head(gen_mc_ik(version=3))
 
 set.seed(123)
-head(gen_MC_IK(version=4))
+head(gen_mc_ik(version=4))

From 72908f665c85624d96fac6bc781a8a62b86e8d44 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:01:36 +0200
Subject: [PATCH 130/323] rename

---
 R/{bw_ROT.R => bw_rot.R} | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
 rename R/{bw_ROT.R => bw_rot.R} (94%)

diff --git a/R/bw_ROT.R b/R/bw_rot.R
similarity index 94%
rename from R/bw_ROT.R
rename to R/bw_rot.R
index f4c17a7..0e65b66 100644
--- a/R/bw_ROT.R
+++ b/R/bw_rot.R
@@ -55,11 +55,11 @@ rot_bw <- function(object){
 #' @examples
 #' data(Lee2008)
 #' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-#' RDDbw_RSW(rd)
+#' rdd_bw_rsw(rd)
 
 
 ####
-RDDbw_RSW <- function(object, type=c("global", "sided")){
+rdd_bw_rsw <- function(object, type=c("global", "sided")){
 
   type <- match.arg(type)
 
@@ -90,6 +90,6 @@ if(FALSE){
 #   head(lee_dat4)
 #   a<-rdd_data(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0)
 # rot_bw(object=a)
-# RDDbw_RSW(object=a)
-RDDbw_RSW(object=a, type="sided")
+# rdd_bw_rsw(object=a)
+rdd_bw_rsw(object=a, type="sided")
 }

From 034698b11fcff768945427f818d49041cd665bcf Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:02:05 +0200
Subject: [PATCH 131/323] from previous

---
 man/rot_bw.Rd | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/man/rot_bw.Rd b/man/rot_bw.Rd
index 19f5055..fed8826 100644
--- a/man/rot_bw.Rd
+++ b/man/rot_bw.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/bw_ROT.R
+% Please edit documentation in R/bw_rot.R
 \name{rot_bw}
 \alias{rot_bw}
 \title{Bandwidth selector}

From 7b3098729264196fea33f5f05187ecdac2481d9a Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:04:02 +0200
Subject: [PATCH 132/323] fix function from rdd package (not rddtools)

---
 tests/rddtools_vs_rdd.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/rddtools_vs_rdd.R b/tests/rddtools_vs_rdd.R
index 513590a..26ed5e4 100644
--- a/tests/rddtools_vs_rdd.R
+++ b/tests/rddtools_vs_rdd.R
@@ -10,7 +10,7 @@ y<-3+2*x+3*cov+10*(x>=0)+rnorm(1000)
 RD <- rdd_data(x=x, y=y, cutpoint=0, covar=cov)
 
 ### Simple estimation:
-bw <- ikbandwidth(X=x, Y=y, cutpoint=0)
+bw <- IKbandwidth(X=x, Y=y, cutpoint=0)
 bw
 rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]]
 RDDtools_mod <- rdd_reg_np(RD, bw=bw, inference="lm")

From ec4bba52f64c91c4d7a44412341c4439d18b15a1 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:04:13 +0200
Subject: [PATCH 133/323] to renaming

---
 NAMESPACE                           |  2 +-
 R/bw_ik.R                           |  2 +-
 R/qplot_experim.R                   |  2 +-
 R/rdd_data_methods.R                |  4 ++--
 man/plot.rdd_data.Rd                |  2 +-
 man/rdd_bw_ik.Rd                    |  2 +-
 man/{RDDbw_RSW.Rd => rdd_bw_rsw.Rd} | 10 +++++-----
 7 files changed, 12 insertions(+), 12 deletions(-)
 rename man/{RDDbw_RSW.Rd => rdd_bw_rsw.Rd} (85%)

diff --git a/NAMESPACE b/NAMESPACE
index 881c99d..db40cad 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -32,7 +32,6 @@ S3method(subset,rdd_data)
 S3method(summary,rdd_data)
 S3method(summary,rdd_reg_np)
 S3method(vcov,rdd_reg_np)
-export(RDDbw_RSW)
 export(as.lm)
 export(as.npreg)
 export(as.npregbw)
@@ -46,6 +45,7 @@ export(plotPlacebo)
 export(plotPlaceboDens)
 export(plotSensi)
 export(rdd_bw_ik)
+export(rdd_bw_rsw)
 export(rdd_coef)
 export(rdd_data)
 export(rdd_gen_reg)
diff --git a/R/bw_ik.R b/R/bw_ik.R
index 42f452f..220ea84 100644
--- a/R/bw_ik.R
+++ b/R/bw_ik.R
@@ -8,7 +8,7 @@
 #' @return The optimal bandwidth
 #' @references Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," 
 #' Review of Economic Studies (2012) 79, 933-959
-#' @seealso \code{\link{RDDbw_RSW}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) 
+#' @seealso \code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) 
 #' @export
 #' @examples
 #' data(Lee2008)
diff --git a/R/qplot_experim.R b/R/qplot_experim.R
index 737f5ce..45c5d50 100644
--- a/R/qplot_experim.R
+++ b/R/qplot_experim.R
@@ -9,7 +9,7 @@ gplot <- function(x,  h, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=3,type
     if(!all(xlim==range(object$x, na.rm=TRUE))){
       object <- subset(object, object$x> min(xlim) & object$x< max(xlim))
     }
-    h <- RDDbw_RSW(object) 
+    h <- rdd_bw_rsw(object) 
     if(is_even(nplot)) {
       se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
     } else {
diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index 51ea5b0..f5fe249 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -31,7 +31,7 @@ summary.rdd_data <- function(object, ...){
 #' @details Produces a simple binned plot averaging values within each interval. The length of the intervals
 #' is specified with the argument \code{h}, specifying the whole binwidth (contrary to the usual bandwidth
 #' argument, that gives half of the length of the kernel window. 
-#' When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{RDDbw_RSW}}. 
+#' When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{rdd_bw_rsw}}. 
 #' @export
 #' @examples
 #' data(Lee2008)
@@ -63,7 +63,7 @@ plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), ce
     if(!all(xlim==range(object$x, na.rm=TRUE))){
       object <- subset(object, x> min(xlim) & x< max(xlim))
     }
-    h <- RDDbw_RSW(object) 
+    h <- rdd_bw_rsw(object) 
     if(is_even(nplot)) {
       se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
     } else {
diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd
index 6e0ea72..2333a9d 100644
--- a/man/plot.rdd_data.Rd
+++ b/man/plot.rdd_data.Rd
@@ -34,7 +34,7 @@ Binned plot of the forcing and outcome variable
 Produces a simple binned plot averaging values within each interval. The length of the intervals
 is specified with the argument \code{h}, specifying the whole binwidth (contrary to the usual bandwidth
 argument, that gives half of the length of the kernel window.
-When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{RDDbw_RSW}}.
+When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{rdd_bw_rsw}}.
 }
 \examples{
 data(Lee2008)
diff --git a/man/rdd_bw_ik.Rd b/man/rdd_bw_ik.Rd
index a9ee263..13cff53 100644
--- a/man/rdd_bw_ik.Rd
+++ b/man/rdd_bw_ik.Rd
@@ -28,6 +28,6 @@ Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the
 Review of Economic Studies (2012) 79, 933-959
 }
 \seealso{
-\code{\link{RDDbw_RSW}} Global bandwidth selector of Ruppert, Sheather and Wand (1995)
+\code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995)
 }
 
diff --git a/man/RDDbw_RSW.Rd b/man/rdd_bw_rsw.Rd
similarity index 85%
rename from man/RDDbw_RSW.Rd
rename to man/rdd_bw_rsw.Rd
index ecd467e..df3efa6 100644
--- a/man/RDDbw_RSW.Rd
+++ b/man/rdd_bw_rsw.Rd
@@ -1,10 +1,10 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/bw_ROT.R
-\name{RDDbw_RSW}
-\alias{RDDbw_RSW}
+% Please edit documentation in R/bw_rot.R
+\name{rdd_bw_rsw}
+\alias{rdd_bw_rsw}
 \title{Global bandwidth selector of Ruppert, Sheather and Wand (1995) from package \pkg{KernSmooth}}
 \usage{
-RDDbw_RSW(object, type = c("global", "sided"))
+rdd_bw_rsw(object, type = c("global", "sided"))
 }
 \arguments{
 \item{object}{object of class rdd_data created by \code{\link{rdd_data}}}
@@ -22,7 +22,7 @@ either to the whole function, or to the functions below and above the cutpoint.
 \examples{
 data(Lee2008)
 rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-RDDbw_RSW(rd)
+rdd_bw_rsw(rd)
 }
 \references{
 See \code{\link[KernSmooth]{dpill}}

From 58d09aa9931f005e315153623d50842430ac9933 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:05:57 +0200
Subject: [PATCH 134/323] if false

---
 R/bw_rot.R | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/R/bw_rot.R b/R/bw_rot.R
index 0e65b66..b9895bb 100644
--- a/R/bw_rot.R
+++ b/R/bw_rot.R
@@ -58,7 +58,6 @@ rot_bw <- function(object){
 #' rdd_bw_rsw(rd)
 
 
-####
 rdd_bw_rsw <- function(object, type=c("global", "sided")){
 
   type <- match.arg(type)
@@ -68,7 +67,6 @@ rdd_bw_rsw <- function(object, type=c("global", "sided")){
   x <- object$x
   y <- object$y
 
-##
   if(type=="global"){
     bw <- dpill(x=x, y=y)
   } else {
@@ -80,16 +78,6 @@ rdd_bw_rsw <- function(object, type=c("global", "sided")){
     bw <- c(bw_left, bw_right)
   }
 
-## result
+  ## result
   bw
 }
-
-
-if(FALSE){
-#   lee_dat4 <- read.csv("/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv", header=FALSE)
-#   head(lee_dat4)
-#   a<-rdd_data(y=lee_dat4[,2], x=lee_dat4[,1], cutpoint=0)
-# rot_bw(object=a)
-# rdd_bw_rsw(object=a)
-rdd_bw_rsw(object=a, type="sided")
-}

From d26bec0c2604798d1a3d8345474ed15d326c49fc Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:06:50 +0200
Subject: [PATCH 135/323] function name

---
 tests/packageDemo.R | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index 65bbbab..c2fca7a 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -51,7 +51,7 @@ plot(Lee2008_rdd, xlim=c(-0.5, 0.5))
 ############################################
 
 ## few bandwidths:
-RDDbw_RSW(Lee2008_rdd)
+rdd_bw_rsw(Lee2008_rdd)
 rdd_bw_ik(Lee2008_rdd)
 
 

From 97717e0c24cba1a6de59e388ed48b560b325521e Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:07:54 +0200
Subject: [PATCH 136/323] rename

---
 RDDtools.Rproj => rddtools.Rproj | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename RDDtools.Rproj => rddtools.Rproj (100%)

diff --git a/RDDtools.Rproj b/rddtools.Rproj
similarity index 100%
rename from RDDtools.Rproj
rename to rddtools.Rproj

From 5c512eccadef3b4407b88a8e33f054ed846a6e97 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:12:29 +0200
Subject: [PATCH 137/323] update with renaming

---
 NEWS | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/NEWS b/NEWS
index 25b1212..124c620 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,10 @@ RDDtools 0.3.0.9000
 
 * development taken over by Bastiaan
 
+* rename package to rddtools (from RDDtools)
+
+* rename functions to lower case
+
 * move package from subdir to repo root directory
 
 * change S3class method to export for roxygen

From ac00df9518fd8779a0ade212c3baa43d4886969f Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:13:14 +0200
Subject: [PATCH 138/323] rename internal RDDdat to rdd_dat

---
 R/rdd_data.R                | 20 ++++++++++----------
 misc/test_RDest_t0_RDDreg.R | 18 +++++++++---------
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/R/rdd_data.R b/R/rdd_data.R
index 85623a6..7ea6819 100644
--- a/R/rdd_data.R
+++ b/R/rdd_data.R
@@ -75,24 +75,24 @@ rdd_data <- function(y, x, covar, cutpoint, z, labels, data){
 #   if(hasCova && is.null(labels$covar)) labels$covar <- if(NCOL(covar)==1) names(deparse(substitute(y))
 
 ## Assemble data
-  RDDdat <- data.frame(x=x, y=y)
+  rdd_dat <- data.frame(x=x, y=y)
   if(hasCovar) {
-    RDDdat <- cbind(RDDdat,covar)
-    if(NCOL(covar)==1 && is.null(colnames(covar))) colnames(RDDdat)[3] <- covar_nam
+    rdd_dat <- cbind(rdd_dat,covar)
+    if(NCOL(covar)==1 && is.null(colnames(covar))) colnames(rdd_dat)[3] <- covar_nam
   } 
 
   if(type=="Fuzzy"){
-    RDDdat <- cbind(RDDdat,z)
+    rdd_dat <- cbind(rdd_dat,z)
   }
 
 ## return
-  class(RDDdat) <- c("rdd_data", "data.frame")
-  attr(RDDdat, "hasCovar") <- hasCovar
-  attr(RDDdat, "labels") <- labels
-  attr(RDDdat, "cutpoint") <- cutpoint
-  attr(RDDdat, "type") <- type
+  class(rdd_dat) <- c("rdd_data", "data.frame")
+  attr(rdd_dat, "hasCovar") <- hasCovar
+  attr(rdd_dat, "labels") <- labels
+  attr(rdd_dat, "cutpoint") <- cutpoint
+  attr(rdd_dat, "type") <- type
 
-  RDDdat
+  rdd_dat
 }
 
 
diff --git a/misc/test_RDest_t0_RDDreg.R b/misc/test_RDest_t0_RDDreg.R
index ba74ffb..9ed86a3 100644
--- a/misc/test_RDest_t0_RDDreg.R
+++ b/misc/test_RDest_t0_RDDreg.R
@@ -1,17 +1,17 @@
 
 if(FALSE){
-RDDdat_choice <- RDDdata(y=choice_pg, x=xx, cutpoint=30)
-RDDdat_risk <- RDDdata(y=risky_option, x=xx, cutpoint=30)
+rdd_dat_choice <- rdd_data(y=choice_pg, x=xx, cutpoint=30)
+rdd_dat_risk <- rdd_data(y=risky_option, x=xx, cutpoint=30)
 
-RDbw_choice <- RDDbw_IK(RDDdat_choice)
-RDbw_risk <- RDDbw_IK(RDDdat_risk)
+RDbw_choice <- RDDbw_IK(rdd_dat_choice)
+RDbw_risk <- RDDbw_IK(rdd_dat_risk)
 
-rd_choice <- RDDreg_np(RDDdat_choice)
-rd_choice_sam <- RDDreg_np(RDDdat_choice, slope="same")
-rd_choice_lm <- RDDreg_lm(RDDdat_choice)
+rd_choice <- RDDreg_np(rdd_dat_choice)
+rd_choice_sam <- RDDreg_np(rdd_dat_choice, slope="same")
+rd_choice_lm <- RDDreg_lm(rdd_dat_choice)
 
-rd_risk <- RDDreg_np(RDDdat_risk)
-rd_risk_sam <- RDDreg_np(RDDdat_risk, slope="same")
+rd_risk <- RDDreg_np(rdd_dat_risk)
+rd_risk_sam <- RDDreg_np(rdd_dat_risk, slope="same")
 
 
 rd_choice

From 67509508fd80475bb74c719222ce9bc30ca5381c Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:22:19 +0200
Subject: [PATCH 139/323] trying out tidy dir

---
 tests/packageDemo.R     | 164 +++++++++++++---------------
 tests/rdd_pred.R        | 233 ++++++++++++++++++----------------------
 tests/rddtools_vs_rdd.R |  42 ++++----
 tests/simple_MC.R       |  48 ++++-----
 tests/testthat.R        |   2 +-
 5 files changed, 224 insertions(+), 265 deletions(-)

diff --git a/tests/packageDemo.R b/tests/packageDemo.R
index c2fca7a..f1d287c 100644
--- a/tests/packageDemo.R
+++ b/tests/packageDemo.R
@@ -3,13 +3,11 @@ library(rddtools)
 
 
 
-############################################
-### STEP 0: Data Manipulation
-############################################
+############################################ STEP 0: Data Manipulation
 data(Lee2008)
 head(Lee2008)
 
-Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdd_data(y = Lee2008$y, x = Lee2008$x, cutpoint = 0)
 
 head(Lee2008_rdd)
 
@@ -20,71 +18,65 @@ summary(Lee2008_rdd)
 n_Lee <- nrow(Lee2008)
 
 set.seed(123)
-Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE))
-Lee2008_rdd_z <- rdd_data(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
+Z <- data.frame(z1 = rnorm(n_Lee), z2 = rnorm(n_Lee, mean = 20, sd = 2), z3 = sample(letters[1:3], size = n_Lee, replace = TRUE))
+Lee2008_rdd_z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
 
-head(Lee2008_rdd_z )
-summary(Lee2008_rdd_z )
+head(Lee2008_rdd_z)
+summary(Lee2008_rdd_z)
 
 ### Fuzzy
 set.seed(123)
-ins <- rbinom(n_Lee, 1, prob=ifelse(Lee2008$x<0, 0.1, 0.9))
-Lee2008_rdd_ins <- rdd_data(y=Lee2008$y, x=Lee2008$x, z=ins,cutpoint=0)
-table(Lee2008$x<0, ins==0)
+ins <- rbinom(n_Lee, 1, prob = ifelse(Lee2008$x < 0, 0.1, 0.9))
+Lee2008_rdd_ins <- rdd_data(y = Lee2008$y, x = Lee2008$x, z = ins, cutpoint = 0)
+table(Lee2008$x < 0, ins == 0)
 
-############################################
-### STEP 2: Graphical inspection
-############################################
+############################################ STEP 2: Graphical inspection
 
-### Plot 
+### Plot
 plot(Lee2008_rdd)
-plot(Lee2008_rdd, nplot=3, h=c(0.02, 0.03, 0.04))
-plot(Lee2008_rdd, nplot=1, h=0.1)
+plot(Lee2008_rdd, nplot = 3, h = c(0.02, 0.03, 0.04))
+plot(Lee2008_rdd, nplot = 1, h = 0.1)
 
-plot(Lee2008_rdd, xlim=c(-0.5, 0.5))
+plot(Lee2008_rdd, xlim = c(-0.5, 0.5))
 
-# plot(Lee2008_rdd, xlim=c(-0.5, 0.5), type="ggplot")
+# plot(Lee2008_rdd, xlim=c(-0.5, 0.5), type='ggplot')
 
 
-############################################
-### STEP 2: Regression
-############################################
+############################################ STEP 2: Regression
 
 ## few bandwidths:
 rdd_bw_rsw(Lee2008_rdd)
 rdd_bw_ik(Lee2008_rdd)
 
 
-###### Parametric regression ######
-# Simple polynomial of order 1:
-reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
+###### Parametric regression ###### Simple polynomial of order 1:
+reg_para <- rdd_reg_lm(rdd_object = Lee2008_rdd)
 print(reg_para)
 summary(reg_para)
 plot(reg_para)
 
-all.equal(unlist(rdd_pred(reg_para)), rdd_coef(reg_para, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para)), rdd_coef(reg_para, allInfo = TRUE)[1:2], check.attributes = FALSE)
 
-## Difference in means regression:
-# Simple polynomial of order 0:
-reg_para_0 <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=0)
+## Difference in means regression: Simple polynomial of order 0:
+reg_para_0 <- rdd_reg_lm(rdd_object = Lee2008_rdd, order = 0)
 print(reg_para_0)
 summary(reg_para_0)
 plot(reg_para_0)
 
 
 ## Simple polynomial of order 4:
-reg_para4 <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para4 <- rdd_reg_lm(rdd_object = Lee2008_rdd, order = 4)
 reg_para4
 plot(reg_para4)
-all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo = TRUE)[1:2], check.attributes = FALSE)
 
 ## Restrict sample to bandwidth area:
 bw_ik <- rdd_bw_ik(Lee2008_rdd)
-reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, bw=bw_ik, order=4)
+reg_para_ik <- rdd_reg_lm(rdd_object = Lee2008_rdd, bw = bw_ik, order = 4)
 reg_para_ik
 plot(reg_para_ik)
 
-all.equal(unlist(rdd_pred(reg_para_ik)), rdd_coef(reg_para_ik, allInfo=TRUE)[1:2], check.attributes=FALSE)
+all.equal(unlist(rdd_pred(reg_para_ik)), rdd_coef(reg_para_ik, allInfo = TRUE)[1:2], check.attributes = FALSE)
 
 ## Fuzzy reg
 reg_para_fuzz <- rdd_reg_lm(Lee2008_rdd_ins)
@@ -92,49 +84,50 @@ coef(reg_para_fuzz)
 summary(reg_para_fuzz)
 
 ## Covariates:
-reg_para4_cov <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".")
+reg_para4_cov <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = ".")
 reg_para4_cov
 summary(reg_para4_cov)
 
-reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = ".", covar.opt = list(slope = "separate"))
 summary(reg_para4_cov_slSep)
 rdd_pred(reg_para4_cov_slSep)
-rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 0.2, 0.2), z2=c(0,20,20), z3b=c(0,1,0), z3c=c(0,0,1)))
+rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 0.2, 0.2), z2 = c(0, 20, 20), z3b = c(0, 1, 0), z3c = c(0, 0, 1)))
 
 
-reg_para4_cov_startR <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual"))
+reg_para4_cov_startR <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = ".", covar.opt = list(strategy = "residual"))
 reg_para4_cov_startR
 summary(reg_para4_cov_startR)
 
 plot(reg_para4_cov)
 
-reg_para4_cov_startR_sl2 <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates=".", covar.opt=list(strategy="residual", slope="separate"))
+reg_para4_cov_startR_sl2 <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = ".", covar.opt = list(strategy = "residual", 
+    slope = "separate"))
 summary(reg_para4_cov_startR_sl2)
 
-reg_para4_cov_2 <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z3+I(z1^2)")
+reg_para4_cov_2 <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = "z3+I(z1^2)")
 reg_para4_cov_2
 summary(reg_para4_cov_2)
 
 ###### Non-parametric regression ######
-reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object = Lee2008_rdd)
 print(reg_nonpara)
 summary(reg_nonpara)
-plot(x=reg_nonpara)
+plot(x = reg_nonpara)
 
-reg_nonpara_inflm <- rdd_reg_np(rdd_object=Lee2008_rdd, inference="lm")
+reg_nonpara_inflm <- rdd_reg_np(rdd_object = Lee2008_rdd, inference = "lm")
 print(reg_nonpara_inflm)
 summary(reg_nonpara_inflm)
-plot(x=reg_nonpara_inflm)
+plot(x = reg_nonpara_inflm)
 
 
-reg_nonpara_sameSl <- rdd_reg_np(rdd_object=Lee2008_rdd, slope="same")
+reg_nonpara_sameSl <- rdd_reg_np(rdd_object = Lee2008_rdd, slope = "same")
 print(reg_nonpara_sameSl)
 summary(reg_nonpara_sameSl)
 
 
 ###### PLOT SENSI ######
-plSe_reg_para <- plotSensi(reg_para_ik, order=4:6)
-plSe_reg_para_fac <- plotSensi(reg_para_ik, type="facet", order=4:6)
+plSe_reg_para <- plotSensi(reg_para_ik, order = 4:6)
+plSe_reg_para_fac <- plotSensi(reg_para_ik, type = "facet", order = 4:6)
 plSe_reg_para
 plSe_reg_para_fac
 
@@ -142,44 +135,42 @@ plSe_reg_para_fac
 plSe_reg_nonpara <- plotSensi(reg_nonpara)
 plSe_reg_nonpara
 
-plSe_reg_nonpara_HC <- plotSensi(reg_nonpara_inflm, vcov. =function(x) vcovCluster(x, clusterVar=model.frame(x)$x))
+plSe_reg_nonpara_HC <- plotSensi(reg_nonpara_inflm, vcov. = function(x) vcovCluster(x, clusterVar = model.frame(x)$x))
 plSe_reg_nonpara_HC
 
-plSe_reg_para_0 <- plotSensi(reg_para_0, plot=FALSE)
+plSe_reg_para_0 <- plotSensi(reg_para_0, plot = FALSE)
 plSe_reg_para_0
 
-plSe_reg_para_0_gg <- plotSensi(reg_para_0, plot=FALSE, output="ggplot")
+plSe_reg_para_0_gg <- plotSensi(reg_para_0, plot = FALSE, output = "ggplot")
 str(plSe_reg_para_0_gg)
 
 
 ###### Post-inference: ######
 
-clusterInf(reg_para, clusterVar=model.frame(reg_para)$x, type="df-adj")
-clusterInf(reg_para, clusterVar=model.frame(reg_para)$x, type="HC")
+clusterInf(reg_para, clusterVar = model.frame(reg_para)$x, type = "df-adj")
+clusterInf(reg_para, clusterVar = model.frame(reg_para)$x, type = "HC")
 
 
-############################################
-### STEP 3: Validty tests
-############################################
+############################################ STEP 3: Validty tests
 
 ## Placebo test:
 placeb_dat_reg_nonpara <- computePlacebo(reg_nonpara)
 
 plotPlacebo(placeb_dat_reg_nonpara)
-plotPlacebo(placeb_dat_reg_nonpara, device="base")
+plotPlacebo(placeb_dat_reg_nonpara, device = "base")
 
 
 plotPlaceboDens(placeb_dat_reg_nonpara)
 
 ## check invisible return:
-ptPl_reg_nonpara <- plotPlacebo(reg_nonpara, plot=FALSE)
+ptPl_reg_nonpara <- plotPlacebo(reg_nonpara, plot = FALSE)
 ptPl_reg_nonpara
 
-ptPl_reg_nonpara2 <- plotPlacebo(reg_nonpara, plot=FALSE, output="ggplot")
+ptPl_reg_nonpara2 <- plotPlacebo(reg_nonpara, plot = FALSE, output = "ggplot")
 ptPl_reg_nonpara2
 
 # with HC:
-ptPl_reg_nonpara_HC <- plotPlacebo(reg_nonpara_inflm, vcov. =function(x) vcovCluster(x, clusterVar=model.frame(x)$x))
+ptPl_reg_nonpara_HC <- plotPlacebo(reg_nonpara_inflm, vcov. = function(x) vcovCluster(x, clusterVar = model.frame(x)$x))
 ptPl_reg_nonpara_HC
 
 ptPl_reg_para_0 <- plotPlacebo(reg_para_0)
@@ -189,60 +180,51 @@ ptPl_reg_para_0
 
 ## density tests
 dens_test(Lee2008_rdd)
-dens_test(reg_para_0, plot=FALSE)
-dens_test(reg_nonpara, plot=FALSE)$test.output[c("theta", "se", "z", "p", "binsize", "bw", "cutpoint")]
+dens_test(reg_para_0, plot = FALSE)
+dens_test(reg_nonpara, plot = FALSE)$test.output[c("theta", "se", "z", "p", "binsize", "bw", "cutpoint")]
 
 
 ## Covariates tests
 covarTest_mean(Lee2008_rdd_z)
-covarTest_mean(Lee2008_rdd_z, bw=0.1)
+covarTest_mean(Lee2008_rdd_z, bw = 0.1)
 covarTest_dis(Lee2008_rdd_z)
-covarTest_dis(Lee2008_rdd_z, bw=0.1)
+covarTest_dis(Lee2008_rdd_z, bw = 0.1)
 
 covarTest_mean(reg_para4_cov)
 covarTest_dis(reg_para4_cov)
 #### as npreg
-  reg_nonpara_np <- as.npreg(reg_nonpara, adjustik_bw=FALSE)
-  reg_nonpara_np
-  rdd_coef(reg_nonpara_np)
-  rdd_coef(reg_nonpara_np, allCo=TRUE)
-  rdd_coef(reg_nonpara_np, allInfo=TRUE)
-  rdd_coef(reg_nonpara_np, allInfo=TRUE, allCo=TRUE)
+reg_nonpara_np <- as.npreg(reg_nonpara, adjustik_bw = FALSE)
+reg_nonpara_np
+rdd_coef(reg_nonpara_np)
+rdd_coef(reg_nonpara_np, allCo = TRUE)
+rdd_coef(reg_nonpara_np, allInfo = TRUE)
+rdd_coef(reg_nonpara_np, allInfo = TRUE, allCo = TRUE)
 
 ## Compare with result obtained with a Gaussian kernel:
-  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
-  reg_nonpara_gaus <- rdd_reg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
-  all.equal(rdd_coef(reg_nonpara_gaus, allCo=TRUE),rdd_coef(reg_nonpara_np, allCo=TRUE), check.attributes=FALSE) 
+bw_lm <- dnorm(Lee2008_rdd$x, sd = rddtools:::getBW(reg_nonpara))
+reg_nonpara_gaus <- rdd_reg_lm(rdd_object = Lee2008_rdd, w = bw_lm)
+all.equal(rdd_coef(reg_nonpara_gaus, allCo = TRUE), rdd_coef(reg_nonpara_np, allCo = TRUE), check.attributes = FALSE)
 
 
 
 #### methods
 
-regs_all <- list(reg_para=reg_para,
-                 reg_para_0=reg_para_0,
-                 reg_para4=reg_para4,
-                 reg_para_ik=reg_para_ik,
-                 reg_para_fuzz=reg_para_fuzz,
-                 reg_para4_cov=reg_para4_cov,
-                 reg_para4_cov_slSep=reg_para4_cov_slSep,
-                 reg_para4_cov_startR=reg_para4_cov_startR,
-                 reg_para4_cov_startR_sl2=reg_para4_cov_startR_sl2,
-                 reg_nonpara=reg_nonpara,
-                 reg_nonpara_inflm=reg_nonpara_inflm,
-                 reg_nonpara_sameSl=reg_nonpara_sameSl)
-capply <- function(x){
-  n.obs <- sapply(x, length)
-  seq.max <- seq_len(max(n.obs))
-  t(sapply(x, "[", i = seq.max))
+regs_all <- list(reg_para = reg_para, reg_para_0 = reg_para_0, reg_para4 = reg_para4, reg_para_ik = reg_para_ik, reg_para_fuzz = reg_para_fuzz, 
+    reg_para4_cov = reg_para4_cov, reg_para4_cov_slSep = reg_para4_cov_slSep, reg_para4_cov_startR = reg_para4_cov_startR, reg_para4_cov_startR_sl2 = reg_para4_cov_startR_sl2, 
+    reg_nonpara = reg_nonpara, reg_nonpara_inflm = reg_nonpara_inflm, reg_nonpara_sameSl = reg_nonpara_sameSl)
+capply <- function(x) {
+    n.obs <- sapply(x, length)
+    seq.max <- seq_len(max(n.obs))
+    t(sapply(x, "[", i = seq.max))
 }
 
 capply(lapply(regs_all, coef))
 sapply(regs_all, rdd_coef)
 rdd_pred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
-sapply(regs_all[!names(regs_all)%in%rdd_pred_issue], rdd_pred)
+sapply(regs_all[!names(regs_all) %in% rdd_pred_issue], rdd_pred)
 
 sapply(regs_all, rddtools:::getCutpoint)
-lapply(regs_all, plotSensi, plot=FALSE)
-
-sapply(regs_all, function(x) dens_test(x, plot=FALSE)[c("p.value", "statistic", "estimate")])
+lapply(regs_all, plotSensi, plot = FALSE)
 
+sapply(regs_all, function(x) dens_test(x, plot = FALSE)[c("p.value", "statistic", "estimate")])
+ 
diff --git a/tests/rdd_pred.R b/tests/rdd_pred.R
index 766d2ef..6293211 100644
--- a/tests/rdd_pred.R
+++ b/tests/rdd_pred.R
@@ -4,196 +4,173 @@ library(car)
 
 #### DATA
 data(Lee2008)
-Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+Lee2008_rdd <- rdd_data(y = Lee2008$y, x = Lee2008$x, cutpoint = 0)
 
 n_Lee <- nrow(Lee2008)
 
 set.seed(123)
-Z<- data.frame(z1=rnorm(n_Lee), z2=rnorm(n_Lee, mean=20, sd=2), z3=sample(letters[1:3], size=n_Lee, replace=TRUE))
-Lee2008_rdd_z <- rdd_data(y=Lee2008$y, x=Lee2008$x, covar=Z,cutpoint=0)
+Z <- data.frame(z1 = rnorm(n_Lee), z2 = rnorm(n_Lee, mean = 20, sd = 2), z3 = sample(letters[1:3], size = n_Lee, replace = TRUE))
+Lee2008_rdd_z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
 
 #### REGS
 bw_ik <- rdd_bw_ik(Lee2008_rdd_z)
 w_ik <- rddtools:::Kernel_tri(Lee2008_rdd_z$x, 0, bw_ik)
-reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
-reg_para4_cov_slSep_W <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"), weights=w_ik)
-reg_np_cov <- rdd_reg_np(rdd_object=Lee2008_rdd_z, covariates="z1", bw=bw_ik, inference="lm")
+reg_para4_cov_slSep <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = "z1", covar.opt = list(slope = "separate"))
+reg_para4_cov_slSep_W <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = "z1", covar.opt = list(slope = "separate"), 
+    weights = w_ik)
+reg_np_cov <- rdd_reg_np(rdd_object = Lee2008_rdd_z, covariates = "z1", bw = bw_ik, inference = "lm")
 
 
 
 
-reg_para4_cov_slSep_2Z <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1+z2", covar.opt=list(slope="separate"))
+reg_para4_cov_slSep_2Z <- rdd_reg_lm(rdd_object = Lee2008_rdd_z, order = 4, covariates = "z1+z2", covar.opt = list(slope = "separate"))
 
-reg_li <- list( reg_para4_cov_slSep=reg_para4_cov_slSep, 
-		reg_para4_cov_slSep_W=reg_para4_cov_slSep_W,
-		reg_np_cov=reg_np_cov,
-		reg_para4_cov_slSep_2Z=reg_para4_cov_slSep_2Z)
+reg_li <- list(reg_para4_cov_slSep = reg_para4_cov_slSep, reg_para4_cov_slSep_W = reg_para4_cov_slSep_W, reg_np_cov = reg_np_cov, 
+    reg_para4_cov_slSep_2Z = reg_para4_cov_slSep_2Z)
 
-checkRDDmean <- function(x, n=5){
-  covDF <- model.frame(x)
-  zDF <- grep("z", colnames(covDF), value=FALSE)
-  hasD <- zDF[-grep(":", colnames(covDF)[zDF])]
-
-  DF_1 <- covDF[1:n,hasD, drop=FALSE]
-  DF_2 <- data.frame(t(colMeans(DF_1)))
-
-  pred_1 <- rdd_pred(x, covdata=DF_1, stat="mean")
-  pred_2 <- rdd_pred(x, covdata=DF_2)
-  all.equal(pred_1, pred_2, check.attributes=FALSE)
+checkRDDmean <- function(x, n = 5) {
+    covDF <- model.frame(x)
+    zDF <- grep("z", colnames(covDF), value = FALSE)
+    hasD <- zDF[-grep(":", colnames(covDF)[zDF])]
+    
+    DF_1 <- covDF[1:n, hasD, drop = FALSE]
+    DF_2 <- data.frame(t(colMeans(DF_1)))
+    
+    pred_1 <- rdd_pred(x, covdata = DF_1, stat = "mean")
+    pred_2 <- rdd_pred(x, covdata = DF_2)
+    all.equal(pred_1, pred_2, check.attributes = FALSE)
 }
 
 sapply(reg_li, checkRDDmean)
 
-sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)),rdd_coef(x, allInfo=TRUE)[1,1:2], check.attributes=FALSE))
-
-
-# 
-# reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
-# print(reg_para)
-# summary(reg_para)
-# plot(reg_para)
-# 
-# formula(reg_para)
-# 
-# update(as.formula("y ~ D + `x^1` + `x^1_right`"), reg_para)
-# reg_para_l <- as.lm(reg_para)
-# # update(reg_para_l, y ~ D + `x^1` + `x^1_right`)
-# 
-# mf <- model.frame(reg_para)
-# 
-# lm("y ~ D + `x^1` + `x^1_right`", mf)
-# a<-lm("y ~ -1 + D +I(1-D) + `x^1` + `x^1_right`", mf)
-# diff(coef(a)[2:1])
-# coef(reg_para)
-# 
-# # deltaMethod(a, "I(1-D) - D", parameterNames=paste("a", 1:4, sep=""))
-# deltaMethod(a, "a1 - a2", parameterNames=paste("a", 1:4, sep=""))
-# coef(summary(reg_para))[2,]
-# 
-# reg_para4_cov_slSep <- rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates="z1", covar.opt=list(slope="separate"))
-# 
+sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)), rdd_coef(x, allInfo = TRUE)[1, 1:2], check.attributes = FALSE))
+
+
+# reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd) print(reg_para) summary(reg_para) plot(reg_para) formula(reg_para)
+# update(as.formula('y ~ D + `x^1` + `x^1_right`'), reg_para) reg_para_l <- as.lm(reg_para) # update(reg_para_l, y ~ D +
+# `x^1` + `x^1_right`) mf <- model.frame(reg_para) lm('y ~ D + `x^1` + `x^1_right`', mf) a<-lm('y ~ -1 + D +I(1-D) + `x^1` +
+# `x^1_right`', mf) diff(coef(a)[2:1]) coef(reg_para) # deltaMethod(a, 'I(1-D) - D', parameterNames=paste('a', 1:4, sep=''))
+# deltaMethod(a, 'a1 - a2', parameterNames=paste('a', 1:4, sep='')) coef(summary(reg_para))[2,] reg_para4_cov_slSep <-
+# rdd_reg_lm(rdd_object=Lee2008_rdd_z, order=4, covariates='z1', covar.opt=list(slope='separate'))
 mf_2 <- model.frame(reg_para4_cov_slSep)
 # formula(reg_para4_cov_slSep)
-# 
-aa <- lm("y ~ D + `x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data=mf_2)
-aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data=mf_2)
-# 
-# diff(coef(aaa)[2:1])
-# rdd_pred(reg_para4_cov_slSep)
-# rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
-# 
+aa <- lm("y ~ D + `x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data = mf_2)
+aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", 
+    data = mf_2)
+# diff(coef(aaa)[2:1]) rdd_pred(reg_para4_cov_slSep) rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
 # rdd_coef(reg_para4_cov_slSep, allInfo=TRUE)
 
 ## compare rdd_pred and Delta at 1:
-rdd_p_1 <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=1))
-delta_1 <- deltaMethod(aaa, "a1 - a2 + a12", parameterNames=paste("a", 1:12, sep=""))
+rdd_p_1 <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = 1))
+delta_1 <- deltaMethod(aaa, "a1 - a2 + a12", parameterNames = paste("a", 1:12, sep = ""))
 rdd_p_1
 delta_1
-all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes=FALSE)
+all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes = FALSE)
 
 ## compare rdd_pred and Delta at 0:
-rdd_p_0 <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
-rdd_c_0 <- rdd_coef(reg_para4_cov_slSep, allInfo=TRUE)
-delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames=paste("a", 1:12, sep=""))
+rdd_p_0 <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = 0))
+rdd_c_0 <- rdd_coef(reg_para4_cov_slSep, allInfo = TRUE)
+delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames = paste("a", 1:12, sep = ""))
 rdd_p_0
 rdd_c_0
 delta_0
-all.equal(unlist(rdd_p_0), drop(as.matrix(delta_0[1:2])), check.attributes=FALSE)
-all.equal(unlist(rdd_p_0), drop(as.matrix(rdd_c_0[1:2])), check.attributes=FALSE)
+all.equal(unlist(rdd_p_0), drop(as.matrix(delta_0[1:2])), check.attributes = FALSE)
+all.equal(unlist(rdd_p_0), drop(as.matrix(rdd_c_0[1:2])), check.attributes = FALSE)
 
 ## compare rdd_pred and Delta at 2 points:
-rdd_p_01_AGG <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.5)))
-rdd_p_01_all <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)))
-rdd_p_01_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="sum")
-rdd_p_01_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0, 1)), stat="mean")
+rdd_p_01_AGG <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.5)))
+rdd_p_01_all <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 1)))
+rdd_p_01_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 1)), stat = "sum")
+rdd_p_01_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 1)), stat = "mean")
 
-delta_01_S <- deltaMethod(aaa, "2*(a1 - a2) +1*a12", parameterNames=paste("a", 1:12, sep=""))
-delta_01_M <- deltaMethod(aaa, "(2*(a1 - a2) +1*a12)/2", parameterNames=paste("a", 1:12, sep=""))
+delta_01_S <- deltaMethod(aaa, "2*(a1 - a2) +1*a12", parameterNames = paste("a", 1:12, sep = ""))
+delta_01_M <- deltaMethod(aaa, "(2*(a1 - a2) +1*a12)/2", parameterNames = paste("a", 1:12, sep = ""))
 delta_01_S
 delta_01_M
 
-all(delta_01_S/2==delta_01_M)
+all(delta_01_S/2 == delta_01_M)
 
 ## compare individuals (stat=ident)
-all.equal(rdd_p_01_all$fit, c(delta_0[1,1], delta_1[1,1]))
-all.equal(rdd_p_01_all$se.fit, c(delta_0[1,2], delta_1[1,2]))
+all.equal(rdd_p_01_all$fit, c(delta_0[1, 1], delta_1[1, 1]))
+all.equal(rdd_p_01_all$se.fit, c(delta_0[1, 2], delta_1[1, 2]))
 c(rdd_p_01_M$fit/2, rdd_p_01_AGG$fit)
 
 ## compare sum (stat=sum)
-all.equal(unlist(rdd_p_01_S), drop(as.matrix(delta_01_S[1:2])), check.attributes=FALSE)
+all.equal(unlist(rdd_p_01_S), drop(as.matrix(delta_01_S[1:2])), check.attributes = FALSE)
 
 ## compare mean (stat=mean)
-all.equal(unlist(rdd_p_01_M), drop(as.matrix(delta_01_M[1:2])), check.attributes=FALSE)
+all.equal(unlist(rdd_p_01_M), drop(as.matrix(delta_01_M[1:2])), check.attributes = FALSE)
 all.equal(rdd_p_01_M$fit, rdd_p_01_S$fit/2)
-all.equal(rdd_p_01_M$fit, rdd_p_01_AGG$fit, check.attributes=FALSE)
-all.equal(rdd_p_01_M$se.fit, rdd_p_01_AGG$se.fit, check.attributes=FALSE)
+all.equal(rdd_p_01_M$fit, rdd_p_01_AGG$fit, check.attributes = FALSE)
+all.equal(rdd_p_01_M$se.fit, rdd_p_01_AGG$se.fit, check.attributes = FALSE)
 
 ## compare rdd_pred and Delta at 5 first points:
-ind_z_pos <- head(which(Lee2008_rdd_z$z1>0),5)
-
-rdd_p_01_5z_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="sum")
-rdd_p_01_5z_Sb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[1:5])), stat="sum")
-rdd_p_01_5zPos_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[ind_z_pos]), stat="sum")
-rdd_p_01_5zPos_Sb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=sum(Lee2008_rdd_z$z1[ind_z_pos])), stat="sum")
-rdd_p_01_5z_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1[1:5]), stat="mean")
-rdd_p_01_5z_Mb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1[1:5])), stat="mean")
-rdd_p_01_ALLz_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=Lee2008_rdd_z$z1), stat="mean")
-rdd_p_01_ALLz_Mb <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=mean(Lee2008_rdd_z$z1)), stat="mean")
-
-del <- function(x, mean=FALSE) {
-  n <- length(x)
-  res <- paste(c(paste(n, "*(a1-a2) "), paste(x, "*a12", sep="")), collapse=" +")
-  su <- sum(x)
-  sig <- if(sign(su)==1) "+" else  NULL
-  res <- paste(n, "*(a1-a2) ", sig, su, "*a12", sep="")
-  if(mean) res <- paste("(", res, ")/", n, sep="")
-  res
+ind_z_pos <- head(which(Lee2008_rdd_z$z1 > 0), 5)
+
+rdd_p_01_5z_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1[1:5]), stat = "sum")
+rdd_p_01_5z_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(Lee2008_rdd_z$z1[1:5])), stat = "sum")
+rdd_p_01_5zPos_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1[ind_z_pos]), stat = "sum")
+rdd_p_01_5zPos_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(Lee2008_rdd_z$z1[ind_z_pos])), stat = "sum")
+rdd_p_01_5z_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1[1:5]), stat = "mean")
+rdd_p_01_5z_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(Lee2008_rdd_z$z1[1:5])), stat = "mean")
+rdd_p_01_ALLz_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1), stat = "mean")
+rdd_p_01_ALLz_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(Lee2008_rdd_z$z1)), stat = "mean")
+
+del <- function(x, mean = FALSE) {
+    n <- length(x)
+    res <- paste(c(paste(n, "*(a1-a2) "), paste(x, "*a12", sep = "")), collapse = " +")
+    su <- sum(x)
+    sig <- if (sign(su) == 1) 
+        "+" else NULL
+    res <- paste(n, "*(a1-a2) ", sig, su, "*a12", sep = "")
+    if (mean) 
+        res <- paste("(", res, ")/", n, sep = "")
+    res
 }
 
-del(x=Lee2008_rdd_z$z1[1:5])
-delta_01_5z_S <- deltaMethod(aaa, del(x=Lee2008_rdd_z$z1[1:5]), parameterNames=paste("a", 1:12, sep=""), func="RDD")
-delta_01_5z_M <- deltaMethod(aaa, del(x=Lee2008_rdd_z$z1[1:5], mean=TRUE), parameterNames=paste("a", 1:12, sep=""), func="RDD")
+del(x = Lee2008_rdd_z$z1[1:5])
+delta_01_5z_S <- deltaMethod(aaa, del(x = Lee2008_rdd_z$z1[1:5]), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
+delta_01_5z_M <- deltaMethod(aaa, del(x = Lee2008_rdd_z$z1[1:5], mean = TRUE), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
 
-all.equal(unlist(rdd_p_01_5z_S), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes=FALSE)
-all.equal(unlist(rdd_p_01_5z_Sb), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes=FALSE)
-all.equal(unlist(rdd_p_01_5z_M), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes=FALSE)
-all.equal(unlist(rdd_p_01_5z_Mb), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes=FALSE)
+all.equal(unlist(rdd_p_01_5z_S), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes = FALSE)
+all.equal(unlist(rdd_p_01_5z_Sb), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes = FALSE)
+all.equal(unlist(rdd_p_01_5z_M), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes = FALSE)
+all.equal(unlist(rdd_p_01_5z_Mb), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes = FALSE)
 
-## All z:
-# all.equal(rdd_p_01_ALLz_M, rdd_p_01_ALLz_Mb, check.attributes=FALSE)
+## All z: all.equal(rdd_p_01_ALLz_M, rdd_p_01_ALLz_Mb, check.attributes=FALSE)
 
 #### Weighted mean!!
 w_5 <- c(0.1, 0.2, 0.4, 0.2, 0.1)
 w <- c(0.4, 0.6)
-rdd_p_01_Sid <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="identity")
-wm <- weighted.mean(rdd_p_01_Sid$fit , w=w)
+rdd_p_01_Sid <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, 1)), stat = "identity")
+wm <- weighted.mean(rdd_p_01_Sid$fit, w = w)
 
-delta_2z_w <- deltaMethod(aaa, "0.4*(a1 - a2) + 0.4*0.2*a12+0.6*(a1 - a2) + 0.6*a12", parameterNames=paste("a", 1:12, sep=""))
-delta_2z_w2 <- deltaMethod(aaa, "1*(a1 - a2) + 0.4*0.2*a12 + 0.6*a12", parameterNames=paste("a", 1:12, sep=""))
-delta_2z_w3 <- deltaMethod(aaa, "1*(a1 - a2) + a12*(0.4*0.2 + 0.6)", parameterNames=paste("a", 1:12, sep=""))
-all(delta_2z_w==delta_2z_w2)
-all.equal(delta_2z_w, delta_2z_w3, check.attributes=FALSE)
-all.equal(delta_2z_w[1,1],wm)
+delta_2z_w <- deltaMethod(aaa, "0.4*(a1 - a2) + 0.4*0.2*a12+0.6*(a1 - a2) + 0.6*a12", parameterNames = paste("a", 1:12, sep = ""))
+delta_2z_w2 <- deltaMethod(aaa, "1*(a1 - a2) + 0.4*0.2*a12 + 0.6*a12", parameterNames = paste("a", 1:12, sep = ""))
+delta_2z_w3 <- deltaMethod(aaa, "1*(a1 - a2) + a12*(0.4*0.2 + 0.6)", parameterNames = paste("a", 1:12, sep = ""))
+all(delta_2z_w == delta_2z_w2)
+all.equal(delta_2z_w, delta_2z_w3, check.attributes = FALSE)
+all.equal(delta_2z_w[1, 1], wm)
 
-rdd_p_01_W_S <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="sum", weights=w)
-rdd_p_01_W_M <- rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=c(0.2,1)), stat="mean", weights=w)
-all.equal(rdd_p_01_W_M$fit,wm)
+rdd_p_01_W_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, 1)), stat = "sum", weights = w)
+rdd_p_01_W_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, 1)), stat = "mean", weights = w)
+all.equal(rdd_p_01_W_M$fit, wm)
 
-all.equal(unlist(rdd_p_01_W_S), drop(as.matrix(delta_2z_w2[1:2])), check.attributes=FALSE)
-all.equal(unlist(rdd_p_01_W_M), drop(as.matrix(delta_2z_w2[1:2])), check.attributes=FALSE)
+all.equal(unlist(rdd_p_01_W_S), drop(as.matrix(delta_2z_w2[1:2])), check.attributes = FALSE)
+all.equal(unlist(rdd_p_01_W_M), drop(as.matrix(delta_2z_w2[1:2])), check.attributes = FALSE)
 
 
 ###### 2 Z:
 df_2Z_5z <- Lee2008_rdd_z[1:5, c("z1", "z2")]
 df_2Z_5z_M <- data.frame(t(colMeans(df_2Z_5z)))
-df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w=w_5)))
+df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w = w_5)))
 
-rdd_p_sZ_5z_S <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="sum")
-rdd_p_sZ_5z_M <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean")
-rdd_p_sZ_5z_Mb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_M, stat="sum")
+rdd_p_sZ_5z_S <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z, stat = "sum")
+rdd_p_sZ_5z_M <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z, stat = "mean")
+rdd_p_sZ_5z_Mb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z_M, stat = "sum")
 
-rdd_p_sZ_5z_MW <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z, stat="mean", weights=w_5)
-rdd_p_sZ_5z_MWb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata=df_2Z_5z_Mw, stat="sum")
+rdd_p_sZ_5z_MW <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z, stat = "mean", weights = w_5)
+rdd_p_sZ_5z_MWb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z_Mw, stat = "sum")
 
-all.equal(rdd_p_sZ_5z_M, rdd_p_sZ_5z_Mb, check.attributes=FALSE)
-all.equal(rdd_p_sZ_5z_MW, rdd_p_sZ_5z_MWb, check.attributes=FALSE)
+all.equal(rdd_p_sZ_5z_M, rdd_p_sZ_5z_Mb, check.attributes = FALSE)
+all.equal(rdd_p_sZ_5z_MW, rdd_p_sZ_5z_MWb, check.attributes = FALSE) 
diff --git a/tests/rddtools_vs_rdd.R b/tests/rddtools_vs_rdd.R
index 26ed5e4..6e7a6c3 100644
--- a/tests/rddtools_vs_rdd.R
+++ b/tests/rddtools_vs_rdd.R
@@ -3,46 +3,46 @@ library(rdd)
 library(rddtools)
 
 set.seed(1234)
-x<-runif(1000,-1,1)
-cov<-rnorm(1000)
-y<-3+2*x+3*cov+10*(x>=0)+rnorm(1000)
+x <- runif(1000, -1, 1)
+cov <- rnorm(1000)
+y <- 3 + 2 * x + 3 * cov + 10 * (x >= 0) + rnorm(1000)
 
-RD <- rdd_data(x=x, y=y, cutpoint=0, covar=cov)
+RD <- rdd_data(x = x, y = y, cutpoint = 0, covar = cov)
 
 ### Simple estimation:
-bw <- IKbandwidth(X=x, Y=y, cutpoint=0)
+bw <- IKbandwidth(X = x, Y = y, cutpoint = 0)
 bw
-rdd_mod <- RDestimate(y~x, bw=bw, se.type="const", model=TRUE)$model[[1]]
-RDDtools_mod <- rdd_reg_np(RD, bw=bw, inference="lm")
+rdd_mod <- RDestimate(y ~ x, bw = bw, se.type = "const", model = TRUE)$model[[1]]
+RDDtools_mod <- rdd_reg_np(RD, bw = bw, inference = "lm")
 
 rdd_co <- coef(summary(rdd_mod))
-RDDtools_co <- rdd_coef(RDDtools_mod, allCo=TRUE, allInfo=TRUE)
+RDDtools_co <- rdd_coef(RDDtools_mod, allCo = TRUE, allInfo = TRUE)
 rdd_co
 RDDtools_co
 
-all.equal(rdd_co[-4,], RDDtools_co[1:3,], check.attributes=FALSE)
-all.equal(rdd_co[4,1], sum(RDDtools_co[3:4,1]), check.attributes=FALSE)
+all.equal(rdd_co[-4, ], RDDtools_co[1:3, ], check.attributes = FALSE)
+all.equal(rdd_co[4, 1], sum(RDDtools_co[3:4, 1]), check.attributes = FALSE)
 
 
 ### Covariate estimation:
-rdd_mod_cov <- RDestimate(y~x|cov, kernel="rectangular", bw=5, model=TRUE, se.type="const")$model[[1]]
-RDDtools_mod_cov <- rdd_reg_lm(RD, bw=5, covariates="cov", covar.opt=list(slope="separate"))
+rdd_mod_cov <- RDestimate(y ~ x | cov, kernel = "rectangular", bw = 5, model = TRUE, se.type = "const")$model[[1]]
+RDDtools_mod_cov <- rdd_reg_lm(RD, bw = 5, covariates = "cov", covar.opt = list(slope = "separate"))
 
 rdd_co_cov <- coef(summary(rdd_mod_cov))
-RDDtools_co_cov <- rdd_coef(RDDtools_mod_cov, allCo=TRUE, allInfo=TRUE)
+RDDtools_co_cov <- rdd_coef(RDDtools_mod_cov, allCo = TRUE, allInfo = TRUE)
 rdd_co_cov
 RDDtools_co_cov
 
-all.equal(rdd_co_cov[-4,], RDDtools_co_cov[-4,], check.attributes=FALSE)
+all.equal(rdd_co_cov[-4, ], RDDtools_co_cov[-4, ], check.attributes = FALSE)
 
 ## Fuzzy
 set.seed(123)
-selec <- rbinom(nrow(RD), 1, prob=ifelse(RD$x<0, 0.1, 0.9))
-RD_rdd_ins <- rdd_data(y=RD$y, x=RD$x, z=selec,cutpoint=0)
+selec <- rbinom(nrow(RD), 1, prob = ifelse(RD$x < 0, 0.1, 0.9))
+RD_rdd_ins <- rdd_data(y = RD$y, x = RD$x, z = selec, cutpoint = 0)
 
-RDDto_reg_fuz <- rdd_reg_lm(RD_rdd_ins, bw=0.2)
-rdd_reg_fuz <- RDestimate(y~x+selec, data=RD_rdd_ins, kernel="rectangular", bw=0.2, model=TRUE, se.type="const")$model[[2]][[1]]
-
-all.equal(rdd_coef(RDDto_reg_fuz),coef(summary(rdd_reg_fuz))[2,1])
-all.equal(rdd_coef(RDDto_reg_fuz, allCo=TRUE)[1:3],coef(summary(rdd_reg_fuz))[1:3,1], check.attributes=FALSE)
+RDDto_reg_fuz <- rdd_reg_lm(RD_rdd_ins, bw = 0.2)
+rdd_reg_fuz <- RDestimate(y ~ x + selec, data = RD_rdd_ins, kernel = "rectangular", bw = 0.2, model = TRUE, se.type = "const")$model[[2]][[1]]
 
+all.equal(rdd_coef(RDDto_reg_fuz), coef(summary(rdd_reg_fuz))[2, 1])
+all.equal(rdd_coef(RDDto_reg_fuz, allCo = TRUE)[1:3], coef(summary(rdd_reg_fuz))[1:3, 1], check.attributes = FALSE)
+ 
diff --git a/tests/simple_MC.R b/tests/simple_MC.R
index eab4c02..c881224 100644
--- a/tests/simple_MC.R
+++ b/tests/simple_MC.R
@@ -5,47 +5,47 @@ library(rdd)
 ## simple MC:
 set.seed(123)
 
-MC_simple <- function(n=200, CATE=0.3, HATE=0.1){
-  x <- rnorm(n, mean=20, sd=5)
-  D <- x>= 20
-  y <- 0.8 + CATE*D+ 0.3*x+HATE*x*D+rnorm(n, sd=0.1)
-  cat("effect", CATE+HATE*20, "\n")
-  rdd_data(x=x, y=y, cutpoint=20)
-
+MC_simple <- function(n = 200, CATE = 0.3, HATE = 0.1) {
+    x <- rnorm(n, mean = 20, sd = 5)
+    D <- x >= 20
+    y <- 0.8 + CATE * D + 0.3 * x + HATE * x * D + rnorm(n, sd = 0.1)
+    cat("effect", CATE + HATE * 20, "\n")
+    rdd_data(x = x, y = y, cutpoint = 20)
+    
 }
 
-input_mc <- MC_simple(n=1000, CATE=0.4)
+input_mc <- MC_simple(n = 1000, CATE = 0.4)
 plot(input_mc)
 
 RDD_bw <- rdd_bw_ik(input_mc)
 
-RDD_np_sep <- rdd_reg_np(input_mc, bw=RDD_bw)
-RDD_np_same <- rdd_reg_np(input_mc, slope="same", bw=RDD_bw)
-RDD_np_sep_inflm <- rdd_reg_np(input_mc, bw=RDD_bw, inf="lm")
-RDD_np_same_inflm <- rdd_reg_np(input_mc, slope="same", bw=RDD_bw, inf="lm")
-RDD_lm_sep <- rdd_reg_lm(input_mc, bw=RDD_bw)
-RDD_lm_same <- rdd_reg_lm(input_mc, slope="same", bw=RDD_bw)
-rdd_RDe <- RDestimate(y~x, data=input_mc, cutpoint=20, model=TRUE, bw=RDD_bw)
+RDD_np_sep <- rdd_reg_np(input_mc, bw = RDD_bw)
+RDD_np_same <- rdd_reg_np(input_mc, slope = "same", bw = RDD_bw)
+RDD_np_sep_inflm <- rdd_reg_np(input_mc, bw = RDD_bw, inf = "lm")
+RDD_np_same_inflm <- rdd_reg_np(input_mc, slope = "same", bw = RDD_bw, inf = "lm")
+RDD_lm_sep <- rdd_reg_lm(input_mc, bw = RDD_bw)
+RDD_lm_same <- rdd_reg_lm(input_mc, slope = "same", bw = RDD_bw)
+rdd_RDe <- RDestimate(y ~ x, data = input_mc, cutpoint = 20, model = TRUE, bw = RDD_bw)
 
 
 printCoefmat(coef(summary(RDD_np_sep_inflm$RDDslot$model)))
 printCoefmat(coef(summary(RDD_np_same_inflm$RDDslot$model)))
 printCoefmat(coef(summary(RDD_lm_sep)))
 printCoefmat(coef(summary(RDD_lm_same)))
-printCoefmat(coef(summary(rdd_RDe $model[[1]])))
+printCoefmat(coef(summary(rdd_RDe$model[[1]])))
 
 
 ## few checks:
-plse <- plotSensi(RDD_np_sep, from=5, to=20, by=0.5)
+plse <- plotSensi(RDD_np_sep, from = 5, to = 20, by = 0.5)
 plotPlacebo(RDD_np_sep)
 
-plotSensi(RDD_np_same, from=5, to=20, by=0.5)
+plotSensi(RDD_np_same, from = 5, to = 20, by = 0.5)
 plotPlacebo(RDD_np_same)
 
-a<-plotSensi(RDD_lm_sep, from=5, to=20, by=0.5)
+a <- plotSensi(RDD_lm_sep, from = 5, to = 20, by = 0.5)
 plotPlacebo(RDD_lm_sep)
 
-plotSensi(RDD_lm_same, from=5, to=20, by=0.5)
+plotSensi(RDD_lm_same, from = 5, to = 20, by = 0.5)
 plotPlacebo(RDD_lm_same)
 
 #### Other MCs:
@@ -53,13 +53,13 @@ set.seed(123)
 head(gen_mc_ik())
 
 set.seed(123)
-head(gen_mc_ik(output="rdd_data"))
+head(gen_mc_ik(output = "rdd_data"))
 
 set.seed(123)
-head(gen_mc_ik(version=2))
+head(gen_mc_ik(version = 2))
 
 set.seed(123)
-head(gen_mc_ik(version=3))
+head(gen_mc_ik(version = 3))
 
 set.seed(123)
-head(gen_mc_ik(version=4))
+head(gen_mc_ik(version = 4)) 
diff --git a/tests/testthat.R b/tests/testthat.R
index 25efbb9..a920888 100644
--- a/tests/testthat.R
+++ b/tests/testthat.R
@@ -1,4 +1,4 @@
 library(testthat)
 library(rddtools)
 
-test_check("rddtools")
+test_check("rddtools") 

From 0dfdaaf8510e47d52a0af66f63495c19a03ca427 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:30:19 +0200
Subject: [PATCH 140/323] fix layout

---
 R/Lee2008-data.R     |   7 +-
 R/STAR_MHE-data.R    | 158 +++-------------
 R/as.npreg.R         | 168 ++++++++--------
 R/bw_ik.R            | 351 +++++++++++++++++-----------------
 R/bw_rot.R           | 102 +++++-----
 R/clusterInf.R       | 130 +++++++------
 R/covarTests.R       | 203 ++++++++++----------
 R/dens_test.R        |  58 +++---
 R/gen_mc_ik.R        | 206 +++++++++-----------
 R/get_methods.R      | 178 +++++++++--------
 R/model.matrix.rdd.R | 146 +++++++-------
 R/placebo.R          | 442 +++++++++++++++++++++----------------------
 R/plotBin.R          | 106 ++++++-----
 R/plotSensi.R        | 358 ++++++++++++++++++-----------------
 R/qplot_experim.R    | 112 +++++------
 R/rdd_coef.R         |  29 +--
 R/rdd_data.R         | 229 +++++++++++-----------
 R/rdd_data_methods.R | 187 +++++++++---------
 R/rdd_pred.R         | 225 +++++++++++-----------
 R/rddtools.R         |   6 +-
 R/reg_gen.R          | 146 +++++++-------
 R/reg_lm.R           | 173 +++++++++--------
 R/reg_np.R           | 347 ++++++++++++++++-----------------
 R/var_estim.R        | 292 ++++++++++++++--------------
 R/various_code.R     |  12 +-
 R/waldci.R           | 226 +++++++++++-----------
 man/Lee2008.Rd       |   2 +-
 man/STAR_MHE.Rd      |   4 +-
 man/clusterInf.Rd    |   4 +-
 man/gen_mc_ik.Rd     |   4 +-
 man/plotBin.Rd       |   2 +-
 man/plotPlacebo.Rd   |   2 +-
 man/plotSensi.Rd     |   4 +-
 man/rdd_bw_ik.Rd     |   2 +-
 man/rdd_gen_reg.Rd   |   2 +-
 man/rdd_pred.Rd      |   6 +-
 man/rot_bw.Rd        |   2 +-
 man/vcovCluster.Rd   |   2 +-
 38 files changed, 2288 insertions(+), 2345 deletions(-)

diff --git a/R/Lee2008-data.R b/R/Lee2008-data.R
index 5bce681..743fe9b 100644
--- a/R/Lee2008-data.R
+++ b/R/Lee2008-data.R
@@ -10,7 +10,7 @@
 #' \item{y}{Vote at election t}
 #' }
 #' @source Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity}
-#' @references Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," 
+#' @references Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' 
 #' Review of Economic Studies (2012) 79, 933-959
 #' @references   Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, 
 #' \emph{Journal of Econometrics}, 142, 675-697
@@ -22,6 +22,5 @@
 
 
 NULL
-# Lee2008 <- read.csv("/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv", header=FALSE)
-# colnames(Lee2008) <- c("x", "y")
-# save(Lee2008, file="/home/mat/Dropbox/HEI/rdd/Rcode/RDDtools/data/Lee2008.rda")
\ No newline at end of file
+# Lee2008 <- read.csv('/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv', header=FALSE)
+# colnames(Lee2008) <- c('x', 'y') save(Lee2008, file='/home/mat/Dropbox/HEI/rdd/Rcode/RDDtools/data/Lee2008.rda') 
diff --git a/R/STAR_MHE-data.R b/R/STAR_MHE-data.R
index fdf8a87..6f3bb6e 100644
--- a/R/STAR_MHE-data.R
+++ b/R/STAR_MHE-data.R
@@ -17,7 +17,7 @@
 #' The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. 
 #' The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website 
 #' (\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta.
-#' @references Krueger, A. (1999) "Experimental Estimates Of Education Production Functions," 
+#' @references Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' 
 #' \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May.
 #' @references Angrist, A. ad  Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, 
 #' Princeton University press
@@ -27,7 +27,7 @@
 #' data(STAR_MHE)
 #' 
 #' # Compute the group means:
-#' STAR_MHE_means <- aggregate(STAR_MHE[, c("classid", "pscore", "cs")],
+#' STAR_MHE_means <- aggregate(STAR_MHE[, c('classid', 'pscore', 'cs')],
 #'                             by=list(STAR_MHE$classid), mean)
 #' 
 #' # Regression of means, with weighted average:
@@ -37,136 +37,28 @@
 NULL
 
 
-##### Quick R code used on the output data:
-# STAR_MHE <- read.csv(".../abuelita.csv")
-# STAR_MHE$female <- as.factor(STAR_MHE$female)
-# STAR_MHE$nwhite <- as.factor(STAR_MHE$nwhite)
-# STAR_MHE$n <- NULL
-# 
-# save(STAR_MHE, file="STAR_MHE.rda")
+##### Quick R code used on the output data: STAR_MHE <- read.csv('.../abuelita.csv') STAR_MHE$female <-
+##### as.factor(STAR_MHE$female) STAR_MHE$nwhite <- as.factor(STAR_MHE$nwhite) STAR_MHE$n <- NULL save(STAR_MHE,
+##### file='STAR_MHE.rda')
 
 
-##### STATA code krueger.do (retrieved 26 November 2012 on http://economics.mit.edu/faculty/angrist/data1/mhe/krueger)
-# version 9
-# set more 1
-# capture log close
-# log using krueger, text replace
-# 
-# /* create Krueger scaled scores */
-#   
-#   /* reading score */
-#   
-#   clear
-# use webstar
-# 
-# keep if cltypek > 1  		/* regular classes */
-#   keep if treadssk ~= .
-# 
-# sort treadssk
-# gen pread0 = 100*_n/_N
-# 
-# egen pread = mean(pread0), by(treadssk)	/* percentile score in reg. classes */
-#   
-#   keep treadssk pread
-# sort tread
-# keep if tread ~= tread[_n-1]
-# save tempr, replace
-# 
-# /* math score */
-#   
-#   use webstar
-# 
-# keep if cltypek > 1			/* regular classes */
-#   keep if tmathssk ~= .
-# 
-# sort tmathssk
-# gen pmath0 = 100*_n/_N
-# egen pmath = mean(pmath0), by(tmathssk)
-# 
-# keep tmathssk pmath
-# sort tmath
-# keep if tmath ~= tmath[_n-1]
-# save tempm, replace
-# 
-# /* merge percentile scores back on */
-#   
-#   use webstar
-# 
-# keep if stark == 1
-# 
-# sort treadssk
-# merge treadssk using tempr
-# ipolate pread treadssk, gen(pr) epolate
-# drop _merge
-# 
-# sort tmathssk
-# merge tmathssk using tempm
-# ipolate pmath tmathssk, gen(pm) epolate
-# replace pm = 0 if pm < 0
-# drop _merge
-# 
-# egen pscore = rowmean(pr pm)
-# 
-# /* make class ids */
-#   
-#   egen classid1 = group(schidkn cltypek)
-# egen cs1 = count(classid1), by(classid1)
-# 
-# egen classid2 = group(classid1 totexpk hdegk cladk) if cltypek==1 & cs >= 20
-# egen classid3 = group(classid1 totexpk hdegk cladk) if cltypek>1 & cs >= 30
-# 
-# gen temp = classid1*100
-# egen classid = rowtotal(temp classid2 classid3)
-# egen cs = count(classid), by(classid)
-# 
-# gen female = ssex == 2
-# gen nwhite = srace >= 2 & srace <= 6 if srace ~= .
-# 
-# keep if cs <= 27 & pscore ~= .
-# keep pscore cs schidkn classid female nwhite
-# gen n = 1
-# 
-# save temp, replace
-# 
-# reg pscore cs, robust
-# local se = _se[cs]
-# local t = _b[cs]/`se'
-# predict r, res
-# loneway r classid
-# local rho = r(rho)
-# 
-# collapse cs, by(classid)
-# sum cs
-# 
-# dis r(Var)
-# local m = 1 + (r(Var)/r(mean) + r(mean) - 1)*`rho'
-# dis `m'
-# dis sqrt(`m')
-# dis `se'
-# dis sqrt(`m')*`se'
-# dis `t'/sqrt(`m')
-# 
-# 
-# use temp, clear
-# 
-# reg pscore cs, robust
-# moulton pscore cs, cluster(classid) moulton
-# moulton pscore cs, cluster(classid)
-# reg pscore cs, cluster(classid)
-# brl pscore cs, cluster(classid)
-# 
-# 
-# 
-# set seed 123456789
-# bootstrap "reg pscore cs" _b, reps(1000) cluster(classid)
-# 
-# areg pscore, absorb(classid)
-# predict hat
-# gen ry = pscore - hat + _b[_cons]
-# collapse (mean) ry cs (sum) n, by(classid)
-# 
-# reg ry cs [aw=n]
-# 
-# 
-# log close
-# set more 0
+##### STATA code krueger.do (retrieved 26 November 2012 on http://economics.mit.edu/faculty/angrist/data1/mhe/krueger) version 9
+##### set more 1 capture log close log using krueger, text replace /* create Krueger scaled scores */ /* reading score */ clear
+##### use webstar keep if cltypek > 1 /* regular classes */ keep if treadssk ~= .  sort treadssk gen pread0 = 100*_n/_N egen
+##### pread = mean(pread0), by(treadssk) /* percentile score in reg. classes */ keep treadssk pread sort tread keep if tread ~=
+##### tread[_n-1] save tempr, replace /* math score */ use webstar keep if cltypek > 1 /* regular classes */ keep if tmathssk ~=
+##### .  sort tmathssk gen pmath0 = 100*_n/_N egen pmath = mean(pmath0), by(tmathssk) keep tmathssk pmath sort tmath keep if
+##### tmath ~= tmath[_n-1] save tempm, replace /* merge percentile scores back on */ use webstar keep if stark == 1 sort treadssk
+##### merge treadssk using tempr ipolate pread treadssk, gen(pr) epolate drop _merge sort tmathssk merge tmathssk using tempm
+##### ipolate pmath tmathssk, gen(pm) epolate replace pm = 0 if pm < 0 drop _merge egen pscore = rowmean(pr pm) /* make class ids
+##### */ egen classid1 = group(schidkn cltypek) egen cs1 = count(classid1), by(classid1) egen classid2 = group(classid1 totexpk
+##### hdegk cladk) if cltypek==1 & cs >= 20 egen classid3 = group(classid1 totexpk hdegk cladk) if cltypek>1 & cs >= 30 gen temp
+##### = classid1*100 egen classid = rowtotal(temp classid2 classid3) egen cs = count(classid), by(classid) gen female = ssex == 2
+##### gen nwhite = srace >= 2 & srace <= 6 if srace ~= .  keep if cs <= 27 & pscore ~= .  keep pscore cs schidkn classid female
+##### nwhite gen n = 1 save temp, replace reg pscore cs, robust local se = _se[cs] local t = _b[cs]/`se' predict r, res loneway r
+##### classid local rho = r(rho) collapse cs, by(classid) sum cs dis r(Var) local m = 1 + (r(Var)/r(mean) + r(mean) - 1)*`rho'
+##### dis `m' dis sqrt(`m') dis `se' dis sqrt(`m')*`se' dis `t'/sqrt(`m') use temp, clear reg pscore cs, robust moulton pscore
+##### cs, cluster(classid) moulton moulton pscore cs, cluster(classid) reg pscore cs, cluster(classid) brl pscore cs,
+##### cluster(classid) set seed 123456789 bootstrap 'reg pscore cs' _b, reps(1000) cluster(classid) areg pscore, absorb(classid)
+##### predict hat gen ry = pscore - hat + _b[_cons] collapse (mean) ry cs (sum) n, by(classid) reg ry cs [aw=n] log close set
+##### more 0 
diff --git a/R/as.npreg.R b/R/as.npreg.R
index d57a470..1107964 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -28,106 +28,102 @@
 #'  all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) 
 
 
-as.npregbw <- function(x,...){
-  res <- as.npregbw_low(x=x, npreg=FALSE,...)
-  res
+as.npregbw <- function(x, ...) {
+    res <- as.npregbw_low(x = x, npreg = FALSE, ...)
+    res
 }
 
 #' @rdname as.npregbw
 #' @export
-as.npreg <- function(x, ...){
-  res <- as.npregbw_low(x=x, npreg=TRUE,...)
-  res
+as.npreg <- function(x, ...) {
+    res <- as.npregbw_low(x = x, npreg = TRUE, ...)
+    res
 }
 
 
-as.npregbw_low <- function(x, npreg=FALSE, adjustik_bw=TRUE, ...){
-
-  dat <- getOriginalData(x)
-  bw <- getBW(x)
-  cutpoint <- getCutpoint(x)
-
-## Specify inputs to npregbw:
-
-  ## data:
-  x <- dat$x
-  dat_np <- data.frame(y=dat$y, x=x,  D=ifelse(x>=cutpoint,1,0), Dx=ifelse(x>=cutpoint,x,0))
-  dataPoints <- data.frame(x=c(cutpoint,cutpoint), D=c(0,1), Dx=c(0,cutpoint))
-
-  ## bw:
-  range.x <- range(dat$x, na.rm=TRUE, finite=TRUE)
-  if(adjustik_bw ){ ## & names(bw) =="h_opt"
-    bw <- rdd_bw_ik(dat, kernel="Normal")
-  }
-  bw_other <- 9999*diff(range.x)
-  bws <- c(bw, rep(bw_other, 2))
-  
-
-## start npregbw
-  res <- np::npregbw(bws=bws, formula=y~x+D+Dx, data= dat_np,  regtype = "ll",
-			eval=dataPoints, bandwidth.compute=FALSE, gradients=TRUE,...)
-  class(res) <- c("rdd_reg_npregbw", class(res))
-
-## if npreg, return instead model_np <- npreg(bw_np, newdata=dataPoints, gradients=TRUE)
-  if(npreg==TRUE) {
+as.npregbw_low <- function(x, npreg = FALSE, adjustik_bw = TRUE, ...) {
+    
+    dat <- getOriginalData(x)
+    bw <- getBW(x)
+    cutpoint <- getCutpoint(x)
+    
+    ## Specify inputs to npregbw:
+    
+    ## data:
+    x <- dat$x
+    dat_np <- data.frame(y = dat$y, x = x, D = ifelse(x >= cutpoint, 1, 0), Dx = ifelse(x >= cutpoint, x, 0))
+    dataPoints <- data.frame(x = c(cutpoint, cutpoint), D = c(0, 1), Dx = c(0, cutpoint))
+    
+    ## bw:
+    range.x <- range(dat$x, na.rm = TRUE, finite = TRUE)
+    if (adjustik_bw) {
+        ## & names(bw) =='h_opt'
+        bw <- rdd_bw_ik(dat, kernel = "Normal")
+    }
+    bw_other <- 9999 * diff(range.x)
+    bws <- c(bw, rep(bw_other, 2))
     
-    # check if np is installed
-    if (!requireNamespace("np", quietly = TRUE)) {
-      stop("The package 'np' is needed for this function to work. Please install it.",
-           call. = FALSE)
+    
+    ## start npregbw
+    res <- np::npregbw(bws = bws, formula = y ~ x + D + Dx, data = dat_np, regtype = "ll", eval = dataPoints, bandwidth.compute = FALSE, 
+        gradients = TRUE, ...)
+    class(res) <- c("rdd_reg_npregbw", class(res))
+    
+    ## if npreg, return instead model_np <- npreg(bw_np, newdata=dataPoints, gradients=TRUE)
+    if (npreg == TRUE) {
+        
+        # check if np is installed
+        if (!requireNamespace("np", quietly = TRUE)) {
+            stop("The package 'np' is needed for this function to work. Please install it.", call. = FALSE)
+        }
+        
+        # require('np') requireNamespace('np', quietly = TRUE)
+        options(np.messages = TRUE)  ## otherwise got warnings messages... probably because comes only if loaded!
+        res <- np::npreg(res, newdata = dataPoints, gradients = TRUE, ...)
+        class(res) <- c("rdd_reg_npreg", class(res))
     }
     
-    # require("np")
-    # requireNamespace("np", quietly = TRUE)
-    options(np.messages = TRUE) ## otherwise got warnings messages... probably because comes only if loaded!
-    res <- np::npreg(res, newdata=dataPoints, gradients=TRUE, ...)
-    class(res) <- c("rdd_reg_npreg", class(res))
-  }
-  
-  attr(res, "RDDdf") <- dat_np
-  attr(res, "cutpoint") <- cutpoint
-  res
+    attr(res, "RDDdf") <- dat_np
+    attr(res, "cutpoint") <- cutpoint
+    res
 }
 
 
 #' @export
-rdd_coef.rdd_reg_npreg <- function(object, allInfo=FALSE, allCo=FALSE, ...){
-
-  co <- diff(object$mean)
-  if(allInfo) {
-    se <- sum(object$merr)
-    zval <- co/se
-    pval <- 2 * pnorm(abs(zval), lower.tail = FALSE)
-    res <- cbind(co, se, zval, pval)
-    colnames(res) <- c("Estimate", "Std. Error", "z value", "Pr(>|z|)")
-    rownames(res) <- "D"
-  } else {
-    res <- co
-  }
-
-  if(allCo){
-    cos <- c(object$mean[1], object$grad)
-    ses <- c(object$merr[1], object$gerr)
-
-    ## X_right:
-    dataPoints_Xr <- data.frame(x=0, D=0, Dx=c(0,1))
-    Xr <- diff(predict(object, newdata=dataPoints_Xr))
-
-    estimates <- c(cos[1], co, cos[2], Xr)
+rdd_coef.rdd_reg_npreg <- function(object, allInfo = FALSE, allCo = FALSE, ...) {
     
-    if(allInfo){
-      zvals <- cos/ses
-      pvals <- 2 * pnorm(abs(zvals), lower.tail = FALSE)
-      res <- data.frame("Estimate"   = estimates,
-			"Std. Error" = c(ses[1], se, ses[2:3]),
-			"z value"    = c(zvals[1], zval, zvals[2:3]),
-			"Pr(>|z|)"   = c(pvals[1], pval, pvals[2:3]),
-			check.names=FALSE)
-      rownames(res) <- c("(Intercept)", "D", "x_left", "x_right")
+    co <- diff(object$mean)
+    if (allInfo) {
+        se <- sum(object$merr)
+        zval <- co/se
+        pval <- 2 * pnorm(abs(zval), lower.tail = FALSE)
+        res <- cbind(co, se, zval, pval)
+        colnames(res) <- c("Estimate", "Std. Error", "z value", "Pr(>|z|)")
+        rownames(res) <- "D"
     } else {
-      res <- estimates
+        res <- co
     }
-  }
-
-  res 
-}
+    
+    if (allCo) {
+        cos <- c(object$mean[1], object$grad)
+        ses <- c(object$merr[1], object$gerr)
+        
+        ## X_right:
+        dataPoints_Xr <- data.frame(x = 0, D = 0, Dx = c(0, 1))
+        Xr <- diff(predict(object, newdata = dataPoints_Xr))
+        
+        estimates <- c(cos[1], co, cos[2], Xr)
+        
+        if (allInfo) {
+            zvals <- cos/ses
+            pvals <- 2 * pnorm(abs(zvals), lower.tail = FALSE)
+            res <- data.frame(Estimate = estimates, `Std. Error` = c(ses[1], se, ses[2:3]), `z value` = c(zvals[1], zval, zvals[2:3]), 
+                `Pr(>|z|)` = c(pvals[1], pval, pvals[2:3]), check.names = FALSE)
+            rownames(res) <- c("(Intercept)", "D", "x_left", "x_right")
+        } else {
+            res <- estimates
+        }
+    }
+    
+    res
+} 
diff --git a/R/bw_ik.R b/R/bw_ik.R
index 220ea84..88a023a 100644
--- a/R/bw_ik.R
+++ b/R/bw_ik.R
@@ -6,7 +6,7 @@
 #' @param rdd_object of class rdd_data created by \code{\link{rdd_data}}
 #' @param kernel The type of kernel used: either \code{triangular} or \code{uniform}. 
 #' @return The optimal bandwidth
-#' @references Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator," 
+#' @references Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' 
 #' Review of Economic Studies (2012) 79, 933-959
 #' @seealso \code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) 
 #' @export
@@ -16,183 +16,190 @@
 #' rdd_bw_ik(rd)
 
 
-rdd_bw_ik <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal")) {
-
-  kernel <- match.arg(kernel)
-  checkIsRDD(rdd_object)
-  cutpoint <- getCutpoint(rdd_object)
-
-  res <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=FALSE, kernel=kernel)
-  return(res)
-
+rdd_bw_ik <- function(rdd_object, kernel = c("Triangular", "Uniform", "Normal")) {
+    
+    kernel <- match.arg(kernel)
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    
+    res <- rdd_bw_ik_low(X = rdd_object$x, Y = rdd_object$y, threshold = cutpoint, verbose = FALSE, type = "RES", returnBig = FALSE, 
+        kernel = kernel)
+    return(res)
+    
 }
 
-ik_bias <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
-
-  kernel <- match.arg(kernel)
-  checkIsRDD(rdd_object)
-  cutpoint <- getCutpoint(rdd_object)
-
-  resB <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
-
-## compute C1: see ik equ 5, and Fan Jijbels (1996, 3.23)
-# is done in R with locpol, computeMu(i=2, equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
-  C1 <- switch(kernel, "Triangular"= -0.1, "Uniform"= -0.1666667, "Normal"= -0.7519384) ## from: 
-
-## Compute bias as in ik equ:5, 
-# note here 1/4 is outside C1
-  if(missing(bw))  bw <- resB$h_opt
-  res<-  C1 * 1/2 * bw^2 *(resB$m2_right-resB$m2_left)
-  return(res)
-
+ik_bias <- function(rdd_object, kernel = c("Triangular", "Uniform", "Normal"), bw) {
+    
+    kernel <- match.arg(kernel)
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    
+    resB <- rdd_bw_ik_low(X = rdd_object$x, Y = rdd_object$y, threshold = cutpoint, verbose = FALSE, type = "RES", returnBig = TRUE, 
+        kernel = kernel)
+    
+    ## compute C1: see ik equ 5, and Fan Jijbels (1996, 3.23) is done in R with locpol, computeMu(i=2, equivKernel(TrianK, nu=0,
+    ## deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
+    C1 <- switch(kernel, Triangular = -0.1, Uniform = -0.1666667, Normal = -0.7519384)  ## from: 
+    
+    ## Compute bias as in ik equ:5, note here 1/4 is outside C1
+    if (missing(bw)) 
+        bw <- resB$h_opt
+    res <- C1 * 1/2 * bw^2 * (resB$m2_right - resB$m2_left)
+    return(res)
+    
 }
 
-ik_var <-function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
-
-  kernel <- match.arg(kernel)
-  checkIsRDD(rdd_object)
-  cutpoint <- getCutpoint(rdd_object)
-
-  resB <- rdd_bw_ik_low(X=rdd_object$x,Y=rdd_object$y,threshold=cutpoint,verbose=FALSE, type="RES", returnBig=TRUE, kernel=kernel)
-
-## compute C2: see ik equ 5, and Fan Jijbels (1996, 3.23)
-# is done in R with locpol, computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=Inf), lower=0, upper=Inf)
-  C2 <- switch(kernel, "Triangular"= 4.8, "Uniform"= 4, "Normal"=1.785961) ## from: 
-
-## Compute var as in ik equ:5, 
-  if(missing(bw))  bw <- resB$h_op
-  elem1 <- (resB$var_inh_left+resB$var_inh_right)/resB$f_cu
-  elem2 <- C2/(nrow(rdd_object)*bw)
-  res <- elem1*elem2
-  res
+ik_var <- function(rdd_object, kernel = c("Triangular", "Uniform", "Normal"), bw) {
+    
+    kernel <- match.arg(kernel)
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    
+    resB <- rdd_bw_ik_low(X = rdd_object$x, Y = rdd_object$y, threshold = cutpoint, verbose = FALSE, type = "RES", returnBig = TRUE, 
+        kernel = kernel)
+    
+    ## compute C2: see ik equ 5, and Fan Jijbels (1996, 3.23) is done in R with locpol, computeRK(equivKernel(TrianK, nu=0, deg=1,
+    ## lower=0, upper=Inf), lower=0, upper=Inf)
+    C2 <- switch(kernel, Triangular = 4.8, Uniform = 4, Normal = 1.785961)  ## from: 
+    
+    ## Compute var as in ik equ:5,
+    if (missing(bw)) 
+        bw <- resB$h_op
+    elem1 <- (resB$var_inh_left + resB$var_inh_right)/resB$f_cu
+    elem2 <- C2/(nrow(rdd_object) * bw)
+    res <- elem1 * elem2
+    res
 }
 
-ik_amse <- function(rdd_object, kernel=c("Triangular", "Uniform", "Normal"), bw) {
-
-  var <- ik_var(rdd_object=rdd_object, kernel=kernel, bw=bw)
-  bias <- ik_bias(rdd_object=rdd_object, kernel=kernel, bw=bw)
-  res <- bias^2+var
-  res
+ik_amse <- function(rdd_object, kernel = c("Triangular", "Uniform", "Normal"), bw) {
+    
+    var <- ik_var(rdd_object = rdd_object, kernel = kernel, bw = bw)
+    bias <- ik_bias(rdd_object = rdd_object, kernel = kernel, bw = bw)
+    res <- bias^2 + var
+    res
 }
 
 
-rdd_bw_ik_low <-function (X,Y,threshold=0,verbose=FALSE, type=c("RES", "RES_imp","WP"), returnBig=FALSE, kernel=c("Triangular", "Uniform", "Normal")) {
-  
-  type <- match.arg(type)
-  kernel <- match.arg(kernel)
-
-
-  N <- length(X)
-  N_left  <- sum(X=threshold, na.rm=TRUE)
-
-  
-##########
-### STEP 1
-##########
-
-## Silverman bandwidth
-  h1 <-  1.84*sd(X)*N^(-1/5)
-  if(verbose)   cat("\n-h1:", h1)
-
-## f(cut)
-  isIn_h1_left  <- X>=(threshold-h1) & X=threshold & X<=(threshold+h1)
-
-  NisIn_h1_left  <- sum(isIn_h1_left, na.rm=TRUE)
-  NisIn_h1_right <- sum(isIn_h1_right, na.rm=TRUE)
-  if(verbose)   cat("\n-N left /right:", NisIn_h1_left, NisIn_h1_right)
-
-
-  f_cut <-(NisIn_h1_left+NisIn_h1_right)/(2*N*h1)
-  if(verbose)   cat("\n-f(threshold):", f_cut)
-
-## Variances : Equ (13) 
-
-  var_inh_left  <- var(Y[isIn_h1_left], na.rm=TRUE)
-  var_inh_right <- var(Y[isIn_h1_right], na.rm=TRUE)
-
-# problem with working pap0er: Equ 4.9 is different!
-  if(type=="WP"){
-    denom <- 1/(NisIn_h1_left+NisIn_h1_right) 
-    var_inh_global <- denom* ((NisIn_h1_left-1)* var_inh_left + (NisIn_h1_right-1)* var_inh_right)
-  }
-
-  if(verbose){
-    cat("\n-Sigma^2 left:", var_inh_left, "\n-Sigma^2 right:", var_inh_right)
-  }
-##########
-### STEP 2
-##########
-
-
-## Global function of order 3: Equ (14) 
-  reg <-lm(Y~I(X>=threshold)+I(X-threshold)+I((X-threshold)^2)+I((X-threshold)^3))
-  m3<- 6*coef(reg)[5]
-  if(verbose)   cat("\n-m3:", m3)
-
-
-## left and right bandwidths: Equ (15) 
-  Ck_h2 <- 3.556702 # 7200^(1/7)
-  h2_left  <- Ck_h2 * ( var_inh_left  /(f_cut*m3^2))^(1/7) * N_left^(-1/7)
-  h2_right <- Ck_h2 * ( var_inh_right /(f_cut*m3^2))^(1/7) * N_right^(-1/7)
-
-  if(verbose)   cat("\n-h2 left:", h2_left, "\n-h2 right:", h2_right)
-
-## second derivatives right/left
-  isIn_h2_left  <- X>=(threshold-h2_left) & X=threshold & X<=(threshold+h2_right)
-
-  N_h2_left <- sum(isIn_h2_left, na.rm=TRUE)
-  N_h2_right <- sum(isIn_h2_right, na.rm=TRUE)
-
-  reg2_left  <-lm(Y~ I(X-threshold)+I((X-threshold)^2),subset=isIn_h2_left)
-  reg2_right <-lm(Y~ I(X-threshold)+I((X-threshold)^2),subset=isIn_h2_right)
-
-  m2_left  <- as.numeric(2*coef(reg2_left)[3])
-  m2_right <- as.numeric(2*coef(reg2_right)[3])
-
-  if(verbose)   cat("\n-m2 left:", m2_left, "\n-m2 right:", m2_right)
-
-##########
-### STEP 3
-##########
-
-## Regularization: Equ (16) 
-  if(type=="RES"){
-    r_left  <- (2160*var_inh_left)  / (N_h2_left *h2_left^4)
-    r_right <- (2160*var_inh_right) / (N_h2_right*h2_right^4)
-  } else {
-    r_left  <- (2160*var_inh_global) / (N_h2_left *h2_left^4)
-    r_right <- (2160*var_inh_global) / (N_h2_right*h2_right^4)
-  }
-
-
-  if(verbose)   cat("\n-Reg left:", r_left, "\n-Reg right:", r_right)
-
-## Compute kernel dependent constant: (see file ~/Dropbox/HEI/rdd/Rcode/ik bandwidth/bandwidth_comput.R)
-  Ck <- switch(kernel, "Triangular"=3.4375, "Uniform"=2.70192, "Normal"=1.25864) # is not 5.4 as in paper since our kernel is on I(|x|<1), not <1/2
-
-## Final bandwidth: Equ (17) 
-  h_opt <- Ck * ( (var_inh_left+ var_inh_right) / (f_cut * ((m2_right-m2_left)^2 + r_left +r_right)))^(1/5) * N^(-1/5)
-  names(h_opt) <- "h_opt"
-
-  if(verbose)   cat("\n\n")
-
-###
-  if(returnBig){
-    res<- list()
-    res$h_opt <- as.numeric(h_opt)
-    res$var_inh_left <- var_inh_left
-    res$var_inh_right <- var_inh_right
-    res$m2_right <- m2_right
-    res$m2_left <- m2_left
-    res$f_cut <- f_cut
-    res$h2_left <- h2_left
-    res$h2_right <- h2_right
-  } else {
-  res <- h_opt
-  }
-
- return(res)
-}
+rdd_bw_ik_low <- function(X, Y, threshold = 0, verbose = FALSE, type = c("RES", "RES_imp", "WP"), returnBig = FALSE, kernel = c("Triangular", 
+    "Uniform", "Normal")) {
+    
+    type <- match.arg(type)
+    kernel <- match.arg(kernel)
+    
+    
+    N <- length(X)
+    N_left <- sum(X < threshold, na.rm = TRUE)
+    N_right <- sum(X >= threshold, na.rm = TRUE)
+    
+    
+    ########## STEP 1
+    
+    ## Silverman bandwidth
+    h1 <- 1.84 * sd(X) * N^(-1/5)
+    if (verbose) 
+        cat("\n-h1:", h1)
+    
+    ## f(cut)
+    isIn_h1_left <- X >= (threshold - h1) & X < threshold
+    isIn_h1_right <- X >= threshold & X <= (threshold + h1)
+    
+    NisIn_h1_left <- sum(isIn_h1_left, na.rm = TRUE)
+    NisIn_h1_right <- sum(isIn_h1_right, na.rm = TRUE)
+    if (verbose) 
+        cat("\n-N left /right:", NisIn_h1_left, NisIn_h1_right)
+    
+    
+    f_cut <- (NisIn_h1_left + NisIn_h1_right)/(2 * N * h1)
+    if (verbose) 
+        cat("\n-f(threshold):", f_cut)
+    
+    ## Variances : Equ (13)
+    
+    var_inh_left <- var(Y[isIn_h1_left], na.rm = TRUE)
+    var_inh_right <- var(Y[isIn_h1_right], na.rm = TRUE)
+    
+    # problem with working pap0er: Equ 4.9 is different!
+    if (type == "WP") {
+        denom <- 1/(NisIn_h1_left + NisIn_h1_right)
+        var_inh_global <- denom * ((NisIn_h1_left - 1) * var_inh_left + (NisIn_h1_right - 1) * var_inh_right)
+    }
+    
+    if (verbose) {
+        cat("\n-Sigma^2 left:", var_inh_left, "\n-Sigma^2 right:", var_inh_right)
+    }
+    ########## STEP 2
+    
+    
+    ## Global function of order 3: Equ (14)
+    reg <- lm(Y ~ I(X >= threshold) + I(X - threshold) + I((X - threshold)^2) + I((X - threshold)^3))
+    m3 <- 6 * coef(reg)[5]
+    if (verbose) 
+        cat("\n-m3:", m3)
+    
+    
+    ## left and right bandwidths: Equ (15)
+    Ck_h2 <- 3.556702  # 7200^(1/7)
+    h2_left <- Ck_h2 * (var_inh_left/(f_cut * m3^2))^(1/7) * N_left^(-1/7)
+    h2_right <- Ck_h2 * (var_inh_right/(f_cut * m3^2))^(1/7) * N_right^(-1/7)
+    
+    if (verbose) 
+        cat("\n-h2 left:", h2_left, "\n-h2 right:", h2_right)
+    
+    ## second derivatives right/left
+    isIn_h2_left <- X >= (threshold - h2_left) & X < threshold
+    isIn_h2_right <- X >= threshold & X <= (threshold + h2_right)
+    
+    N_h2_left <- sum(isIn_h2_left, na.rm = TRUE)
+    N_h2_right <- sum(isIn_h2_right, na.rm = TRUE)
+    
+    reg2_left <- lm(Y ~ I(X - threshold) + I((X - threshold)^2), subset = isIn_h2_left)
+    reg2_right <- lm(Y ~ I(X - threshold) + I((X - threshold)^2), subset = isIn_h2_right)
+    
+    m2_left <- as.numeric(2 * coef(reg2_left)[3])
+    m2_right <- as.numeric(2 * coef(reg2_right)[3])
+    
+    if (verbose) 
+        cat("\n-m2 left:", m2_left, "\n-m2 right:", m2_right)
+    
+    ########## STEP 3
+    
+    ## Regularization: Equ (16)
+    if (type == "RES") {
+        r_left <- (2160 * var_inh_left)/(N_h2_left * h2_left^4)
+        r_right <- (2160 * var_inh_right)/(N_h2_right * h2_right^4)
+    } else {
+        r_left <- (2160 * var_inh_global)/(N_h2_left * h2_left^4)
+        r_right <- (2160 * var_inh_global)/(N_h2_right * h2_right^4)
+    }
+    
+    
+    if (verbose) 
+        cat("\n-Reg left:", r_left, "\n-Reg right:", r_right)
+    
+    ## Compute kernel dependent constant: (see file ~/Dropbox/HEI/rdd/Rcode/ik bandwidth/bandwidth_comput.R)
+    Ck <- switch(kernel, Triangular = 3.4375, Uniform = 2.70192, Normal = 1.25864)  # is not 5.4 as in paper since our kernel is on I(|x|<1), not <1/2
+    
+    ## Final bandwidth: Equ (17)
+    h_opt <- Ck * ((var_inh_left + var_inh_right)/(f_cut * ((m2_right - m2_left)^2 + r_left + r_right)))^(1/5) * N^(-1/5)
+    names(h_opt) <- "h_opt"
+    
+    if (verbose) 
+        cat("\n\n")
+    
+    ### 
+    if (returnBig) {
+        res <- list()
+        res$h_opt <- as.numeric(h_opt)
+        res$var_inh_left <- var_inh_left
+        res$var_inh_right <- var_inh_right
+        res$m2_right <- m2_right
+        res$m2_left <- m2_left
+        res$f_cut <- f_cut
+        res$h2_left <- h2_left
+        res$h2_right <- h2_right
+    } else {
+        res <- h_opt
+    }
+    
+    return(res)
+} 
diff --git a/R/bw_rot.R b/R/bw_rot.R
index b9895bb..3baa257 100644
--- a/R/bw_rot.R
+++ b/R/bw_rot.R
@@ -3,39 +3,40 @@
 #' implements dpill
 #' 
 #' @param object object of class rdd_data
-#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005}
+#' @references McCrary, Justin. (2008) 'Manipulation of the running variable in the regression discontinuity design: A density test,' \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005}
 #' @export
 #' @examples
 #' #No discontinuity
 
 ### Crary bw
 
-rot_bw <- function(object){
-
-  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-  cutpoint <- getCutpoint(object)
-  x <- object$x
-  y <- object$y
-
-##### first step
-  n <- length(y)
-  sd_x <- sd(x, na.rm=TRUE)
-  bw_pilot <- (2*sd_x)/sqrt(n)
-
-## hist
-  his <- plotBin(x=x, y=y, h=bw_pilot, cutpoint=cutpoint,plot=FALSE, type="number")
-#   his2 <- hist(x, breaks=c(min(x), his[["x"]], max(x)))
-  x1 <- his$x
-  y1 <- his[,"y.Freq"]
-
-##### second step
-
-## regs:
- reg_left  <- lm(y1 ~ poly(x1, degree=4, raw=TRUE), subset=x1=cutpoint)
-
-
-
+rot_bw <- function(object) {
+    
+    if (!inherits(object, "rdd_data")) 
+        stop("Only works for rdd_data objects")
+    cutpoint <- getCutpoint(object)
+    x <- object$x
+    y <- object$y
+    
+    ##### first step
+    n <- length(y)
+    sd_x <- sd(x, na.rm = TRUE)
+    bw_pilot <- (2 * sd_x)/sqrt(n)
+    
+    ## hist
+    his <- plotBin(x = x, y = y, h = bw_pilot, cutpoint = cutpoint, plot = FALSE, type = "number")
+    # his2 <- hist(x, breaks=c(min(x), his[['x']], max(x)))
+    x1 <- his$x
+    y1 <- his[, "y.Freq"]
+    
+    ##### second step
+    
+    ## regs:
+    reg_left <- lm(y1 ~ poly(x1, degree = 4, raw = TRUE), subset = x1 < cutpoint)
+    reg_right <- lm(y1 ~ poly(x1, degree = 4, raw = TRUE), subset = x1 >= cutpoint)
+    
+    
+    
 }
 
 
@@ -58,26 +59,27 @@ rot_bw <- function(object){
 #' rdd_bw_rsw(rd)
 
 
-rdd_bw_rsw <- function(object, type=c("global", "sided")){
-
-  type <- match.arg(type)
-
-  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-  cutpoint <- getCutpoint(object)
-  x <- object$x
-  y <- object$y
-
-  if(type=="global"){
-    bw <- dpill(x=x, y=y)
-  } else {
-    dat_left  <- subset(object, x=cutpoint)
-
-    bw_left  <- dpill(x=dat_left$x, y=dat_left$y)
-    bw_right <- dpill(x=dat_right$x, y=dat_right$y)
-    bw <- c(bw_left, bw_right)
-  }
-
-  ## result
-  bw
-}
+rdd_bw_rsw <- function(object, type = c("global", "sided")) {
+    
+    type <- match.arg(type)
+    
+    if (!inherits(object, "rdd_data")) 
+        stop("Only works for rdd_data objects")
+    cutpoint <- getCutpoint(object)
+    x <- object$x
+    y <- object$y
+    
+    if (type == "global") {
+        bw <- dpill(x = x, y = y)
+    } else {
+        dat_left <- subset(object, x < cutpoint)
+        dat_right <- subset(object, x >= cutpoint)
+        
+        bw_left <- dpill(x = dat_left$x, y = dat_left$y)
+        bw_right <- dpill(x = dat_right$x, y = dat_right$y)
+        bw <- c(bw_left, bw_right)
+    }
+    
+    ## result
+    bw
+} 
diff --git a/R/clusterInf.R b/R/clusterInf.R
index d171357..48b676c 100644
--- a/R/clusterInf.R
+++ b/R/clusterInf.R
@@ -20,54 +20,56 @@
 #' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 #' 
 #' # here we just generate randomly a cluster variable:
-#' nlet <- sort(c(outer(letters, letters, paste, sep="")))
+#' nlet <- sort(c(outer(letters, letters, paste, sep='')))
 #' clusRandom <- sample(nlet[1:60], size=nrow(Lee2008_rdd), replace=TRUE)
 #'
 #' # now do post-inference:
 #' clusterInf(reg_para, clusterVar=clusRandom)
-#' clusterInf(reg_para, clusterVar=clusRandom, type="HC")
+#' clusterInf(reg_para, clusterVar=clusRandom, type='HC')
 
 
-clusterInf <- function(object, clusterVar, vcov. = NULL, type=c("df-adj", "HC"), ...){
-  
-  if(is.null(clusterVar)) stop("clusterVar seems to be NULL?")
-  type <- match.arg(type)
-
-  if(type=="df-adj"){
-    nClus <- if(is.factor(clusterVar)) nlevels(clusterVar) else length(unique(clusterVar))
-    res <- coeftest(object, vcov. = vcov., df = nClus, ...)
-  } else {
-    if(!is.null(vcov.)) warning("arg 'vcov.' not used when 'type=HC' (default vcovCluster used)")
-    res <- coeftest(object, vcov. = function(x) vcovCluster(x, clusterVar=clusterVar), ...)
-  }
-
-  return(res)
+clusterInf <- function(object, clusterVar, vcov. = NULL, type = c("df-adj", "HC"), ...) {
+    
+    if (is.null(clusterVar)) 
+        stop("clusterVar seems to be NULL?")
+    type <- match.arg(type)
+    
+    if (type == "df-adj") {
+        nClus <- if (is.factor(clusterVar)) 
+            nlevels(clusterVar) else length(unique(clusterVar))
+        res <- coeftest(object, vcov. = vcov., df = nClus, ...)
+    } else {
+        if (!is.null(vcov.)) 
+            warning("arg 'vcov.' not used when 'type=HC' (default vcovCluster used)")
+        res <- coeftest(object, vcov. = function(x) vcovCluster(x, clusterVar = clusterVar), ...)
+    }
+    
+    return(res)
 }
 
 #' @export
-estfun.rdd_reg_np <- function(x,...){
-  inf_met <- infType(x) ## def in Misc.R
-  if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
-  estfun(x$RDDslot$model)
+estfun.rdd_reg_np <- function(x, ...) {
+    inf_met <- infType(x)  ## def in Misc.R
+    if (inf_met == "se") 
+        stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
+    estfun(x$RDDslot$model)
 }
 
 #' @export
-bread.rdd_reg_np <- function(x,...){
-  inf_met <- infType(x) ## def in Misc.R
-  if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
-  bread(x$RDDslot$model)
-} 
+bread.rdd_reg_np <- function(x, ...) {
+    inf_met <- infType(x)  ## def in Misc.R
+    if (inf_met == "se") 
+        stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
+    bread(x$RDDslot$model)
+}
 
 
-# sandwich.rdd_reg_np <- function (x, bread. = bread, meat. = meat, ...){
-#   inf_met <- infType(x) ## def in Misc.R
-#   if(inf_met=="se") stop("No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference estimators")
-#   sandwich(x$RDDslot$model, bread.=bread., meat.=meat., ...)
-# }
+# sandwich.rdd_reg_np <- function (x, bread. = bread, meat. = meat, ...){ inf_met <- infType(x) ## def in Misc.R
+# if(inf_met=='se') stop('No 'vcovHC', 'vcovCluster', 'estfun' etc can be applied to RDDrg_np with non-parametric inference
+# estimators') sandwich(x$RDDslot$model, bread.=bread., meat.=meat., ...)  }
 
 #' @export
-model.frame.rdd_reg_np <- function (formula, ...) 
-  model.frame(formula$RDDslot$model)
+model.frame.rdd_reg_np <- function(formula, ...) model.frame(formula$RDDslot$model)
 
 #' Cluster Heteroskedasticity-consistent estimation of the covariance matrix. 
 #' 
@@ -91,58 +93,54 @@ model.frame.rdd_reg_np <- function (formula, ...)
 #' reg_krug <- lm(pscore~cs, data=STAR_MHE)
 #' 
 #' # Row 1 of Table 8.2.1, inference with standard vcovHC:
-#' coeftest(reg_krug,vcov.=vcovHC(reg_krug, "HC1"))[2,2]
+#' coeftest(reg_krug,vcov.=vcovHC(reg_krug, 'HC1'))[2,2]
 #' 
 #' # Row 4 of Table 8.2.1, inference with cluster vcovHC:
 #' coeftest(reg_krug,vcov.=vcovCluster(reg_krug, clusterVar=STAR_MHE$classid))[2,2]
 #' }
 
-vcovCluster   <- function(object, clusterVar){
-  M <- length(unique(clusterVar))   
-  N <- length(clusterVar)  	        
-  K <- getModelRank(object)
-  dfc <- (M/(M-1))*((N-1)/(N-K))  
-  uj  <- apply(estfun(object),2, function(x) tapply(x, clusterVar, sum))
-  # require("sandwich")
-  dfc*sandwich::sandwich(object, meat.=crossprod(uj)/N)
+vcovCluster <- function(object, clusterVar) {
+    M <- length(unique(clusterVar))
+    N <- length(clusterVar)
+    K <- getModelRank(object)
+    dfc <- (M/(M - 1)) * ((N - 1)/(N - K))
+    uj <- apply(estfun(object), 2, function(x) tapply(x, clusterVar, sum))
+    # require('sandwich')
+    dfc * sandwich::sandwich(object, meat. = crossprod(uj)/N)
 }
 
 #' @rdname vcovCluster
 #' @param clusterVar1,clusterVar2 The two cluster variables for the 2-cluster case.
 #' @export
-vcovCluster2 <- function(object, clusterVar1, clusterVar2){
-    # R-codes (www.r-project.org) for computing multi-way 
-    # clustered-standard errors. Mahmood Arai, Jan 26, 2008. 
-    # See: Thompson (2006), Cameron, Gelbach and Miller (2006)
-    # and Petersen (2006).
-    # reweighting the var-cov matrix for the within model
-  
-    K   <- getModelRank(object)
+vcovCluster2 <- function(object, clusterVar1, clusterVar2) {
+    # R-codes (www.r-project.org) for computing multi-way clustered-standard errors. Mahmood Arai, Jan 26, 2008.  See: Thompson
+    # (2006), Cameron, Gelbach and Miller (2006) and Petersen (2006).  reweighting the var-cov matrix for the within model
+    
+    K <- getModelRank(object)
     estF <- estfun(object)
     
-    clusterVar12 <- paste(clusterVar1,clusterVar2, sep="")
-    M1  <- length(unique(clusterVar1))
-    M2  <- length(unique(clusterVar2))   
+    clusterVar12 <- paste(clusterVar1, clusterVar2, sep = "")
+    M1 <- length(unique(clusterVar1))
+    M2 <- length(unique(clusterVar2))
     M12 <- length(unique(clusterVar12))
-    N   <- length(clusterVar1)          
+    N <- length(clusterVar1)
     
-    dfc1  <- (M1/(M1-1))*((N-1)/(N-K))  
-    dfc2  <- (M2/(M2-1))*((N-1)/(N-K))  
-    dfc12 <- (M12/(M12-1))*((N-1)/(N-K))  
+    dfc1 <- (M1/(M1 - 1)) * ((N - 1)/(N - K))
+    dfc2 <- (M2/(M2 - 1)) * ((N - 1)/(N - K))
+    dfc12 <- (M12/(M12 - 1)) * ((N - 1)/(N - K))
     
-    u1j   <- apply(estF, 2, function(x) tapply(x, clusterVar1,  sum)) 
-    u2j   <- apply(estF, 2, function(x) tapply(x, clusterVar2,  sum)) 
-    u12j  <- apply(estF, 2, function(x) tapply(x, clusterVar12, sum)) 
-    vc1   <-  dfc1*sandwich(object, meat.=crossprod(u1j)/N )
-    vc2   <-  dfc2*sandwich(object, meat.=crossprod(u2j)/N )
-    vc12  <- dfc12*sandwich(object, meat.=crossprod(u12j)/N)
+    u1j <- apply(estF, 2, function(x) tapply(x, clusterVar1, sum))
+    u2j <- apply(estF, 2, function(x) tapply(x, clusterVar2, sum))
+    u12j <- apply(estF, 2, function(x) tapply(x, clusterVar12, sum))
+    vc1 <- dfc1 * sandwich(object, meat. = crossprod(u1j)/N)
+    vc2 <- dfc2 * sandwich(object, meat. = crossprod(u2j)/N)
+    vc12 <- dfc12 * sandwich(object, meat. = crossprod(u12j)/N)
     vcovMCL <- vc1 + vc2 - vc12
     vcovMCL
 }
 
-getModelRank <- function(object,...)
-  UseMethod("getModelRank")
+getModelRank <- function(object, ...) UseMethod("getModelRank")
 
-getModelRank.default <- function(object,...) object$rank
+getModelRank.default <- function(object, ...) object$rank
 
-getModelRank.rdd_reg_np <- function(object,...) getModelRank.default(object$RDDslot$model)
+getModelRank.rdd_reg_np <- function(object, ...) getModelRank.default(object$RDDslot$model) 
diff --git a/R/covarTests.R b/R/covarTests.R
index 49d876d..666cf72 100644
--- a/R/covarTests.R
+++ b/R/covarTests.R
@@ -36,64 +36,71 @@
 
 
 #' @export
-covarTest_mean <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) 
-  UseMethod("covarTest_mean")
+covarTest_mean <- function(object, bw = NULL, paired = FALSE, var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", 
+    "hommel", "bonferroni")) UseMethod("covarTest_mean")
 
 #' @rdname covarTest_mean
 #' @export
-covarTest_mean.rdd_data <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
-
-  cutpoint <- getCutpoint(object)
-  covar <- getCovar(object)
-  cutvar <- object$x
-
-  covarTest_mean_low(covar=covar,cutvar=cutvar,cutpoint=cutpoint, bw=bw, paired = paired, var.equal = var.equal, p.adjust=p.adjust)
-
+covarTest_mean.rdd_data <- function(object, bw = NULL, paired = FALSE, var.equal = FALSE, p.adjust = c("none", "holm", "BH", 
+    "BY", "hochberg", "hommel", "bonferroni")) {
+    
+    cutpoint <- getCutpoint(object)
+    covar <- getCovar(object)
+    cutvar <- object$x
+    
+    covarTest_mean_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, paired = paired, var.equal = var.equal, 
+        p.adjust = p.adjust)
+    
 }
 
 
 #' @rdname covarTest_mean
 #' @export
-covarTest_mean.rdd_reg <- function(object, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
-  
-  cutpoint <- getCutpoint(object)
-  dat <- object$RDDslot$rdd_data
-  covar <- getCovar(dat)
-  cutvar <- dat$x
-  if(is.null(bw)) bw <- getBW(object)
-  
-  covarTest_mean_low(covar=covar,cutvar=cutvar,cutpoint=cutpoint, bw=bw, paired = paired, var.equal = var.equal, p.adjust=p.adjust)
-  
+covarTest_mean.rdd_reg <- function(object, bw = NULL, paired = FALSE, var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", 
+    "hochberg", "hommel", "bonferroni")) {
+    
+    cutpoint <- getCutpoint(object)
+    dat <- object$RDDslot$rdd_data
+    covar <- getCovar(dat)
+    cutvar <- dat$x
+    if (is.null(bw)) 
+        bw <- getBW(object)
+    
+    covarTest_mean_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, paired = paired, var.equal = var.equal, 
+        p.adjust = p.adjust)
+    
 }
 
 
-covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE, var.equal = FALSE, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
-
-  p.adjust <- match.arg(p.adjust)
-
-## subset
-  if(!is.null(bw)){
-    isInH <- cutvar >= cutpoint -bw & cutvar <= cutpoint +bw
-    covar <- covar[isInH,]
-    cutvar <- cutvar[isInH]
-  }
-  regime <- cutvar < cutpoint
-
-## Split data
-  covar_num <- sapply(covar, as.numeric)
-
-  tests <-apply(covar_num, 2, function(x) t.test(x[regime], x[!regime], paired=paired, var.equal=var.equal))
-  tests_vals <- sapply(tests, function(x) c(x[["estimate"]], diff(x[["estimate"]]),x[c("statistic", "p.value")]))
-
-## Adjust p values if required:
-  if(p.adjust!="none") tests_vals["p.value",] <- p.adjust(tests_vals["p.value",], method=p.adjust)
-
-## Print results
-  res <- t(tests_vals)
-  colnames(res)[3] <- "Difference"
-  res
-
-
+covarTest_mean_low <- function(covar, cutvar, cutpoint, bw = NULL, paired = FALSE, var.equal = FALSE, p.adjust = c("none", "holm", 
+    "BH", "BY", "hochberg", "hommel", "bonferroni")) {
+    
+    p.adjust <- match.arg(p.adjust)
+    
+    ## subset
+    if (!is.null(bw)) {
+        isInH <- cutvar >= cutpoint - bw & cutvar <= cutpoint + bw
+        covar <- covar[isInH, ]
+        cutvar <- cutvar[isInH]
+    }
+    regime <- cutvar < cutpoint
+    
+    ## Split data
+    covar_num <- sapply(covar, as.numeric)
+    
+    tests <- apply(covar_num, 2, function(x) t.test(x[regime], x[!regime], paired = paired, var.equal = var.equal))
+    tests_vals <- sapply(tests, function(x) c(x[["estimate"]], diff(x[["estimate"]]), x[c("statistic", "p.value")]))
+    
+    ## Adjust p values if required:
+    if (p.adjust != "none") 
+        tests_vals["p.value", ] <- p.adjust(tests_vals["p.value", ], method = p.adjust)
+    
+    ## Print results
+    res <- t(tests_vals)
+    colnames(res)[3] <- "Difference"
+    res
+    
+    
 }
 
 
@@ -132,61 +139,65 @@ covarTest_mean_low <- function(covar,cutvar, cutpoint, bw=NULL, paired = FALSE,
 #' covarTest_dis(reg_nonpara)
 
 #' @export
-covarTest_dis <- function(object, bw,  exact=NULL, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni"))
-  UseMethod("covarTest_dis")
+covarTest_dis <- function(object, bw, exact = NULL, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni")) UseMethod("covarTest_dis")
 
 #' @rdname covarTest_dis
 #' @export
-covarTest_dis.rdd_data <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
-
-  cutpoint <- getCutpoint(object)
-  covar <- getCovar(object)
-  cutvar <- object$x
-
-  covarTest_dis_low(covar=covar,cutvar=cutvar,cutpoint=cutpoint, bw=bw, exact= exact, p.adjust=p.adjust)
-
+covarTest_dis.rdd_data <- function(object, bw = NULL, exact = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", 
+    "bonferroni")) {
+    
+    cutpoint <- getCutpoint(object)
+    covar <- getCovar(object)
+    cutvar <- object$x
+    
+    covarTest_dis_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, exact = exact, p.adjust = p.adjust)
+    
 }
 
 #' @rdname covarTest_dis
 #' @export
-covarTest_dis.rdd_reg <- function(object, bw=NULL, exact = FALSE,  p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
-  
-  cutpoint <- getCutpoint(object)
-  dat <- object$RDDslot$rdd_data
-  covar <- getCovar(dat)
-  cutvar <- dat$x
-  if(is.null(bw)) bw <- getBW(object)
-  
-  covarTest_dis_low(covar=covar,cutvar=cutvar,cutpoint=cutpoint, bw=bw, exact= exact, p.adjust=p.adjust)
-  
+covarTest_dis.rdd_reg <- function(object, bw = NULL, exact = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", 
+    "bonferroni")) {
+    
+    cutpoint <- getCutpoint(object)
+    dat <- object$RDDslot$rdd_data
+    covar <- getCovar(dat)
+    cutvar <- dat$x
+    if (is.null(bw)) 
+        bw <- getBW(object)
+    
+    covarTest_dis_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, exact = exact, p.adjust = p.adjust)
+    
 }
 
-covarTest_dis_low <- function(covar,cutvar, cutpoint, bw=NULL, exact=NULL, p.adjust=c("none", "holm", "BH", "BY","hochberg", "hommel", "bonferroni")) {
-
-  p.adjust <- match.arg(p.adjust)
-
-## subset
-  if(!is.null(bw)){
-    isInH <- cutvar >= cutpoint -bw & cutvar <= cutpoint +bw
-    covar <- covar[isInH,]
-    cutvar <- cutvar[isInH]
-  }
-  regime <- cutvar < cutpoint
-
-
-
-## Split data
-  covar_num <- sapply(covar, as.numeric)
-
-  tests <-apply(covar_num, 2, function(x) ks.test(x[regime], x[!regime], exact=exact))
-  tests_vals <- sapply(tests, function(x) x[c("statistic", "p.value")])
-
-## Adjust p values if required:
-  if(p.adjust!="none") tests_vals["p.value",] <- p.adjust(tests_vals["p.value",], method=p.adjust)
-
-## Print results
-  res <- t(tests_vals)
-  res
-
-
-}
+covarTest_dis_low <- function(covar, cutvar, cutpoint, bw = NULL, exact = NULL, p.adjust = c("none", "holm", "BH", "BY", "hochberg", 
+    "hommel", "bonferroni")) {
+    
+    p.adjust <- match.arg(p.adjust)
+    
+    ## subset
+    if (!is.null(bw)) {
+        isInH <- cutvar >= cutpoint - bw & cutvar <= cutpoint + bw
+        covar <- covar[isInH, ]
+        cutvar <- cutvar[isInH]
+    }
+    regime <- cutvar < cutpoint
+    
+    
+    
+    ## Split data
+    covar_num <- sapply(covar, as.numeric)
+    
+    tests <- apply(covar_num, 2, function(x) ks.test(x[regime], x[!regime], exact = exact))
+    tests_vals <- sapply(tests, function(x) x[c("statistic", "p.value")])
+    
+    ## Adjust p values if required:
+    if (p.adjust != "none") 
+        tests_vals["p.value", ] <- p.adjust(tests_vals["p.value", ], method = p.adjust)
+    
+    ## Print results
+    res <- t(tests_vals)
+    res
+    
+    
+} 
diff --git a/R/dens_test.R b/R/dens_test.R
index 0394fd1..3a8792b 100644
--- a/R/dens_test.R
+++ b/R/dens_test.R
@@ -16,32 +16,34 @@
 
 
 
-dens_test <- function(rdd_object, bin=NULL, bw=NULL, plot=TRUE,...){
-  checkIsRDD(rdd_object)
-  cutpoint <- getCutpoint(rdd_object)
-  x <- getOriginalX(rdd_object)
-  test <- try(DCdensity(runvar=x, cutpoint=cutpoint, bin = bin, bw = bw, plot=plot, ext.out=TRUE, ...), silent=TRUE)
-  if(inherits(test, "try-error")){
-    warning("Error in computing the density, returning a simple histogram", if(is.null(bin)) " with arbitrary bin" else NULL)
-    if(is.null(bin)) {
-      test <- try(DCdensity(rdd_object$x, cutpoint, bin = bin, bw = 0.2, ext.out=TRUE, plot=FALSE), silent=TRUE)
-      bin <- test$binsize
+dens_test <- function(rdd_object, bin = NULL, bw = NULL, plot = TRUE, ...) {
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    x <- getOriginalX(rdd_object)
+    test <- try(DCdensity(runvar = x, cutpoint = cutpoint, bin = bin, bw = bw, plot = plot, ext.out = TRUE, ...), silent = TRUE)
+    if (inherits(test, "try-error")) {
+        warning("Error in computing the density, returning a simple histogram", if (is.null(bin)) 
+            " with arbitrary bin" else NULL)
+        if (is.null(bin)) {
+            test <- try(DCdensity(rdd_object$x, cutpoint, bin = bin, bw = 0.2, ext.out = TRUE, plot = FALSE), silent = TRUE)
+            bin <- test$binsize
+        }
+        max_x <- max(rdd_object$x, na.rm = TRUE)
+        seq_breaks <- seq(from = min(rdd_object$x, na.rm = TRUE), to = max_x, by = bin)
+        if (max_x > max(seq_breaks)) 
+            seq_breaks <- c(seq_breaks, max_x + 0.001)
+        hist(rdd_object$x, breaks = seq_breaks)
+        abline(v = cutpoint, col = 2, lty = 2)
     }
-    max_x <- max(rdd_object$x, na.rm=TRUE)
-    seq_breaks <- seq(from=min(rdd_object$x, na.rm=TRUE), to=max_x, by=bin)
-    if(max_x>max(seq_breaks)) seq_breaks <- c(seq_breaks, max_x+0.001)
-    hist(rdd_object$x, breaks=seq_breaks)
-    abline(v=cutpoint, col=2, lty=2)
-  }
-  
-  test.htest <- list()
-  test.htest$statistic <- c("z-val"=test$z)
-  test.htest$p.value <- test$p
-  test.htest$data.name <- deparse(substitute(rdd_object))
-  test.htest$method <- "McCrary Test for no discontinuity of density around cutpoint"
-  test.htest$alternative <- "Density is discontinuous around cutpoint"
-  test.htest$estimate <- c(Discontinuity=test$theta)
-  test.htest$test.output <- test
-  class(test.htest) <- "htest"
-  return(test.htest)
-}
+    
+    test.htest <- list()
+    test.htest$statistic <- c(`z-val` = test$z)
+    test.htest$p.value <- test$p
+    test.htest$data.name <- deparse(substitute(rdd_object))
+    test.htest$method <- "McCrary Test for no discontinuity of density around cutpoint"
+    test.htest$alternative <- "Density is discontinuous around cutpoint"
+    test.htest$estimate <- c(Discontinuity = test$theta)
+    test.htest$test.output <- test
+    class(test.htest) <- "htest"
+    return(test.htest)
+} 
diff --git a/R/gen_mc_ik.R b/R/gen_mc_ik.R
index 4ae7dab..3cf1461 100644
--- a/R/gen_mc_ik.R
+++ b/R/gen_mc_ik.R
@@ -20,8 +20,8 @@
 #' plotCu <- function(version=1, xlim=c(-0.1,0.1)){
 #'   res <- gen_mc_ik(sd=0.0000001, n=1000, version=version)
 #'   res <- res[order(res$x),]
-#'   ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), "y"))
-#'   plot(res, type="l", xlim=xlim, ylim=ylim, main=paste("DGP", version))
+#'   ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), 'y'))
+#'   plot(res, type='l', xlim=xlim, ylim=ylim, main=paste('DGP', version))
 #'   abline(v=0)
 #'   xCut <- res[which(res$x==min(res$x[res$x>=0]))+c(0,-1),]
 #'   points(xCut, col=2)
@@ -33,127 +33,109 @@
 #' plotCu(version=4)
 #' layout(matrix(1))
 
-gen_mc_ik <- function(n=200, version=1, sd=0.1295, output=c("data.frame", "rdd_data"), size){
- 
-  output <- match.arg(output)
-  if(!version%in% c(1:4) |length(version) !=1) stop("arg 'version' should be between 1 and 4")
-
-  foo <- switch(version, 
-			"1"=gen_mc_ik_1,
-			"2"=gen_mc_ik_2,
-			"3"=gen_mc_ik_3,
-			"4"=gen_mc_ik_4)
-  if(missing(size)) {
-    size <- switch(version, 
-		    "1"=0.04,
-		    "2"=0,
-		    "3"=0.1,
-		    "4"=0.1)
-  }
-  res <- foo(n=n, sd=sd, size=size)
-  if(output=="rdd_data"){
-    res <- rdd_data(x=res$x, y=res$y, cutpoint=0)
-  }
-  res
+gen_mc_ik <- function(n = 200, version = 1, sd = 0.1295, output = c("data.frame", "rdd_data"), size) {
+    
+    output <- match.arg(output)
+    if (!version %in% c(1:4) | length(version) != 1) 
+        stop("arg 'version' should be between 1 and 4")
+    
+    foo <- switch(version, `1` = gen_mc_ik_1, `2` = gen_mc_ik_2, `3` = gen_mc_ik_3, `4` = gen_mc_ik_4)
+    if (missing(size)) {
+        size <- switch(version, `1` = 0.04, `2` = 0, `3` = 0.1, `4` = 0.1)
+    }
+    res <- foo(n = n, sd = sd, size = size)
+    if (output == "rdd_data") {
+        res <- rdd_data(x = res$x, y = res$y, cutpoint = 0)
+    }
+    res
 }
 
 
-####################################
-######### MC 1
-####################################
-
-gen_mc_ik_1 <- function(n=200,  sd=0.1295, size=0.04){
-
-## Regressor:
-  Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
-  X <- 2*Z-1
-  error <- rnorm(n, sd=sd)
-
-## Prepare variables:
-  Y <- vector("numeric", length=n)
-  ind_below <- X<0
-  X_low <- X[ind_below]
-  X_up  <- X[!ind_below]
-
-## Compute Y variables:
-  Y[ind_below]  <- 0.48 +  1.27*X_low + 7.18*X_low^2 + 20.21* X_low^3 +21.54*X_low^4 +7.33*X_low^5 + error[ind_below]
-  Y[!ind_below] <- 0.48+size +  0.84*X_up - 3*   X_up^2 +  7.99* X_up^3 - 9.01*X_up^4 +3.56*X_up^5 + error[!ind_below]
-
-## Result:
-  res <- data.frame(x=X, y=Y)
-  return(res)
+#################################### MC 1
+
+gen_mc_ik_1 <- function(n = 200, sd = 0.1295, size = 0.04) {
+    
+    ## Regressor:
+    Z <- rbeta(n, shape1 = 2, shape2 = 4, ncp = 0)
+    X <- 2 * Z - 1
+    error <- rnorm(n, sd = sd)
+    
+    ## Prepare variables:
+    Y <- vector("numeric", length = n)
+    ind_below <- X < 0
+    X_low <- X[ind_below]
+    X_up <- X[!ind_below]
+    
+    ## Compute Y variables:
+    Y[ind_below] <- 0.48 + 1.27 * X_low + 7.18 * X_low^2 + 20.21 * X_low^3 + 21.54 * X_low^4 + 7.33 * X_low^5 + error[ind_below]
+    Y[!ind_below] <- 0.48 + size + 0.84 * X_up - 3 * X_up^2 + 7.99 * X_up^3 - 9.01 * X_up^4 + 3.56 * X_up^5 + error[!ind_below]
+    
+    ## Result:
+    res <- data.frame(x = X, y = Y)
+    return(res)
 }
 
-####################################
-######### MC 2
-####################################
-
-gen_mc_ik_2 <- function(n=200,  sd=0.1295, size=0){
-
-#   if(!missing(size) && !is.null(size)) warning("Argument 'size' ignored for gen_mc_ik_2")
-## Regressor:
-  Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
-  X <- 2*Z-1
-  error <- rnorm(n, sd=sd)
-
-## Compute Y variables:
-  Y <- ifelse(X<0, 3*X^2, 4*X^2+size) + error
-
-## Result:
-  res <- data.frame(x=X, y=Y)
-  return(res)
+#################################### MC 2
+
+gen_mc_ik_2 <- function(n = 200, sd = 0.1295, size = 0) {
+    
+    # if(!missing(size) && !is.null(size)) warning('Argument 'size' ignored for gen_mc_ik_2') Regressor:
+    Z <- rbeta(n, shape1 = 2, shape2 = 4, ncp = 0)
+    X <- 2 * Z - 1
+    error <- rnorm(n, sd = sd)
+    
+    ## Compute Y variables:
+    Y <- ifelse(X < 0, 3 * X^2, 4 * X^2 + size) + error
+    
+    ## Result:
+    res <- data.frame(x = X, y = Y)
+    return(res)
 }
 
-  
-####################################
-######### MC 3
-####################################
 
-gen_mc_ik_3 <- function(n=200,  sd=0.1295, size=0.1){
-
-## Regressor:
-  Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
-  X <- 2*Z-1
-  error <- rnorm(n, sd=sd)
-
-## Compute Y variables:
-  Y <- 0.42 + ifelse(X<0, 0, size) + 0.84*X - 3*X^2 +7.99 * X^3-9.01*X^4+3.56*X^5 + error
-
-## Result:
-  res <- data.frame(x=X, y=Y)
-  return(res)
+#################################### MC 3
+
+gen_mc_ik_3 <- function(n = 200, sd = 0.1295, size = 0.1) {
+    
+    ## Regressor:
+    Z <- rbeta(n, shape1 = 2, shape2 = 4, ncp = 0)
+    X <- 2 * Z - 1
+    error <- rnorm(n, sd = sd)
+    
+    ## Compute Y variables:
+    Y <- 0.42 + ifelse(X < 0, 0, size) + 0.84 * X - 3 * X^2 + 7.99 * X^3 - 9.01 * X^4 + 3.56 * X^5 + error
+    
+    ## Result:
+    res <- data.frame(x = X, y = Y)
+    return(res)
 }
 
-####################################
-######### MC 4
-####################################
-
-gen_mc_ik_4 <- function(n=200,  sd=0.1295, size=0.1){
-
-## Regressor:
-  Z <- rbeta(n, shape1=2, shape2=4, ncp = 0)
-  X <- 2*Z-1
-  error <- rnorm(n, sd=sd)
-
-## Compute Y variables:
-  Y <- 0.42 + ifelse(X<0, 0, size) + 0.84*X  +7.99 * X^3-9.01*X^4+3.56*X^5 + error
-
-## Result:
-  res <- data.frame(x=X, y=Y)
-  return(res)
+#################################### MC 4
+
+gen_mc_ik_4 <- function(n = 200, sd = 0.1295, size = 0.1) {
+    
+    ## Regressor:
+    Z <- rbeta(n, shape1 = 2, shape2 = 4, ncp = 0)
+    X <- 2 * Z - 1
+    error <- rnorm(n, sd = sd)
+    
+    ## Compute Y variables:
+    Y <- 0.42 + ifelse(X < 0, 0, size) + 0.84 * X + 7.99 * X^3 - 9.01 * X^4 + 3.56 * X^5 + error
+    
+    ## Result:
+    res <- data.frame(x = X, y = Y)
+    return(res)
 }
 
 
-####################################
-######### MC simple
-####################################
-
-gen_MC_simple <- function(n=200, LATE=0.3){
-
-## Regressor:
-  x <- rnorm(n)
-  D <- x>= 0
-  y <- 0.8 + LATE*D+ 0.3*x+0.1*x*D+rnorm(n)
-  rdd_data(x=x, y=y, cutpoint=0)
+#################################### MC simple
 
-}
\ No newline at end of file
+gen_MC_simple <- function(n = 200, LATE = 0.3) {
+    
+    ## Regressor:
+    x <- rnorm(n)
+    D <- x >= 0
+    y <- 0.8 + LATE * D + 0.3 * x + 0.1 * x * D + rnorm(n)
+    rdd_data(x = x, y = y, cutpoint = 0)
+    
+} 
diff --git a/R/get_methods.R b/R/get_methods.R
index 37ba86d..88147d4 100644
--- a/R/get_methods.R
+++ b/R/get_methods.R
@@ -1,143 +1,141 @@
 
 
-# checkIsRDD <- function(object)  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-# checkIsAnyRDD <- function(object)  if(!inherits(object, c("rdd_data", "rdd_reg_np"))) stop("Only works for rdd_data objects")
-
-# function(object)  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-checkIsAnyRDD <- checkIsRDD <- function(object)  {
-  classesOk <- c("rdd_data", "rdd_reg_np", "rdd_reg_lm")
-  if(!inherits(object, classesOk)) stop("Only works for rdd_data objects")
+# checkIsRDD <- function(object) if(!inherits(object, 'rdd_data')) stop('Only works for rdd_data objects') checkIsAnyRDD <-
+# function(object) if(!inherits(object, c('rdd_data', 'rdd_reg_np'))) stop('Only works for rdd_data objects')
+
+# function(object) if(!inherits(object, 'rdd_data')) stop('Only works for rdd_data objects')
+checkIsAnyRDD <- checkIsRDD <- function(object) {
+    classesOk <- c("rdd_data", "rdd_reg_np", "rdd_reg_lm")
+    if (!inherits(object, classesOk)) 
+        stop("Only works for rdd_data objects")
 }
 
-getType <- function(object){
-  checkIsRDD(object)
-  attr(object, "type")
+getType <- function(object) {
+    checkIsRDD(object)
+    attr(object, "type")
 }
 
-isFuzzy <- function(object){
-  checkIsRDD(object)
-  attr(object, "type")=="Fuzzy"
+isFuzzy <- function(object) {
+    checkIsRDD(object)
+    attr(object, "type") == "Fuzzy"
 }
 
-getCutpoint <- function(object){
-  
-  checkIsRDD(object)
-  attr(object, "cutpoint")
+getCutpoint <- function(object) {
+    
+    checkIsRDD(object)
+    attr(object, "cutpoint")
 }
 
-getOrder <- function(object){
-
-  checkIsRDD(object)
-  attr(object, "PolyOrder")
+getOrder <- function(object) {
+    
+    checkIsRDD(object)
+    attr(object, "PolyOrder")
 }
 
-getSlope <- function(object){
-
-  checkIsRDD(object)
-  attr(object, "slope")
+getSlope <- function(object) {
+    
+    checkIsRDD(object)
+    attr(object, "slope")
 }
 
-getBW <- function(object, force.na=FALSE){
-
-  checkIsAnyRDD(object)
-  res <- attr(object, "bw")
-  if(force.na) if(is.null(res)) res <- NA
-  res
+getBW <- function(object, force.na = FALSE) {
+    
+    checkIsAnyRDD(object)
+    res <- attr(object, "bw")
+    if (force.na) 
+        if (is.null(res)) 
+            res <- NA
+    res
 }
 
 
 
 ## return the type of inference used by rdd_reg_np
 infType <- function(x) {
-  if(is.null(getCall(x)$inference)) "se" else getCall(x)$inference
+    if (is.null(getCall(x)$inference)) 
+        "se" else getCall(x)$inference
 }
 
 
-hasCovar <- function(object)
-  UseMethod("hasCovar")
+hasCovar <- function(object) UseMethod("hasCovar")
 
-hasCovar.rdd_data <- function(object)  attr(object, "hasCovar")
+hasCovar.rdd_data <- function(object) attr(object, "hasCovar")
 
-hasCovar.rdd_reg <- function(object) { 
-  call <- getCall(object)
-  !is.null(call$covariates)
+hasCovar.rdd_reg <- function(object) {
+    call <- getCall(object)
+    !is.null(call$covariates)
 }
 
-getCovar <- function(object){
-  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-  if(!hasCovar(object)) stop("object has no covariates")
-  
-  rem <- if(isFuzzy(object)) 1:3 else  1:2
-  res <- object[,-rem, drop=FALSE]
-  as.data.frame(res)
+getCovar <- function(object) {
+    if (!inherits(object, "rdd_data")) 
+        stop("Only works for rdd_data objects")
+    if (!hasCovar(object)) 
+        stop("object has no covariates")
+    
+    rem <- if (isFuzzy(object)) 
+        1:3 else 1:2
+    res <- object[, -rem, drop = FALSE]
+    as.data.frame(res)
 }
 
-getCovarNames <- function(object){
-  if(!inherits(object, "rdd_data")) stop("Only works for rdd_data objects")
-  if(!hasCovar(object)) stop("object has no covariates")
-  
-  rem <- if(isFuzzy(object)) 1:3 else  1:2
-  colnames(object)[-rem]
+getCovarNames <- function(object) {
+    if (!inherits(object, "rdd_data")) 
+        stop("Only works for rdd_data objects")
+    if (!hasCovar(object)) 
+        stop("object has no covariates")
+    
+    rem <- if (isFuzzy(object)) 
+        1:3 else 1:2
+    colnames(object)[-rem]
 }
 
-getOriginalX <- function(object){
-
-  cutpoint <- getCutpoint(object)
-  x <- object$model[,"x"]
-  if(cutpoint!=0)  x <- x+cutpoint
-  x
+getOriginalX <- function(object) {
+    
+    cutpoint <- getCutpoint(object)
+    x <- object$model[, "x"]
+    if (cutpoint != 0) 
+        x <- x + cutpoint
+    x
 }
 
-getOriginalX <- function(object)
-  UseMethod("getOriginalX")
+getOriginalX <- function(object) UseMethod("getOriginalX")
 
 
-getOriginalX.rdd_reg <- function(object){
-  object$RDDslot$rdd_data[, "x"]
+getOriginalX.rdd_reg <- function(object) {
+    object$RDDslot$rdd_data[, "x"]
 }
 
-getOriginalX.rdd_data <- function(object){
-  object[, "x"]
+getOriginalX.rdd_data <- function(object) {
+    object[, "x"]
 }
 
-# getOriginalX.rdd_reg_np <- function(object){
-# 
-#   cutpoint <- getCutpoint(object)
-#   Xnam <- getXname(object) 
-#   x <- object$model[,Xnam]
-#   if(cutpoint!=0)  x <- x+cutpoint
-#   x
-# }
+# getOriginalX.rdd_reg_np <- function(object){ cutpoint <- getCutpoint(object) Xnam <- getXname(object) x <-
+# object$model[,Xnam] if(cutpoint!=0) x <- x+cutpoint x }
 
 
-getOriginalData <- function(object, na.rm=TRUE, classRDD=TRUE)
-  UseMethod("getOriginalData")
+getOriginalData <- function(object, na.rm = TRUE, classRDD = TRUE) UseMethod("getOriginalData")
 
-# getOriginalData.rdd_reg_np <- function(object, na.rm=TRUE){
-# 
-#   cutpoint <- getCutpoint(object)
-#   Xnam <- getXname(object) 
-#   dat <- object$model[,c("y",Xnam)]
-#   if(cutpoint!=0)  dat[,Xnam] <- dat[,Xnam] +cutpoint
-#   if(na.rm) dat <- dat[apply(dat, 1, function(x) all(!is.na(x))),] # remove na rows
-#   dat
-# }
+# getOriginalData.rdd_reg_np <- function(object, na.rm=TRUE){ cutpoint <- getCutpoint(object) Xnam <- getXname(object) dat <-
+# object$model[,c('y',Xnam)] if(cutpoint!=0) dat[,Xnam] <- dat[,Xnam] +cutpoint if(na.rm) dat <- dat[apply(dat, 1,
+# function(x) all(!is.na(x))),] # remove na rows dat }
 
 
 
-getOriginalData.rdd_reg <- function(object, na.rm=TRUE, classRDD=TRUE){
-  res <- object$RDDslot$rdd_data
-  if(na.rm) res <- res[apply(res, 1, function(x) all(!is.na(x))),] # remove na rows
-  if(!classRDD) res <- as.data.frame(res)
-  res
+getOriginalData.rdd_reg <- function(object, na.rm = TRUE, classRDD = TRUE) {
+    res <- object$RDDslot$rdd_data
+    if (na.rm) 
+        res <- res[apply(res, 1, function(x) all(!is.na(x))), ]  # remove na rows
+    if (!classRDD) 
+        res <- as.data.frame(res)
+    res
 }
 
 
 
 #' @importFrom stats getCall
 #' @export
-getCall.rdd_reg <- function(x,...) attr(x, "RDDcall")
-
+getCall.rdd_reg <- function(x, ...) attr(x, "RDDcall")
 
-#format(Sys.Date(), "%A %Y-%m-%d")
 
+# format(Sys.Date(), '%A %Y-%m-%d')
+ 
diff --git a/R/model.matrix.rdd.R b/R/model.matrix.rdd.R
index 8ab921a..4a5e4da 100644
--- a/R/model.matrix.rdd.R
+++ b/R/model.matrix.rdd.R
@@ -1,74 +1,80 @@
 #' @export
 
-model.matrix.rdd_data <- function(object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), ...){
-
-  checkIsRDD(object)
-  rdd_object <- object
-  type <- getType(object)
-
-  if(!missing(covar.strat)) warning("covar.strat is (soon) deprecated arg!")
-
-  slope <- match.arg(slope)
-  covar.strat <- match.arg(covar.opt$strategy, choices=c("include", "residual"))
-  covar.slope <- match.arg(covar.opt$slope, choices=c("same", "separate"))
-  
-  cutpoint <- getCutpoint(rdd_object)
-  if(!is.null(covariates) & !hasCovar(rdd_object))  stop("Arg 'covariates' was specified, but no covariates found in 'rdd_object'.")
-
-## Construct data
-  dat <- as.data.frame(rdd_object)
-
-  dat_step1 <- dat[, c("y", "x")]
-  dat_step1$x <- dat_step1$x -cutpoint
-
-  L <- ifelse(dat_step1$x>= 0, 1,0)
-  dat_step1$D <- if(type=="Sharp") L else object$z
-
-  if(order>0){
-    polys <- poly(dat_step1$x, degree=order, raw=TRUE)
-    colnames(polys) <- paste("x", 1:order, sep="^")
-    dat_step1  <- cbind(dat_step1[,c("y", "D")],polys)
-    if(slope=="separate") {
-      polys2 <- polys*L
-      colnames(polys2) <- paste(colnames(polys), "right", sep="_")
-      dat_step1  <- cbind(dat_step1,polys2)
-    }
-  } else {
-    dat_step1$x <- NULL
-  }
-
-## Covariates
-  if(!is.null(covariates)){
-    covar <- getCovar(rdd_object)
-    formu.cova <- covariates
-
-    if(grepl("\\.", formu.cova)) formu.cova <- paste(colnames(covar), collapse=" + ")
-    if(covar.slope=="separate") { 
-      formu.cova <- paste(formu.cova, "+", paste("D*(", formu.cova,")", sep=""), sep=" ")
-      covar$D <- dat_step1$D
-    } 
-
-    formula.cova <- as.formula(paste("~", formu.cova))
-    mf <- model.frame(formula.cova, covar, na.action=na.pass)
-    M_covar <- model.matrix(formula.cova, data=mf)
-
-    if(covar.strat=="residual"){
-      M_covar <- data.frame(y=dat_step1$y, M_covar)
-      first_stage <- lm(y~., data=M_covar) ## regress y on covariates only
-      dat_step1$y <- residuals(first_stage) ## change in original data
+model.matrix.rdd_data <- function(object, covariates = NULL, order = 1, bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy = c("include", 
+    "residual"), slope = c("same", "separate"), bw = NULL), covar.strat = c("include", "residual"), ...) {
+    
+    checkIsRDD(object)
+    rdd_object <- object
+    type <- getType(object)
+    
+    if (!missing(covar.strat)) 
+        warning("covar.strat is (soon) deprecated arg!")
+    
+    slope <- match.arg(slope)
+    covar.strat <- match.arg(covar.opt$strategy, choices = c("include", "residual"))
+    covar.slope <- match.arg(covar.opt$slope, choices = c("same", "separate"))
+    
+    cutpoint <- getCutpoint(rdd_object)
+    if (!is.null(covariates) & !hasCovar(rdd_object)) 
+        stop("Arg 'covariates' was specified, but no covariates found in 'rdd_object'.")
+    
+    ## Construct data
+    dat <- as.data.frame(rdd_object)
+    
+    dat_step1 <- dat[, c("y", "x")]
+    dat_step1$x <- dat_step1$x - cutpoint
+    
+    L <- ifelse(dat_step1$x >= 0, 1, 0)
+    dat_step1$D <- if (type == "Sharp") 
+        L else object$z
+    
+    if (order > 0) {
+        polys <- poly(dat_step1$x, degree = order, raw = TRUE)
+        colnames(polys) <- paste("x", 1:order, sep = "^")
+        dat_step1 <- cbind(dat_step1[, c("y", "D")], polys)
+        if (slope == "separate") {
+            polys2 <- polys * L
+            colnames(polys2) <- paste(colnames(polys), "right", sep = "_")
+            dat_step1 <- cbind(dat_step1, polys2)
+        }
     } else {
-      rem <- switch(covar.slope, "separate"="^D$|(Intercept)", "same" ="(Intercept)")
-      M_covar <- M_covar[,-grep(rem, colnames(M_covar)), drop=FALSE	]
-      dat_step1 <- cbind(dat_step1, M_covar) ## add covar as regressors
+        dat_step1$x <- NULL
     }
-  }
-
-## Colnames cleaning
-  colnames(dat_step1) <- gsub("x\\^1", "x", colnames(dat_step1))
-
-## 
- if(type=="Fuzzy") dat_step1$ins <- L
-
-## return results: 
-  dat_step1
-}
\ No newline at end of file
+    
+    ## Covariates
+    if (!is.null(covariates)) {
+        covar <- getCovar(rdd_object)
+        formu.cova <- covariates
+        
+        if (grepl("\\.", formu.cova)) 
+            formu.cova <- paste(colnames(covar), collapse = " + ")
+        if (covar.slope == "separate") {
+            formu.cova <- paste(formu.cova, "+", paste("D*(", formu.cova, ")", sep = ""), sep = " ")
+            covar$D <- dat_step1$D
+        }
+        
+        formula.cova <- as.formula(paste("~", formu.cova))
+        mf <- model.frame(formula.cova, covar, na.action = na.pass)
+        M_covar <- model.matrix(formula.cova, data = mf)
+        
+        if (covar.strat == "residual") {
+            M_covar <- data.frame(y = dat_step1$y, M_covar)
+            first_stage <- lm(y ~ ., data = M_covar)  ## regress y on covariates only
+            dat_step1$y <- residuals(first_stage)  ## change in original data
+        } else {
+            rem <- switch(covar.slope, separate = "^D$|(Intercept)", same = "(Intercept)")
+            M_covar <- M_covar[, -grep(rem, colnames(M_covar)), drop = FALSE]
+            dat_step1 <- cbind(dat_step1, M_covar)  ## add covar as regressors
+        }
+    }
+    
+    ## Colnames cleaning
+    colnames(dat_step1) <- gsub("x\\^1", "x", colnames(dat_step1))
+    
+    ## 
+    if (type == "Fuzzy") 
+        dat_step1$ins <- L
+    
+    ## return results:
+    dat_step1
+} 
diff --git a/R/placebo.R b/R/placebo.R
index 0e68416..9404dde 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -15,15 +15,14 @@
 #' plotPlacebo(reg_nonpara)
 #' 
 #' # Use with another vcov function; cluster case
-#' reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference="lm")
+#' reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference='lm')
 #' # need to be a function applied to updated object!
 #' vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 #' plotPlacebo(reg_nonpara_lminf, vcov. = vc)
 
 
 #' @export
-plotPlacebo <- function(object, device=c("ggplot", "base"), ...)
-  UseMethod("plotPlacebo")
+plotPlacebo <- function(object, device = c("ggplot", "base"), ...) UseMethod("plotPlacebo")
 
 #' @rdname plotPlacebo
 #' @export
@@ -32,255 +31,256 @@ plotPlacebo <- function(object, device=c("ggplot", "base"), ...)
 #' @param by Increments of the from-to sequence
 #' @param level Level of the confidence interval shown
 #' @param same_bw Whether to re-estimate the bandwidth at each point
-plotPlacebo.rdd_reg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, plot=TRUE, output=c("data", "ggplot"), ...){
-
-  device <- match.arg(device)
-  output <- match.arg(output)
-
-  # compute Placebos:
-  seq_vals <- computePlacebo(object=object, from=from, to=to, by=by, level=level, 
-                             same_bw=same_bw, vcov.=vcov.)
-  
-  ## Use low-level to plot:
-  plotPlacebo_low(seq_vals, device=device, plot=plot, output=output,...)
-
-  invisible(seq_vals)
+plotPlacebo.rdd_reg <- function(object, device = c("ggplot", "base"), from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, 
+    vcov. = NULL, plot = TRUE, output = c("data", "ggplot"), ...) {
+    
+    device <- match.arg(device)
+    output <- match.arg(output)
+    
+    # compute Placebos:
+    seq_vals <- computePlacebo(object = object, from = from, to = to, by = by, level = level, same_bw = same_bw, vcov. = vcov.)
+    
+    ## Use low-level to plot:
+    plotPlacebo_low(seq_vals, device = device, plot = plot, output = output, ...)
+    
+    invisible(seq_vals)
 }
 
 
 
 #' @export
-plotPlacebo.PlaceboVals <- function(object, device=c("ggplot", "base"),plot=TRUE, output=c("data", "ggplot"), ...){
-
-  device <- match.arg(device)
-  output <- match.arg(output)
-  plotPlacebo_low(object, device=device, plot=plot, output=output,...)
-
-  invisible(object)
+plotPlacebo.PlaceboVals <- function(object, device = c("ggplot", "base"), plot = TRUE, output = c("data", "ggplot"), ...) {
+    
+    device <- match.arg(device)
+    output <- match.arg(output)
+    plotPlacebo_low(object, device = device, plot = plot, output = output, ...)
+    
+    invisible(object)
 }
 
 
-plotPlacebo_low <- function(seq_vals,  device=c("ggplot", "base"), output=c("data", "ggplot"), plot=TRUE){
-
-  device <- match.arg(device)
-  output <- match.arg(output)
-
-  if(device=="base"){
-    if(plot){
-      ylims <- range(seq_vals[,c("CI_low", "CI_high")], na.rm=TRUE)
-      xlims <- range(seq_vals$cutpoint)
-      
-      dat_left <- subset(seq_vals, position=="left")
-      dat_right <- subset(seq_vals, position=="right")
-      dat_true <- subset(seq_vals, position=="True")
-      
-      plot(dat_left$cutpoint, dat_left$LATE, type="l", ylab="LATE", xlab="Cutpoints", ylim=ylims, xlim=xlims)
-      title("Placebo test")
-      abline(h=0)
-      
-      # left CI
-      lines(dat_left$cutpoint, dat_left$CI_low, lty=2)
-      lines(dat_left$cutpoint, dat_left$CI_high, lty=2) 
-      
-      # right values:
-      lines(dat_right$cutpoint, dat_right$LATE, lty=1)
-      lines(dat_right$cutpoint, dat_right$CI_low, lty=2)
-      lines(dat_right$cutpoint, dat_right$CI_high, lty=2)
-      
-      # add estimate at true cutoff 
-      points(dat_true$cutpoint, dat_true$LATE, col=2)
-      segments(dat_true$cutpoint,ylims[1]-1, dat_true$cutpoint, dat_true$LATE, col="red", lty=2) ## vertical line
-      segments(xlims[1]-1, dat_true$LATE, dat_true$cutpoint, dat_true$LATE, col="red", lty=2)
+plotPlacebo_low <- function(seq_vals, device = c("ggplot", "base"), output = c("data", "ggplot"), plot = TRUE) {
+    
+    device <- match.arg(device)
+    output <- match.arg(output)
+    
+    if (device == "base") {
+        if (plot) {
+            ylims <- range(seq_vals[, c("CI_low", "CI_high")], na.rm = TRUE)
+            xlims <- range(seq_vals$cutpoint)
+            
+            dat_left <- subset(seq_vals, position == "left")
+            dat_right <- subset(seq_vals, position == "right")
+            dat_true <- subset(seq_vals, position == "True")
+            
+            plot(dat_left$cutpoint, dat_left$LATE, type = "l", ylab = "LATE", xlab = "Cutpoints", ylim = ylims, xlim = xlims)
+            title("Placebo test")
+            abline(h = 0)
+            
+            # left CI
+            lines(dat_left$cutpoint, dat_left$CI_low, lty = 2)
+            lines(dat_left$cutpoint, dat_left$CI_high, lty = 2)
+            
+            # right values:
+            lines(dat_right$cutpoint, dat_right$LATE, lty = 1)
+            lines(dat_right$cutpoint, dat_right$CI_low, lty = 2)
+            lines(dat_right$cutpoint, dat_right$CI_high, lty = 2)
+            
+            # add estimate at true cutoff
+            points(dat_true$cutpoint, dat_true$LATE, col = 2)
+            segments(dat_true$cutpoint, ylims[1] - 1, dat_true$cutpoint, dat_true$LATE, col = "red", lty = 2)  ## vertical line
+            segments(xlims[1] - 1, dat_true$LATE, dat_true$cutpoint, dat_true$LATE, col = "red", lty = 2)
+        }
+        if (output != "data") 
+            warning("output='ggplot' only makes sense with device='ggplot'")
+    } else {
+        seq_vals_placeb <- subset(seq_vals, position != "True")
+        seq_vals_true <- subset(seq_vals, position == "True")
+        
+        # hack for decent width of error bar:
+        last_left <- nrow(subset(seq_vals_placeb, position == "left"))
+        W <- diff(seq_vals_placeb[c(last_left, last_left + 1), "cutpoint"])/5
+        
+        pl <- qplot(x = cutpoint, y = LATE, data = seq_vals_placeb, geom = "line", colour = position) + geom_smooth(aes(ymin = CI_low, 
+            ymax = CI_high), data = seq_vals_placeb, stat = "identity") + theme(legend.position = "none") + geom_hline(yintercept = 0) + 
+            geom_point(aes(x = cutpoint, y = LATE), data = seq_vals_true) + geom_errorbar(aes(ymin = CI_low, ymax = CI_high), 
+            data = seq_vals_true, width = W)
+        if (plot) 
+            print(pl)
     }
-    if(output!="data") warning("output='ggplot' only makes sense with device='ggplot'")
-  } else {
-    seq_vals_placeb <- subset(seq_vals, position!="True")
-    seq_vals_true <- subset(seq_vals, position=="True")
-
-    # hack for decent width of error bar:
-    last_left <- nrow(subset(seq_vals_placeb, position=="left"))
-    W <- diff(seq_vals_placeb[c(last_left, last_left+1), "cutpoint"])/5
-
-    pl <- qplot(x=cutpoint, y=LATE, data=seq_vals_placeb, geom="line", colour=position)+
-      geom_smooth(aes(ymin=CI_low, ymax=CI_high), data=seq_vals_placeb, stat="identity")+
-      theme(legend.position="none")+geom_hline(yintercept=0)+
-      geom_point(aes(x=cutpoint, y=LATE), data=seq_vals_true)+
-      geom_errorbar(aes(ymin=CI_low, ymax=CI_high), data=seq_vals_true, width=W)
-    if(plot) print(pl)
-  }
-
-## export (silently) results:
-  out <- switch(output, "data"=seq_vals, "ggplot"=pl)
-  invisible(out)
+    
+    ## export (silently) results:
+    out <- switch(output, data = seq_vals, ggplot = pl)
+    invisible(out)
 }
 
 
 #' @rdname plotPlacebo
 #' @export
-plotPlaceboDens <- function(object, device=c("ggplot", "base"), ...)
-  UseMethod("plotPlaceboDens")
+plotPlaceboDens <- function(object, device = c("ggplot", "base"), ...) UseMethod("plotPlaceboDens")
 
 #' @rdname plotPlacebo
 #' @export
-plotPlaceboDens.rdd_reg <- function(object, device=c("ggplot", "base"), from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL, ...){
-
-  device <- match.arg(device)
-
-  # compute Placebos:
-  seq_vals <- computePlacebo(object=object, from=from, to=to, by=by, level=level, same_bw=same_bw, vcov.=vcov.)
-  
-  ## Use low-level to plot:
-  plotPlaceboDens_low(seq_vals, device=device)
-
-  invisible(seq_vals)
+plotPlaceboDens.rdd_reg <- function(object, device = c("ggplot", "base"), from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, 
+    vcov. = NULL, ...) {
+    
+    device <- match.arg(device)
+    
+    # compute Placebos:
+    seq_vals <- computePlacebo(object = object, from = from, to = to, by = by, level = level, same_bw = same_bw, vcov. = vcov.)
+    
+    ## Use low-level to plot:
+    plotPlaceboDens_low(seq_vals, device = device)
+    
+    invisible(seq_vals)
 }
 
 
 #' @export
-plotPlaceboDens.PlaceboVals <- function(object, device=c("ggplot", "base"), ...){
-
-  device <- match.arg(device)
-  plotPlaceboDens_low(object, device=device,...)
-
-  invisible(object)
+plotPlaceboDens.PlaceboVals <- function(object, device = c("ggplot", "base"), ...) {
+    
+    device <- match.arg(device)
+    plotPlaceboDens_low(object, device = device, ...)
+    
+    invisible(object)
 }
 
 
-plotPlaceboDens_low <- function(seq_vals,  device=c("ggplot", "base")){
-
-  device <- match.arg(device)
-  seq_vals_placeb <- subset(seq_vals, position!="True")
-  perc_rejected <- 100*mean(seq_vals_placeb$p_value<0.05)
-
-
-  if(device=="base") {
-    stop("not implemented")
-  } else {
-    seq_vals_true <- subset(seq_vals, position=="True")
-
-    dens_max <- max(density(seq_vals_placeb$LATE)$y) # not efficient....
-    text_rej <- paste("Perc rejected:", perc_rejected, "%")
-
-
-    pl <- qplot(x=LATE, data=seq_vals_placeb, geom="density")+
-	  geom_vline(xintercept=0, lty=2)+geom_vline(xintercept=seq_vals_true$LATE, colour="red")+
-	  annotate("text", x = seq_vals_true$LATE,  y = dens_max, label = "LATE at true \ncutpoint ", colour="red", hjust=1)+
-	  annotate("text", x = seq_vals_true$LATE,  y = 0, label = text_rej, hjust=1, vjust=1)
-    print(pl)
-  }
-
-## export (silently) results:
-  invisible(seq_vals)
+plotPlaceboDens_low <- function(seq_vals, device = c("ggplot", "base")) {
+    
+    device <- match.arg(device)
+    seq_vals_placeb <- subset(seq_vals, position != "True")
+    perc_rejected <- 100 * mean(seq_vals_placeb$p_value < 0.05)
+    
+    
+    if (device == "base") {
+        stop("not implemented")
+    } else {
+        seq_vals_true <- subset(seq_vals, position == "True")
+        
+        dens_max <- max(density(seq_vals_placeb$LATE)$y)  # not efficient....
+        text_rej <- paste("Perc rejected:", perc_rejected, "%")
+        
+        
+        pl <- qplot(x = LATE, data = seq_vals_placeb, geom = "density") + geom_vline(xintercept = 0, lty = 2) + geom_vline(xintercept = seq_vals_true$LATE, 
+            colour = "red") + annotate("text", x = seq_vals_true$LATE, y = dens_max, label = "LATE at true \ncutpoint ", colour = "red", 
+            hjust = 1) + annotate("text", x = seq_vals_true$LATE, y = 0, label = text_rej, hjust = 1, vjust = 1)
+        print(pl)
+    }
+    
+    ## export (silently) results:
+    invisible(seq_vals)
 }
 
 
 #' @rdname plotPlacebo
 #' @export
 
-computePlacebo <- function(object, from=0.25, to=0.75, by=0.1, level=0.95, same_bw=FALSE, vcov.=NULL){
-
-  bw <- getBW(object)
-  hasBw <- !is.null(bw)
-  if(!hasBw) bw <- NA
-
-  if(!is.null(vcov.)&& !is.function(vcov.)) stop("'arg' vcov. should be a function (so can be updated at each step, not a matrix")
-  cutpoint <- getCutpoint(object)
-  forc_var <- getOriginalX(object)
-
-## set grid:
-  quants_left  <- quantile(forc_var[forc_var=cutpoint], probs=c(from, to))
-
-  seqi_left  <- seq(from=quants_left[1], to=quants_left[2], by=by)
-  seqi_right <- seq(from=quants_right[1], to=quants_right[2], by=by)
-  seqi <- c(seqi_left, seqi_right)
-
-  n_seqi_left <- length(seqi_left)
-  n_seqi_right <- length(seqi_right)
-  n_seqi <- length(seqi)
-
-## set matrix for results:
-  seq_vals <- matrix(NA, nrow=n_seqi, ncol=8)
-  colnames(seq_vals) <- c("cutpoint", "position", "LATE", "se", "p_value", "CI_low", "CI_high", "bw")
-  seq_vals[, "cutpoint"] <- seqi
-
-## get original call:
-  object_call <- getCall(object)
-
-## original dataset:
-  dat_orig <- eval(object_call$rdd_object)
-  hasCov <- hasCovar(dat_orig)
-
-## run each time:
-  for(i in seq_along(seqi)){
-
-    ## select sample
-    if(seqi[i]cutpoint) ## exclude x>cutpoint
+computePlacebo <- function(object, from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, vcov. = NULL) {
+    
+    bw <- getBW(object)
+    hasBw <- !is.null(bw)
+    if (!hasBw) 
+        bw <- NA
+    
+    if (!is.null(vcov.) && !is.function(vcov.)) 
+        stop("'arg' vcov. should be a function (so can be updated at each step, not a matrix")
+    cutpoint <- getCutpoint(object)
+    forc_var <- getOriginalX(object)
+    
+    ## set grid:
+    quants_left <- quantile(forc_var[forc_var < cutpoint], probs = c(from, to))
+    quants_right <- quantile(forc_var[forc_var >= cutpoint], probs = c(from, to))
+    
+    seqi_left <- seq(from = quants_left[1], to = quants_left[2], by = by)
+    seqi_right <- seq(from = quants_right[1], to = quants_right[2], by = by)
+    seqi <- c(seqi_left, seqi_right)
+    
+    n_seqi_left <- length(seqi_left)
+    n_seqi_right <- length(seqi_right)
+    n_seqi <- length(seqi)
+    
+    ## set matrix for results:
+    seq_vals <- matrix(NA, nrow = n_seqi, ncol = 8)
+    colnames(seq_vals) <- c("cutpoint", "position", "LATE", "se", "p_value", "CI_low", "CI_high", "bw")
+    seq_vals[, "cutpoint"] <- seqi
+    
+    ## get original call:
+    object_call <- getCall(object)
+    
+    ## original dataset:
+    dat_orig <- eval(object_call$rdd_object)
+    hasCov <- hasCovar(dat_orig)
+    
+    ## run each time:
+    for (i in seq_along(seqi)) {
+        
+        ## select sample
+        if (seqi[i] < cutpoint) {
+            dat_sides <- subset(dat_orig, x < cutpoint)
+        } else {
+            dat_sides <- subset(dat_orig, x > cutpoint)  ## exclude x>cutpoint
+        }
+        
+        
+        ## change the cutpoint, reattribute new data:
+        attr(dat_sides, "cutpoint") <- seqi[i]
+        object_call$rdd_object <- dat_sides
+        
+        ## Change bw if(same_bw=FALSE)
+        if (hasBw) 
+            object_call$bw <- if (!same_bw) 
+                rdd_bw_ik(dat_sides) else bw
+        
+        ## Re-estimate model with new cutpoint/bw
+        object_new <- eval(object_call)  # rdd_reg_np(dat_sides, bw=bw_reg)
+        
+        ## assign results (LATE and se)
+        if (!inherits(object_new, "try-error")) {
+            
+            # check if lmtest is installed
+            if (!requireNamespace("lmtest", quietly = TRUE)) {
+                stop("The package 'lmtest' is needed for this function to work. Please install it.", call. = FALSE)
+            }
+            
+            # load the lmtest package require('lmtest')
+            
+            seq_vals[i, "LATE"] <- rdd_coef(object_new)
+            if (!is.null(vcov.)) {
+                co <- lmtest::coeftest(object_new, vcov. = vcov.)["D", , drop = FALSE]
+            } else {
+                co <- rdd_coef(object_new, allInfo = TRUE)
+            }
+            seq_vals[i, "se"] <- co[, "Std. Error"]
+            seq_vals[i, "p_value"] <- co[, 4]
+            seq_vals[i, "bw"] <- getBW(object_new, force.na = TRUE)
+            seq_vals[i, c("CI_low", "CI_high")] <- waldci(object_new, level = level, vcov. = vcov.)["D", ]  ## confint version working with vcov. 
+        }
     }
-
     
-    ## change the cutpoint, reattribute new data:
-    attr(dat_sides, "cutpoint") <- seqi[i]
-    object_call$rdd_object <- dat_sides
-
-    ## Change bw if(same_bw=FALSE)
-    if(hasBw) object_call$bw <- if(!same_bw) rdd_bw_ik(dat_sides) else bw
     
-    ## Re-estimate model with new cutpoint/bw
-    object_new <- eval(object_call) # rdd_reg_np(dat_sides, bw=bw_reg)
-
-    ## assign results (LATE and se)
-    if(!inherits(object_new, "try-error")){
-      
-      # check if lmtest is installed
-      if (!requireNamespace("lmtest", quietly = TRUE)) {
-        stop("The package 'lmtest' is needed for this function to work. Please install it.",
-             call. = FALSE)
-      }
-      
-      # load the lmtest package
-      # require("lmtest")
-
-      seq_vals[i,"LATE"] <- rdd_coef(object_new)
-      if(!is.null(vcov.)) {
-        co <- lmtest::coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE]
-      } else {
-        co <- rdd_coef(object_new, allInfo=TRUE)
-      }
-      seq_vals[i,"se"] <- co[,"Std. Error"]
-      seq_vals[i,"p_value"] <- co[,4]
-      seq_vals[i,"bw"] <- getBW(object_new, force.na=TRUE)
-      seq_vals[i,c("CI_low", "CI_high")] <- waldci(object_new, level=level, vcov.=vcov.)["D",] ## confint version working with vcov. 
+    ## Add midpoint:
+    if (!is.null(vcov.)) {
+        true_co <- coeftest(object, vcov. = vcov.)["D", , drop = FALSE]
+    } else {
+        true_co <- rdd_coef(object, allInfo = TRUE)
     }
-  }
-
-
-## Add midpoint:
-  if(!is.null(vcov.)) {
-    true_co <- coeftest(object, vcov.=vcov.)["D",, drop=FALSE]
-  } else {
-    true_co <- rdd_coef(object, allInfo=TRUE)
-  }
-  true_confint <- as.numeric(waldci(object, level=level, vcov.=vcov.)["D",])
-  true <- data.frame(cutpoint=cutpoint, position="True", LATE=rdd_coef(object), 
-		      se=true_co["D","Std. Error"], p_value=true_co["D",4], 
-		      CI_low=true_confint[1], CI_high=true_confint[2], bw=bw)
-
-
-## output
-  seq_vals <- as.data.frame(seq_vals)
-  seq_vals$position <- ifelse(seq_vals$cutpoint < cutpoint, "left", "right")
-
-  seq_vals <- rbind(seq_vals, true)
-  seq_vals <- seq_vals[order(seq_vals$cutpoint),]
-  rownames(seq_vals) <- seq_len(nrow(seq_vals))
-
-
-#   seq_vals$position <- if(seq_vals$cutpoint == cutpoint) "True"
-
-  class(seq_vals) <- c("PlaceboVals", "data.frame")
-  return(seq_vals)
-}
+    true_confint <- as.numeric(waldci(object, level = level, vcov. = vcov.)["D", ])
+    true <- data.frame(cutpoint = cutpoint, position = "True", LATE = rdd_coef(object), se = true_co["D", "Std. Error"], p_value = true_co["D", 
+        4], CI_low = true_confint[1], CI_high = true_confint[2], bw = bw)
+    
+    
+    ## output
+    seq_vals <- as.data.frame(seq_vals)
+    seq_vals$position <- ifelse(seq_vals$cutpoint < cutpoint, "left", "right")
+    
+    seq_vals <- rbind(seq_vals, true)
+    seq_vals <- seq_vals[order(seq_vals$cutpoint), ]
+    rownames(seq_vals) <- seq_len(nrow(seq_vals))
+    
+    
+    # seq_vals$position <- if(seq_vals$cutpoint == cutpoint) 'True'
+    
+    class(seq_vals) <- c("PlaceboVals", "data.frame")
+    return(seq_vals)
+} 
diff --git a/R/plotBin.R b/R/plotBin.R
index d59608b..d253b00 100644
--- a/R/plotBin.R
+++ b/R/plotBin.R
@@ -1,6 +1,6 @@
 #' Bin plotting
 #' 
-#' Do a "scatterplot bin smoothing"
+#' Do a 'scatterplot bin smoothing'
 #' 
 #' @param x Forcing variable
 #' @param y Output
@@ -15,59 +15,61 @@
 #' @references McCrary, Justin. 
 
 
-plotBin <-  function(x, y, h=0.05, nbins=NULL, cutpoint=0, plot=TRUE, type=c("value", "number"), xlim=range(x, na.rm=TRUE), cex=0.9,main=NULL, xlab, ylab, ...){
-
-  type <- match.arg(type)
-  x_name <- if(missing(xlab)) deparse(substitute(x)) else xlab
-  y_name <- if(missing(ylab)) deparse(substitute(y)) else ylab
-
-
-## Set intervals and midpoints
-  min_x <- min(xlim)
-  max_x <- max(xlim)
-
-  if(!is.null(nbins)) h <- diff(xlim)/nbins
-
-  K0 <- ceiling((cutpoint-min_x)/h) # Number of cells on left
-  K1 <- ceiling((cutpoint+max_x)/h) # Number of cells on right
-  K <- K0+K1
-  if(!is.null(nbins) && K!=nbins) {
-    ranges <- c(cutpoint-min_x, cutpoint+max_x)
-    if(which.min(ranges)==1) {
-      K0 <- K0-1 
-    } else {
-      K1 <- K1-1 
+plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, type = c("value", "number"), xlim = range(x, na.rm = TRUE), 
+    cex = 0.9, main = NULL, xlab, ylab, ...) {
+    
+    type <- match.arg(type)
+    x_name <- if (missing(xlab)) 
+        deparse(substitute(x)) else xlab
+    y_name <- if (missing(ylab)) 
+        deparse(substitute(y)) else ylab
+    
+    
+    ## Set intervals and midpoints
+    min_x <- min(xlim)
+    max_x <- max(xlim)
+    
+    if (!is.null(nbins)) 
+        h <- diff(xlim)/nbins
+    
+    K0 <- ceiling((cutpoint - min_x)/h)  # Number of cells on left
+    K1 <- ceiling((cutpoint + max_x)/h)  # Number of cells on right
+    K <- K0 + K1
+    if (!is.null(nbins) && K != nbins) {
+        ranges <- c(cutpoint - min_x, cutpoint + max_x)
+        if (which.min(ranges) == 1) {
+            K0 <- K0 - 1
+        } else {
+            K1 <- K1 - 1
+        }
+        K <- K0 + K1
     }
-    K <- K0+K1
-  }
-
-  b_k <- cutpoint - (K0-c(1:K)+1)*h # Lee and Lemieux (2010) p. 308
-  mid_points_bk <- b_k+h/2
-  n_bins <- length(mid_points_bk)
-  brk <- c(b_k,cutpoint + (K1+2)*h)
-
-## compute output (mean of count)
-  intervs <- cut(x, breaks=brk, include.lowest=TRUE)
-  table_intervs <- table(intervs)
-  n_non0_intervs <- sum(table_intervs!=0)
-
-  y2 <- switch(type, 
-		"value" =tapply(y, intervs, mean, na.rm=TRUE),
-		"number" =table_intervs)
-
-
-## plot
-  if(plot){
-    plot(mid_points_bk, as.numeric(y2), pch=19, cex=cex, xlab=x_name, ylab=y_name, xlim=xlim,...)
-    title(main=main, sub=paste("h=", round(h,4), ",\\tn bins=", n_non0_intervs, sep=""))
-    abline(v=cutpoint, lty=2)
-  }
-
-## return invisible result
-  res <- data.frame(x=mid_points_bk,y=y2)
-  invisible(res)
+    
+    b_k <- cutpoint - (K0 - c(1:K) + 1) * h  # Lee and Lemieux (2010) p. 308
+    mid_points_bk <- b_k + h/2
+    n_bins <- length(mid_points_bk)
+    brk <- c(b_k, cutpoint + (K1 + 2) * h)
+    
+    ## compute output (mean of count)
+    intervs <- cut(x, breaks = brk, include.lowest = TRUE)
+    table_intervs <- table(intervs)
+    n_non0_intervs <- sum(table_intervs != 0)
+    
+    y2 <- switch(type, value = tapply(y, intervs, mean, na.rm = TRUE), number = table_intervs)
+    
+    
+    ## plot
+    if (plot) {
+        plot(mid_points_bk, as.numeric(y2), pch = 19, cex = cex, xlab = x_name, ylab = y_name, xlim = xlim, ...)
+        title(main = main, sub = paste("h=", round(h, 4), ",\\tn bins=", n_non0_intervs, sep = ""))
+        abline(v = cutpoint, lty = 2)
+    }
+    
+    ## return invisible result
+    res <- data.frame(x = mid_points_bk, y = y2)
+    invisible(res)
 }
 
 
 
-
+ 
diff --git a/R/plotSensi.R b/R/plotSensi.R
index 3b1498f..6aec0d4 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -23,201 +23,209 @@
 #' bw_ik <- rdd_bw_ik(Lee2008_rdd)
 #' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 #' plotSensi(reg_nonpara)
-#' plotSensi(reg_nonpara, device="base")
+#' plotSensi(reg_nonpara, device='base')
 #'
 #' #Parametric estimate:
 #' reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
 #' plotSensi(reg_para_ik)
-#' plotSensi(reg_para_ik, type="facet")
+#' plotSensi(reg_para_ik, type='facet')
 
 
 
-###################################
-##### plotSensi: function to plot sensitivity to bandwidth
-###################################
+################################### plotSensi: function to plot sensitivity to bandwidth
 
 #' @export
-plotSensi <- function(rdd_regobject, from, to, by=0.01, level=0.95, output=c("data", "ggplot"), plot=TRUE, ...)
-  UseMethod("plotSensi")
+plotSensi <- function(rdd_regobject, from, to, by = 0.01, level = 0.95, output = c("data", "ggplot"), plot = TRUE, ...) UseMethod("plotSensi")
 
 #' @rdname plotSensi
 #' @export
 #' @param vcov. Specific covariance function to pass to coeftest. See help of package \code{\link[sandwich]{sandwich}}
-plotSensi.rdd_reg_np <- function(rdd_regobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, device=c("ggplot", "base"), vcov.=NULL, ...){
-
-  device <- match.arg(device)
-  output <- match.arg(output)
-  if(!is.null(vcov.)&& !is.function(vcov.)) stop("'arg' vcov. should be a function (so can be updated at each step, not a matrix")
-  if(device=="base"&&output=="ggplot") stop("Arg 'output=ggplot' only relevant for 'device=ggplot'")
-
-  object <- rdd_regobject
-  bw <- getBW(object)
-  est <- rdd_coef(object)
-
-## set grid:
-  if(missing(from))  from <- max(1e-3, bw-0.1)
-  if(missing(to))  to <- bw+0.1
-
-  seq_bw <- unique(sort(c(bw,seq(from=from, to=to, by=by))))
-  n_seq_bw <- length(seq_bw)
-
-## set matrix for results:
-  seq_vals <- matrix(NA, nrow=n_seq_bw, ncol=6)
-  colnames(seq_vals) <- c("bw", "LATE", "se", "p_value", "CI_low", "CI_high")
-  seq_vals[,"bw"] <- seq_bw
-
-## get call:
-  object_call <- getCall(object)
-
-## run each time:
-  for(i in seq_along(seq_bw)){
-    object_call$bw <- seq_bw[i]
-    object_new <- try(eval(object_call), silent=TRUE)
-    if(!inherits(object_new, "try-error")){
-      seq_vals[i,"LATE"] <- rdd_coef(object_new)
-      if(!is.null(vcov.)) {
-	co <- coeftest(object_new, vcov.=vcov.)["D",, drop=FALSE]
-      } else {
-	co <- rdd_coef(object_new, allInfo=TRUE)
-      }
-      seq_vals[i,"se"] <- co[,"Std. Error"]
-      seq_vals[i,"p_value"] <- co[,4]
-      seq_vals[i,c("CI_low", "CI_high")] <- waldci(object_new, level=level, vcov.=vcov.)["D",] ## confint version working with vcov. 
+plotSensi.rdd_reg_np <- function(rdd_regobject, from, to, by = 0.05, level = 0.95, output = c("data", "ggplot"), plot = TRUE, 
+    device = c("ggplot", "base"), vcov. = NULL, ...) {
+    
+    device <- match.arg(device)
+    output <- match.arg(output)
+    if (!is.null(vcov.) && !is.function(vcov.)) 
+        stop("'arg' vcov. should be a function (so can be updated at each step, not a matrix")
+    if (device == "base" && output == "ggplot") 
+        stop("Arg 'output=ggplot' only relevant for 'device=ggplot'")
+    
+    object <- rdd_regobject
+    bw <- getBW(object)
+    est <- rdd_coef(object)
+    
+    ## set grid:
+    if (missing(from)) 
+        from <- max(0.001, bw - 0.1)
+    if (missing(to)) 
+        to <- bw + 0.1
+    
+    seq_bw <- unique(sort(c(bw, seq(from = from, to = to, by = by))))
+    n_seq_bw <- length(seq_bw)
+    
+    ## set matrix for results:
+    seq_vals <- matrix(NA, nrow = n_seq_bw, ncol = 6)
+    colnames(seq_vals) <- c("bw", "LATE", "se", "p_value", "CI_low", "CI_high")
+    seq_vals[, "bw"] <- seq_bw
+    
+    ## get call:
+    object_call <- getCall(object)
+    
+    ## run each time:
+    for (i in seq_along(seq_bw)) {
+        object_call$bw <- seq_bw[i]
+        object_new <- try(eval(object_call), silent = TRUE)
+        if (!inherits(object_new, "try-error")) {
+            seq_vals[i, "LATE"] <- rdd_coef(object_new)
+            if (!is.null(vcov.)) {
+                co <- coeftest(object_new, vcov. = vcov.)["D", , drop = FALSE]
+            } else {
+                co <- rdd_coef(object_new, allInfo = TRUE)
+            }
+            seq_vals[i, "se"] <- co[, "Std. Error"]
+            seq_vals[i, "p_value"] <- co[, 4]
+            seq_vals[i, c("CI_low", "CI_high")] <- waldci(object_new, level = level, vcov. = vcov.)["D", ]  ## confint version working with vcov. 
+        }
     }
-  }
-
-
-## plot results:
-  seq_vals <- as.data.frame(seq_vals)
-  if(device=="base" && plot){
-    ra <- range(seq_vals[,c("CI_low", "CI_high")], na.rm=TRUE)
-    plot(seq_vals[,"bw"], seq_vals[,"LATE"], type="l", ylab="LATE", xlab="bandwidth", ylim=ra)
-    title("Sensitivity to bandwidth choice")
-    lines(seq_bw, seq_vals[,"CI_low"], lty=2)
-    lines(seq_bw, seq_vals[,"CI_high"], lty=2) #
-
     
-    ## add optim in case: 
-    points(bw, est, col="red")
-    segments(bw,0, bw, est, col="red", lty=2)
-    segments(0,est, bw, est, col="red", lty=2)
-  } else {
-    sensPlot <- qplot(x=bw, y=LATE, data=seq_vals, geom="line")
-    sensPlot <- sensPlot+ geom_smooth(aes(ymax = CI_high, ymin=CI_low),data=seq_vals, stat="identity") # add the conf int
-    point.df <- data.frame(bw=bw, LATE=est)
-    sensPlot <- sensPlot + geom_point(data=point.df) # add the conf int
-    sensPlot <- sensPlot + geom_vline(xintercept=0, lty=2)
-    if(plot) print(sensPlot)
-  }
-
-## export (silently) results:
-  out <- switch(output, "data"=seq_vals, "ggplot"=sensPlot)
-  invisible(out)
+    
+    ## plot results:
+    seq_vals <- as.data.frame(seq_vals)
+    if (device == "base" && plot) {
+        ra <- range(seq_vals[, c("CI_low", "CI_high")], na.rm = TRUE)
+        plot(seq_vals[, "bw"], seq_vals[, "LATE"], type = "l", ylab = "LATE", xlab = "bandwidth", ylim = ra)
+        title("Sensitivity to bandwidth choice")
+        lines(seq_bw, seq_vals[, "CI_low"], lty = 2)
+        lines(seq_bw, seq_vals[, "CI_high"], lty = 2)  #
+        
+        
+        ## add optim in case:
+        points(bw, est, col = "red")
+        segments(bw, 0, bw, est, col = "red", lty = 2)
+        segments(0, est, bw, est, col = "red", lty = 2)
+    } else {
+        sensPlot <- qplot(x = bw, y = LATE, data = seq_vals, geom = "line")
+        sensPlot <- sensPlot + geom_smooth(aes(ymax = CI_high, ymin = CI_low), data = seq_vals, stat = "identity")  # add the conf int
+        point.df <- data.frame(bw = bw, LATE = est)
+        sensPlot <- sensPlot + geom_point(data = point.df)  # add the conf int
+        sensPlot <- sensPlot + geom_vline(xintercept = 0, lty = 2)
+        if (plot) 
+            print(sensPlot)
+    }
+    
+    ## export (silently) results:
+    out <- switch(output, data = seq_vals, ggplot = sensPlot)
+    invisible(out)
 }
 
 
 #' @rdname plotSensi
 #' @export
-plotSensi.rdd_reg_lm <- function(rdd_regobject, from, to, by=0.05, level=0.95, output=c("data", "ggplot"), plot=TRUE, order, type=c("colour", "facet"),  ...){
-
-  type <- match.arg(type)
-  output <- match.arg(output)
-  object <- rdd_regobject
-  est <- rdd_coef(object)
-  bw <- getBW(object)
-  origOrder <- getOrder(object)
-  hasBw <- !is.null(bw)
-  if(!hasBw&type=="facet") stop("Arg 'type=facet' works only when the parametric regression was estimated with a bandwidth")
-
-## set grid:
-  if(hasBw){
-    if(missing(from))  from <- max(1e-3, bw-0.1)
-    if(missing(to))  to <- bw+0.1
-
-    seq_bw <- unique(sort(c(bw,seq(from=from, to=to, by=by))))
-    n_seq_bw <- length(seq_bw)
-  } else {
-    if(!all(c(missing(from), missing(to)))) warning("Args 'from' and 'to' not considered since original input has no bw")
-    n_seq_bw <- 1
-    seq_bw <- NULL
-  }
-
-  if(missing(order)) order <- 0:(getOrder(rdd_regobject)+2)
-  seq_ord <- order
-  n_seq_ord <- length(seq_ord)
-
-## set matrix for results:
-  seq_vals <- matrix(NA, nrow=n_seq_bw*n_seq_ord, ncol=6)
-  colnames(seq_vals) <- c("bw", "order", "LATE", "se", "CI_low", "CI_high")
-
-## get call:
-  object_call <- attr(object, "RDDcall")
-
-## guess if obtained with ikbandwidth? (trick: call$bw would be empty)
-#   is_ikband <- is.null(object_call$bw)
-
-## run each time:
-  for(j in 1:length(seq_ord)){
-    for(i in 1:n_seq_bw){
-      # assign new order/bw, and estimate:
-      object_call$bw <- seq_bw[i]
-      object_call$order <- seq_ord[j]
-      object_new <- try(eval(object_call), silent=TRUE)
-
-      # put parameters bw/order into matrix:
-      seq_vals[i+(j-1)*n_seq_bw,"bw"] <- if(is.null(seq_bw[i])) NA else seq_bw[i]
-      seq_vals[i+(j-1)*n_seq_bw,"order"] <- seq_ord[j]
-
-      # put output estim/se into matrix:
-      if(!inherits(object_new, "try-error")){
-        co <- rdd_coef(object_new, allInfo=TRUE)
-        seq_vals[i+(j-1)*n_seq_bw,"LATE"] <- co[,1]
-        seq_vals[i+(j-1)*n_seq_bw,"se"] <- co[,2]
-      } else {
-        warning("Problem evaluating model with new bw=", 
-                object_call$bw, " and new order=",object_call$order, ".")
-      }
+plotSensi.rdd_reg_lm <- function(rdd_regobject, from, to, by = 0.05, level = 0.95, output = c("data", "ggplot"), plot = TRUE, 
+    order, type = c("colour", "facet"), ...) {
+    
+    type <- match.arg(type)
+    output <- match.arg(output)
+    object <- rdd_regobject
+    est <- rdd_coef(object)
+    bw <- getBW(object)
+    origOrder <- getOrder(object)
+    hasBw <- !is.null(bw)
+    if (!hasBw & type == "facet") 
+        stop("Arg 'type=facet' works only when the parametric regression was estimated with a bandwidth")
+    
+    ## set grid:
+    if (hasBw) {
+        if (missing(from)) 
+            from <- max(0.001, bw - 0.1)
+        if (missing(to)) 
+            to <- bw + 0.1
+        
+        seq_bw <- unique(sort(c(bw, seq(from = from, to = to, by = by))))
+        n_seq_bw <- length(seq_bw)
+    } else {
+        if (!all(c(missing(from), missing(to)))) 
+            warning("Args 'from' and 'to' not considered since original input has no bw")
+        n_seq_bw <- 1
+        seq_bw <- NULL
     }
-  }
-
-
-
-## compute intervals:
-  probs <- (1 - level)/2
-  probs <- c(probs, 1 - probs)
-  quants <- qnorm(probs)
-  seq_vals[,"CI_low"] <- seq_vals[,"LATE"] +quants[1]*seq_vals[,"se"]
-  seq_vals[,"CI_high"] <- seq_vals[,"LATE"] +quants[2]*seq_vals[,"se"]
-
-
-## plot results:
-  seq_vals_df <- as.data.frame(seq_vals)
-  rownames(seq_vals_df) <- 1:nrow(seq_vals_df)
-  if(hasBw) seq_vals_df$order <- as.factor(seq_vals_df$order)
-
-
-  if(type=="colour"){
-    if(hasBw){
-      est_point <- data.frame(bw=bw, LATE=est, order=as.factor(origOrder))
-      sensPlot <- qplot(x=bw, y=LATE, data=seq_vals_df, colour=order, geom="line")+
-        geom_point(data=est_point)+
-        geom_smooth(aes(ymin=CI_low, ymax=CI_high), data=seq_vals_df, stat="identity")
+    
+    if (missing(order)) 
+        order <- 0:(getOrder(rdd_regobject) + 2)
+    seq_ord <- order
+    n_seq_ord <- length(seq_ord)
+    
+    ## set matrix for results:
+    seq_vals <- matrix(NA, nrow = n_seq_bw * n_seq_ord, ncol = 6)
+    colnames(seq_vals) <- c("bw", "order", "LATE", "se", "CI_low", "CI_high")
+    
+    ## get call:
+    object_call <- attr(object, "RDDcall")
+    
+    ## guess if obtained with ikbandwidth? (trick: call$bw would be empty) is_ikband <- is.null(object_call$bw)
+    
+    ## run each time:
+    for (j in 1:length(seq_ord)) {
+        for (i in 1:n_seq_bw) {
+            # assign new order/bw, and estimate:
+            object_call$bw <- seq_bw[i]
+            object_call$order <- seq_ord[j]
+            object_new <- try(eval(object_call), silent = TRUE)
+            
+            # put parameters bw/order into matrix:
+            seq_vals[i + (j - 1) * n_seq_bw, "bw"] <- if (is.null(seq_bw[i])) 
+                NA else seq_bw[i]
+            seq_vals[i + (j - 1) * n_seq_bw, "order"] <- seq_ord[j]
+            
+            # put output estim/se into matrix:
+            if (!inherits(object_new, "try-error")) {
+                co <- rdd_coef(object_new, allInfo = TRUE)
+                seq_vals[i + (j - 1) * n_seq_bw, "LATE"] <- co[, 1]
+                seq_vals[i + (j - 1) * n_seq_bw, "se"] <- co[, 2]
+            } else {
+                warning("Problem evaluating model with new bw=", object_call$bw, " and new order=", object_call$order, ".")
+            }
+        }
+    }
+    
+    
+    
+    ## compute intervals:
+    probs <- (1 - level)/2
+    probs <- c(probs, 1 - probs)
+    quants <- qnorm(probs)
+    seq_vals[, "CI_low"] <- seq_vals[, "LATE"] + quants[1] * seq_vals[, "se"]
+    seq_vals[, "CI_high"] <- seq_vals[, "LATE"] + quants[2] * seq_vals[, "se"]
+    
+    
+    ## plot results:
+    seq_vals_df <- as.data.frame(seq_vals)
+    rownames(seq_vals_df) <- 1:nrow(seq_vals_df)
+    if (hasBw) 
+        seq_vals_df$order <- as.factor(seq_vals_df$order)
+    
+    
+    if (type == "colour") {
+        if (hasBw) {
+            est_point <- data.frame(bw = bw, LATE = est, order = as.factor(origOrder))
+            sensPlot <- qplot(x = bw, y = LATE, data = seq_vals_df, colour = order, geom = "line") + geom_point(data = est_point) + 
+                geom_smooth(aes(ymin = CI_low, ymax = CI_high), data = seq_vals_df, stat = "identity")
+        } else {
+            est_point <- data.frame(LATE = est, order = origOrder)
+            sensPlot <- qplot(x = order, y = LATE, data = seq_vals_df, geom = "line") + geom_point(data = est_point) + geom_smooth(aes(ymin = CI_low, 
+                ymax = CI_high), data = seq_vals_df, stat = "identity")
+        }
     } else {
-      est_point <- data.frame(LATE=est, order=origOrder)
-      sensPlot <- qplot(x=order, y=LATE, data=seq_vals_df, geom="line")+
-        geom_point(data=est_point)+
-        geom_smooth(aes(ymin=CI_low, ymax=CI_high), data=seq_vals_df, stat="identity")
+        sensPlot <- qplot(x = bw, y = LATE, data = seq_vals_df, geom = "line") + facet_grid(order ~ .) + geom_smooth(aes(ymin = CI_low, 
+            ymax = CI_high), data = seq_vals_df, stat = "identity")
     }
-  } else {
-    sensPlot <- qplot(x=bw, y=LATE, data= seq_vals_df, geom="line")+facet_grid(order~.)+
-	  geom_smooth(aes(ymin=CI_low, ymax=CI_high), data=seq_vals_df, stat="identity")
-  }
-
-  if(plot) print(sensPlot)
-
-
-
-## export (silently) results:
-  out <- switch(output, "data"=seq_vals_df, "ggplot"=sensPlot)
-  invisible(out)
-}
+    
+    if (plot) 
+        print(sensPlot)
+    
+    
+    
+    ## export (silently) results:
+    out <- switch(output, data = seq_vals_df, ggplot = sensPlot)
+    invisible(out)
+} 
diff --git a/R/qplot_experim.R b/R/qplot_experim.R
index 45c5d50..58dad24 100644
--- a/R/qplot_experim.R
+++ b/R/qplot_experim.R
@@ -1,61 +1,63 @@
 
 
-gplot <- function(x,  h, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=3,type=c("base", "ggplot"),...){
-  object <- x
-  cutpoint <- getCutpoint(object)
-
-## bandwidth: use Ruppert, Sheather and Wand (KernSmooth:::dpill)
-  if(missing(h)) {
-    if(!all(xlim==range(object$x, na.rm=TRUE))){
-      object <- subset(object, object$x> min(xlim) & object$x< max(xlim))
-    }
-    h <- rdd_bw_rsw(object) 
-    if(is_even(nplot)) {
-      se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
+gplot <- function(x, h, xlim = range(object$x, na.rm = TRUE), cex = 0.7, nplot = 3, type = c("base", "ggplot"), ...) {
+    object <- x
+    cutpoint <- getCutpoint(object)
+    
+    ## bandwidth: use Ruppert, Sheather and Wand (KernSmooth:::dpill)
+    if (missing(h)) {
+        if (!all(xlim == range(object$x, na.rm = TRUE))) {
+            object <- subset(object, object$x > min(xlim) & object$x < max(xlim))
+        }
+        h <- rdd_bw_rsw(object)
+        if (is_even(nplot)) {
+            se <- seq(from = 1 - (sum(1:nplot < (nplot/2))) * 0.2, to = 1 + (sum(1:nplot > (nplot/2))) * 0.2, by = 0.2)
+        } else {
+            se <- seq(from = 1 - floor(nplot/2) * 0.2, to = 1 + floor(nplot/2) * 0.2, by = 0.2)
+        }
+        hs <- if (nplot == 1) 
+            h else se * h
     } else {
-      se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
+        if (length(h) == 1) {
+            if (is_even(nplot)) {
+                se <- seq(from = 1 - (sum(1:nplot < (nplot/2))) * 0.2, to = 1 + (sum(1:nplot > (nplot/2))) * 0.2, by = 0.2)
+            } else {
+                se <- seq(from = 1 - floor(nplot/2) * 0.2, to = 1 + floor(nplot/2) * 0.2, by = 0.2)
+            }
+            hs <- if (nplot == 1) 
+                h else se * h
+        } else {
+            if (length(h == nplot)) {
+                hs <- h
+            } else {
+                stop("Length of h should be either one or equal to nplot (", nplot, ")")
+            }
+        }
     }
-    hs <- if(nplot==1) h else se *h
-  } else {
-    if(length(h)==1){
-      if(is_even(nplot)) {
-	se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
-      } else {
-	se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
-      }
-      hs <- if(nplot==1) h else se *h
+    
+    
+    
+    
+    ## plot
+    if (type == "base") {
+        par_orig <- par()
+        par(mfrow = c(nplot, 1))
+        for (i in 1:nplot) {
+            plotBin(x = object$x, y = object$y, cutpoint = cutpoint, h = hs[i], xlim = xlim, cex = cex)
+        }
     } else {
-      if(length(h==nplot)){
-	hs <- h
-      } else {
-	stop("Length of h should be either one or equal to nplot (", nplot, ")")
-      }
-    }
-  }
-
-
-  
-
-## plot
-  if(type=="base"){
-    par_orig <- par()
-    par(mfrow=c(nplot,1))
-    for(i in 1:nplot){
-      plotBin(x=object$x, y=object$y, cutpoint=cutpoint, h=hs[i], xlim=xlim, cex=cex)
+        
+        plotBin_out <- plotBin(x = object$x, y = object$y, cutpoint = cutpoint, h = hs[1], xlim = xlim, cex = cex, plot = FALSE)
+        plotBin_out$h <- rep(hs[1], nrow(plotBin_out))
+        for (i in 2:nplot) {
+            new <- plotBin(x = object$x, y = object$y, cutpoint = cutpoint, h = hs[i], xlim = xlim, cex = cex)
+            new$h <- rep(hs[i], nrow(new))
+            plotBin_out <- rbind(plotBin_out, new)
+        }
+        
+        plotBin_out$h <- round(plotBin_out$h, 4)
+        qplot(x = x, y = y, data = plotBin_out) + facet_grid(h ~ .)
+        
     }
-  } else {
-
-    plotBin_out <- plotBin(x=object$x, y=object$y, cutpoint=cutpoint, h=hs[1], xlim=xlim, cex=cex, plot=FALSE)
-    plotBin_out$h <- rep(hs[1], nrow(plotBin_out))
-    for(i in 2:nplot){
-      new <- plotBin(x=object$x, y=object$y, cutpoint=cutpoint, h=hs[i], xlim=xlim, cex=cex)
-      new$h <- rep(hs[i], nrow(new))
-      plotBin_out <- rbind(plotBin_out, new)
-    }
-
-    plotBin_out$h <- round(plotBin_out$h,4)
-    qplot(x=x, y=y, data=plotBin_out)+facet_grid(h~.)
-
-  }
-
-}
+    
+} 
diff --git a/R/rdd_coef.R b/R/rdd_coef.R
index 282ae30..a8fb39c 100644
--- a/R/rdd_coef.R
+++ b/R/rdd_coef.R
@@ -10,24 +10,27 @@
 #' @export
 
 
-rdd_coef <- function(object, allInfo=FALSE, allCo=FALSE, ...)
-  UseMethod("rdd_coef")
+rdd_coef <- function(object, allInfo = FALSE, allCo = FALSE, ...) UseMethod("rdd_coef")
 
 #' @rdname rdd_coef
 #' @export
-rdd_coef.default <- function(object, allInfo=FALSE, allCo=FALSE, ...){
-  res <- coef(summary(object))
-  if(!allCo) res <- res["D",, drop=FALSE]
-  if(!allInfo) res <- res[,"Estimate"]
-  res
+rdd_coef.default <- function(object, allInfo = FALSE, allCo = FALSE, ...) {
+    res <- coef(summary(object))
+    if (!allCo) 
+        res <- res["D", , drop = FALSE]
+    if (!allInfo) 
+        res <- res[, "Estimate"]
+    res
 }
 
 #' @rdname rdd_coef
 #' @export
-rdd_coef.rdd_reg_np <- function(object, allInfo=FALSE, allCo=FALSE, ...){
-  res<- object$coefMat
-  if(!allCo) res <- res["D",, drop=FALSE]
-  if(!allInfo) res <- res[,"Estimate"]
-  res
+rdd_coef.rdd_reg_np <- function(object, allInfo = FALSE, allCo = FALSE, ...) {
+    res <- object$coefMat
+    if (!allCo) 
+        res <- res["D", , drop = FALSE]
+    if (!allInfo) 
+        res <- res[, "Estimate"]
+    res
 }
-
+ 
diff --git a/R/rdd_data.R b/R/rdd_data.R
index 7ea6819..d3a8a12 100644
--- a/R/rdd_data.R
+++ b/R/rdd_data.R
@@ -25,111 +25,115 @@
 #' plot(rd)
 
 
-rdd_data <- function(y, x, covar, cutpoint, z, labels, data){
-
-  
-## check args
-  type <- ifelse(missing(z), "Sharp", "Fuzzy")
-  hasCovar <- !missing(covar)
-  if(missing(cutpoint)) stop("Please provide cutpoint")
-  covar_nam <- deparse(substitute(covar))
-
-## Use data in case:
-  if(!missing(data)){
-    pf <- parent.frame()
-    x <- eval(substitute(x), data, enclos = pf) # copy from with.default
-    y <- eval(substitute(y), data, enclos = pf) # copy from with.default
-    if(hasCovar) covar <- eval(substitute(covar), data, enclos = pf) # idem
-  }
-  
-### Check y, x univariate
-  k_y <- NCOL(y)
-  k_x <- NCOL(x)
-
-  if(any(!c(k_y, k_x)==1)) stop("y or x should be univariate")
-
-### Check y, x, z same size
-  n_y <- NROW(y)
-  n_x <- NROW(x)
-  n_covar <- if(hasCovar) NROW(x) else NULL
-
-  if(any(c(n_y, n_x) != n_covar)) stop("y or x should be univariate")
-
-### Check cutpoint
-  range_x <- range(x, na.rm=TRUE)
-  if(cutpointrange_x[2]) stop("Cutpoint outside range of x")
-
-## Check labels
-  if(!missing(labels)){
-    if(!is.list(labels)) stop("labels should be a list.")
-    if(is.null(names(labels)) || !all(names(labels)%in%c("x", "y", "covar"))) stop("labels should be a list with components x, and/or y, and/or covar")
-    if(hasCovar){
-      if("covar"%in%names(labels) && length(labels$covar)!=NCOL(covar)) stop("There should be ", NCOL(covar), " values (dim of covar) for component 'covar' in labels")
+rdd_data <- function(y, x, covar, cutpoint, z, labels, data) {
+    
+    
+    ## check args
+    type <- ifelse(missing(z), "Sharp", "Fuzzy")
+    hasCovar <- !missing(covar)
+    if (missing(cutpoint)) 
+        stop("Please provide cutpoint")
+    covar_nam <- deparse(substitute(covar))
+    
+    ## Use data in case:
+    if (!missing(data)) {
+        pf <- parent.frame()
+        x <- eval(substitute(x), data, enclos = pf)  # copy from with.default
+        y <- eval(substitute(y), data, enclos = pf)  # copy from with.default
+        if (hasCovar) 
+            covar <- eval(substitute(covar), data, enclos = pf)  # idem
     }
-  } else {
-    labels <- list()
-  }
-
-#   if(is.null(labels$x)) labels$x <- deparse(substitute(x))
-#   if(is.null(labels$y)) labels$y <- deparse(substitute(y))
-#   if(hasCova && is.null(labels$covar)) labels$covar <- if(NCOL(covar)==1) names(deparse(substitute(y))
-
-## Assemble data
-  rdd_dat <- data.frame(x=x, y=y)
-  if(hasCovar) {
-    rdd_dat <- cbind(rdd_dat,covar)
-    if(NCOL(covar)==1 && is.null(colnames(covar))) colnames(rdd_dat)[3] <- covar_nam
-  } 
-
-  if(type=="Fuzzy"){
-    rdd_dat <- cbind(rdd_dat,z)
-  }
-
-## return
-  class(rdd_dat) <- c("rdd_data", "data.frame")
-  attr(rdd_dat, "hasCovar") <- hasCovar
-  attr(rdd_dat, "labels") <- labels
-  attr(rdd_dat, "cutpoint") <- cutpoint
-  attr(rdd_dat, "type") <- type
-
-  rdd_dat
+    
+    ### Check y, x univariate
+    k_y <- NCOL(y)
+    k_x <- NCOL(x)
+    
+    if (any(!c(k_y, k_x) == 1)) 
+        stop("y or x should be univariate")
+    
+    ### Check y, x, z same size
+    n_y <- NROW(y)
+    n_x <- NROW(x)
+    n_covar <- if (hasCovar) 
+        NROW(x) else NULL
+    
+    if (any(c(n_y, n_x) != n_covar)) 
+        stop("y or x should be univariate")
+    
+    ### Check cutpoint
+    range_x <- range(x, na.rm = TRUE)
+    if (cutpoint < range_x[1] | cutpoint > range_x[2]) 
+        stop("Cutpoint outside range of x")
+    
+    ## Check labels
+    if (!missing(labels)) {
+        if (!is.list(labels)) 
+            stop("labels should be a list.")
+        if (is.null(names(labels)) || !all(names(labels) %in% c("x", "y", "covar"))) 
+            stop("labels should be a list with components x, and/or y, and/or covar")
+        if (hasCovar) {
+            if ("covar" %in% names(labels) && length(labels$covar) != NCOL(covar)) 
+                stop("There should be ", NCOL(covar), " values (dim of covar) for component 'covar' in labels")
+        }
+    } else {
+        labels <- list()
+    }
+    
+    # if(is.null(labels$x)) labels$x <- deparse(substitute(x)) if(is.null(labels$y)) labels$y <- deparse(substitute(y))
+    # if(hasCova && is.null(labels$covar)) labels$covar <- if(NCOL(covar)==1) names(deparse(substitute(y))
+    
+    ## Assemble data
+    rdd_dat <- data.frame(x = x, y = y)
+    if (hasCovar) {
+        rdd_dat <- cbind(rdd_dat, covar)
+        if (NCOL(covar) == 1 && is.null(colnames(covar))) 
+            colnames(rdd_dat)[3] <- covar_nam
+    }
+    
+    if (type == "Fuzzy") {
+        rdd_dat <- cbind(rdd_dat, z)
+    }
+    
+    ## return
+    class(rdd_dat) <- c("rdd_data", "data.frame")
+    attr(rdd_dat, "hasCovar") <- hasCovar
+    attr(rdd_dat, "labels") <- labels
+    attr(rdd_dat, "cutpoint") <- cutpoint
+    attr(rdd_dat, "type") <- type
+    
+    rdd_dat
 }
 
 
 ### Specific subsetting methods
 
-# as.data.frame.rdd_data <- function(x) {
-# subset(x, y>
-# }as.data.frame.default(x)
+# as.data.frame.rdd_data <- function(x) { subset(x, y> }as.data.frame.default(x)
 
 #' @export
-'[.rdd_data' <- function(x,i,...){
-  attr_x <- attributes(x)
-  r <- NextMethod("[", object=as.data.frame(x))
-
-## keep attributes only if remains a data frame!
-  if(inherits(r, "data.frame")){
-    attr_x$row.names <- attr(r, "row.names")
-    attr_x$names <- attr(r, "names")
-    mostattributes(r) <- attr_x
-    attributes(r) <- attributes(r)[match(names(attr_x), names(attributes(r)))]
-  }
-#   newCla <- class(r)
-#   if(any(grepl("rdd_data", newCla))) newCla <- newCla[-grepl("rdd_data", newCla)]
-#   print(names(attributes(newCla)))
-# 
-#   if(!inherits(newCla, "data.frame")) attr(r, "class")[which(attr(r, "class")=="data.frame")] <- newCla
-  r
+"[.rdd_data" <- function(x, i, ...) {
+    attr_x <- attributes(x)
+    r <- NextMethod("[", object = as.data.frame(x))
+    
+    ## keep attributes only if remains a data frame!
+    if (inherits(r, "data.frame")) {
+        attr_x$row.names <- attr(r, "row.names")
+        attr_x$names <- attr(r, "names")
+        mostattributes(r) <- attr_x
+        attributes(r) <- attributes(r)[match(names(attr_x), names(attributes(r)))]
+    }
+    # newCla <- class(r) if(any(grepl('rdd_data', newCla))) newCla <- newCla[-grepl('rdd_data', newCla)]
+    # print(names(attributes(newCla))) if(!inherits(newCla, 'data.frame')) attr(r, 'class')[which(attr(r,
+    # 'class')=='data.frame')] <- newCla
+    r
 }
 
 #' @export
-subset.rdd_data <- function (x, subset, select, drop = FALSE, ...) {
-  attr_x <- attributes(x)
-
-### subset code: start
+subset.rdd_data <- function(x, subset, select, drop = FALSE, ...) {
+    attr_x <- attributes(x)
+    
+    ### subset code: start
     if (missing(subset)) 
-        r <- TRUE
-    else {
+        r <- TRUE else {
         e <- substitute(subset)
         r <- eval(e, x, parent.frame())
         if (!is.logical(r)) 
@@ -137,32 +141,29 @@ subset.rdd_data <- function (x, subset, select, drop = FALSE, ...) {
         r <- r & !is.na(r)
     }
     if (missing(select)) 
-        vars <- TRUE
-    else {
+        vars <- TRUE else {
         nl <- as.list(seq_along(x))
         names(nl) <- names(x)
         vars <- eval(substitute(select), nl, parent.frame())
     }
     res <- x[r, vars, drop = drop]
-### subset code: end
-#   r <- subset.data.frame(x,...)
-#   r <- NextMethod("subset")
-
-## keep attributes only if remains a data frame!
-  if(inherits(r, "data.frame")){
-    attr_x$row.names <- attr(res, "row.names")
-    attr_x$names <- attr(res, "names")
-    mostattributes(res) <- attr_x
-    attributes(res) <- attributes(res)[match(names(attr_x), names(attributes(res)))]
-  }
-  res
+    ### subset code: end r <- subset.data.frame(x,...)  r <- NextMethod('subset')
+    
+    ## keep attributes only if remains a data frame!
+    if (inherits(r, "data.frame")) {
+        attr_x$row.names <- attr(res, "row.names")
+        attr_x$names <- attr(res, "names")
+        mostattributes(res) <- attr_x
+        attributes(res) <- attributes(res)[match(names(attr_x), names(attributes(res)))]
+    }
+    res
 }
 
 #' @export 
-as.data.frame.rdd_data <- function(x,...){
-  class(x) <- "data.frame"
-  attr(x, "hasCovar") <- NULL
-  attr(x, "labels")   <- NULL 
-  attr(x, "cutpoint") <- NULL
-  x
-}
+as.data.frame.rdd_data <- function(x, ...) {
+    class(x) <- "data.frame"
+    attr(x, "hasCovar") <- NULL
+    attr(x, "labels") <- NULL
+    attr(x, "cutpoint") <- NULL
+    x
+} 
diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index f5fe249..17e8e98 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -2,17 +2,15 @@
 
 ### SUMMARY method
 #' @export
-summary.rdd_data <- function(object, ...){
-
-  cutpoint <- getCutpoint(object)
-  hasCovar_eng <- ifelse(hasCovar(object), "yes", "no")
-  cat("### rdd_data object ###\n")
-  cat("\nCutpoint:", cutpoint, "\n")
-  cat("Sample size:",
-	"\n\t-Full :", nrow(object), 
-	"\n\t-Left :", sum(object$x=cutpoint))
-  cat("\nCovariates:", hasCovar_eng, "\n")
+summary.rdd_data <- function(object, ...) {
+    
+    cutpoint <- getCutpoint(object)
+    hasCovar_eng <- ifelse(hasCovar(object), "yes", "no")
+    cat("### rdd_data object ###\n")
+    cat("\nCutpoint:", cutpoint, "\n")
+    cat("Sample size:", "\n\t-Full :", nrow(object), "\n\t-Left :", sum(object$x < cutpoint), "\n\t-Right:", sum(object$x >= 
+        cutpoint))
+    cat("\nCovariates:", hasCovar_eng, "\n")
 }
 
 #' Plot rdd_data
@@ -52,62 +50,65 @@ summary.rdd_data <- function(object, ...){
 
 
 ### PLOT method
-plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), cex=0.7, nplot=1, device=c("base", "ggplot"),...){
-
-  object <- x
-  cutpoint <- getCutpoint(object)
-  device <- match.arg(device)
-
-## bandwidth: use Ruppert, Sheather and Wand (KernSmooth:::dpill)
-  if(missing(h) & is.null(nbins)) {
-    if(!all(xlim==range(object$x, na.rm=TRUE))){
-      object <- subset(object, x> min(xlim) & x< max(xlim))
-    }
-    h <- rdd_bw_rsw(object) 
-    if(is_even(nplot)) {
-      se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
-    } else {
-      se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
+plot.rdd_data <- function(x, h, nbins = NULL, xlim = range(object$x, na.rm = TRUE), cex = 0.7, nplot = 1, device = c("base", 
+    "ggplot"), ...) {
+    
+    object <- x
+    cutpoint <- getCutpoint(object)
+    device <- match.arg(device)
+    
+    ## bandwidth: use Ruppert, Sheather and Wand (KernSmooth:::dpill)
+    if (missing(h) & is.null(nbins)) {
+        if (!all(xlim == range(object$x, na.rm = TRUE))) {
+            object <- subset(object, x > min(xlim) & x < max(xlim))
+        }
+        h <- rdd_bw_rsw(object)
+        if (is_even(nplot)) {
+            se <- seq(from = 1 - (sum(1:nplot < (nplot/2))) * 0.2, to = 1 + (sum(1:nplot > (nplot/2))) * 0.2, by = 0.2)
+        } else {
+            se <- seq(from = 1 - floor(nplot/2) * 0.2, to = 1 + floor(nplot/2) * 0.2, by = 0.2)
+        }
+        hs <- if (nplot == 1) 
+            h else se * h
+    } else if (!missing(h) & is.null(nbins)) {
+        if (length(h) == 1) {
+            if (is_even(nplot)) {
+                se <- seq(from = 1 - (sum(1:nplot < (nplot/2))) * 0.2, to = 1 + (sum(1:nplot > (nplot/2))) * 0.2, by = 0.2)
+            } else {
+                se <- seq(from = 1 - floor(nplot/2) * 0.2, to = 1 + floor(nplot/2) * 0.2, by = 0.2)
+            }
+            hs <- if (nplot == 1) 
+                h else se * h
+        } else {
+            if (length(h == nplot)) {
+                hs <- h
+            } else {
+                stop("Length of h should be either one or equal to nplot (", nplot, ")")
+            }
+        }
+    } else if (!is.null(nbins)) {
+        hs <- rep(0.05, nplot)
+        if (length(nbins) != nplot) {
+            stop("Length of nbins should be equal to nplot (", nplot, ")")
+        }
     }
-    hs <- if(nplot==1) h else se *h
-  } else if(!missing(h) & is.null(nbins)){
-    if(length(h)==1){
-      if(is_even(nplot)) {
-	se <- seq(from=1-(sum(1:nplot<(nplot/2)))*0.2, to=1+(sum(1:nplot>(nplot/2)))*0.2, by=.2)
-      } else {
-	se <- seq(from=1-floor(nplot/2)*0.2, to=1+floor(nplot/2)*0.2, by=.2)
-      }
-      hs <- if(nplot==1) h else se *h
-    } else {
-      if(length(h==nplot)){
-	hs <- h
-      } else {
-	stop("Length of h should be either one or equal to nplot (", nplot, ")")
-      }
+    
+    
+    
+    
+    ## plot
+    
+    par_orig <- par()
+    par(mfrow = c(nplot, 1))
+    for (i in 1:nplot) {
+        plotBin(x = object$x, y = object$y, cutpoint = cutpoint, h = hs[i], nbins = nbins[i], xlim = xlim, cex = cex, ...)
     }
-  } else if(!is.null(nbins)){
-    hs <- rep(0.05, nplot)
-    if(length(nbins)!=nplot){
-      stop("Length of nbins should be equal to nplot (", nplot, ")")
-    }
-  }
-
-
-  
-
-## plot
-
-  par_orig <- par()
-  par(mfrow=c(nplot,1))
-  for(i in 1:nplot){
-    plotBin(x=object$x, y=object$y, cutpoint=cutpoint, h=hs[i], nbins=nbins[i], xlim=xlim, cex=cex,...)
-  }
-  par(mfrow=c(1,1))
-
-
-
-## invisible return:
-  invisible(object)
+    par(mfrow = c(1, 1))
+    
+    
+    
+    ## invisible return:
+    invisible(object)
 }
 
 
@@ -124,17 +125,16 @@ plot.rdd_data <- function(x, h, nbins=NULL, xlim=range(object$x, na.rm=TRUE), ce
 #' reg_para_lm
 #' plot(reg_para_lm, which=4)
 #' @export
-as.lm <- function(x)
-  UseMethod("as.lm")
-
-
-as.lm_RDD <- function(x){
+as.lm <- function(x) UseMethod("as.lm")
 
-  at_x <- attributes(x)
-  at_x[names(at_x)!="names"] <- NULL
-  class(x) <- "lm"
 
-  x
+as.lm_RDD <- function(x) {
+    
+    at_x <- attributes(x)
+    at_x[names(at_x) != "names"] <- NULL
+    class(x) <- "lm"
+    
+    x
 }
 
 #' @export
@@ -146,28 +146,23 @@ as.lm.rdd_reg <- function(x) as.lm_RDD(x)
 
 
 
-# subset.rdd_data <- function(x,...){
-# 
-#   res <- subset.data.frame(x,...)
-#   attributes(res) <- attributes(x)
-#   res
-# }
+# subset.rdd_data <- function(x,...){ res <- subset.data.frame(x,...)  attributes(res) <- attributes(x) res }
 
 
 ### EXAMPLE
-if(FALSE){
-  library(RDDtools)
-#   data(Lee2008)
-
-
-  environment(plot.rdd_data) <- environment(rdd_data)
-
-  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-  plot(Lee2008_rdd)
-
-  plot(Lee2008_rdd, h=0.2)
-  plot(Lee2008_rdd, h=c(0.2,0.3,0.4), nplot=3)
-
-  plot(Lee2008_rdd, nbins=21)
-
-}
+if (FALSE) {
+    library(RDDtools)
+    # data(Lee2008)
+    
+    
+    environment(plot.rdd_data) <- environment(rdd_data)
+    
+    Lee2008_rdd <- rdd_data(y = Lee2008$y, x = Lee2008$x, cutpoint = 0)
+    plot(Lee2008_rdd)
+    
+    plot(Lee2008_rdd, h = 0.2)
+    plot(Lee2008_rdd, h = c(0.2, 0.3, 0.4), nplot = 3)
+    
+    plot(Lee2008_rdd, nbins = 21)
+    
+} 
diff --git a/R/rdd_pred.R b/R/rdd_pred.R
index 7b689a8..4cfaed1 100644
--- a/R/rdd_pred.R
+++ b/R/rdd_pred.R
@@ -17,7 +17,7 @@
 #' \code{rdd_pred} allows to set the value of the covariate(s) at which to evaluate the RDD effect, by providing a data.frame with
 #' the values for the covariates. Note that the effect can be evaluated at multiple points, if you provide multiple rows of \code{covdata}. 
 #'
-#' In pressence of covariate-specific RDD effect, one may wish to estimate an average effect. This can be done by setting the argument \code{stat="mean"}. 
+#' In pressence of covariate-specific RDD effect, one may wish to estimate an average effect. This can be done by setting the argument \code{stat='mean'}. 
 #' Weights can additionally be added, with the argument \code{weights}, to obtain a weighted-average of the predictions. Note however that in most cases, 
 #' this will be equivalent to provide covariates at their (weighted) mean value, which will be much faster also!
 #'
@@ -44,8 +44,8 @@
 #' 
 #' # estimation with covariates: 
 #' reg_para_cov <- rdd_reg_lm(rdd_object=Lee2008_rdd,
-#'                           covariates="z1",
-#'                           covar.opt=list(slope="separate") )
+#'                           covariates='z1',
+#'                           covar.opt=list(slope='separate') )
 #'
 #' # should obtain same result as with RDestimate                             
 #' rdd_pred(reg_para_cov, covdata=data.frame(z1=0)) 
@@ -53,114 +53,127 @@
 #' # evaluate at mean of z1 (as comes from uniform)
 #' rdd_pred(reg_para_cov, covdata=data.frame(z1=0.5))
 
-rdd_pred <- function(object, covdata, se.fit=TRUE, vcov. = NULL, newdata, stat=c("identity", "sum", "mean"), weights){
-
-  stat <- match.arg(stat)
-
-  if(!missing(weights)) {
-    if(missing(covdata)) stop("Arg 'weights' only useful with arg 'covdata'")
-    if(stat=="identity") stop("Argument 'weights' not useful when arg: stat='identity'")
-    if(stat=="sum") {
-      warning("Providing weights for a sum makes little sense?!")
+rdd_pred <- function(object, covdata, se.fit = TRUE, vcov. = NULL, newdata, stat = c("identity", "sum", "mean"), weights) {
+    
+    stat <- match.arg(stat)
+    
+    if (!missing(weights)) {
+        if (missing(covdata)) 
+            stop("Arg 'weights' only useful with arg 'covdata'")
+        if (stat == "identity") 
+            stop("Argument 'weights' not useful when arg: stat='identity'")
+        if (stat == "sum") {
+            warning("Providing weights for a sum makes little sense?!")
+        }
+        if (length(weights) != NROW(covdata)) 
+            stop("Weights should be of the same length than covdata")
     }
-    if(length(weights)!=NROW(covdata)) stop("Weights should be of the same length than covdata")
-  }
-
-  x_call <- getCall(object)
-  hasCo <- hasCovar(object)
-
-  if(is.null(x_call$covar.opt)){
-    covar.slope <- "same"
-    covar.strat <- "include"
-  } else {
-    covar.slope <- ifelse(is.null(x_call$covar.opt$slope), "same", x_call$covar.opt$slope)
-    covar.strat <- ifelse(is.null(x_call$covar.opt$strategy), "include", x_call$covar.opt$strategy)
-  }
-
-
-## get original data structure:
-  mf <- model.frame(object)[1:2,-1]
-  if(any(grepl("\\(weights\\)", colnames(mf)))) mf <- mf[,-grep("\\(weights\\)", colnames(mf))]
-
-## Fill orig struc with 0/1
-  if(missing(newdata)){
-    which.D <- grep("^D$", colnames(mf))
-    mf[,which.D] <- c(0,1) ## set coeff of interest
-    mf[,-which.D] <- 0 ## remove others (not absolutely necessary actually)
-    newdata <- mf
-  }
-
-## Merge covdata with newdata:
-
-  if(!missing(covdata)){
-    if(covar.strat=="residual") stop("Do not provide 'covdata' if covariates were use with 'residual' strategy")
-    if(covar.slope=="separate"){
-      Nrow_cov <- nrow(covdata)
-      if(Nrow_cov>1) newdata <- newdata[c(1, rep(2,Nrow_cov)),]
-      if(!is.null(rownames(covdata))) { 
-	  if("1" %in% rownames(covdata)) rownames(newdata)[1] <- "0"
-	  rownames(newdata)[-1] <- rownames(covdata)
-      } else {
-	rownames(newdata) <- c(0, seq_len(Nrow_cov))
-      }
-      colnames_cov <- colnames(covdata)
-      ind <- seq(from=2, by=2, length.out=Nrow_cov)
-      if(!all(colnames_cov%in% colnames(newdata))) stop("Arg 'covdata' contains colnames not in the data")
-      newdata[2:nrow(newdata), paste(colnames(covdata), "D", sep=":")] <- covdata
+    
+    x_call <- getCall(object)
+    hasCo <- hasCovar(object)
+    
+    if (is.null(x_call$covar.opt)) {
+        covar.slope <- "same"
+        covar.strat <- "include"
+    } else {
+        covar.slope <- ifelse(is.null(x_call$covar.opt$slope), "same", x_call$covar.opt$slope)
+        covar.strat <- ifelse(is.null(x_call$covar.opt$strategy), "include", x_call$covar.opt$strategy)
+    }
+    
+    
+    ## get original data structure:
+    mf <- model.frame(object)[1:2, -1]
+    if (any(grepl("\\(weights\\)", colnames(mf)))) 
+        mf <- mf[, -grep("\\(weights\\)", colnames(mf))]
+    
+    ## Fill orig struc with 0/1
+    if (missing(newdata)) {
+        which.D <- grep("^D$", colnames(mf))
+        mf[, which.D] <- c(0, 1)  ## set coeff of interest
+        mf[, -which.D] <- 0  ## remove others (not absolutely necessary actually)
+        newdata <- mf
+    }
+    
+    ## Merge covdata with newdata:
+    
+    if (!missing(covdata)) {
+        if (covar.strat == "residual") 
+            stop("Do not provide 'covdata' if covariates were use with 'residual' strategy")
+        if (covar.slope == "separate") {
+            Nrow_cov <- nrow(covdata)
+            if (Nrow_cov > 1) 
+                newdata <- newdata[c(1, rep(2, Nrow_cov)), ]
+            if (!is.null(rownames(covdata))) {
+                if ("1" %in% rownames(covdata)) 
+                  rownames(newdata)[1] <- "0"
+                rownames(newdata)[-1] <- rownames(covdata)
+            } else {
+                rownames(newdata) <- c(0, seq_len(Nrow_cov))
+            }
+            colnames_cov <- colnames(covdata)
+            ind <- seq(from = 2, by = 2, length.out = Nrow_cov)
+            if (!all(colnames_cov %in% colnames(newdata))) 
+                stop("Arg 'covdata' contains colnames not in the data")
+            newdata[2:nrow(newdata), paste(colnames(covdata), "D", sep = ":")] <- covdata
+        }
     }
-  } 
-
-  multiN <- nrow(newdata)>2
-
-## Merge and check no NAs
-  X_i <- as.matrix(cbind(1,newdata))
-  if(any(is.na(X_i))){
-    warning("data contains NA. Were removed")
-    X_i <- X_i[-apply(X_i, 1, function(x) any(is.na(x))),]
-  }
-
-## Set up variance matrix: X_i (X'X)^{-1} X_i'
-  if(is.null(vcov.)) vcov. <- vcov(object)
-  X_inv <- vcov.
-  mat <- X_i%*%X_inv%*%t(X_i)
-
-## preds:
-
-  if(!multiN) {
-    pred_point <- drop(diff(X_i%*%rdd_coef(object, allCo=TRUE)))
-    if(se.fit) pred_se    <- sqrt(sum(c(diag(mat), -2*mat[1,2])))
-  } else {
-    d <- X_i%*%coef(object)
-
     
-    Mat_SUM  <- cbind( 1, diag(nrow(d)-1))
-    Mat_DIAG <- matrix(diag(mat), ncol=1)
-    if(missing(weights)) {
-      MAT_SmallSum <- matrix(c(-(nrow(d)-1), rep(1,nrow(d)-1  )), nrow=1) ## create vector: [- n-1, 1, 1, 1....]
+    multiN <- nrow(newdata) > 2
+    
+    ## Merge and check no NAs
+    X_i <- as.matrix(cbind(1, newdata))
+    if (any(is.na(X_i))) {
+        warning("data contains NA. Were removed")
+        X_i <- X_i[-apply(X_i, 1, function(x) any(is.na(x))), ]
+    }
+    
+    ## Set up variance matrix: X_i (X'X)^{-1} X_i'
+    if (is.null(vcov.)) 
+        vcov. <- vcov(object)
+    X_inv <- vcov.
+    mat <- X_i %*% X_inv %*% t(X_i)
+    
+    ## preds:
+    
+    if (!multiN) {
+        pred_point <- drop(diff(X_i %*% rdd_coef(object, allCo = TRUE)))
+        if (se.fit) 
+            pred_se <- sqrt(sum(c(diag(mat), -2 * mat[1, 2])))
     } else {
-      MAT_SmallSum <- matrix(c(-1, weights), nrow=1)                            ## create vector: [- 1, w_1, w_2, w_n]
+        d <- X_i %*% coef(object)
+        
+        
+        Mat_SUM <- cbind(1, diag(nrow(d) - 1))
+        Mat_DIAG <- matrix(diag(mat), ncol = 1)
+        if (missing(weights)) {
+            MAT_SmallSum <- matrix(c(-(nrow(d) - 1), rep(1, nrow(d) - 1)), nrow = 1)  ## create vector: [- n-1, 1, 1, 1....]
+        } else {
+            MAT_SmallSum <- matrix(c(-1, weights), nrow = 1)  ## create vector: [- 1, w_1, w_2, w_n]
+        }
+        
+        if (stat == "identity") {
+            Mat_DIFF <- Mat_SUM
+            Mat_DIFF[, 1] <- -1
+            pred_point <- drop(Mat_DIFF %*% d)
+            if (se.fit) 
+                pred_se <- drop(sqrt(Mat_SUM %*% Mat_DIAG - 2 * mat[1, 2:ncol(mat)]))
+        } else {
+            if (stat == "mean" & missing(weights)) 
+                MAT_SmallSum <- MAT_SmallSum/Nrow_cov
+            pred_point <- drop(MAT_SmallSum %*% d)
+            if (se.fit) 
+                pred_se <- drop(sqrt(MAT_SmallSum %*% mat %*% t(MAT_SmallSum)))
+        }
     }
     
-    if(stat=="identity"){
-      Mat_DIFF <- Mat_SUM
-      Mat_DIFF[,1] <- -1
-      pred_point <- drop(Mat_DIFF%*%d)
-      if(se.fit) pred_se <- drop(sqrt(Mat_SUM %*%Mat_DIAG -2* mat[1,2:ncol(mat)]))
+    
+    ## result:
+    if (se.fit) {
+        res <- list()
+        res$fit <- pred_point
+        res$se.fit <- pred_se
     } else {
-      if(stat=="mean" & missing(weights)) MAT_SmallSum <- MAT_SmallSum/Nrow_cov
-      pred_point <- drop(MAT_SmallSum%*%d)
-      if(se.fit) pred_se <- drop(sqrt(MAT_SmallSum%*%mat%*%t(MAT_SmallSum)))
+        res <- pred_point
     }
-  }
-
-
-## result:
-  if(se.fit){
-    res <- list()
-    res$fit <- pred_point
-    res$se.fit <- pred_se
-  } else {
-    res <- pred_point
-  }
-res
-}
+    res
+} 
diff --git a/R/rddtools.R b/R/rddtools.R
index 063f170..d93b898 100644
--- a/R/rddtools.R
+++ b/R/rddtools.R
@@ -11,6 +11,6 @@
 #' @title Regression Discontinuity Design 
 
 if (getRversion() >= "3.1.0") {
-  utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high"))
-  utils::suppressForeignCheck(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high"))
-}
\ No newline at end of file
+    utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high"))
+    utils::suppressForeignCheck(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high"))
+} 
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 0778579..4196043 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -30,80 +30,84 @@
 #' 
 #' ## Estimate a local probit:
 #' Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y= cutpoint -bw & dat$x <= cutpoint +bw, 1, 0)
-  } else if(!missing(weights)){
-    weights <- weights
-  } else {
-    weights <- NULL
-  }
-
-## Construct data
-  if(missing(weights)) weights <- NULL
-  dat_step1 <- model.matrix(rdd_object, covariates=covariates, order=order, bw=bw, 
-			    slope=slope, covar.opt=covar.opt)
-
-## Regression
-  reg <- fun(y~., data=dat_step1, weights=weights,...)
-  
-  ##Return
-  RDDslot <- list()
-  RDDslot$rdd_data <- rdd_object
-  reg$RDDslot <- RDDslot 
-  class(reg) <- c("rdd_reg_lm", "rdd_reg", class(reg))
-  attr(reg, "PolyOrder") <- order
-  attr(reg, "cutpoint") <- cutpoint
-  attr(reg, "slope") <- slope
-  attr(reg, "RDDcall") <- match.call()
-  attr(reg, "bw") <- bw
-  reg
+rdd_gen_reg <- function(rdd_object, fun = glm, covariates = NULL, order = 1, bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy = c("include", 
+    "residual"), slope = c("same", "separate"), bw = NULL), weights, ...) {
+    
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    
+    slope <- match.arg(slope)
+    
+    if (!missing(weights) & !is.null(bw)) 
+        stop("Cannot give both 'bw' and 'weights'")
+    
+    
+    ## Subsetting
+    dat <- as.data.frame(rdd_object)
+    
+    if (!is.null(bw)) {
+        weights <- ifelse(dat$x >= cutpoint - bw & dat$x <= cutpoint + bw, 1, 0)
+    } else if (!missing(weights)) {
+        weights <- weights
+    } else {
+        weights <- NULL
+    }
+    
+    ## Construct data
+    if (missing(weights)) 
+        weights <- NULL
+    dat_step1 <- model.matrix(rdd_object, covariates = covariates, order = order, bw = bw, slope = slope, covar.opt = covar.opt)
+    
+    ## Regression
+    reg <- fun(y ~ ., data = dat_step1, weights = weights, ...)
+    
+    ## Return
+    RDDslot <- list()
+    RDDslot$rdd_data <- rdd_object
+    reg$RDDslot <- RDDslot
+    class(reg) <- c("rdd_reg_lm", "rdd_reg", class(reg))
+    attr(reg, "PolyOrder") <- order
+    attr(reg, "cutpoint") <- cutpoint
+    attr(reg, "slope") <- slope
+    attr(reg, "RDDcall") <- match.call()
+    attr(reg, "bw") <- bw
+    reg
 }
 
-rdd_gen_reg_old <- function(rdd_object, covariates=".", bw=rdd_bw_ik(rdd_object), slope=c("separate", "same"), fun=glm, ...){
-
-  slope <- match.arg(slope)
-  checkIsRDD(rdd_object)
-  if(!is.function(fun)) stop("Arg 'fun' should be a function")
-  cutpoint <- getCutpoint(rdd_object)
-
-  ## Construct data
-  dat <- as.data.frame(rdd_object)
-
-  dat_step1 <- dat[, c("y", "x")]
-  dat_step1$x <- dat_step1$x -cutpoint
-  dat_step1$D <- ifelse(dat_step1$x >= 0, 1,0)
-  if(slope=="separate") {
-    dat_step1$x_right <- dat_step1$x*dat_step1$D 
-  }
-
-### Weights
-  kernel_w <- Kernel_tri(dat_step1[,"x"], center=0, bw=bw)
-
-## Regression
-  reg <- fun(y~., data=dat_step1, weights=kernel_w,...)
-
-##Return
-  class(reg) <- c("rdd_reg_gen", "rdd_reg", class(reg))
-  attr(reg, "RDDcall") <- match.call()
-  attr(reg, "cutpoint") <- cutpoint
-  attr(reg, "bw") <- bw
-  reg
-}
+rdd_gen_reg_old <- function(rdd_object, covariates = ".", bw = rdd_bw_ik(rdd_object), slope = c("separate", "same"), fun = glm, 
+    ...) {
+    
+    slope <- match.arg(slope)
+    checkIsRDD(rdd_object)
+    if (!is.function(fun)) 
+        stop("Arg 'fun' should be a function")
+    cutpoint <- getCutpoint(rdd_object)
+    
+    ## Construct data
+    dat <- as.data.frame(rdd_object)
+    
+    dat_step1 <- dat[, c("y", "x")]
+    dat_step1$x <- dat_step1$x - cutpoint
+    dat_step1$D <- ifelse(dat_step1$x >= 0, 1, 0)
+    if (slope == "separate") {
+        dat_step1$x_right <- dat_step1$x * dat_step1$D
+    }
+    
+    ### Weights
+    kernel_w <- Kernel_tri(dat_step1[, "x"], center = 0, bw = bw)
+    
+    ## Regression
+    reg <- fun(y ~ ., data = dat_step1, weights = kernel_w, ...)
+    
+    ## Return
+    class(reg) <- c("rdd_reg_gen", "rdd_reg", class(reg))
+    attr(reg, "RDDcall") <- match.call()
+    attr(reg, "cutpoint") <- cutpoint
+    attr(reg, "bw") <- bw
+    reg
+} 
diff --git a/R/reg_lm.R b/R/reg_lm.R
index a68b373..1f344ac 100644
--- a/R/reg_lm.R
+++ b/R/reg_lm.R
@@ -51,94 +51,101 @@
 #' plot(reg_para_ik)
 
 
-rdd_reg_lm <- function(rdd_object, covariates=NULL, order=1, bw=NULL, slope=c("separate", "same"), covar.opt=list(strategy=c("include", "residual"), slope=c("same", "separate"), bw=NULL), covar.strat=c("include", "residual"), weights){
-
-  checkIsRDD(rdd_object)
-  cutpoint <- getCutpoint(rdd_object)
-  type <- getType(rdd_object)
-
-  slope <- match.arg(slope)
-
-  if(!missing(covar.strat)) warning("covar.strat is (soon) deprecated arg!")  
-  if(!missing(weights)&!is.null(bw)) stop("Cannot give both 'bw' and 'weights'")
-
-## Subsetting
-  dat <- as.data.frame(rdd_object)
-
-  if(!is.null(bw)){
-    weights <- ifelse(dat$x >= cutpoint -bw & dat$x <= cutpoint +bw, 1, 0)
-  } else if(!missing(weights)){
-    weights <- weights
-  } else {
-    weights <- NULL
-  }
-
-## Construct data
-  if(missing(weights)) weights <- NULL
-  dat_step1 <- model.matrix(rdd_object, covariates=covariates, order=order, bw=bw, 
-			    slope=slope, covar.opt=covar.opt)
-
-## Regression
-  if(type=="Sharp"){
-    reg <- lm(y~., data=dat_step1, weights=weights)
-    class_reg <- "lm"
-  } else {
-    if(!is.null(covariates)) stop("Covariates currently not implemented for Fuzzy case")
-    reg <- ivreg(y~.-ins|.-D, data=dat_step1, weights=weights)
-    class_reg <- "ivreg"
-  }
-  
-
-##Return
-  RDDslot <- list()
-  RDDslot$rdd_data <- rdd_object
-  reg$RDDslot <- RDDslot 
-  class(reg) <- c("rdd_reg_lm", "rdd_reg", class_reg)
-  attr(reg, "PolyOrder") <- order
-  attr(reg, "cutpoint") <- cutpoint
-  attr(reg, "slope") <- slope
-  attr(reg, "RDDcall") <- match.call()
-  attr(reg, "bw") <- bw
-  reg
+rdd_reg_lm <- function(rdd_object, covariates = NULL, order = 1, bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy = c("include", 
+    "residual"), slope = c("same", "separate"), bw = NULL), covar.strat = c("include", "residual"), weights) {
+    
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    type <- getType(rdd_object)
+    
+    slope <- match.arg(slope)
+    
+    if (!missing(covar.strat)) 
+        warning("covar.strat is (soon) deprecated arg!")
+    if (!missing(weights) & !is.null(bw)) 
+        stop("Cannot give both 'bw' and 'weights'")
+    
+    ## Subsetting
+    dat <- as.data.frame(rdd_object)
+    
+    if (!is.null(bw)) {
+        weights <- ifelse(dat$x >= cutpoint - bw & dat$x <= cutpoint + bw, 1, 0)
+    } else if (!missing(weights)) {
+        weights <- weights
+    } else {
+        weights <- NULL
+    }
+    
+    ## Construct data
+    if (missing(weights)) 
+        weights <- NULL
+    dat_step1 <- model.matrix(rdd_object, covariates = covariates, order = order, bw = bw, slope = slope, covar.opt = covar.opt)
+    
+    ## Regression
+    if (type == "Sharp") {
+        reg <- lm(y ~ ., data = dat_step1, weights = weights)
+        class_reg <- "lm"
+    } else {
+        if (!is.null(covariates)) 
+            stop("Covariates currently not implemented for Fuzzy case")
+        reg <- ivreg(y ~ . - ins | . - D, data = dat_step1, weights = weights)
+        class_reg <- "ivreg"
+    }
+    
+    
+    ## Return
+    RDDslot <- list()
+    RDDslot$rdd_data <- rdd_object
+    reg$RDDslot <- RDDslot
+    class(reg) <- c("rdd_reg_lm", "rdd_reg", class_reg)
+    attr(reg, "PolyOrder") <- order
+    attr(reg, "cutpoint") <- cutpoint
+    attr(reg, "slope") <- slope
+    attr(reg, "RDDcall") <- match.call()
+    attr(reg, "bw") <- bw
+    reg
 }
 
 
 #' @export 
-print.rdd_reg_lm <- function(x,...) {
-
-  order <- getOrder(x)
-  cutpoint <- getCutpoint(x)
-  slope <- getSlope(x)
-  bw <- getBW(x)
-  hasBw <- !is.null(bw)
-  bw2 <- if(hasBw) bw else Inf
-
-  x_var <- getOriginalX(x)
-  n_left  <- sum(x_var >= cutpoint -bw2 & x_var < cutpoint)
-  n_right <- sum(x_var >= cutpoint & x_var <= cutpoint+bw2)
-
-  cat("### RDD regression: parametric ###\n")
-  cat("\tPolynomial order: ", order, "\n")
-  cat("\tSlopes: ", slope, "\n")
-  if(hasBw)   cat("\tBandwidth: ", bw, "\n")
-  cat("\tNumber of obs: ", sum(n_left+n_right), " (left: ", n_left, ", right: ", n_right, ")\n", sep="")
-
-  cat("\n\tCoefficient:\n")
-
-  printCoefmat(coef(summary(x))[2,, drop=FALSE])
-
+print.rdd_reg_lm <- function(x, ...) {
+    
+    order <- getOrder(x)
+    cutpoint <- getCutpoint(x)
+    slope <- getSlope(x)
+    bw <- getBW(x)
+    hasBw <- !is.null(bw)
+    bw2 <- if (hasBw) 
+        bw else Inf
+    
+    x_var <- getOriginalX(x)
+    n_left <- sum(x_var >= cutpoint - bw2 & x_var < cutpoint)
+    n_right <- sum(x_var >= cutpoint & x_var <= cutpoint + bw2)
+    
+    cat("### RDD regression: parametric ###\n")
+    cat("\tPolynomial order: ", order, "\n")
+    cat("\tSlopes: ", slope, "\n")
+    if (hasBw) 
+        cat("\tBandwidth: ", bw, "\n")
+    cat("\tNumber of obs: ", sum(n_left + n_right), " (left: ", n_left, ", right: ", n_right, ")\n", sep = "")
+    
+    cat("\n\tCoefficient:\n")
+    
+    printCoefmat(coef(summary(x))[2, , drop = FALSE])
+    
 }
 
 
 #' @export
-plot.rdd_reg_lm <- function(x,...) {
-
-## data
-  dat <- getOriginalData(x)
-  subw <-   if(!is.null(x$weights)) x$weights>0 else rep(TRUE, nrow(dat))
-  pred <- data.frame(x=dat$x,y=fitted(x))[subw,]
-  
-##plot
-  plotBin(dat$x, dat$y, ...)
-  lines(pred[order(pred$x),])
-}
+plot.rdd_reg_lm <- function(x, ...) {
+    
+    ## data
+    dat <- getOriginalData(x)
+    subw <- if (!is.null(x$weights)) 
+        x$weights > 0 else rep(TRUE, nrow(dat))
+    pred <- data.frame(x = dat$x, y = fitted(x))[subw, ]
+    
+    ## plot
+    plotBin(dat$x, dat$y, ...)
+    lines(pred[order(pred$x), ])
+} 
diff --git a/R/reg_np.R b/R/reg_np.R
index d09522d..d467e6c 100644
--- a/R/reg_np.R
+++ b/R/reg_np.R
@@ -23,194 +23,199 @@
 #' plot(reg_nonpara)
 
 
-rdd_reg_np <- function(rdd_object, covariates=NULL, bw=rdd_bw_ik(rdd_object), slope=c("separate", "same"), inference=c("np", "lm"), covar.opt=list(slope=c("same", "separate"), bw=NULL)){
-
-  slope <- match.arg(slope)
-  inference <- match.arg(inference)
-  checkIsRDD(rdd_object)
-  cutpoint <- getCutpoint(rdd_object)
-
-  if(!is.null(covariates)) warning("covariates not fully implemented for non-para reg")
-
-## Construct data
-  if("strategy"%in%names(covar.opt)) warning("Arg 'strategy' should not be used for ")
-  covar.opt$strategy <- "include"
-  dat <- as.data.frame(rdd_object)
-  dat_step1 <- model.matrix(rdd_object, covariates=covariates, order=1, bw=bw, 
-			    slope=slope, covar.opt=covar.opt)
-
-
-### Weights
-  kernel_w <- Kernel_tri(dat_step1[,"x"], center=0, bw=bw)
-
-## Regression
-  reg <- lm(y~., data=dat_step1, weights=kernel_w)
-  coefD <- coef(reg)["D"]
-
-## Non-para inference:
-  if(inference=="np"){
-    var <- var_estim(x=dat$x, y=dat$y, point=cutpoint, bw=bw, eachSide=TRUE)
-    dens <- dens_estim(x=dat$x, point=cutpoint, bw=bw, eachSide=TRUE)
-
-    const <- 4.8/(nrow(dat)*bw)
-    all <- const*sum(var)/dens
-    se <- sqrt(all)
-    tval <- coefD/se
-    pval <- 2 * pnorm(abs(tval), lower.tail = FALSE)
-    coefmat <- matrix(c(coefD, se,tval, pval), nrow=1, dimnames=list("D", c("Estimate", "Std. Error", "z value", "Pr(>|z|)")))
-  } else {
-    coefmat <- coef(summary(reg))#["D", , drop=FALSE]
-  }
-
-##Return
-  res <- list()
-  RDDslot <- list()
-  RDDslot$rdd_data <- rdd_object
-  RDDslot$model <- reg
-  res$coefficients <- coef(reg)["D"]
-  res$coefMat <- coefmat 
-  res$residuals <- residuals(reg)
-  res$fitted <- fitted(reg)
-  res$RDDslot <- RDDslot
-
-  class(res) <- c("rdd_reg_np", "rdd_reg", "lm")
-  attr(res, "RDDcall") <- match.call()
-  attr(res, "cutpoint") <- cutpoint
-  attr(res, "bw") <- bw
-  res
+rdd_reg_np <- function(rdd_object, covariates = NULL, bw = rdd_bw_ik(rdd_object), slope = c("separate", "same"), inference = c("np", 
+    "lm"), covar.opt = list(slope = c("same", "separate"), bw = NULL)) {
+    
+    slope <- match.arg(slope)
+    inference <- match.arg(inference)
+    checkIsRDD(rdd_object)
+    cutpoint <- getCutpoint(rdd_object)
+    
+    if (!is.null(covariates)) 
+        warning("covariates not fully implemented for non-para reg")
+    
+    ## Construct data
+    if ("strategy" %in% names(covar.opt)) 
+        warning("Arg 'strategy' should not be used for ")
+    covar.opt$strategy <- "include"
+    dat <- as.data.frame(rdd_object)
+    dat_step1 <- model.matrix(rdd_object, covariates = covariates, order = 1, bw = bw, slope = slope, covar.opt = covar.opt)
+    
+    
+    ### Weights
+    kernel_w <- Kernel_tri(dat_step1[, "x"], center = 0, bw = bw)
+    
+    ## Regression
+    reg <- lm(y ~ ., data = dat_step1, weights = kernel_w)
+    coefD <- coef(reg)["D"]
+    
+    ## Non-para inference:
+    if (inference == "np") {
+        var <- var_estim(x = dat$x, y = dat$y, point = cutpoint, bw = bw, eachSide = TRUE)
+        dens <- dens_estim(x = dat$x, point = cutpoint, bw = bw, eachSide = TRUE)
+        
+        const <- 4.8/(nrow(dat) * bw)
+        all <- const * sum(var)/dens
+        se <- sqrt(all)
+        tval <- coefD/se
+        pval <- 2 * pnorm(abs(tval), lower.tail = FALSE)
+        coefmat <- matrix(c(coefD, se, tval, pval), nrow = 1, dimnames = list("D", c("Estimate", "Std. Error", "z value", "Pr(>|z|)")))
+    } else {
+        coefmat <- coef(summary(reg))  #['D', , drop=FALSE]
+    }
+    
+    ## Return
+    res <- list()
+    RDDslot <- list()
+    RDDslot$rdd_data <- rdd_object
+    RDDslot$model <- reg
+    res$coefficients <- coef(reg)["D"]
+    res$coefMat <- coefmat
+    res$residuals <- residuals(reg)
+    res$fitted <- fitted(reg)
+    res$RDDslot <- RDDslot
+    
+    class(res) <- c("rdd_reg_np", "rdd_reg", "lm")
+    attr(res, "RDDcall") <- match.call()
+    attr(res, "cutpoint") <- cutpoint
+    attr(res, "bw") <- bw
+    res
 }
 
 
 #' @export 
 print.rdd_reg_np <- function(x, signif.stars = getOption("show.signif.stars"), ...) {
-
-  RDDcall <- attr(x, "RDDcall")
-  bw <- getBW(x)
-  cutpoint <- getCutpoint(x)
-  x_var <- getOriginalX(x)
-
-  n_left  <- sum(x_var >= cutpoint -bw & x_var < cutpoint)
-  n_right <- sum(x_var >= cutpoint & x_var <= cutpoint+bw)
-
-  cat("### RDD regression: nonparametric local linear###\n")
-  cat("\tBandwidth: ", bw, "\n")
-  cat("\tNumber of obs: ", sum(n_left+n_right), " (left: ", n_left, ", right: ", n_right, ")\n", sep="")
-
-  cat("\n\tCoefficient:\n")
-
-  printCoefmat(rdd_coef(x, allInfo=TRUE), signif.stars=signif.stars)
-
+    
+    RDDcall <- attr(x, "RDDcall")
+    bw <- getBW(x)
+    cutpoint <- getCutpoint(x)
+    x_var <- getOriginalX(x)
+    
+    n_left <- sum(x_var >= cutpoint - bw & x_var < cutpoint)
+    n_right <- sum(x_var >= cutpoint & x_var <= cutpoint + bw)
+    
+    cat("### RDD regression: nonparametric local linear###\n")
+    cat("\tBandwidth: ", bw, "\n")
+    cat("\tNumber of obs: ", sum(n_left + n_right), " (left: ", n_left, ", right: ", n_right, ")\n", sep = "")
+    
+    cat("\n\tCoefficient:\n")
+    
+    printCoefmat(rdd_coef(x, allInfo = TRUE), signif.stars = signif.stars)
+    
 }
 
 
 #' @export
-summary.rdd_reg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) {
-
-  x <- object
-  bw <- getBW(x)
-  cutpoint <- getCutpoint(x)
-  x_var <- getOriginalX(x)
-
-## compute numbers left/right:
-  n_left  <- sum(x_var >= cutpoint -bw & x_var < cutpoint)
-  n_right <- sum(x_var >= cutpoint & x_var <= cutpoint+bw)
-
-## compute residual summary:
-  res_quant <- quantile(residuals(x))
-  names(res_quant) <- c("Min", "1Q", "Median", "3Q", "Max")
-
-## compute R^2
-  r.squared <- summary(x$RDDslot$model)$r.squared
-
-## Extend the rdd_reg_no output with new computaations:
-
-  object$r.squared <- r.squared
-  object$res_quant <- res_quant
-  object$n_obs <- list(n_left=n_left, n_right=n_right, total=n_left+n_right)
-
-  class(object) <- c("summary.rdd_reg_np", class(object))
-  object
+summary.rdd_reg_np <- function(object, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), 
+    ...) {
+    
+    x <- object
+    bw <- getBW(x)
+    cutpoint <- getCutpoint(x)
+    x_var <- getOriginalX(x)
+    
+    ## compute numbers left/right:
+    n_left <- sum(x_var >= cutpoint - bw & x_var < cutpoint)
+    n_right <- sum(x_var >= cutpoint & x_var <= cutpoint + bw)
+    
+    ## compute residual summary:
+    res_quant <- quantile(residuals(x))
+    names(res_quant) <- c("Min", "1Q", "Median", "3Q", "Max")
+    
+    ## compute R^2
+    r.squared <- summary(x$RDDslot$model)$r.squared
+    
+    ## Extend the rdd_reg_no output with new computaations:
+    
+    object$r.squared <- r.squared
+    object$res_quant <- res_quant
+    object$n_obs <- list(n_left = n_left, n_right = n_right, total = n_left + n_right)
+    
+    class(object) <- c("summary.rdd_reg_np", class(object))
+    object
 }
 
 
 #' @export
-print.summary.rdd_reg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) {
-
-  bw <- getBW(x)
-
-  cat("### RDD regression: nonparametric local linear###\n")
-  cat("\tBandwidth: ", bw, "\n")
-  cat("\tNumber of obs: ", x$n_obs$total, " (left: ", x$n_obs$n_left, ", right: ", x$n_obs$n_right, ")\n", sep="")
-
-  cat("\n\tWeighted Residuals:\n")
-  print(zapsmall(x$res_quant, digits + 1))
-
-
-  cat("\n\tCoefficient:\n")
-
-  printCoefmat(rdd_coef(x, allInfo=TRUE), signif.stars=signif.stars)
-
-  cat("\n\tLocal R squared:",  formatC(x$r.squared, digits = digits), "\n")
-
+print.summary.rdd_reg_np <- function(x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), 
+    ...) {
+    
+    bw <- getBW(x)
+    
+    cat("### RDD regression: nonparametric local linear###\n")
+    cat("\tBandwidth: ", bw, "\n")
+    cat("\tNumber of obs: ", x$n_obs$total, " (left: ", x$n_obs$n_left, ", right: ", x$n_obs$n_right, ")\n", sep = "")
+    
+    cat("\n\tWeighted Residuals:\n")
+    print(zapsmall(x$res_quant, digits + 1))
+    
+    
+    cat("\n\tCoefficient:\n")
+    
+    printCoefmat(rdd_coef(x, allInfo = TRUE), signif.stars = signif.stars)
+    
+    cat("\n\tLocal R squared:", formatC(x$r.squared, digits = digits), "\n")
+    
 }
 
 
 #' @export
-plot.rdd_reg_np <- function(x,binwidth,chart=c("locpoly", "np"), ...) {
-
-  chart <- match.arg(chart)
-  cutpoint <- getCutpoint(x)
-  bw <- getBW(x)
-  if(missing(binwidth)) binwidth <- bw/5 # binwidth!=bandwidth
-
-## data
-  dat <- getOriginalData(x, classRDD=FALSE) 
-
-## Use locpoly:
-  dat_left <- subset(dat, x=cutpoint)
-
-  if(chart=="locpoly"){
-    llp_left <- locpoly(x=dat_left$x, y=dat_left$y, bandwidth=bw)
-    llp_right <- locpoly(x=dat_right$x, y=dat_right$y, bandwidth=bw)
-
-## Use np:
-  } else {
-    np_reg_left  <- np::npreg(np::npregbw(y~x, data=dat_left, regtype="ll", ckertype="epanechnikov",
-		      bandwidth.compute=FALSE, bws=bw))
-
-     np_reg_right  <- np::npreg(np::npregbw(y~x, data=dat_right, regtype="ll", ckertype="epanechnikov",
-		      bandwidth.compute=FALSE, bws=bw))
-    newDat_left <- data.frame(x=seq(min(dat_left$x), cutpoint-0.001, by=.01))
-    newDat_right <- data.frame(x=seq(cutpoint, max(dat_right$x),  by=.01))
-    pred_left <- predict(np_reg_left, newdata=newDat_left,se.fit=TRUE)
-    pred_right <- predict(np_reg_right, newdata=newDat_right,se.fit=TRUE)
-  }
-##plot
-  plotBin(dat$x, dat$y, h=binwidth, ...)
-  if(chart=="locpoly"){
-    lines(llp_left$x, llp_left$y)
-    lines(llp_right$x, llp_right$y)
-  } else {
-    lines(newDat_left$x, pred_left$fit, col=1)
-    lines(newDat_left$x, pred_left$fit+2*pred_left$se.fit, col=2, lty=2)
-    lines(newDat_left$x, pred_left$fit-2*pred_left$se.fit, col=2, lty=2)
-
-    lines(newDat_right$x, pred_right$fit, col=1)
-    lines(newDat_right$x, pred_right$fit+2*pred_right$se.fit, col=2, lty=2)
-    lines(newDat_right$x, pred_right$fit-2*pred_right$se.fit, col=2, lty=2)
-}
+plot.rdd_reg_np <- function(x, binwidth, chart = c("locpoly", "np"), ...) {
+    
+    chart <- match.arg(chart)
+    cutpoint <- getCutpoint(x)
+    bw <- getBW(x)
+    if (missing(binwidth)) 
+        binwidth <- bw/5  # binwidth!=bandwidth
+    
+    ## data
+    dat <- getOriginalData(x, classRDD = FALSE)
+    
+    ## Use locpoly:
+    dat_left <- subset(dat, x < cutpoint)
+    dat_right <- subset(dat, x >= cutpoint)
+    
+    if (chart == "locpoly") {
+        llp_left <- locpoly(x = dat_left$x, y = dat_left$y, bandwidth = bw)
+        llp_right <- locpoly(x = dat_right$x, y = dat_right$y, bandwidth = bw)
+        
+        ## Use np:
+    } else {
+        np_reg_left <- np::npreg(np::npregbw(y ~ x, data = dat_left, regtype = "ll", ckertype = "epanechnikov", bandwidth.compute = FALSE, 
+            bws = bw))
+        
+        np_reg_right <- np::npreg(np::npregbw(y ~ x, data = dat_right, regtype = "ll", ckertype = "epanechnikov", bandwidth.compute = FALSE, 
+            bws = bw))
+        newDat_left <- data.frame(x = seq(min(dat_left$x), cutpoint - 0.001, by = 0.01))
+        newDat_right <- data.frame(x = seq(cutpoint, max(dat_right$x), by = 0.01))
+        pred_left <- predict(np_reg_left, newdata = newDat_left, se.fit = TRUE)
+        pred_right <- predict(np_reg_right, newdata = newDat_right, se.fit = TRUE)
+    }
+    ## plot
+    plotBin(dat$x, dat$y, h = binwidth, ...)
+    if (chart == "locpoly") {
+        lines(llp_left$x, llp_left$y)
+        lines(llp_right$x, llp_right$y)
+    } else {
+        lines(newDat_left$x, pred_left$fit, col = 1)
+        lines(newDat_left$x, pred_left$fit + 2 * pred_left$se.fit, col = 2, lty = 2)
+        lines(newDat_left$x, pred_left$fit - 2 * pred_left$se.fit, col = 2, lty = 2)
+        
+        lines(newDat_right$x, pred_right$fit, col = 1)
+        lines(newDat_right$x, pred_right$fit + 2 * pred_right$se.fit, col = 2, lty = 2)
+        lines(newDat_right$x, pred_right$fit - 2 * pred_right$se.fit, col = 2, lty = 2)
+    }
 }
 
 #' @export 
-vcov.rdd_reg_np <- function(object, ...){
-
-  infType <- infType(object)
-  if(infType=="np") {
-    warning("No vcov() available when rdd_reg_np() was called with infType='np'")
-    res <- NULL
-  } else {
-    res <- vcov(object$RDDslot$model)
-  }
-  res
-}
+vcov.rdd_reg_np <- function(object, ...) {
+    
+    infType <- infType(object)
+    if (infType == "np") {
+        warning("No vcov() available when rdd_reg_np() was called with infType='np'")
+        res <- NULL
+    } else {
+        res <- vcov(object$RDDslot$model)
+    }
+    res
+} 
diff --git a/R/var_estim.R b/R/var_estim.R
index 94fa909..a2ee059 100644
--- a/R/var_estim.R
+++ b/R/var_estim.R
@@ -1,56 +1,59 @@
 
 
 
-dens_estim <- function(x, point, bw, eachSide=TRUE){
-
-  N <- length(x)
-
-  if(missing(bw)) bw <-  1.84*sd(x)*N^(-1/5)
-
-  if(eachSide){
-    isIn_bw_left  <- x>=(point-bw) & x=point & x<=(point+bw)
-
-    NisIn_bw_left  <- sum(isIn_bw_left, na.rm=TRUE)
-    NisIn_bw_right <- sum(isIn_bw_right, na.rm=TRUE)
-
-    res <-(NisIn_bw_left+NisIn_bw_right)/(2*N*bw)
-  } else {
-    isIn_bw_both  <- x>=(point-bw) & x<=(point+bw)
-    NisIn_bw_both  <- sum(isIn_bw_both, na.rm=TRUE)
-    res <- NisIn_bw_both/(2*N*bw)
-  }
-  res
+dens_estim <- function(x, point, bw, eachSide = TRUE) {
+    
+    N <- length(x)
+    
+    if (missing(bw)) 
+        bw <- 1.84 * sd(x) * N^(-1/5)
+    
+    if (eachSide) {
+        isIn_bw_left <- x >= (point - bw) & x < point
+        isIn_bw_right <- x >= point & x <= (point + bw)
+        
+        NisIn_bw_left <- sum(isIn_bw_left, na.rm = TRUE)
+        NisIn_bw_right <- sum(isIn_bw_right, na.rm = TRUE)
+        
+        res <- (NisIn_bw_left + NisIn_bw_right)/(2 * N * bw)
+    } else {
+        isIn_bw_both <- x >= (point - bw) & x <= (point + bw)
+        NisIn_bw_both <- sum(isIn_bw_both, na.rm = TRUE)
+        res <- NisIn_bw_both/(2 * N * bw)
+    }
+    res
 }
 
-dens_estim2 <- function(x, point, bw, kernel="gaussian",...){
-
-
-  if(missing(bw)) bw <-  "SJ"
-
-  d <- density(x, from=point, to=point, n=1, na.rm=TRUE, kernel=kernel, bw=bw,...)
-  d$y
+dens_estim2 <- function(x, point, bw, kernel = "gaussian", ...) {
+    
+    
+    if (missing(bw)) 
+        bw <- "SJ"
+    
+    d <- density(x, from = point, to = point, n = 1, na.rm = TRUE, kernel = kernel, bw = bw, ...)
+    d$y
 }
 
 
-var_estim <- function(x,y, point, bw, eachSide=TRUE){
-
-
-  N <- length(x)
-  if(missing(bw)) bw <-  1.84*sd(x)*N^(-1/5)
-
-  if(eachSide){
-    isIn_bw_left  <- x>=(point-bw) & x=point & x<=(point+bw)
-    var_inh_left  <- var(y[isIn_bw_left], na.rm=TRUE)
-    var_inh_right <- var(y[isIn_bw_right], na.rm=TRUE)
-    res <- c(var_inh_left, var_inh_right)
-  } else {
-    isIn_bw  <- x>=(point-bw) & x<=point+bw
-    var_inh  <- var(y[isIn_bw], na.rm=TRUE)
-    res <- var_inh
-  }
-res
+var_estim <- function(x, y, point, bw, eachSide = TRUE) {
+    
+    
+    N <- length(x)
+    if (missing(bw)) 
+        bw <- 1.84 * sd(x) * N^(-1/5)
+    
+    if (eachSide) {
+        isIn_bw_left <- x >= (point - bw) & x < point
+        isIn_bw_right <- x >= point & x <= (point + bw)
+        var_inh_left <- var(y[isIn_bw_left], na.rm = TRUE)
+        var_inh_right <- var(y[isIn_bw_right], na.rm = TRUE)
+        res <- c(var_inh_left, var_inh_right)
+    } else {
+        isIn_bw <- x >= (point - bw) & x <= point + bw
+        var_inh <- var(y[isIn_bw], na.rm = TRUE)
+        res <- var_inh
+    }
+    res
 }
 
 
@@ -59,113 +62,116 @@ res
 
 ### Add locpol kernel for uniform:
 uniK <- function(x) ifelse(abs(x) <= 1, 1/2, 0)
-attr(uniK, "RK") <- 1/2 ## Rk: kernel(u)^2
-attr(uniK,"mu0K") <- 1
-attr(uniK,"mu2K") <- 1/3 ## second orde rmoment of K
-attr(uniK,"K4") <- NA ## see with author!
-attr(uniK,"RdK") <- NA ## see with author!
-attr(uniK, "dom") <- c(-1,1) ##
-
-var_estim2 <- function(x,y, point, bw, estim=c("var", "NW", "NW_loc", "LL_kern", "LL_loc", "var_loc"), sides=c("both", "uni"), kernel=c("Normal", "Uniform"), dfadj=TRUE){
-
-  sides <- match.arg(sides)
-  estim <- match.arg(estim)
-  kernel <- match.arg(kernel)
-  N <- length(x)
-  if(missing(bw)) bw <-  1.84*sd(x)*N^(-1/5)
-
-  if(sides=="uni"){
-    isIn_bw_left  <- x>=(point-bw) & x=point & x<=(point+bw)
-    var_inh_left  <- var(y[isIn_bw_left], na.rm=TRUE)
-    var_inh_right <- var(y[isIn_bw_right], na.rm=TRUE)
-    res <- c(var_inh_left, var_inh_right)
-  } else  {
-    if(estim=="NW"){
-      ker <- switch(kernel, "Uniform"="box", "Normal"="normal")
-      m <- ksmooth(x=x, y=y, bandwidth=bw*2, x.points=point, kernel=ker)$y
-      s <- ksmooth(x=x, y=y^2, bandwidth=bw*2, x.points=point, kernel=ker)$y
-    } else if(estim=="NW_loc"){
-      ker <- switch(kernel, "Uniform"=uniK, "Normal"=gaussK)
-      df_xy <- data.frame(y=y, x=x, y2=y^2)
-#       a <<- locCteSmootherC(x=x, y=y, xeval=point, bw=bw, kernel=uniK)
-#       aa <<- locCteSmootherC(x=x, y=y, xeval=point, bw=bw, kernel=gaussK)
-      m <- locpol(y~x,data=df_xy, bw=bw, xeval=point, deg=0, kernel=ker)
-      s <- locpol(y2~x,data=df_xy, bw=bw, xeval=point, deg=0, kernel=ker)
-      m <- m$lpFit["y"]
-      s <- s$lpFit["y2"]
-    } else if(estim=="LL_kern"){
-      if(kernel!="Normal") warning("Kernel set to Normal for locpoly")
-      m <- locpoly(x=x, y=y, bandwidth=bw, gridsize=200)
-      s <- locpoly(x=x, y=y^2, bandwidth=bw, gridsize=200)
-      m <- m$y[which.min(abs(m$x-point))]
-      s <- s$y[which.min(abs(s$x-point))]
-    } else if(estim=="LL_loc"){
-      ker <- switch(kernel, "Uniform"=uniK, "Normal"=gaussK)
-      df_xy <- data.frame(y=y, x=x, y2=y^2)
-      m <- locpol(y~x,data=df_xy, bw=bw, xeval=point, kernel=ker)
-      s <- locpol(y2~x,data=df_xy, bw=bw, xeval=point, kernel=ker)
-      m <- m$lpFit["y"]
-      s <- s$lpFit["y2"]
+attr(uniK, "RK") <- 1/2  ## Rk: kernel(u)^2
+attr(uniK, "mu0K") <- 1
+attr(uniK, "mu2K") <- 1/3  ## second orde rmoment of K
+attr(uniK, "K4") <- NA  ## see with author!
+attr(uniK, "RdK") <- NA  ## see with author!
+attr(uniK, "dom") <- c(-1, 1)  ##
+
+var_estim2 <- function(x, y, point, bw, estim = c("var", "NW", "NW_loc", "LL_kern", "LL_loc", "var_loc"), sides = c("both", "uni"), 
+    kernel = c("Normal", "Uniform"), dfadj = TRUE) {
+    
+    sides <- match.arg(sides)
+    estim <- match.arg(estim)
+    kernel <- match.arg(kernel)
+    N <- length(x)
+    if (missing(bw)) 
+        bw <- 1.84 * sd(x) * N^(-1/5)
+    
+    if (sides == "uni") {
+        isIn_bw_left <- x >= (point - bw) & x < point
+        isIn_bw_right <- x >= point & x <= (point + bw)
+        var_inh_left <- var(y[isIn_bw_left], na.rm = TRUE)
+        var_inh_right <- var(y[isIn_bw_right], na.rm = TRUE)
+        res <- c(var_inh_left, var_inh_right)
     } else {
-      s <- m <- 1
+        if (estim == "NW") {
+            ker <- switch(kernel, Uniform = "box", Normal = "normal")
+            m <- ksmooth(x = x, y = y, bandwidth = bw * 2, x.points = point, kernel = ker)$y
+            s <- ksmooth(x = x, y = y^2, bandwidth = bw * 2, x.points = point, kernel = ker)$y
+        } else if (estim == "NW_loc") {
+            ker <- switch(kernel, Uniform = uniK, Normal = gaussK)
+            df_xy <- data.frame(y = y, x = x, y2 = y^2)
+            # a <<- locCteSmootherC(x=x, y=y, xeval=point, bw=bw, kernel=uniK) aa <<- locCteSmootherC(x=x, y=y, xeval=point, bw=bw,
+            # kernel=gaussK)
+            m <- locpol(y ~ x, data = df_xy, bw = bw, xeval = point, deg = 0, kernel = ker)
+            s <- locpol(y2 ~ x, data = df_xy, bw = bw, xeval = point, deg = 0, kernel = ker)
+            m <- m$lpFit["y"]
+            s <- s$lpFit["y2"]
+        } else if (estim == "LL_kern") {
+            if (kernel != "Normal") 
+                warning("Kernel set to Normal for locpoly")
+            m <- locpoly(x = x, y = y, bandwidth = bw, gridsize = 200)
+            s <- locpoly(x = x, y = y^2, bandwidth = bw, gridsize = 200)
+            m <- m$y[which.min(abs(m$x - point))]
+            s <- s$y[which.min(abs(s$x - point))]
+        } else if (estim == "LL_loc") {
+            ker <- switch(kernel, Uniform = uniK, Normal = gaussK)
+            df_xy <- data.frame(y = y, x = x, y2 = y^2)
+            m <- locpol(y ~ x, data = df_xy, bw = bw, xeval = point, kernel = ker)
+            s <- locpol(y2 ~ x, data = df_xy, bw = bw, xeval = point, kernel = ker)
+            m <- m$lpFit["y"]
+            s <- s$lpFit["y2"]
+        } else {
+            s <- m <- 1
+        }
+        sh <- s - m^2
+        res <- sh
+        if (estim == "var_loc") {
+            ker <- switch(kernel, Uniform = uniK, Normal = gaussK)
+            df_xy <- data.frame(y = y, x = x, y2 = y^2)
+            m <- locpol(y ~ x, data = df_xy, bw = bw, xeval = point, kernel = ker)
+            res <- m$lpFit$var
+        } else if (estim == "var") {
+            isIn_bw <- x >= (point - bw) & x <= (point + bw)
+            var <- var(y[isIn_bw], na.rm = TRUE)
+            res <- if (dfadj) 
+                var * (sum(isIn_bw) - 1)/sum(isIn_bw) else var
+        }
+        
     }
-    sh <- s - m^2
-    res <- sh
-    if(estim=="var_loc"){
-      ker <- switch(kernel, "Uniform"=uniK, "Normal"=gaussK)
-      df_xy <- data.frame(y=y, x=x, y2=y^2)
-      m <- locpol(y~x,data=df_xy, bw=bw, xeval=point, kernel=ker)
-      res <- m$lpFit$var
-    } else if(estim=="var"){
-      isIn_bw<- x>=(point-bw) & x<=(point+bw)
-      var  <- var(y[isIn_bw], na.rm=TRUE)
-      res <- if(dfadj) var*(sum(isIn_bw)-1)/sum(isIn_bw) else var
-    }
-
-  }
-  names(res) <- NULL
-as.numeric(res)
+    names(res) <- NULL
+    as.numeric(res)
 }
 
 
-## Formula: \sqrt[ (C_2 * \sigma(x)^2 / f(x)) / ( n * h) ]
-## Imbens & Kalyan: C_2/N*h (sigma_l^2 + \sigma_r^2)/f(x)
-## value of constant: 4.8 (using boundary kernel: Triangular
-## (value of constant: 33.6 (using boundary kernel: Triangular
-## library(locpol)
-## computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=1), lower=0, upper=Inf)
-## or: 
+## Formula: \sqrt[ (C_2 * \sigma(x)^2 / f(x)) / ( n * h) ] Imbens & Kalyan: C_2/N*h (sigma_l^2 + \sigma_r^2)/f(x) value of
+## constant: 4.8 (using boundary kernel: Triangular (value of constant: 33.6 (using boundary kernel: Triangular
+## library(locpol) computeRK(equivKernel(TrianK, nu=0, deg=1, lower=0, upper=1), lower=0, upper=Inf) or:
 ## computeRK(equivKernel(TrianK, nu=0, deg=1, lower=-1, upper=1), lower=-Inf, upper=Inf)
 
-all_var_low <- function(x,y, point, bw, eachSide=TRUE, return=c("se", "all")){
-
-  return <- match.arg(return)
-
-  N <- length(x)
-  if(missing(bw)) bw <-  1.84*sd(x)*N^(-1/5)
-
-  var <- var_estim(x=x, y=y, point=point, bw=bw, eachSide=eachSide)
-  dens <- dens_estim(x=x, point=point, bw=bw, eachSide=eachSide)
-
-  C2 <- if(eachSide) 4.8 else 2/3
-  const <- C2/(N*bw)
-  all <- const*sum(var)/dens
-  res <- sqrt(all)
-  names(res) <- "se"
-  if(return=="all") res <- c(res, cons=const, dens=dens, var=sum(var))
-  res
-
+all_var_low <- function(x, y, point, bw, eachSide = TRUE, return = c("se", "all")) {
+    
+    return <- match.arg(return)
+    
+    N <- length(x)
+    if (missing(bw)) 
+        bw <- 1.84 * sd(x) * N^(-1/5)
+    
+    var <- var_estim(x = x, y = y, point = point, bw = bw, eachSide = eachSide)
+    dens <- dens_estim(x = x, point = point, bw = bw, eachSide = eachSide)
+    
+    C2 <- if (eachSide) 
+        4.8 else 2/3
+    const <- C2/(N * bw)
+    all <- const * sum(var)/dens
+    res <- sqrt(all)
+    names(res) <- "se"
+    if (return == "all") 
+        res <- c(res, cons = const, dens = dens, var = sum(var))
+    res
+    
 }
 
 
 all_var <- function(...) all_var_low(...)
 
-all_var.rdd_reg.np <- function(x){
-
-  bw <- getBW(x)
-  dat <- getOriginalData(x)
-  cutpoint <- getCutpoint(x)
-  res <- all_var_low(dat$x,dat$y, point=cutpoint, bw=bw, eachSide=TRUE, return="se")
-  res
-}
+all_var.rdd_reg.np <- function(x) {
+    
+    bw <- getBW(x)
+    dat <- getOriginalData(x)
+    cutpoint <- getCutpoint(x)
+    res <- all_var_low(dat$x, dat$y, point = cutpoint, bw = bw, eachSide = TRUE, return = "se")
+    res
+} 
diff --git a/R/various_code.R b/R/various_code.R
index 66f4665..674f60c 100644
--- a/R/various_code.R
+++ b/R/various_code.R
@@ -1,17 +1,15 @@
 ### MISC
-is_even <- function (a) {
-  a%%2 == 0
+is_even <- function(a) {
+    a%%2 == 0
 }
 
 
 Kernel_tri <- function(X, center, bw) {
-  ifelse(abs(X - center) > bw, 0, 1 - (abs(X - center) / bw))
+    ifelse(abs(X - center) > bw, 0, 1 - (abs(X - center)/bw))
 }
 
 Kernel_uni <- function(X, center, bw) {
-  ifelse(abs(X - center) > bw, 0, 1)
+    ifelse(abs(X - center) > bw, 0, 1)
 }
 
-.onAttach <- function(libname, pkgname)
-  packageStartupMessage("IMPORTANT, this is an ALPHA VERSION
-                        many changes to the API will follow")
+.onAttach <- function(libname, pkgname) packageStartupMessage("IMPORTANT, this is an ALPHA VERSION\n                        many changes to the API will follow") 
diff --git a/R/waldci.R b/R/waldci.R
index 77e7863..33679e0 100644
--- a/R/waldci.R
+++ b/R/waldci.R
@@ -9,131 +9,137 @@
 #' @param \ldots Further arguments
 
 
-waldci <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...)
-{
-  UseMethod("waldci")
+waldci <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) {
+    UseMethod("waldci")
 }
 
-waldci.default <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...)
-{
-  ## use S4 methods if loaded
-  coef0 <- if("stats4" %in% loadedNamespaces()) stats4::coef else coef
-  vcov0 <- if("stats4" %in% loadedNamespaces()) stats4::vcov else vcov
-
-  ## extract coefficients and standard errors
-  est <- coef0(x)
-  if(is.null(vcov.)) se <- vcov0(x) else {
-      if(is.function(vcov.)) se <- vcov.(x)
-        else se <- vcov.
-  }
-  se <- sqrt(diag(se))
-
-  ## match using names and compute t/z statistics
-  if(!is.null(names(est)) && !is.null(names(se))) {
-    anames <- names(est)[names(est) %in% names(se)]
-    est <- est[anames]
-    se <- se[anames]
-  }
-  
-  ## process level
-  a <- (1 - level)/2
-  a <- c(a, 1 - a)
-  
-  ## get quantile from central limit theorem
-  if(is.null(df)) {
-    df <- try(df.residual(x), silent = TRUE)
-    if(inherits(df, "try-error")) df <- NULL
-  }
-  if(is.null(df)) df <- 0
-  fac <- if(is.finite(df) && df > 0) qt(a, df = df) else qnorm(a)
-
-  ## set up confidence intervals
-  ci <- cbind(est + fac[1] * se, est + fac[2] * se)
-  colnames(ci) <- paste(format(100 * a, trim = TRUE, scientific = FALSE, digits = 3L), "%")
-  
-  ## process parm
-  if(is.null(parm)) parm <- seq_along(est)
-#   if(is.character(parm)) parm <- which(parm %in% names(est))
-if(is.character(parm)) parm <- which(names(est)%in% parm )
-  ci <- ci[parm, , drop = FALSE]
-  return(ci)
-} 
-
-
-## copy of stats:::format.perc
-format.perc <- function (probs, digits) 
-  paste(format(100 * probs, trim = TRUE, scientific = FALSE, digits = digits), 
-        "%")
-
-waldci.rdd_reg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...){
-
-  inf_met <- infType(x) ## def in Misc.R
-  if(inf_met=="se"){
-    if(!is.null(vcov.)|!is.infinite(df)) {warning("Arg 'vcov.' and 'df' only work for rdd_reg with inf='lm'")
+waldci.default <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) {
+    ## use S4 methods if loaded
+    coef0 <- if ("stats4" %in% loadedNamespaces()) 
+        stats4::coef else coef
+    vcov0 <- if ("stats4" %in% loadedNamespaces()) 
+        stats4::vcov else vcov
+    
+    ## extract coefficients and standard errors
+    est <- coef0(x)
+    if (is.null(vcov.)) 
+        se <- vcov0(x) else {
+        if (is.function(vcov.)) 
+            se <- vcov.(x) else se <- vcov.
     }
-    ## code recycled from stats::confint.default
-    co <- rdd_coef(x, allInfo=TRUE)
+    se <- sqrt(diag(se))
+    
+    ## match using names and compute t/z statistics
+    if (!is.null(names(est)) && !is.null(names(se))) {
+        anames <- names(est)[names(est) %in% names(se)]
+        est <- est[anames]
+        se <- se[anames]
+    }
+    
+    ## process level
     a <- (1 - level)/2
     a <- c(a, 1 - a)
-    fac <- qnorm(a)
-    pct <- format.perc(a, 3) ## import!!
-    ci <- array(NA, dim = c(1, 2L), dimnames = list("D",   pct))
-    ci[] <- co[,"Estimate"] + co[,"Std. Error"] %o% fac
+    
+    ## get quantile from central limit theorem
+    if (is.null(df)) {
+        df <- try(df.residual(x), silent = TRUE)
+        if (inherits(df, "try-error")) 
+            df <- NULL
+    }
+    if (is.null(df)) 
+        df <- 0
+    fac <- if (is.finite(df) && df > 0) 
+        qt(a, df = df) else qnorm(a)
+    
+    ## set up confidence intervals
+    ci <- cbind(est + fac[1] * se, est + fac[2] * se)
+    colnames(ci) <- paste(format(100 * a, trim = TRUE, scientific = FALSE, digits = 3L), "%")
+    
+    ## process parm
+    if (is.null(parm)) 
+        parm <- seq_along(est)
+    # if(is.character(parm)) parm <- which(parm %in% names(est))
+    if (is.character(parm)) 
+        parm <- which(names(est) %in% parm)
+    ci <- ci[parm, , drop = FALSE]
     return(ci)
-  } else {
-    waldci.default(x$RDDslot$model, parm = "D", level = level, vcov. = vcov., df = df, ...)  
-  }
 }
 
 
-
-
-waldci.glm <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = Inf, ...)
-  waldci.default(x, parm = parm, level = level, vcov. = vcov., df = df, ...)  
-
-waldci.mlm <- function(x, parm=NULL, level = 0.95, vcov. = NULL, df = NULL, ...)
-{
-  ## obtain vcov
-  v <- if(is.null(vcov.)) vcov(x) else if(is.function(vcov.)) vcov.(x) else vcov.
-
-  ## nasty hack: replace coefficients so that their names match the vcov() method
-  x$coefficients <- structure(as.vector(x$coefficients), .Names = colnames(vcov(x)))
-
-  ## call default method
-  waldci.default(x, parm = parm, level = level, vcov. = v, df = df, ...)
+## copy of stats:::format.perc
+format.perc <- function(probs, digits) paste(format(100 * probs, trim = TRUE, scientific = FALSE, digits = digits), "%")
+
+waldci.rdd_reg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...) {
+    
+    inf_met <- infType(x)  ## def in Misc.R
+    if (inf_met == "se") {
+        if (!is.null(vcov.) | !is.infinite(df)) {
+            warning("Arg 'vcov.' and 'df' only work for rdd_reg with inf='lm'")
+        }
+        ## code recycled from stats::confint.default
+        co <- rdd_coef(x, allInfo = TRUE)
+        a <- (1 - level)/2
+        a <- c(a, 1 - a)
+        fac <- qnorm(a)
+        pct <- format.perc(a, 3)  ## import!!
+        ci <- array(NA, dim = c(1, 2L), dimnames = list("D", pct))
+        ci[] <- co[, "Estimate"] + co[, "Std. Error"] %o% fac
+        return(ci)
+    } else {
+        waldci.default(x$RDDslot$model, parm = "D", level = level, vcov. = vcov., df = df, ...)
+    }
 }
 
-waldci.survreg <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = Inf, ...)
-{
-  if(is.null(vcov.)) v <- vcov(x) else {
-      if(is.function(vcov.)) v <- vcov.(x)
-  	else v <- vcov.
-  }
-  if(length(x$coefficients) < NROW(x$var)) {
-    x$coefficients <- c(x$coefficients, "Log(scale)" = log(x$scale))
-  }
-  waldci.default(x, parm = parm, level = level, vcov. = v, df = df, ...)  
-} 
 
 
-if(FALSE){
 
-library(sandwich)
-library(lmtest)
+waldci.glm <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = Inf, ...) waldci.default(x, parm = parm, level = level, 
+    vcov. = vcov., df = df, ...)
 
-reg <- lm(freeny)
+waldci.mlm <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) {
+    ## obtain vcov
+    v <- if (is.null(vcov.)) 
+        vcov(x) else if (is.function(vcov.)) 
+        vcov.(x) else vcov.
+    
+    ## nasty hack: replace coefficients so that their names match the vcov() method
+    x$coefficients <- structure(as.vector(x$coefficients), .Names = colnames(vcov(x)))
+    
+    ## call default method
+    waldci.default(x, parm = parm, level = level, vcov. = v, df = df, ...)
+}
 
-### Regular
-all(confint(reg)==waldci(reg))
-confint(reg)
-co_reg <- coeftest(reg)
-co_reg[,1] + qnorm(0.975)*co_reg[,2]
-co_reg[,1] + qt(0.975, df=reg[["df.residual"]] )*co_reg[,2]
+waldci.survreg <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = Inf, ...) {
+    if (is.null(vcov.)) 
+        v <- vcov(x) else {
+        if (is.function(vcov.)) 
+            v <- vcov.(x) else v <- vcov.
+    }
+    if (length(x$coefficients) < NROW(x$var)) {
+        x$coefficients <- c(x$coefficients, `Log(scale)` = log(x$scale))
+    }
+    waldci.default(x, parm = parm, level = level, vcov. = v, df = df, ...)
+}
 
-## vcovHC
-waldci(reg, vcov.=vcovHC)
-co <- coeftest(reg, vcov.=vcovHC)
-co[,1] + qnorm(0.975)*co[,2]
-co[,1] + qt(0.975, df=reg[["df.residual"]] )*co[,2]
 
-}
\ No newline at end of file
+if (FALSE) {
+    
+    library(sandwich)
+    library(lmtest)
+    
+    reg <- lm(freeny)
+    
+    ### Regular
+    all(confint(reg) == waldci(reg))
+    confint(reg)
+    co_reg <- coeftest(reg)
+    co_reg[, 1] + qnorm(0.975) * co_reg[, 2]
+    co_reg[, 1] + qt(0.975, df = reg[["df.residual"]]) * co_reg[, 2]
+    
+    ## vcovHC
+    waldci(reg, vcov. = vcovHC)
+    co <- coeftest(reg, vcov. = vcovHC)
+    co[, 1] + qnorm(0.975) * co[, 2]
+    co[, 1] + qt(0.975, df = reg[["df.residual"]]) * co[, 2]
+    
+} 
diff --git a/man/Lee2008.Rd b/man/Lee2008.Rd
index c5bb3e4..43ac259 100644
--- a/man/Lee2008.Rd
+++ b/man/Lee2008.Rd
@@ -25,7 +25,7 @@ summary(RDDlee)
 plot(RDDlee)
 }
 \references{
-Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator,"
+Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,'
 Review of Economic Studies (2012) 79, 933-959
 
 Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections,
diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd
index 96c6f02..a9e5cf4 100644
--- a/man/STAR_MHE.Rd
+++ b/man/STAR_MHE.Rd
@@ -33,7 +33,7 @@ The transformed data was obtained using the STATA script krueger.do, obtained fr
 data(STAR_MHE)
 
 # Compute the group means:
-STAR_MHE_means <- aggregate(STAR_MHE[, c("classid", "pscore", "cs")],
+STAR_MHE_means <- aggregate(STAR_MHE[, c('classid', 'pscore', 'cs')],
                             by=list(STAR_MHE$classid), mean)
 
 # Regression of means, with weighted average:
@@ -41,7 +41,7 @@ reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs)
 coef(summary(reg_krug_gls))[2,2]
 }
 \references{
-Krueger, A. (1999) "Experimental Estimates Of Education Production Functions,"
+Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,'
 \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May.
 
 Angrist, A. ad  Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion},
diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd
index 2744c30..7544d1a 100644
--- a/man/clusterInf.Rd
+++ b/man/clusterInf.Rd
@@ -30,12 +30,12 @@ Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
 
 # here we just generate randomly a cluster variable:
-nlet <- sort(c(outer(letters, letters, paste, sep="")))
+nlet <- sort(c(outer(letters, letters, paste, sep='')))
 clusRandom <- sample(nlet[1:60], size=nrow(Lee2008_rdd), replace=TRUE)
 
 # now do post-inference:
 clusterInf(reg_para, clusterVar=clusRandom)
-clusterInf(reg_para, clusterVar=clusRandom, type="HC")
+clusterInf(reg_para, clusterVar=clusRandom, type='HC')
 }
 \references{
 Wooldridge (2003) Cluster-sample methods in applied econometrics.
diff --git a/man/gen_mc_ik.Rd b/man/gen_mc_ik.Rd
index 01548f1..8fcd0b1 100644
--- a/man/gen_mc_ik.Rd
+++ b/man/gen_mc_ik.Rd
@@ -36,8 +36,8 @@ reg_nonpara
 plotCu <- function(version=1, xlim=c(-0.1,0.1)){
   res <- gen_mc_ik(sd=0.0000001, n=1000, version=version)
   res <- res[order(res$x),]
-  ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), "y"))
-  plot(res, type="l", xlim=xlim, ylim=ylim, main=paste("DGP", version))
+  ylim <- range(subset(res, x>=min(xlim) & x<=max(xlim), 'y'))
+  plot(res, type='l', xlim=xlim, ylim=ylim, main=paste('DGP', version))
   abline(v=0)
   xCut <- res[which(res$x==min(res$x[res$x>=0]))+c(0,-1),]
   points(xCut, col=2)
diff --git a/man/plotBin.Rd b/man/plotBin.Rd
index a68cac2..fa63c3c 100644
--- a/man/plotBin.Rd
+++ b/man/plotBin.Rd
@@ -31,7 +31,7 @@ plotBin(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE,
 Returns silently values
 }
 \description{
-Do a "scatterplot bin smoothing"
+Do a 'scatterplot bin smoothing'
 }
 \references{
 McCrary, Justin.
diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd
index 4eecd69..4ff7da5 100644
--- a/man/plotPlacebo.Rd
+++ b/man/plotPlacebo.Rd
@@ -59,7 +59,7 @@ reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
 plotPlacebo(reg_nonpara)
 
 # Use with another vcov function; cluster case
-reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference="lm")
+reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference='lm')
 # need to be a function applied to updated object!
 vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 plotPlacebo(reg_nonpara_lminf, vcov. = vc)
diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd
index 2ab374b..646a359 100644
--- a/man/plotSensi.Rd
+++ b/man/plotSensi.Rd
@@ -56,11 +56,11 @@ Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 bw_ik <- rdd_bw_ik(Lee2008_rdd)
 reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
 plotSensi(reg_nonpara)
-plotSensi(reg_nonpara, device="base")
+plotSensi(reg_nonpara, device='base')
 
 #Parametric estimate:
 reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
 plotSensi(reg_para_ik)
-plotSensi(reg_para_ik, type="facet")
+plotSensi(reg_para_ik, type='facet')
 }
 
diff --git a/man/rdd_bw_ik.Rd b/man/rdd_bw_ik.Rd
index 13cff53..18f0385 100644
--- a/man/rdd_bw_ik.Rd
+++ b/man/rdd_bw_ik.Rd
@@ -24,7 +24,7 @@ rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
 rdd_bw_ik(rd)
 }
 \references{
-Imbens, Guido and Karthik Kalyanaraman. (2012) "Optimal Bandwidth Choice for the regression discontinuity estimator,"
+Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,'
 Review of Economic Studies (2012) 79, 933-959
 }
 \seealso{
diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd
index e9e3577..72783cd 100644
--- a/man/rdd_gen_reg.Rd
+++ b/man/rdd_gen_reg.Rd
@@ -53,7 +53,7 @@ Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
 
 ## Estimate a local probit:
 Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y
Date: Thu, 7 May 2015 12:30:27 +0200
Subject: [PATCH 141/323] use coveralls

---
 .travis.yml | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 7b685ab..f096594 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,11 +1,22 @@
-# Sample .travis.yml for R projects
-
 language: r
+sudo: required
 warnings_are_errors: true
 
+env:
+ global:
+   - CRAN: http://cran.rstudio.com
+   
+r_github_packages:
+  - jimhester/covr
+
 r_packages:
+  - testthat
   - rmarkdown
 
+
+after_success:
+  - Rscript -e 'library(covr);coveralls()'
+
 notifications:
   email:
     on_success: change

From 554e914836272bdf3faec1b3ee754b4ca8afe3cf Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:50:09 +0200
Subject: [PATCH 142/323] rename Lee2008 to house, move documentation to
 rddtools file

---
 R/Lee2008-data.R             |  26 --------------
 R/STAR_MHE-data.R            |  64 -----------------------------------
 R/rddtools.R                 |  63 +++++++++++++++++++++++++++++++---
 data/Lee2008.rda             | Bin 36431 -> 0 bytes
 data/house.rda               | Bin 0 -> 36367 bytes
 man/STAR_MHE.Rd              |   2 +-
 man/{Lee2008.Rd => house.Rd} |  19 +++++------
 man/rddtools.Rd              |   3 --
 8 files changed, 67 insertions(+), 110 deletions(-)
 delete mode 100644 R/Lee2008-data.R
 delete mode 100644 R/STAR_MHE-data.R
 delete mode 100644 data/Lee2008.rda
 create mode 100644 data/house.rda
 rename man/{Lee2008.Rd => house.Rd} (73%)

diff --git a/R/Lee2008-data.R b/R/Lee2008-data.R
deleted file mode 100644
index 743fe9b..0000000
--- a/R/Lee2008-data.R
+++ /dev/null
@@ -1,26 +0,0 @@
-#' @name Lee2008
-#' @title Dataset used in Lee (2008)
-#' @description U.S. House elections data
-#' @docType data
-#' @usage Lee2008
-#' @description Dataset described used in Imbens and Kalyamaran (2012), and probably the same dataset used in Lee (2008),
-#' @format A data frame with 6558 observations and two variables:
-#' \describe{
-#' \item{x}{Vote at election t-1}
-#' \item{y}{Vote at election t}
-#' }
-#' @source Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity}
-#' @references Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' 
-#' Review of Economic Studies (2012) 79, 933-959
-#' @references   Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, 
-#' \emph{Journal of Econometrics}, 142, 675-697
-#' @examples 
-#' data(Lee2008)
-#' RDDlee <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
-#' summary(RDDlee)
-#' plot(RDDlee)
-
-
-NULL
-# Lee2008 <- read.csv('/home/mat/Dropbox/HEI/rdd/Rcode/IK bandwidth/datasets/imbens_from_MATLAB.csv', header=FALSE)
-# colnames(Lee2008) <- c('x', 'y') save(Lee2008, file='/home/mat/Dropbox/HEI/rdd/Rcode/RDDtools/data/Lee2008.rda') 
diff --git a/R/STAR_MHE-data.R b/R/STAR_MHE-data.R
deleted file mode 100644
index 6f3bb6e..0000000
--- a/R/STAR_MHE-data.R
+++ /dev/null
@@ -1,64 +0,0 @@
-#' @name STAR_MHE
-#' @title Transformation of the STAR dataset as used in Angrist and Pischke (2008)
-#' @description Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke (2008) 
-#' @docType data
-#' @usage STAR_MHE
-#' @seealso \code{\link[AER]{STAR}} for the original dataset.
-#' @format A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, 
-#' all other are created by Angrist and Pischke STAT code.
-#' \describe{
-#' \item{schidkn}{School ID in kindergarden (original variable, schoolidk in \code{\link[AER]{STAR}})}
-#' \item{pscore}{The propensity score  (computed by A & P)}
-#' \item{classid}{The id of the class (computed by A & P)}
-#' \item{cs}{Class size (computed by A & P)}
-#' \item{female, nwhite}{Various covariates (computed by A & P)}
-#' }
-#' @details ). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. 
-#' The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. 
-#' The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website 
-#' (\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta.
-#' @references Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' 
-#' \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May.
-#' @references Angrist, A. ad  Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, 
-#' Princeton University press
-#' @source Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website 
-#' \url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012.
-#' @examples 
-#' data(STAR_MHE)
-#' 
-#' # Compute the group means:
-#' STAR_MHE_means <- aggregate(STAR_MHE[, c('classid', 'pscore', 'cs')],
-#'                             by=list(STAR_MHE$classid), mean)
-#' 
-#' # Regression of means, with weighted average:
-#' reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs)
-#' coef(summary(reg_krug_gls))[2,2]
-
-NULL
-
-
-##### Quick R code used on the output data: STAR_MHE <- read.csv('.../abuelita.csv') STAR_MHE$female <-
-##### as.factor(STAR_MHE$female) STAR_MHE$nwhite <- as.factor(STAR_MHE$nwhite) STAR_MHE$n <- NULL save(STAR_MHE,
-##### file='STAR_MHE.rda')
-
-
-##### STATA code krueger.do (retrieved 26 November 2012 on http://economics.mit.edu/faculty/angrist/data1/mhe/krueger) version 9
-##### set more 1 capture log close log using krueger, text replace /* create Krueger scaled scores */ /* reading score */ clear
-##### use webstar keep if cltypek > 1 /* regular classes */ keep if treadssk ~= .  sort treadssk gen pread0 = 100*_n/_N egen
-##### pread = mean(pread0), by(treadssk) /* percentile score in reg. classes */ keep treadssk pread sort tread keep if tread ~=
-##### tread[_n-1] save tempr, replace /* math score */ use webstar keep if cltypek > 1 /* regular classes */ keep if tmathssk ~=
-##### .  sort tmathssk gen pmath0 = 100*_n/_N egen pmath = mean(pmath0), by(tmathssk) keep tmathssk pmath sort tmath keep if
-##### tmath ~= tmath[_n-1] save tempm, replace /* merge percentile scores back on */ use webstar keep if stark == 1 sort treadssk
-##### merge treadssk using tempr ipolate pread treadssk, gen(pr) epolate drop _merge sort tmathssk merge tmathssk using tempm
-##### ipolate pmath tmathssk, gen(pm) epolate replace pm = 0 if pm < 0 drop _merge egen pscore = rowmean(pr pm) /* make class ids
-##### */ egen classid1 = group(schidkn cltypek) egen cs1 = count(classid1), by(classid1) egen classid2 = group(classid1 totexpk
-##### hdegk cladk) if cltypek==1 & cs >= 20 egen classid3 = group(classid1 totexpk hdegk cladk) if cltypek>1 & cs >= 30 gen temp
-##### = classid1*100 egen classid = rowtotal(temp classid2 classid3) egen cs = count(classid), by(classid) gen female = ssex == 2
-##### gen nwhite = srace >= 2 & srace <= 6 if srace ~= .  keep if cs <= 27 & pscore ~= .  keep pscore cs schidkn classid female
-##### nwhite gen n = 1 save temp, replace reg pscore cs, robust local se = _se[cs] local t = _b[cs]/`se' predict r, res loneway r
-##### classid local rho = r(rho) collapse cs, by(classid) sum cs dis r(Var) local m = 1 + (r(Var)/r(mean) + r(mean) - 1)*`rho'
-##### dis `m' dis sqrt(`m') dis `se' dis sqrt(`m')*`se' dis `t'/sqrt(`m') use temp, clear reg pscore cs, robust moulton pscore
-##### cs, cluster(classid) moulton moulton pscore cs, cluster(classid) reg pscore cs, cluster(classid) brl pscore cs,
-##### cluster(classid) set seed 123456789 bootstrap 'reg pscore cs' _b, reps(1000) cluster(classid) areg pscore, absorb(classid)
-##### predict hat gen ry = pscore - hat + _b[_cons] collapse (mean) ry cs (sum) n, by(classid) reg ry cs [aw=n] log close set
-##### more 0 
diff --git a/R/rddtools.R b/R/rddtools.R
index d93b898..d19c8b2 100644
--- a/R/rddtools.R
+++ b/R/rddtools.R
@@ -1,9 +1,4 @@
-#' Regression Discontinuity Design 
-#' 
-#' Provides function to do a comprehensive regression discontinuity analysis. 
-#' 
 #' @name rddtools
-#' @aliases rddtools
 #' @docType package
 #' @import KernSmooth
 #' @import np
@@ -14,3 +9,61 @@ if (getRversion() >= "3.1.0") {
     utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high"))
     utils::suppressForeignCheck(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high"))
 } 
+
+#' @name house
+#' @docType data
+#' @title Dataset used in Lee (2008)
+#' @description Randomized experiments from non-random selection in U.S. House elections
+#' @description Dataset described used in Imbens and Kalyamaran (2012), and probably the same dataset used in Lee (2008),
+#' @format A data frame with 6558 observations and two variables:
+#' \describe{
+#' \item{x}{Vote at election t-1}
+#' \item{y}{Vote at election t}
+#' }
+#' @source Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity}
+#' @references Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' 
+#' Review of Economic Studies (2012) 79, 933-959
+#' @references   Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, 
+#' \emph{Journal of Econometrics}, 142, 675-697
+#' @examples 
+#' data(house)
+#' rdd_house <- rdd_data(x=x, y=y, data=house, cutpoint=0)
+#' summary(rdd_house)
+#' plot(rdd_house)
+NULL
+#' @name STAR_MHE
+#' @docType data
+#' @title Transformation of the STAR dataset as used in Angrist and Pischke (2008)
+#' @description Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke (2008) 
+#' @usage STAR_MHE
+#' @seealso \code{\link[AER]{STAR}} for the original dataset.
+#' @format A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, 
+#' all other are created by Angrist and Pischke STAT code.
+#' \describe{
+#' \item{schidkn}{School ID in kindergarden (original variable, schoolidk in \code{\link[AER]{STAR}})}
+#' \item{pscore}{The propensity score  (computed by A & P)}
+#' \item{classid}{The id of the class (computed by A & P)}
+#' \item{cs}{Class size (computed by A & P)}
+#' \item{female, nwhite}{Various covariates (computed by A & P)}
+#' }
+#' @details ). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. 
+#' The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. 
+#' The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website 
+#' (\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta.
+#' @references Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' 
+#' \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May.
+#' @references Angrist, A. ad  Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, 
+#' Princeton University press
+#' @source Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website 
+#' \url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012.
+#' @examples 
+#' data(STAR_MHE)
+#' 
+#' # Compute the group means:
+#' STAR_MHE_means <- aggregate(STAR_MHE[, c('classid', 'pscore', 'cs')],
+#'                             by=list(STAR_MHE$classid), mean)
+#' 
+#' # Regression of means, with weighted average:
+#' reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs)
+#' coef(summary(reg_krug_gls))[2,2]
+NULL
diff --git a/data/Lee2008.rda b/data/Lee2008.rda
deleted file mode 100644
index df517b7eedf64717e4c70f8c0ddf41e5cd46683f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 36431
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 xC4oH81GpTOS?z?Y@JrFz$pdQL|F
zU(8&;koPJ3nBs36ypJY*Nj2n;15
z!WR&po}o)IpnpJfE>hy#7(Qi6yrX%b>Msk(pCjs933^xw=OiKz&^(NU_o=#S3ci~1
z9%A?i8GQGlJD&%7un*QnH8J=~0v}oWm>Ky?44$m|iTIU@i~XEP{N@&Qi7|SUnxorf
zj*sRbwy0Mn^i4|#KLbb9dlr79d{%r&>8**!D1C@6>C2F>X|86MzKj-isWS1jzSfCn
z2h`b8a31NOXT-x}>29#k`plCF(ZTD%p9$cBX7s-%%(ZAT7gY7h6>!2BoFmp8C-SU;
z<_p3XP=AT$mq{l}I@$yL!sx*|aAqAI=ZE=w=~h>STawQ$f@jw`=Uv{TbO|!{$-wc2
z5AsrQyEgsfHR2Ypr@(p9d)K_G2>d#t-^16%RDVI2CqZvs^IZGreI(AmALxw150&4^
zSlYu9f
z-g>+z=@E^YZ?uD*-<98?&nw11_NZT%ICs)3se+FcTs(AGPfj=`=UnqXWKSdVhlsgX
zb#Ry(@qC3mZ5?}2(7bKUGhshVZ$5bNe8GeFOl*%!z9JKAz6Sa?3Hx1mqWD^x
z?^&ZR-o$P;c&;}0-(+1jq!UU#w}L%LJ+ABOY~rzRYyK+xO89Lb-d6-aqb^<}^g4@Ro+kjujENT%AL@Jr#8nCFK1OeBOgu2g
zpO3LSTdd~@d+Bio{6ZBRNAvWAORJy4>x>gG4u}sj@|yv1MWVQpz7nmc`0V1#B+P$`
zz{>~V@!l@O|5rRLo%>8YA8_uJenIh@mx;eO*k=X!6a(_@j5s1C4;No31t%5Xe@pYA
z*(Y7jtL8$fPTrwEQ1gpR_^%>5fCcjT3i0h0yrZ#rHQ=uS>!H3o`BTk*+kk&0zCc3$
z5QBfIk4*2iNSslCr&^ZY4fZ<3es}qPo&2RpTv$b~Ys`7s20xcRLWzEgP2v#cp$R(6
zzOJC>62Aw$TYPKjK&o#ofwwi_ylb9oje1f6{8Do(rOz#V(C>fZgpm1?vZI=lDLm8T
z&Ai_>@q7)OL%hp2`9_EQxTU!}@U&#dH{c_!M8AA)KcTURD);LmhF5zZ$@|=yDD=(aqBD*Rd-Bx(m_|tHBqO
zuGuVo^BcsM1=r7VP_Ln1sewON9WUlNH1}9@cxv?RtO5Z;Ua97+
zmcVOE=-?HdKEXl!&U^LykG#k0$?<+`^sj@H9$X)Mx&ywXd1Hzjcz&})9}9d+&nHX3
zx%B?UOV5b+6ZlmDaZbSBck-~{xh5cQmVZ=Vw)7zrc%15^8IW(PKd{I9YZ5o9zghfG
z>9}fsTbsByCLc|yS4eM~`7)l*KEN(-vHsFU9iaO&2JiL$QS&T_x5nTLn%f=_cc{-?
zbCc@e6Uysb${)}ZiTLVyWyG-q;`uSULdr)o>H$q~73prFdv5~PErhqCdFw53sxrK#
zGX7bcSnkbaqT`NbnEfsgj6pKRhEJJLBMfAI5q
zrJF{5U;1(C!&kkchdm6aBl@|vtbc~igXS41PiU}iUE&hWD{Qmh)juG;QjbGYkBT|h
z(w)fgw<&&Jc!2OE)vJ4&&x;=m;Q1%Q>%g^A>L|jSLU=I|c)aEf4K@FlJaUAe*@ky1
z{ZY;F?r^?q=nE-N(*8)u$0KkVy%)XLmh>0to0MJybH+?Wysvpd(jAcAVMyFxqMqA<
z2cx+DsL!uchnBw>6aVY$fcmfUzX5T{2;8wwJwQD8So-($%_zQ_{##lp`!}tIBVb?wKx`}qdqyFf*
zFMj^Z_W#G{?El}x`QgJ}t^e_w>0kfd7d`i7`gQ&AG0%JM%b)x0zxUGpPn!DmN5AwX
luljafVKQpq;jiESfB*TP*+drlKPLb8{{b_phT*T80RSKS19AWW

literal 0
HcmV?d00001

diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd
index a9e5cf4..7da199f 100644
--- a/man/STAR_MHE.Rd
+++ b/man/STAR_MHE.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/STAR_MHE-data.R
+% Please edit documentation in R/rddtools.R
 \docType{data}
 \name{STAR_MHE}
 \alias{STAR_MHE}
diff --git a/man/Lee2008.Rd b/man/house.Rd
similarity index 73%
rename from man/Lee2008.Rd
rename to man/house.Rd
index 43ac259..100ad18 100644
--- a/man/Lee2008.Rd
+++ b/man/house.Rd
@@ -1,8 +1,8 @@
 % Generated by roxygen2 (4.1.1): do not edit by hand
-% Please edit documentation in R/Lee2008-data.R
+% Please edit documentation in R/rddtools.R
 \docType{data}
-\name{Lee2008}
-\alias{Lee2008}
+\name{house}
+\alias{house}
 \title{Dataset used in Lee (2008)}
 \format{A data frame with 6558 observations and two variables:
 \describe{
@@ -12,17 +12,14 @@
 \source{
 Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity}
 }
-\usage{
-Lee2008
-}
 \description{
-U.S. House elections data
+Randomized experiments from non-random selection in U.S. House elections
 }
 \examples{
-data(Lee2008)
-RDDlee <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
-summary(RDDlee)
-plot(RDDlee)
+data(house)
+rdd_house <- rdd_data(x=x, y=y, data=house, cutpoint=0)
+summary(rdd_house)
+plot(rdd_house)
 }
 \references{
 Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,'
diff --git a/man/rddtools.Rd b/man/rddtools.Rd
index 080251d..a3c5f8b 100644
--- a/man/rddtools.Rd
+++ b/man/rddtools.Rd
@@ -8,7 +8,4 @@
 \description{
 Regression Discontinuity Design
 }
-\details{
-Provides function to do a comprehensive regression discontinuity analysis.
-}
 

From 9cdec88c3f6defe52e29fce45a951f5eb892f53f Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:53:43 +0200
Subject: [PATCH 143/323] update references Lee2008 to house

---
 R/as.npreg.R                  | 10 ++---
 R/bw_ik.R                     |  4 +-
 R/bw_rot.R                    |  4 +-
 R/clusterInf.R                |  8 ++--
 R/covarTests.R                | 28 ++++++------
 R/dens_test.R                 |  6 +--
 R/placebo.R                   |  8 ++--
 R/plotSensi.R                 | 10 ++---
 R/rdd_data.R                  |  6 +--
 R/rdd_data_methods.R          | 32 +++++++-------
 R/rdd_pred.R                  | 10 ++---
 R/reg_gen.R                   |  8 ++--
 R/reg_lm.R                    | 12 +++---
 R/reg_np.R                    |  6 +--
 man/as.lm.Rd                  |  6 +--
 man/as.npregbw.Rd             | 10 ++---
 man/clusterInf.Rd             |  8 ++--
 man/covarTest_dis.Rd          | 14 +++---
 man/covarTest_mean.Rd         | 14 +++---
 man/dens_test.Rd              |  6 +--
 man/plot.rdd_data.Rd          | 14 +++---
 man/plotPlacebo.Rd            |  8 ++--
 man/plotSensi.Rd              | 10 ++---
 man/rdd_bw_ik.Rd              |  4 +-
 man/rdd_bw_rsw.Rd             |  4 +-
 man/rdd_data.Rd               |  6 +--
 man/rdd_gen_reg.Rd            |  8 ++--
 man/rdd_pred.Rd               | 10 ++---
 man/rdd_reg_lm.Rd             | 12 +++---
 man/rdd_reg_np.Rd             |  6 +--
 tests/packageDemo.R           | 80 +++++++++++++++++------------------
 tests/rdd_pred.R              | 50 +++++++++++-----------
 tests/testthat/test_rdddata.R |  6 +--
 vignettes/rddtools.R          | 24 +++++------
 vignettes/rddtools.Rmd        | 24 +++++------
 vignettes/rddtools.html       | 24 +++++------
 36 files changed, 250 insertions(+), 250 deletions(-)

diff --git a/R/as.npreg.R b/R/as.npreg.R
index 1107964..a6219df 100644
--- a/R/as.npreg.R
+++ b/R/as.npreg.R
@@ -13,9 +13,9 @@
 #' @seealso \code{\link{as.lm}} which converts \code{rdd_reg} objects into \code{lm}.
 #' @examples
 #' # Estimate ususal rdd_reg:
-#'  data(Lee2008)
-#'  Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#'  reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
+#'  data(house)
+#'  house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
+#'  reg_nonpara <- rdd_reg_np(rdd_object=house_rdd)
 #' 
 #' ## Convert to npreg:
 #'  reg_nonpara_np <- as.npreg(reg_nonpara)
@@ -23,8 +23,8 @@
 #'  rdd_coef(reg_nonpara_np, allCo=TRUE, allInfo=TRUE)
 #' 
 #' ## Compare with result obtained with a Gaussian kernel:
-#'  bw_lm <- dnorm(Lee2008_rdd$x, sd=rddtools:::getBW(reg_nonpara))
-#'  reg_nonpara_gaus <- rdd_reg_lm(rdd_object=Lee2008_rdd, w=bw_lm)
+#'  bw_lm <- dnorm(house_rdd$x, sd=rddtools:::getBW(reg_nonpara))
+#'  reg_nonpara_gaus <- rdd_reg_lm(rdd_object=house_rdd, w=bw_lm)
 #'  all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) 
 
 
diff --git a/R/bw_ik.R b/R/bw_ik.R
index 88a023a..ddfb8d4 100644
--- a/R/bw_ik.R
+++ b/R/bw_ik.R
@@ -11,8 +11,8 @@
 #' @seealso \code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) 
 #' @export
 #' @examples
-#' data(Lee2008)
-#' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
+#' data(house)
+#' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0)
 #' rdd_bw_ik(rd)
 
 
diff --git a/R/bw_rot.R b/R/bw_rot.R
index 3baa257..3fd1d89 100644
--- a/R/bw_rot.R
+++ b/R/bw_rot.R
@@ -54,8 +54,8 @@ rot_bw <- function(object) {
 #' @import KernSmooth
 #' @export
 #' @examples
-#' data(Lee2008)
-#' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
+#' data(house)
+#' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0)
 #' rdd_bw_rsw(rd)
 
 
diff --git a/R/clusterInf.R b/R/clusterInf.R
index 48b676c..9e83b48 100644
--- a/R/clusterInf.R
+++ b/R/clusterInf.R
@@ -15,13 +15,13 @@
 #' @import sandwich
 #' @import lmtest
 #' @examples
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
+#' reg_para <- rdd_reg_lm(rdd_object=house_rdd)
 #' 
 #' # here we just generate randomly a cluster variable:
 #' nlet <- sort(c(outer(letters, letters, paste, sep='')))
-#' clusRandom <- sample(nlet[1:60], size=nrow(Lee2008_rdd), replace=TRUE)
+#' clusRandom <- sample(nlet[1:60], size=nrow(house_rdd), replace=TRUE)
 #'
 #' # now do post-inference:
 #' clusterInf(reg_para, clusterVar=clusRandom)
diff --git a/R/covarTests.R b/R/covarTests.R
index 666cf72..2f1491a 100644
--- a/R/covarTests.R
+++ b/R/covarTests.R
@@ -11,24 +11,24 @@
 #' @return A data frame with, for each covariate, the mean on each size, the difference, t-stat and ts p-value. 
 #' @seealso \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution
 #' @examples
-#' data(Lee2008)
+#' data(house)
 #' 
 #' ## Add randomly generated covariates
 #' set.seed(123)
-#' n_Lee <- nrow(Lee2008)
+#' n_Lee <- nrow(house)
 #' Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-#'                 z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
+#'                 z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
 #'                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-#' Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+#' house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
 #' 
 #' ## test for equality of means around cutoff:
-#' covarTest_mean(Lee2008_rdd_Z, bw=0.3)
+#' covarTest_mean(house_rdd_Z, bw=0.3)
 #' 
 #' ## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
-#' covarTest_dis(Lee2008_rdd_Z, bw=0.3)
+#' covarTest_dis(house_rdd_Z, bw=0.3)
 #' 
 #' ## covarTest_mean works also on regression outputs (bw will be taken from the model)
-#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd_Z)
+#' reg_nonpara <- rdd_reg_np(rdd_object=house_rdd_Z)
 #' covarTest_mean(reg_nonpara)
 
 
@@ -119,23 +119,23 @@ covarTest_mean_low <- function(covar, cutvar, cutpoint, bw = NULL, paired = FALS
 #' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @seealso \code{\link{covarTest_mean}} for the t-test of equality of means
 #' @examples
-#' data(Lee2008)
+#' data(house)
 #' 
 #' ## Add randomly generated covariates
 #' set.seed(123)
-#' n_Lee <- nrow(Lee2008)
+#' n_Lee <- nrow(house)
 #' Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-#'                 z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
+#'                 z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
 #'                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-#' Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+#' house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
 #' 
 #' ## Kolmogorov-Smirnov test of equality in distribution:
-#' covarTest_dis(Lee2008_rdd_Z, bw=0.3)
+#' covarTest_dis(house_rdd_Z, bw=0.3)
 #' 
 #' ## Can also use function covarTest_dis() for a t-test for equality of means around cutoff:
-#' covarTest_mean(Lee2008_rdd_Z, bw=0.3)
+#' covarTest_mean(house_rdd_Z, bw=0.3)
 #' ## covarTest_dis works also on regression outputs (bw will be taken from the model)
-#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd_Z)
+#' reg_nonpara <- rdd_reg_np(rdd_object=house_rdd_Z)
 #' covarTest_dis(reg_nonpara)
 
 #' @export
diff --git a/R/dens_test.R b/R/dens_test.R
index 3a8792b..79c247d 100644
--- a/R/dens_test.R
+++ b/R/dens_test.R
@@ -10,9 +10,9 @@
 #' @export
 #' @import rdd
 #' @examples
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' dens_test(Lee2008_rdd)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
+#' dens_test(house_rdd)
 
 
 
diff --git a/R/placebo.R b/R/placebo.R
index 9404dde..e612f59 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -9,13 +9,13 @@
 #' @param output Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object
 #' @return A data frame containing the cutpoints, their corresponding estimates and confidence intervals. 
 #' @examples
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
+#' reg_nonpara <- rdd_reg_np(rdd_object=house_rdd)
 #' plotPlacebo(reg_nonpara)
 #' 
 #' # Use with another vcov function; cluster case
-#' reg_nonpara_lminf <- rdd_reg_np(rdd_object=Lee2008_rdd, inference='lm')
+#' reg_nonpara_lminf <- rdd_reg_np(rdd_object=house_rdd, inference='lm')
 #' # need to be a function applied to updated object!
 #' vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 #' plotPlacebo(reg_nonpara_lminf, vcov. = vc)
diff --git a/R/plotSensi.R b/R/plotSensi.R
index 6aec0d4..8d6e004 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -16,17 +16,17 @@
 #' @return A data frame containing the bandwidths and corresponding estimates and confidence intervals. 
 #' @import methods
 #' @examples
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
 #' 
 #' #Non-parametric estimate 
-#' bw_ik <- rdd_bw_ik(Lee2008_rdd)
-#' reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+#' bw_ik <- rdd_bw_ik(house_rdd)
+#' reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik)
 #' plotSensi(reg_nonpara)
 #' plotSensi(reg_nonpara, device='base')
 #'
 #' #Parametric estimate:
-#' reg_para_ik <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4, bw=bw_ik)
+#' reg_para_ik <- rdd_reg_lm(rdd_object=house_rdd, order=4, bw=bw_ik)
 #' plotSensi(reg_para_ik)
 #' plotSensi(reg_para_ik, type='facet')
 
diff --git a/R/rdd_data.R b/R/rdd_data.R
index d3a8a12..3b5e30d 100644
--- a/R/rdd_data.R
+++ b/R/rdd_data.R
@@ -13,9 +13,9 @@
 #' @return Object of class \code{rdd_data}, inheriting from \code{data.frame}
 #' @export
 #' @examples
-#' data(Lee2008)
-#' rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-#' rd2 <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
+#' data(house)
+#' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0)
+#' rd2 <- rdd_data(x=x, y=y, data=house, cutpoint=0)
 #' 
 #' # The print() function is the same as the print.data.frame:
 #' rd
diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index 17e8e98..c60f620 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -32,21 +32,21 @@ summary.rdd_data <- function(object, ...) {
 #' When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{rdd_bw_rsw}}. 
 #' @export
 #' @examples
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' plot(Lee2008_rdd)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
+#' plot(house_rdd)
 #' 
 #' ## Specify manually the bandwidth:
-#' plot(Lee2008_rdd, h=0.2)
+#' plot(house_rdd, h=0.2)
 #' 
 #' ## Show three plots with different bandwidth:
-#' plot(Lee2008_rdd, h=c(0.2,0.3,0.4), nplot=3)
+#' plot(house_rdd, h=c(0.2,0.3,0.4), nplot=3)
 #' 
 #' ## Specify instead of the bandwidth, the final number of bins:
-#' plot(Lee2008_rdd, nbins=22)
+#' plot(house_rdd, nbins=22)
 #'
 #' ## If the specified number of bins is odd, the larger number is given to side with largest range
-#' plot(Lee2008_rdd, nbins=21)
+#' plot(house_rdd, nbins=21)
 
 
 ### PLOT method
@@ -118,9 +118,9 @@ plot.rdd_data <- function(x, h, nbins = NULL, xlim = range(object$x, na.rm = TRU
 #' @return An object of class \code{lm}
 #' @seealso \code{\link{as.npreg}} which converts \code{rdd_reg} objects into \code{npreg} from package \code{np}.
 #' @examples 
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
-#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
+#' reg_para <- rdd_reg_lm(rdd_object=house_rdd)
 #' reg_para_lm <- as.lm(reg_para)
 #' reg_para_lm
 #' plot(reg_para_lm, which=4)
@@ -152,17 +152,17 @@ as.lm.rdd_reg <- function(x) as.lm_RDD(x)
 ### EXAMPLE
 if (FALSE) {
     library(RDDtools)
-    # data(Lee2008)
+    # data(house)
     
     
     environment(plot.rdd_data) <- environment(rdd_data)
     
-    Lee2008_rdd <- rdd_data(y = Lee2008$y, x = Lee2008$x, cutpoint = 0)
-    plot(Lee2008_rdd)
+    house_rdd <- rdd_data(y = house$y, x = house$x, cutpoint = 0)
+    plot(house_rdd)
     
-    plot(Lee2008_rdd, h = 0.2)
-    plot(Lee2008_rdd, h = c(0.2, 0.3, 0.4), nplot = 3)
+    plot(house_rdd, h = 0.2)
+    plot(house_rdd, h = c(0.2, 0.3, 0.4), nplot = 3)
     
-    plot(Lee2008_rdd, nbins = 21)
+    plot(house_rdd, nbins = 21)
     
 } 
diff --git a/R/rdd_pred.R b/R/rdd_pred.R
index 4cfaed1..373c4b5 100644
--- a/R/rdd_pred.R
+++ b/R/rdd_pred.R
@@ -31,19 +31,19 @@
 #' @references Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024
 #' @examples
 #' # Load data, add (artificial) covariates:
-#' data(Lee2008)
-#' n_Lee <- nrow(Lee2008)
+#' data(house)
+#' n_Lee <- nrow(house)
 #' z1 <- runif(n_Lee)
-#' Lee2008_rdd <- rdd_data(y=y, x=x, data=Lee2008, covar=z1, cutpoint=0)
+#' house_rdd <- rdd_data(y=y, x=x, data=house, covar=z1, cutpoint=0)
 #' 
 #' # estimation without covariates: rdd_pred is the same than rdd_coef:
-#' reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd)
+#' reg_para <- rdd_reg_lm(rdd_object=house_rdd)
 #' 
 #' rdd_pred(reg_para)
 #' rdd_coef(reg_para, allInfo=TRUE)
 #' 
 #' # estimation with covariates: 
-#' reg_para_cov <- rdd_reg_lm(rdd_object=Lee2008_rdd,
+#' reg_para_cov <- rdd_reg_lm(rdd_object=house_rdd,
 #'                           covariates='z1',
 #'                           covar.opt=list(slope='separate') )
 #'
diff --git a/R/reg_gen.R b/R/reg_gen.R
index 4196043..d72acbb 100644
--- a/R/reg_gen.R
+++ b/R/reg_gen.R
@@ -25,12 +25,12 @@
 #' @export rdd_gen_reg 
 #' @examples
 #' ## Step 0: prepare data
-#' data(Lee2008)
-#' Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+#' data(house)
+#' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
 #' 
 #' ## Estimate a local probit:
-#' Lee2008_rdd$y <- with(Lee2008_rdd, ifelse(y 0), 5)
+ind_z_pos <- head(which(house_rdd_z$z1 > 0), 5)
 
-rdd_p_01_5z_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1[1:5]), stat = "sum")
-rdd_p_01_5z_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(Lee2008_rdd_z$z1[1:5])), stat = "sum")
-rdd_p_01_5zPos_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1[ind_z_pos]), stat = "sum")
-rdd_p_01_5zPos_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(Lee2008_rdd_z$z1[ind_z_pos])), stat = "sum")
-rdd_p_01_5z_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1[1:5]), stat = "mean")
-rdd_p_01_5z_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(Lee2008_rdd_z$z1[1:5])), stat = "mean")
-rdd_p_01_ALLz_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = Lee2008_rdd_z$z1), stat = "mean")
-rdd_p_01_ALLz_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(Lee2008_rdd_z$z1)), stat = "mean")
+rdd_p_01_5z_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1[1:5]), stat = "sum")
+rdd_p_01_5z_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(house_rdd_z$z1[1:5])), stat = "sum")
+rdd_p_01_5zPos_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1[ind_z_pos]), stat = "sum")
+rdd_p_01_5zPos_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(house_rdd_z$z1[ind_z_pos])), stat = "sum")
+rdd_p_01_5z_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1[1:5]), stat = "mean")
+rdd_p_01_5z_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(house_rdd_z$z1[1:5])), stat = "mean")
+rdd_p_01_ALLz_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1), stat = "mean")
+rdd_p_01_ALLz_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(house_rdd_z$z1)), stat = "mean")
 
 del <- function(x, mean = FALSE) {
     n <- length(x)
@@ -128,9 +128,9 @@ del <- function(x, mean = FALSE) {
     res
 }
 
-del(x = Lee2008_rdd_z$z1[1:5])
-delta_01_5z_S <- deltaMethod(aaa, del(x = Lee2008_rdd_z$z1[1:5]), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
-delta_01_5z_M <- deltaMethod(aaa, del(x = Lee2008_rdd_z$z1[1:5], mean = TRUE), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
+del(x = house_rdd_z$z1[1:5])
+delta_01_5z_S <- deltaMethod(aaa, del(x = house_rdd_z$z1[1:5]), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
+delta_01_5z_M <- deltaMethod(aaa, del(x = house_rdd_z$z1[1:5], mean = TRUE), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
 
 all.equal(unlist(rdd_p_01_5z_S), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes = FALSE)
 all.equal(unlist(rdd_p_01_5z_Sb), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes = FALSE)
@@ -161,7 +161,7 @@ all.equal(unlist(rdd_p_01_W_M), drop(as.matrix(delta_2z_w2[1:2])), check.attribu
 
 
 ###### 2 Z:
-df_2Z_5z <- Lee2008_rdd_z[1:5, c("z1", "z2")]
+df_2Z_5z <- house_rdd_z[1:5, c("z1", "z2")]
 df_2Z_5z_M <- data.frame(t(colMeans(df_2Z_5z)))
 df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w = w_5)))
 
diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R
index a1bfe21..29e7b37 100644
--- a/tests/testthat/test_rdddata.R
+++ b/tests/testthat/test_rdddata.R
@@ -4,11 +4,11 @@
 library(rddtools)
 
 # load the example data set
-data(Lee2008)
+data(house)
 
 # create rdd_data sets
-rd<- rdd_data(x=Lee2008$x, y=Lee2008$y, cutpoint=0)
-rd2 <- rdd_data(x=x, y=y, data=Lee2008, cutpoint=0)
+rd<- rdd_data(x=house$x, y=house$y, cutpoint=0)
+rd2 <- rdd_data(x=x, y=y, data=house, cutpoint=0)
 
 # define context
 context("input ambivalence")
diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R
index 18072d8..d2f4e38 100644
--- a/vignettes/rddtools.R
+++ b/vignettes/rddtools.R
@@ -3,24 +3,24 @@ knitr::opts_chunk$set(collapse = T, comment = "#>")
 
 ## ------------------------------------------------------------------------
 library(rddtools)
-data(Lee2008)
+data(house)
 
 ## ------------------------------------------------------------------------
-Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
 
 ## ----dataPlot------------------------------------------------------------
-summary(Lee2008_rdd)
-plot(Lee2008_rdd)
+summary(house_rdd)
+plot(house_rdd)
 
 ## ----reg_para------------------------------------------------------------
-reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para <- rdd_reg_lm(rdd_object=house_rdd, order=4)
 reg_para
 
 plot(reg_para)
 
 ## ----RegPlot-------------------------------------------------------------
-bw_ik <- rdd_bw_ik(Lee2008_rdd)
-reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+bw_ik <- rdd_bw_ik(house_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
 
@@ -35,16 +35,16 @@ dens_test(reg_nonpara)
 
 ## ------------------------------------------------------------------------
 set.seed(123)
-n_Lee <- nrow(Lee2008)
+n_Lee <- nrow(house)
 Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-                z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
+                z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
 
 ## ------------------------------------------------------------------------
 ## test for equality of means around cutoff:
-covarTest_mean(Lee2008_rdd_Z, bw=0.3)
+covarTest_mean(house_rdd_Z, bw=0.3)
 
 ## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
-covarTest_dis(Lee2008_rdd_Z, bw=0.3)
+covarTest_dis(house_rdd_Z, bw=0.3)
 
diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd
index a1da6e4..d10f930 100644
--- a/vignettes/rddtools.Rmd
+++ b/vignettes/rddtools.Rmd
@@ -21,21 +21,21 @@ Load the package, and load the built-in dataset from [Lee 2008]:
 
 ```{r}
 library(rddtools)
-data(Lee2008)
+data(house)
 ```
 
 Declare the data to be a *rdd_data* object:
 
 ```{r}
-Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
 ```
 
 
 You can now directly summarise and visualise this data:
 
 ```{r dataPlot}
-summary(Lee2008_rdd)
-plot(Lee2008_rdd)
+summary(house_rdd)
+plot(house_rdd)
 ```
 
 
@@ -44,7 +44,7 @@ plot(Lee2008_rdd)
 Estimate parametrically, by fitting a 4th order polynomial.
 
 ```{r reg_para}
-reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
+reg_para <- rdd_reg_lm(rdd_object=house_rdd, order=4)
 reg_para
 
 plot(reg_para)
@@ -56,8 +56,8 @@ plot(reg_para)
 Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.
 
 ```{r RegPlot}
-bw_ik <- rdd_bw_ik(Lee2008_rdd)
-reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+bw_ik <- rdd_bw_ik(house_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik)
 print(reg_nonpara)
 plot(x=reg_nonpara)
 ```
@@ -100,21 +100,21 @@ We here simulate three variables, with the second having a different mean on the
 
 ```{r}
 set.seed(123)
-n_Lee <- nrow(Lee2008)
+n_Lee <- nrow(house)
 Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-                z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
+                z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
 ```
 
 
 Run the tests:
 ```{r}
 ## test for equality of means around cutoff:
-covarTest_mean(Lee2008_rdd_Z, bw=0.3)
+covarTest_mean(house_rdd_Z, bw=0.3)
 
 ## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
-covarTest_dis(Lee2008_rdd_Z, bw=0.3)
+covarTest_dis(house_rdd_Z, bw=0.3)
 ```
 
 Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. 
diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html
index 39e13d8..45e9f1f 100644
--- a/vignettes/rddtools.html
+++ b/vignettes/rddtools.html
@@ -63,11 +63,11 @@ 

2015-05-07

Data Preparation and Visualisation

Load the package, and load the built-in dataset from [Lee 2008]:

library(rddtools)
-data(Lee2008)
+data(house)

Declare the data to be a rdd_data object:

-
Lee2008_rdd <- rdd_data(y=Lee2008$y, x=Lee2008$x, cutpoint=0)
+
house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)

You can now directly summarise and visualise this data:

-
summary(Lee2008_rdd)
+
summary(house_rdd)
 #> ### rdd_data object ###
 #> 
 #> Cutpoint: 0 
@@ -76,13 +76,13 @@ 

Data Preparation and Visualisation

#> -Left : 2740 #> -Right: 3818 #> Covariates: no -plot(Lee2008_rdd)
+plot(house_rdd)

Parametric Estimation

Estimate parametrically, by fitting a 4th order polynomial.

-
reg_para <- rdd_reg_lm(rdd_object=Lee2008_rdd, order=4)
+
reg_para <- rdd_reg_lm(rdd_object=house_rdd, order=4)
 reg_para
 #> ### RDD regression: parametric ###
 #>  Polynomial order:  4 
@@ -101,8 +101,8 @@ 

Parametric Estimation

Non-parametric Estimation

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

-
bw_ik <- rdd_bw_ik(Lee2008_rdd)
-reg_nonpara <- rdd_reg_np(rdd_object=Lee2008_rdd, bw=bw_ik)
+
bw_ik <- rdd_bw_ik(house_rdd)
+reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik)
 print(reg_nonpara)
 #> ### RDD regression: nonparametric local linear###
 #>  Bandwidth:  0.2938561 
@@ -152,21 +152,21 @@ 

Discontinuity comes from covariates: covariates balance tests

Two tests available: + equal means of covariates: covarTest_mean() + equal density of covariates: covarTest_dens()

We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. We here simulate three variables, with the second having a different mean on the left and the right.

set.seed(123)
-n_Lee <- nrow(Lee2008)
+n_Lee <- nrow(house)
 Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-                z2 = rnorm(n_Lee, mean = ifelse(Lee2008<0, 5, 8)), 
+                z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
                 z3 = sample(letters, size = n_Lee, replace = TRUE))
-Lee2008_rdd_Z <- rdd_data(y = Lee2008$y, x = Lee2008$x, covar = Z, cutpoint = 0)
+house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)

Run the tests:

## test for equality of means around cutoff:
-covarTest_mean(Lee2008_rdd_Z, bw=0.3)
+covarTest_mean(house_rdd_Z, bw=0.3)
 #>    mean of x   mean of y Difference statistic  p.value  
 #> z1 0.004268177 0.0218581 0.01758993 -0.2539109 0.7995803
 #> z2 5.005608    7.984865  2.979257   -84.84982  0        
 #> z3 13.18888    13.43534  0.2464617  -0.9409715 0.3467888
 
 ## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
-covarTest_dis(Lee2008_rdd_Z, bw=0.3)
+covarTest_dis(house_rdd_Z, bw=0.3)
 #> Warning in ks.test(x[regime], x[!regime], exact = exact): p-value will be
 #> approximate in the presence of ties
 #>    statistic  p.value  

From 02bd04a12e90cfd746811eb842a432aea7c1f887 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 12:56:27 +0200
Subject: [PATCH 144/323] remove since not needed

---
 .travis.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index f096594..72bcdc5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,4 @@
 language: r
-sudo: required
 warnings_are_errors: true
 
 env:

From 131f386d621d8cff2709260e32eb614d7bf08ec0 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 13:23:24 +0200
Subject: [PATCH 145/323] update functions names, package name and install
 instructions

---
 README.md | 42 +++++++++++++++++++++---------------------
 1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/README.md b/README.md
index a18265f..59cd871 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,22 @@
-RDDtools
+rddtools
 ========================================================
 [![Travis-CI Build Status](https://travis-ci.org/bquast/RDDtools.png?branch=master)](https://travis-ci.org/bquast/RDDtools)
 [![Coverage Status](https://coveralls.io/repos/bquast/RDDtools/badge.svg)](https://coveralls.io/r/bquast/RDDtools)
 
-**RDDtools** is a new R package under development, designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. 
+**rddtools** is a new R package under development, designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. 
 
 
-Installing **RDDtools**
+Installing **rddtools**
 -----------------------
 
 This github website hosts the source code. One of the easiest ways to install the package from github is by using the R package **devtools**:
 
 ```r
 if (!require('devtools')) install.packages('devtools')
-devtools::install_github( "bquast/RDDtools", build_vignettes = TRUE )
+devtools::install_github( "bquast/rddtools" )
 ```
 
-Note however the latest version of RDDtools only works with R 3.0, and that you might need to install  [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. 
+Note however the latest version of rddtools only works with R 3.0, and that you might need to install  [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. 
 
 
 Documentation
@@ -24,34 +24,34 @@ Documentation
 The (preliminary) documentation is available in the help files directly, as well as in the *vignettes*. The vignettes can be accessed from R.
 
 ```r
-vignette("RDDtools")
+vignette("rddtools")
 ```
 
-RDDtools: main features
+rddtools: main features
 -----------------------
 
-+  Simple visualisation of the data using binned-plot: **plot()**
++  Simple visualisation of the data using binned-plot: `plot()`
 
 + Bandwidth selection:
-  + MSE-RDD bandwidth procedure of [Imbens and Kalyanaraman 2012]: **RDDbw_IK()**
-  + MSE global bandwidth procedure of [Ruppert et al 1995]: **RDDbw_RSW()**
+  + MSE-RDD bandwidth procedure of [Imbens and Kalyanaraman 2012]: `rdd_bw_ik()`
+  + MSE global bandwidth procedure of [Ruppert et al 1995]: `rdd_bw_rsw()`
 + Estimation:
-  +  RDD parametric estimation: **RDDreg_lm()** This includes specifying the polynomial order, including covariates with various specifications as advocated in [Imbens and Lemieux 2008].
-  +  RDD local non-parametric estimation: **RDDreg_np()**. Can also include covariates, and allows different types of inference (fully non-parametric, or parametric approximation). 
+  +  RDD parametric estimation: `rdd_reg_lm()` This includes specifying the polynomial order, including covariates with various specifications as advocated in [Imbens and Lemieux 2008].
+  +  RDD local non-parametric estimation: `rdd_reg_np()`. Can also include covariates, and allows different types of inference (fully non-parametric, or parametric approximation). 
   +  RDD generalised estimation: allows to use custom estimating functions to get the RDD coefficient. Could allow for example a probit RDD, or quantile regression.
 + Post-Estimation tools:
-  + Various tools, to obtain predictions at given covariate values ( **RDDpred()** ), or to convert to other classes, to lm ( **as.lm()** ), or to the package *np* ( **as.npreg()** ). 
-  + Function to do inference with clustered data: **clusterInf()** either using a cluster covariance matrix ( **vcovCluster()** ) or by a degrees of freedom correction (as in [Cameron et al. 2008]).
+  + Various tools, to obtain predictions at given covariate values ( `rdd_pred()` ), or to convert to other classes, to lm ( **as.lm()** ), or to the package `np` ( `as.npreg()` ). 
+  + Function to do inference with clustered data: `clusterInf()` either using a cluster covariance matrix ( **vcovCluster()** ) or by a degrees of freedom correction (as in [Cameron et al. 2008]).
 + Regression sensitivity analysis:
-  + Plot the sensitivity of the coefficient with respect to the bandwith: **plotSensi()**
-  + *Placebo plot* using different cutpoints: **plotPlacebo()**
+  + Plot the sensitivity of the coefficient with respect to the bandwith: `plotSensi()`
+  + *Placebo plot* using different cutpoints: `plotPlacebo()`
 + Design sensitivity analysis:
-  + McCrary test of manipulation of the forcing variable: wrapper **dens_test()** to the function **DCdensity()** from package **rdd**. 
-  + Test of equal means of covariates: **covarTest_mean()**
-  + Test of equal density of covariates: **covarTest_dens()**
+  + McCrary test of manipulation of the forcing variable: wrapper `dens_test()` to the function `DCdensity()` from package `rdd`. 
+  + Test of equal means of covariates: `covarTest_mean()`
+  + Test of equal density of covariates: `covarTest_dens()`
 + Datasets
-  + Contains the seminal dataset of [Lee 2008]: **Lee2008**
-  + Contains functions to replicate the Monte-Carlo simulations of [Imbens and Kalyanaraman 2012]: **gen_MC_IK()**
+  + Contains the seminal dataset of [Lee 2008]: `house`
+  + Contains functions to replicate the Monte-Carlo simulations of [Imbens and Kalyanaraman 2012]: `gen_mc_ik()`
 
 References
 -----------------------

From 9b6406da8e3b8769bad50f414ad048c8544cbe3d Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Thu, 7 May 2015 13:25:31 +0200
Subject: [PATCH 146/323] fix badges

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 59cd871..ae35d7b 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 rddtools
 ========================================================
-[![Travis-CI Build Status](https://travis-ci.org/bquast/RDDtools.png?branch=master)](https://travis-ci.org/bquast/RDDtools)
-[![Coverage Status](https://coveralls.io/repos/bquast/RDDtools/badge.svg)](https://coveralls.io/r/bquast/RDDtools)
+[![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools)
+[![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools)
 
 **rddtools** is a new R package under development, designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. 
 

From 8b73e783d06c7259cbb7da802b1fcc586bb54328 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:41:48 +0000
Subject: [PATCH 147/323] readd as checks passed

---
 R/rdd_data.R | 1 +
 1 file changed, 1 insertion(+)

diff --git a/R/rdd_data.R b/R/rdd_data.R
index 3b5e30d..3e537b4 100644
--- a/R/rdd_data.R
+++ b/R/rdd_data.R
@@ -11,6 +11,7 @@
 #' the column names can be entered directly for argument \code{x} and \code{y}
 #' @param z Assignment variable for the fuzzy case. 
 #' @return Object of class \code{rdd_data}, inheriting from \code{data.frame}
+#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @export
 #' @examples
 #' data(house)

From 6c5130d04db61b04dbb923ba7170897aa8913cb2 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:42:53 +0000
Subject: [PATCH 148/323] readd as checks passed

---
 R/rdd_data_methods.R | 1 +
 1 file changed, 1 insertion(+)

diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R
index c60f620..d6426be 100644
--- a/R/rdd_data_methods.R
+++ b/R/rdd_data_methods.R
@@ -30,6 +30,7 @@ summary.rdd_data <- function(object, ...) {
 #' is specified with the argument \code{h}, specifying the whole binwidth (contrary to the usual bandwidth
 #' argument, that gives half of the length of the kernel window. 
 #' When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{rdd_bw_rsw}}. 
+#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @export
 #' @examples
 #' data(house)

From 1d0fbbf4c0aef340ed9245f4a11877d0063d3fee Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:43:33 +0000
Subject: [PATCH 149/323] readd as checks passed

---
 R/bw_ik.R | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/R/bw_ik.R b/R/bw_ik.R
index ddfb8d4..09c69ce 100644
--- a/R/bw_ik.R
+++ b/R/bw_ik.R
@@ -8,7 +8,8 @@
 #' @return The optimal bandwidth
 #' @references Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' 
 #' Review of Economic Studies (2012) 79, 933-959
-#' @seealso \code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) 
+#' @seealso \code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995)
+#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @export
 #' @examples
 #' data(house)

From e47f9e8a054c2c46cc05c6154fa2d454a1d43185 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:44:14 +0000
Subject: [PATCH 150/323] readd as checks passed

---
 R/placebo.R | 1 +
 1 file changed, 1 insertion(+)

diff --git a/R/placebo.R b/R/placebo.R
index e612f59..a393fca 100644
--- a/R/placebo.R
+++ b/R/placebo.R
@@ -8,6 +8,7 @@
 #' @param plot Whether to actually plot the data. 
 #' @param output Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object
 #' @return A data frame containing the cutpoints, their corresponding estimates and confidence intervals. 
+#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @examples
 #' data(house)
 #' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)

From 1b7fb85f4ab1898b19a26a8135fa409000d988fd Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:44:59 +0000
Subject: [PATCH 151/323] readd as checks passed

---
 R/plotSensi.R | 1 +
 1 file changed, 1 insertion(+)

diff --git a/R/plotSensi.R b/R/plotSensi.R
index 8d6e004..093a68e 100644
--- a/R/plotSensi.R
+++ b/R/plotSensi.R
@@ -14,6 +14,7 @@
 #' @param plot Whether to actually plot the data. 
 #' @param \ldots Further arguments passed to specific methods
 #' @return A data frame containing the bandwidths and corresponding estimates and confidence intervals. 
+#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @import methods
 #' @examples
 #' data(house)

From f8c5bf23c114f422454a923712821e55319131af Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:45:44 +0000
Subject: [PATCH 152/323] readd as checks passed

---
 R/covarTests.R | 1 +
 1 file changed, 1 insertion(+)

diff --git a/R/covarTests.R b/R/covarTests.R
index 2f1491a..19bff51 100644
--- a/R/covarTests.R
+++ b/R/covarTests.R
@@ -9,6 +9,7 @@
 #' @param p.adjust Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function
 #' @param \ldots currently not used
 #' @return A data frame with, for each covariate, the mean on each size, the difference, t-stat and ts p-value. 
+#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}>
 #' @seealso \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution
 #' @examples
 #' data(house)

From b57347ca1998e4adc49b290b91c9bbe73237ab6d Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:46:45 +0000
Subject: [PATCH 153/323] now using testthat

---
 tests/packageDemo.R | 230 --------------------------------------------
 1 file changed, 230 deletions(-)
 delete mode 100644 tests/packageDemo.R

diff --git a/tests/packageDemo.R b/tests/packageDemo.R
deleted file mode 100644
index d525c43..0000000
--- a/tests/packageDemo.R
+++ /dev/null
@@ -1,230 +0,0 @@
-library(rddtools)
-
-
-
-
-############################################ STEP 0: Data Manipulation
-data(house)
-head(house)
-
-house_rdd <- rdd_data(y = house$y, x = house$x, cutpoint = 0)
-
-head(house_rdd)
-
-summary(house_rdd)
-
-## With covariates
-
-n_Lee <- nrow(house)
-
-set.seed(123)
-Z <- data.frame(z1 = rnorm(n_Lee), z2 = rnorm(n_Lee, mean = 20, sd = 2), z3 = sample(letters[1:3], size = n_Lee, replace = TRUE))
-house_rdd_z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
-
-head(house_rdd_z)
-summary(house_rdd_z)
-
-### Fuzzy
-set.seed(123)
-ins <- rbinom(n_Lee, 1, prob = ifelse(house$x < 0, 0.1, 0.9))
-house_rdd_ins <- rdd_data(y = house$y, x = house$x, z = ins, cutpoint = 0)
-table(house$x < 0, ins == 0)
-
-############################################ STEP 2: Graphical inspection
-
-### Plot
-plot(house_rdd)
-plot(house_rdd, nplot = 3, h = c(0.02, 0.03, 0.04))
-plot(house_rdd, nplot = 1, h = 0.1)
-
-plot(house_rdd, xlim = c(-0.5, 0.5))
-
-# plot(house_rdd, xlim=c(-0.5, 0.5), type='ggplot')
-
-
-############################################ STEP 2: Regression
-
-## few bandwidths:
-rdd_bw_rsw(house_rdd)
-rdd_bw_ik(house_rdd)
-
-
-###### Parametric regression ###### Simple polynomial of order 1:
-reg_para <- rdd_reg_lm(rdd_object = house_rdd)
-print(reg_para)
-summary(reg_para)
-plot(reg_para)
-
-all.equal(unlist(rdd_pred(reg_para)), rdd_coef(reg_para, allInfo = TRUE)[1:2], check.attributes = FALSE)
-
-## Difference in means regression: Simple polynomial of order 0:
-reg_para_0 <- rdd_reg_lm(rdd_object = house_rdd, order = 0)
-print(reg_para_0)
-summary(reg_para_0)
-plot(reg_para_0)
-
-
-## Simple polynomial of order 4:
-reg_para4 <- rdd_reg_lm(rdd_object = house_rdd, order = 4)
-reg_para4
-plot(reg_para4)
-all.equal(unlist(rdd_pred(reg_para4)), rdd_coef(reg_para4, allInfo = TRUE)[1:2], check.attributes = FALSE)
-
-## Restrict sample to bandwidth area:
-bw_ik <- rdd_bw_ik(house_rdd)
-reg_para_ik <- rdd_reg_lm(rdd_object = house_rdd, bw = bw_ik, order = 4)
-reg_para_ik
-plot(reg_para_ik)
-
-all.equal(unlist(rdd_pred(reg_para_ik)), rdd_coef(reg_para_ik, allInfo = TRUE)[1:2], check.attributes = FALSE)
-
-## Fuzzy reg
-reg_para_fuzz <- rdd_reg_lm(house_rdd_ins)
-coef(reg_para_fuzz)
-summary(reg_para_fuzz)
-
-## Covariates:
-reg_para4_cov <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = ".")
-reg_para4_cov
-summary(reg_para4_cov)
-
-reg_para4_cov_slSep <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = ".", covar.opt = list(slope = "separate"))
-summary(reg_para4_cov_slSep)
-rdd_pred(reg_para4_cov_slSep)
-rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 0.2, 0.2), z2 = c(0, 20, 20), z3b = c(0, 1, 0), z3c = c(0, 0, 1)))
-
-
-reg_para4_cov_startR <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = ".", covar.opt = list(strategy = "residual"))
-reg_para4_cov_startR
-summary(reg_para4_cov_startR)
-
-plot(reg_para4_cov)
-
-reg_para4_cov_startR_sl2 <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = ".", covar.opt = list(strategy = "residual", 
-    slope = "separate"))
-summary(reg_para4_cov_startR_sl2)
-
-reg_para4_cov_2 <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = "z3+I(z1^2)")
-reg_para4_cov_2
-summary(reg_para4_cov_2)
-
-###### Non-parametric regression ######
-reg_nonpara <- rdd_reg_np(rdd_object = house_rdd)
-print(reg_nonpara)
-summary(reg_nonpara)
-plot(x = reg_nonpara)
-
-reg_nonpara_inflm <- rdd_reg_np(rdd_object = house_rdd, inference = "lm")
-print(reg_nonpara_inflm)
-summary(reg_nonpara_inflm)
-plot(x = reg_nonpara_inflm)
-
-
-reg_nonpara_sameSl <- rdd_reg_np(rdd_object = house_rdd, slope = "same")
-print(reg_nonpara_sameSl)
-summary(reg_nonpara_sameSl)
-
-
-###### PLOT SENSI ######
-plSe_reg_para <- plotSensi(reg_para_ik, order = 4:6)
-plSe_reg_para_fac <- plotSensi(reg_para_ik, type = "facet", order = 4:6)
-plSe_reg_para
-plSe_reg_para_fac
-
-
-plSe_reg_nonpara <- plotSensi(reg_nonpara)
-plSe_reg_nonpara
-
-plSe_reg_nonpara_HC <- plotSensi(reg_nonpara_inflm, vcov. = function(x) vcovCluster(x, clusterVar = model.frame(x)$x))
-plSe_reg_nonpara_HC
-
-plSe_reg_para_0 <- plotSensi(reg_para_0, plot = FALSE)
-plSe_reg_para_0
-
-plSe_reg_para_0_gg <- plotSensi(reg_para_0, plot = FALSE, output = "ggplot")
-str(plSe_reg_para_0_gg)
-
-
-###### Post-inference: ######
-
-clusterInf(reg_para, clusterVar = model.frame(reg_para)$x, type = "df-adj")
-clusterInf(reg_para, clusterVar = model.frame(reg_para)$x, type = "HC")
-
-
-############################################ STEP 3: Validty tests
-
-## Placebo test:
-placeb_dat_reg_nonpara <- computePlacebo(reg_nonpara)
-
-plotPlacebo(placeb_dat_reg_nonpara)
-plotPlacebo(placeb_dat_reg_nonpara, device = "base")
-
-
-plotPlaceboDens(placeb_dat_reg_nonpara)
-
-## check invisible return:
-ptPl_reg_nonpara <- plotPlacebo(reg_nonpara, plot = FALSE)
-ptPl_reg_nonpara
-
-ptPl_reg_nonpara2 <- plotPlacebo(reg_nonpara, plot = FALSE, output = "ggplot")
-ptPl_reg_nonpara2
-
-# with HC:
-ptPl_reg_nonpara_HC <- plotPlacebo(reg_nonpara_inflm, vcov. = function(x) vcovCluster(x, clusterVar = model.frame(x)$x))
-ptPl_reg_nonpara_HC
-
-ptPl_reg_para_0 <- plotPlacebo(reg_para_0)
-ptPl_reg_para_0
-
-
-
-## density tests
-dens_test(house_rdd)
-dens_test(reg_para_0, plot = FALSE)
-dens_test(reg_nonpara, plot = FALSE)$test.output[c("theta", "se", "z", "p", "binsize", "bw", "cutpoint")]
-
-
-## Covariates tests
-covarTest_mean(house_rdd_z)
-covarTest_mean(house_rdd_z, bw = 0.1)
-covarTest_dis(house_rdd_z)
-covarTest_dis(house_rdd_z, bw = 0.1)
-
-covarTest_mean(reg_para4_cov)
-covarTest_dis(reg_para4_cov)
-#### as npreg
-reg_nonpara_np <- as.npreg(reg_nonpara, adjustik_bw = FALSE)
-reg_nonpara_np
-rdd_coef(reg_nonpara_np)
-rdd_coef(reg_nonpara_np, allCo = TRUE)
-rdd_coef(reg_nonpara_np, allInfo = TRUE)
-rdd_coef(reg_nonpara_np, allInfo = TRUE, allCo = TRUE)
-
-## Compare with result obtained with a Gaussian kernel:
-bw_lm <- dnorm(house_rdd$x, sd = rddtools:::getBW(reg_nonpara))
-reg_nonpara_gaus <- rdd_reg_lm(rdd_object = house_rdd, w = bw_lm)
-all.equal(rdd_coef(reg_nonpara_gaus, allCo = TRUE), rdd_coef(reg_nonpara_np, allCo = TRUE), check.attributes = FALSE)
-
-
-
-#### methods
-
-regs_all <- list(reg_para = reg_para, reg_para_0 = reg_para_0, reg_para4 = reg_para4, reg_para_ik = reg_para_ik, reg_para_fuzz = reg_para_fuzz, 
-    reg_para4_cov = reg_para4_cov, reg_para4_cov_slSep = reg_para4_cov_slSep, reg_para4_cov_startR = reg_para4_cov_startR, reg_para4_cov_startR_sl2 = reg_para4_cov_startR_sl2, 
-    reg_nonpara = reg_nonpara, reg_nonpara_inflm = reg_nonpara_inflm, reg_nonpara_sameSl = reg_nonpara_sameSl)
-capply <- function(x) {
-    n.obs <- sapply(x, length)
-    seq.max <- seq_len(max(n.obs))
-    t(sapply(x, "[", i = seq.max))
-}
-
-capply(lapply(regs_all, coef))
-sapply(regs_all, rdd_coef)
-rdd_pred_issue <- c("reg_para_0", "reg_para_fuzz", "reg_nonpara", "reg_nonpara_sameSl")
-sapply(regs_all[!names(regs_all) %in% rdd_pred_issue], rdd_pred)
-
-sapply(regs_all, rddtools:::getCutpoint)
-lapply(regs_all, plotSensi, plot = FALSE)
-
-sapply(regs_all, function(x) dens_test(x, plot = FALSE)[c("p.value", "statistic", "estimate")])
- 

From 65a673503bcb8568ba282640fdfbb07a05a8babf Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:46:59 +0000
Subject: [PATCH 154/323] now using testthat

---
 tests/rdd_pred.R | 176 -----------------------------------------------
 1 file changed, 176 deletions(-)
 delete mode 100644 tests/rdd_pred.R

diff --git a/tests/rdd_pred.R b/tests/rdd_pred.R
deleted file mode 100644
index 7a2055c..0000000
--- a/tests/rdd_pred.R
+++ /dev/null
@@ -1,176 +0,0 @@
-library(rddtools)
-library(car)
-
-
-#### DATA
-data(house)
-house_rdd <- rdd_data(y = house$y, x = house$x, cutpoint = 0)
-
-n_Lee <- nrow(house)
-
-set.seed(123)
-Z <- data.frame(z1 = rnorm(n_Lee), z2 = rnorm(n_Lee, mean = 20, sd = 2), z3 = sample(letters[1:3], size = n_Lee, replace = TRUE))
-house_rdd_z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
-
-#### REGS
-bw_ik <- rdd_bw_ik(house_rdd_z)
-w_ik <- rddtools:::Kernel_tri(house_rdd_z$x, 0, bw_ik)
-reg_para4_cov_slSep <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = "z1", covar.opt = list(slope = "separate"))
-reg_para4_cov_slSep_W <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = "z1", covar.opt = list(slope = "separate"), 
-    weights = w_ik)
-reg_np_cov <- rdd_reg_np(rdd_object = house_rdd_z, covariates = "z1", bw = bw_ik, inference = "lm")
-
-
-
-
-reg_para4_cov_slSep_2Z <- rdd_reg_lm(rdd_object = house_rdd_z, order = 4, covariates = "z1+z2", covar.opt = list(slope = "separate"))
-
-reg_li <- list(reg_para4_cov_slSep = reg_para4_cov_slSep, reg_para4_cov_slSep_W = reg_para4_cov_slSep_W, reg_np_cov = reg_np_cov, 
-    reg_para4_cov_slSep_2Z = reg_para4_cov_slSep_2Z)
-
-checkRDDmean <- function(x, n = 5) {
-    covDF <- model.frame(x)
-    zDF <- grep("z", colnames(covDF), value = FALSE)
-    hasD <- zDF[-grep(":", colnames(covDF)[zDF])]
-    
-    DF_1 <- covDF[1:n, hasD, drop = FALSE]
-    DF_2 <- data.frame(t(colMeans(DF_1)))
-    
-    pred_1 <- rdd_pred(x, covdata = DF_1, stat = "mean")
-    pred_2 <- rdd_pred(x, covdata = DF_2)
-    all.equal(pred_1, pred_2, check.attributes = FALSE)
-}
-
-sapply(reg_li, checkRDDmean)
-
-sapply(reg_li, function(x) all.equal(unlist(rdd_pred(x)), rdd_coef(x, allInfo = TRUE)[1, 1:2], check.attributes = FALSE))
-
-
-# reg_para <- rdd_reg_lm(rdd_object=house_rdd) print(reg_para) summary(reg_para) plot(reg_para) formula(reg_para)
-# update(as.formula('y ~ D + `x^1` + `x^1_right`'), reg_para) reg_para_l <- as.lm(reg_para) # update(reg_para_l, y ~ D +
-# `x^1` + `x^1_right`) mf <- model.frame(reg_para) lm('y ~ D + `x^1` + `x^1_right`', mf) a<-lm('y ~ -1 + D +I(1-D) + `x^1` +
-# `x^1_right`', mf) diff(coef(a)[2:1]) coef(reg_para) # deltaMethod(a, 'I(1-D) - D', parameterNames=paste('a', 1:4, sep=''))
-# deltaMethod(a, 'a1 - a2', parameterNames=paste('a', 1:4, sep='')) coef(summary(reg_para))[2,] reg_para4_cov_slSep <-
-# rdd_reg_lm(rdd_object=house_rdd_z, order=4, covariates='z1', covar.opt=list(slope='separate'))
-mf_2 <- model.frame(reg_para4_cov_slSep)
-# formula(reg_para4_cov_slSep)
-aa <- lm("y ~ D + `x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", data = mf_2)
-aaa <- lm("y ~ -1+ D + I(1-D)+`x` + `x^2` + `x^3` + `x^4` + `x_right` + `x^2_right` + `x^3_right` + `x^4_right` + z1 + `z1:D`", 
-    data = mf_2)
-# diff(coef(aaa)[2:1]) rdd_pred(reg_para4_cov_slSep) rdd_pred(reg_para4_cov_slSep, covdata=data.frame(z1=0))
-# rdd_coef(reg_para4_cov_slSep, allInfo=TRUE)
-
-## compare rdd_pred and Delta at 1:
-rdd_p_1 <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = 1))
-delta_1 <- deltaMethod(aaa, "a1 - a2 + a12", parameterNames = paste("a", 1:12, sep = ""))
-rdd_p_1
-delta_1
-all.equal(unlist(rdd_p_1), drop(as.matrix(delta_1[1:2])), check.attributes = FALSE)
-
-## compare rdd_pred and Delta at 0:
-rdd_p_0 <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = 0))
-rdd_c_0 <- rdd_coef(reg_para4_cov_slSep, allInfo = TRUE)
-delta_0 <- deltaMethod(aaa, "a1 - a2 ", parameterNames = paste("a", 1:12, sep = ""))
-rdd_p_0
-rdd_c_0
-delta_0
-all.equal(unlist(rdd_p_0), drop(as.matrix(delta_0[1:2])), check.attributes = FALSE)
-all.equal(unlist(rdd_p_0), drop(as.matrix(rdd_c_0[1:2])), check.attributes = FALSE)
-
-## compare rdd_pred and Delta at 2 points:
-rdd_p_01_AGG <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.5)))
-rdd_p_01_all <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 1)))
-rdd_p_01_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 1)), stat = "sum")
-rdd_p_01_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0, 1)), stat = "mean")
-
-delta_01_S <- deltaMethod(aaa, "2*(a1 - a2) +1*a12", parameterNames = paste("a", 1:12, sep = ""))
-delta_01_M <- deltaMethod(aaa, "(2*(a1 - a2) +1*a12)/2", parameterNames = paste("a", 1:12, sep = ""))
-delta_01_S
-delta_01_M
-
-all(delta_01_S/2 == delta_01_M)
-
-## compare individuals (stat=ident)
-all.equal(rdd_p_01_all$fit, c(delta_0[1, 1], delta_1[1, 1]))
-all.equal(rdd_p_01_all$se.fit, c(delta_0[1, 2], delta_1[1, 2]))
-c(rdd_p_01_M$fit/2, rdd_p_01_AGG$fit)
-
-## compare sum (stat=sum)
-all.equal(unlist(rdd_p_01_S), drop(as.matrix(delta_01_S[1:2])), check.attributes = FALSE)
-
-## compare mean (stat=mean)
-all.equal(unlist(rdd_p_01_M), drop(as.matrix(delta_01_M[1:2])), check.attributes = FALSE)
-all.equal(rdd_p_01_M$fit, rdd_p_01_S$fit/2)
-all.equal(rdd_p_01_M$fit, rdd_p_01_AGG$fit, check.attributes = FALSE)
-all.equal(rdd_p_01_M$se.fit, rdd_p_01_AGG$se.fit, check.attributes = FALSE)
-
-## compare rdd_pred and Delta at 5 first points:
-ind_z_pos <- head(which(house_rdd_z$z1 > 0), 5)
-
-rdd_p_01_5z_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1[1:5]), stat = "sum")
-rdd_p_01_5z_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(house_rdd_z$z1[1:5])), stat = "sum")
-rdd_p_01_5zPos_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1[ind_z_pos]), stat = "sum")
-rdd_p_01_5zPos_Sb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = sum(house_rdd_z$z1[ind_z_pos])), stat = "sum")
-rdd_p_01_5z_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1[1:5]), stat = "mean")
-rdd_p_01_5z_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(house_rdd_z$z1[1:5])), stat = "mean")
-rdd_p_01_ALLz_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = house_rdd_z$z1), stat = "mean")
-rdd_p_01_ALLz_Mb <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = mean(house_rdd_z$z1)), stat = "mean")
-
-del <- function(x, mean = FALSE) {
-    n <- length(x)
-    res <- paste(c(paste(n, "*(a1-a2) "), paste(x, "*a12", sep = "")), collapse = " +")
-    su <- sum(x)
-    sig <- if (sign(su) == 1) 
-        "+" else NULL
-    res <- paste(n, "*(a1-a2) ", sig, su, "*a12", sep = "")
-    if (mean) 
-        res <- paste("(", res, ")/", n, sep = "")
-    res
-}
-
-del(x = house_rdd_z$z1[1:5])
-delta_01_5z_S <- deltaMethod(aaa, del(x = house_rdd_z$z1[1:5]), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
-delta_01_5z_M <- deltaMethod(aaa, del(x = house_rdd_z$z1[1:5], mean = TRUE), parameterNames = paste("a", 1:12, sep = ""), func = "RDD")
-
-all.equal(unlist(rdd_p_01_5z_S), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes = FALSE)
-all.equal(unlist(rdd_p_01_5z_Sb), drop(as.matrix(delta_01_5z_S[1:2])), check.attributes = FALSE)
-all.equal(unlist(rdd_p_01_5z_M), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes = FALSE)
-all.equal(unlist(rdd_p_01_5z_Mb), drop(as.matrix(delta_01_5z_M[1:2])), check.attributes = FALSE)
-
-## All z: all.equal(rdd_p_01_ALLz_M, rdd_p_01_ALLz_Mb, check.attributes=FALSE)
-
-#### Weighted mean!!
-w_5 <- c(0.1, 0.2, 0.4, 0.2, 0.1)
-w <- c(0.4, 0.6)
-rdd_p_01_Sid <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, 1)), stat = "identity")
-wm <- weighted.mean(rdd_p_01_Sid$fit, w = w)
-
-delta_2z_w <- deltaMethod(aaa, "0.4*(a1 - a2) + 0.4*0.2*a12+0.6*(a1 - a2) + 0.6*a12", parameterNames = paste("a", 1:12, sep = ""))
-delta_2z_w2 <- deltaMethod(aaa, "1*(a1 - a2) + 0.4*0.2*a12 + 0.6*a12", parameterNames = paste("a", 1:12, sep = ""))
-delta_2z_w3 <- deltaMethod(aaa, "1*(a1 - a2) + a12*(0.4*0.2 + 0.6)", parameterNames = paste("a", 1:12, sep = ""))
-all(delta_2z_w == delta_2z_w2)
-all.equal(delta_2z_w, delta_2z_w3, check.attributes = FALSE)
-all.equal(delta_2z_w[1, 1], wm)
-
-rdd_p_01_W_S <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, 1)), stat = "sum", weights = w)
-rdd_p_01_W_M <- rdd_pred(reg_para4_cov_slSep, covdata = data.frame(z1 = c(0.2, 1)), stat = "mean", weights = w)
-all.equal(rdd_p_01_W_M$fit, wm)
-
-all.equal(unlist(rdd_p_01_W_S), drop(as.matrix(delta_2z_w2[1:2])), check.attributes = FALSE)
-all.equal(unlist(rdd_p_01_W_M), drop(as.matrix(delta_2z_w2[1:2])), check.attributes = FALSE)
-
-
-###### 2 Z:
-df_2Z_5z <- house_rdd_z[1:5, c("z1", "z2")]
-df_2Z_5z_M <- data.frame(t(colMeans(df_2Z_5z)))
-df_2Z_5z_Mw <- data.frame(t(apply(df_2Z_5z, 2, weighted.mean, w = w_5)))
-
-rdd_p_sZ_5z_S <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z, stat = "sum")
-rdd_p_sZ_5z_M <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z, stat = "mean")
-rdd_p_sZ_5z_Mb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z_M, stat = "sum")
-
-rdd_p_sZ_5z_MW <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z, stat = "mean", weights = w_5)
-rdd_p_sZ_5z_MWb <- rdd_pred(reg_para4_cov_slSep_2Z, covdata = df_2Z_5z_Mw, stat = "sum")
-
-all.equal(rdd_p_sZ_5z_M, rdd_p_sZ_5z_Mb, check.attributes = FALSE)
-all.equal(rdd_p_sZ_5z_MW, rdd_p_sZ_5z_MWb, check.attributes = FALSE) 

From 6947d8c49252edc94e8d9798676e65edd93c7332 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:47:10 +0000
Subject: [PATCH 155/323] now using testthat

---
 tests/rddtools_vs_rdd.R | 48 -----------------------------------------
 1 file changed, 48 deletions(-)
 delete mode 100644 tests/rddtools_vs_rdd.R

diff --git a/tests/rddtools_vs_rdd.R b/tests/rddtools_vs_rdd.R
deleted file mode 100644
index 6e7a6c3..0000000
--- a/tests/rddtools_vs_rdd.R
+++ /dev/null
@@ -1,48 +0,0 @@
-
-library(rdd)
-library(rddtools)
-
-set.seed(1234)
-x <- runif(1000, -1, 1)
-cov <- rnorm(1000)
-y <- 3 + 2 * x + 3 * cov + 10 * (x >= 0) + rnorm(1000)
-
-RD <- rdd_data(x = x, y = y, cutpoint = 0, covar = cov)
-
-### Simple estimation:
-bw <- IKbandwidth(X = x, Y = y, cutpoint = 0)
-bw
-rdd_mod <- RDestimate(y ~ x, bw = bw, se.type = "const", model = TRUE)$model[[1]]
-RDDtools_mod <- rdd_reg_np(RD, bw = bw, inference = "lm")
-
-rdd_co <- coef(summary(rdd_mod))
-RDDtools_co <- rdd_coef(RDDtools_mod, allCo = TRUE, allInfo = TRUE)
-rdd_co
-RDDtools_co
-
-all.equal(rdd_co[-4, ], RDDtools_co[1:3, ], check.attributes = FALSE)
-all.equal(rdd_co[4, 1], sum(RDDtools_co[3:4, 1]), check.attributes = FALSE)
-
-
-### Covariate estimation:
-rdd_mod_cov <- RDestimate(y ~ x | cov, kernel = "rectangular", bw = 5, model = TRUE, se.type = "const")$model[[1]]
-RDDtools_mod_cov <- rdd_reg_lm(RD, bw = 5, covariates = "cov", covar.opt = list(slope = "separate"))
-
-rdd_co_cov <- coef(summary(rdd_mod_cov))
-RDDtools_co_cov <- rdd_coef(RDDtools_mod_cov, allCo = TRUE, allInfo = TRUE)
-rdd_co_cov
-RDDtools_co_cov
-
-all.equal(rdd_co_cov[-4, ], RDDtools_co_cov[-4, ], check.attributes = FALSE)
-
-## Fuzzy
-set.seed(123)
-selec <- rbinom(nrow(RD), 1, prob = ifelse(RD$x < 0, 0.1, 0.9))
-RD_rdd_ins <- rdd_data(y = RD$y, x = RD$x, z = selec, cutpoint = 0)
-
-RDDto_reg_fuz <- rdd_reg_lm(RD_rdd_ins, bw = 0.2)
-rdd_reg_fuz <- RDestimate(y ~ x + selec, data = RD_rdd_ins, kernel = "rectangular", bw = 0.2, model = TRUE, se.type = "const")$model[[2]][[1]]
-
-all.equal(rdd_coef(RDDto_reg_fuz), coef(summary(rdd_reg_fuz))[2, 1])
-all.equal(rdd_coef(RDDto_reg_fuz, allCo = TRUE)[1:3], coef(summary(rdd_reg_fuz))[1:3, 1], check.attributes = FALSE)
- 

From 7c40cd8d7fb68f62f2cfa48682e84cfff7066baf Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 19 May 2015 14:47:22 +0000
Subject: [PATCH 156/323] now using testthat

---
 tests/simple_MC.R | 65 -----------------------------------------------
 1 file changed, 65 deletions(-)
 delete mode 100644 tests/simple_MC.R

diff --git a/tests/simple_MC.R b/tests/simple_MC.R
deleted file mode 100644
index c881224..0000000
--- a/tests/simple_MC.R
+++ /dev/null
@@ -1,65 +0,0 @@
-
-library(rddtools)
-library(rdd)
-
-## simple MC:
-set.seed(123)
-
-MC_simple <- function(n = 200, CATE = 0.3, HATE = 0.1) {
-    x <- rnorm(n, mean = 20, sd = 5)
-    D <- x >= 20
-    y <- 0.8 + CATE * D + 0.3 * x + HATE * x * D + rnorm(n, sd = 0.1)
-    cat("effect", CATE + HATE * 20, "\n")
-    rdd_data(x = x, y = y, cutpoint = 20)
-    
-}
-
-input_mc <- MC_simple(n = 1000, CATE = 0.4)
-plot(input_mc)
-
-RDD_bw <- rdd_bw_ik(input_mc)
-
-RDD_np_sep <- rdd_reg_np(input_mc, bw = RDD_bw)
-RDD_np_same <- rdd_reg_np(input_mc, slope = "same", bw = RDD_bw)
-RDD_np_sep_inflm <- rdd_reg_np(input_mc, bw = RDD_bw, inf = "lm")
-RDD_np_same_inflm <- rdd_reg_np(input_mc, slope = "same", bw = RDD_bw, inf = "lm")
-RDD_lm_sep <- rdd_reg_lm(input_mc, bw = RDD_bw)
-RDD_lm_same <- rdd_reg_lm(input_mc, slope = "same", bw = RDD_bw)
-rdd_RDe <- RDestimate(y ~ x, data = input_mc, cutpoint = 20, model = TRUE, bw = RDD_bw)
-
-
-printCoefmat(coef(summary(RDD_np_sep_inflm$RDDslot$model)))
-printCoefmat(coef(summary(RDD_np_same_inflm$RDDslot$model)))
-printCoefmat(coef(summary(RDD_lm_sep)))
-printCoefmat(coef(summary(RDD_lm_same)))
-printCoefmat(coef(summary(rdd_RDe$model[[1]])))
-
-
-## few checks:
-plse <- plotSensi(RDD_np_sep, from = 5, to = 20, by = 0.5)
-plotPlacebo(RDD_np_sep)
-
-plotSensi(RDD_np_same, from = 5, to = 20, by = 0.5)
-plotPlacebo(RDD_np_same)
-
-a <- plotSensi(RDD_lm_sep, from = 5, to = 20, by = 0.5)
-plotPlacebo(RDD_lm_sep)
-
-plotSensi(RDD_lm_same, from = 5, to = 20, by = 0.5)
-plotPlacebo(RDD_lm_same)
-
-#### Other MCs:
-set.seed(123)
-head(gen_mc_ik())
-
-set.seed(123)
-head(gen_mc_ik(output = "rdd_data"))
-
-set.seed(123)
-head(gen_mc_ik(version = 2))
-
-set.seed(123)
-head(gen_mc_ik(version = 3))
-
-set.seed(123)
-head(gen_mc_ik(version = 4)) 

From 72c3bf6ac143954062aed526265cbda60a23012f Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Wed, 20 May 2015 14:51:58 +0200
Subject: [PATCH 157/323] compile again

---
 man/covarTest_mean.Rd | 3 +++
 man/plot.rdd_data.Rd  | 3 +++
 man/plotPlacebo.Rd    | 3 +++
 man/plotSensi.Rd      | 3 +++
 man/rdd_bw_ik.Rd      | 3 +++
 man/rdd_data.Rd       | 3 +++
 6 files changed, 18 insertions(+)

diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd
index 590b6c1..81b7697 100644
--- a/man/covarTest_mean.Rd
+++ b/man/covarTest_mean.Rd
@@ -58,6 +58,9 @@ covarTest_dis(house_rdd_Z, bw=0.3)
 reg_nonpara <- rdd_reg_np(rdd_object=house_rdd_Z)
 covarTest_mean(reg_nonpara)
 }
+\author{
+Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}>
+}
 \seealso{
 \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution
 }
diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd
index d59b3c4..b25d3cc 100644
--- a/man/plot.rdd_data.Rd
+++ b/man/plot.rdd_data.Rd
@@ -53,4 +53,7 @@ plot(house_rdd, nbins=22)
 ## If the specified number of bins is odd, the larger number is given to side with largest range
 plot(house_rdd, nbins=21)
 }
+\author{
+Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}>
+}
 
diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd
index f6cf286..da799ea 100644
--- a/man/plotPlacebo.Rd
+++ b/man/plotPlacebo.Rd
@@ -64,4 +64,7 @@ reg_nonpara_lminf <- rdd_reg_np(rdd_object=house_rdd, inference='lm')
 vc <- function(x) vcovCluster(x, clusterVar=model.frame(x)$x)
 plotPlacebo(reg_nonpara_lminf, vcov. = vc)
 }
+\author{
+Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}>
+}
 
diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd
index 50c4516..c29397d 100644
--- a/man/plotSensi.Rd
+++ b/man/plotSensi.Rd
@@ -63,4 +63,7 @@ reg_para_ik <- rdd_reg_lm(rdd_object=house_rdd, order=4, bw=bw_ik)
 plotSensi(reg_para_ik)
 plotSensi(reg_para_ik, type='facet')
 }
+\author{
+Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}>
+}
 
diff --git a/man/rdd_bw_ik.Rd b/man/rdd_bw_ik.Rd
index c7d00d4..68a36d8 100644
--- a/man/rdd_bw_ik.Rd
+++ b/man/rdd_bw_ik.Rd
@@ -23,6 +23,9 @@ data(house)
 rd<- rdd_data(x=house$x, y=house$y, cutpoint=0)
 rdd_bw_ik(rd)
 }
+\author{
+Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}>
+}
 \references{
 Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,'
 Review of Economic Studies (2012) 79, 933-959
diff --git a/man/rdd_data.Rd b/man/rdd_data.Rd
index a2e4f57..75718ed 100644
--- a/man/rdd_data.Rd
+++ b/man/rdd_data.Rd
@@ -40,4 +40,7 @@ rd
 summary(rd)
 plot(rd)
 }
+\author{
+Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}>
+}
 

From 6629846ba5eedbbe2fbe1b46c7f2b454fe9d6b16 Mon Sep 17 00:00:00 2001
From: Bastiaan Quast 
Date: Tue, 14 Jul 2015 11:57:06 +0200
Subject: [PATCH 158/323] remove

---
 vignettes/rddtools.R    |  50 -----------
 vignettes/rddtools.html | 193 ----------------------------------------
 2 files changed, 243 deletions(-)
 delete mode 100644 vignettes/rddtools.R
 delete mode 100644 vignettes/rddtools.html

diff --git a/vignettes/rddtools.R b/vignettes/rddtools.R
deleted file mode 100644
index d2f4e38..0000000
--- a/vignettes/rddtools.R
+++ /dev/null
@@ -1,50 +0,0 @@
-## ---- echo = FALSE, message = FALSE--------------------------------------
-knitr::opts_chunk$set(collapse = T, comment = "#>")
-
-## ------------------------------------------------------------------------
-library(rddtools)
-data(house)
-
-## ------------------------------------------------------------------------
-house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
-
-## ----dataPlot------------------------------------------------------------
-summary(house_rdd)
-plot(house_rdd)
-
-## ----reg_para------------------------------------------------------------
-reg_para <- rdd_reg_lm(rdd_object=house_rdd, order=4)
-reg_para
-
-plot(reg_para)
-
-## ----RegPlot-------------------------------------------------------------
-bw_ik <- rdd_bw_ik(house_rdd)
-reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik)
-print(reg_nonpara)
-plot(x=reg_nonpara)
-
-## ----SensiPlot-----------------------------------------------------------
-plotSensi(reg_nonpara, from=0.05, to=1, by=0.1)
-
-## ----placeboPlot---------------------------------------------------------
-plotPlacebo(reg_nonpara)
-
-## ----DensPlot------------------------------------------------------------
-dens_test(reg_nonpara)
-
-## ------------------------------------------------------------------------
-set.seed(123)
-n_Lee <- nrow(house)
-Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-                z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
-                z3 = sample(letters, size = n_Lee, replace = TRUE))
-house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
-
-## ------------------------------------------------------------------------
-## test for equality of means around cutoff:
-covarTest_mean(house_rdd_Z, bw=0.3)
-
-## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
-covarTest_dis(house_rdd_Z, bw=0.3)
-
diff --git a/vignettes/rddtools.html b/vignettes/rddtools.html
deleted file mode 100644
index 45e9f1f..0000000
--- a/vignettes/rddtools.html
+++ /dev/null
@@ -1,193 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rddtools
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

RDDtools works in an object-oriented way: the user has to define once the characteristic of the data, creating a rdd_data object, on which different anaylsis tools can be applied.

-
-

Data Preparation and Visualisation

-

Load the package, and load the built-in dataset from [Lee 2008]:

-
library(rddtools)
-data(house)
-

Declare the data to be a rdd_data object:

-
house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0)
-

You can now directly summarise and visualise this data:

-
summary(house_rdd)
-#> ### rdd_data object ###
-#> 
-#> Cutpoint: 0 
-#> Sample size: 
-#>  -Full : 6558 
-#>  -Left : 2740 
-#>  -Right: 3818
-#> Covariates: no
-plot(house_rdd)
-

-
-
-

Parametric Estimation

-

Estimate parametrically, by fitting a 4th order polynomial.

-
reg_para <- rdd_reg_lm(rdd_object=house_rdd, order=4)
-reg_para
-#> ### RDD regression: parametric ###
-#>  Polynomial order:  4 
-#>  Slopes:  separate 
-#>  Number of obs: 6558 (left: 2740, right: 3818)
-#> 
-#>  Coefficient:
-#>   Estimate Std. Error t value  Pr(>|t|)    
-#> D 0.076590   0.013239  5.7851 7.582e-09 ***
-#> ---
-#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-
-plot(reg_para)
-

-
-
-

Non-parametric Estimation

-

Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidth.

-
bw_ik <- rdd_bw_ik(house_rdd)
-reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik)
-print(reg_nonpara)
-#> ### RDD regression: nonparametric local linear###
-#>  Bandwidth:  0.2938561 
-#>  Number of obs: 3200 (left: 1594, right: 1606)
-#> 
-#>  Coefficient:
-#>   Estimate Std. Error z value  Pr(>|z|)    
-#> D 0.079924   0.009465  8.4443 < 2.2e-16 ***
-#> ---
-#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-plot(x=reg_nonpara)
-

-
-
-

Regression Sensitivity tests:

-

One can easily check the sensitivity of the estimate to different bandwidths:

-
plotSensi(reg_nonpara, from=0.05, to=1, by=0.1)
-

-

Or run the Placebo test, estimating the RDD effect based on fake cutpoints:

-
plotPlacebo(reg_nonpara)
-

-
-
-

Design Sensitivity tests:

-

Design sensitivity tests check whether the discontinuity found can actually be attributed ot other causes. Two types of tests are available:

-
    -
  • Discontinuity comes from manipulation: test whether there is possible manipulation around the cutoff, McCrary 2008 test: dens_test()
  • -
  • Discontinuity comes from other variables: should test whether discontinuity arises with covariates. Currently, only simple tests of equality of covariates around the threshold are available:
  • -
-
-

Discontinuity comes from manipulation: McCrary test

-

use simply the function dens_test(), on either the raw data, or the regression output:

-
dens_test(reg_nonpara)
-

-
#> 
-#>  McCrary Test for no discontinuity of density around cutpoint
-#> 
-#> data:  reg_nonpara
-#> z-val = 1.2952, p-value = 0.1952
-#> alternative hypothesis: Density is discontinuous around cutpoint
-#> sample estimates:
-#> Discontinuity 
-#>     0.1035008
-
-
-

Discontinuity comes from covariates: covariates balance tests

-

Two tests available: + equal means of covariates: covarTest_mean() + equal density of covariates: covarTest_dens()

-

We need here to simulate some data, given that the Lee (2008) dataset contains no covariates. We here simulate three variables, with the second having a different mean on the left and the right.

-
set.seed(123)
-n_Lee <- nrow(house)
-Z <- data.frame(z1 = rnorm(n_Lee, sd=2), 
-                z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), 
-                z3 = sample(letters, size = n_Lee, replace = TRUE))
-house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0)
-

Run the tests:

-
## test for equality of means around cutoff:
-covarTest_mean(house_rdd_Z, bw=0.3)
-#>    mean of x   mean of y Difference statistic  p.value  
-#> z1 0.004268177 0.0218581 0.01758993 -0.2539109 0.7995803
-#> z2 5.005608    7.984865  2.979257   -84.84982  0        
-#> z3 13.18888    13.43534  0.2464617  -0.9409715 0.3467888
-
-## Can also use function covarTest_dis() for Kolmogorov-Smirnov test:
-covarTest_dis(house_rdd_Z, bw=0.3)
-#> Warning in ks.test(x[regime], x[!regime], exact = exact): p-value will be
-#> approximate in the presence of ties
-#>    statistic  p.value  
-#> z1 0.03482029 0.2726692
-#> z2 0.8647849  0        
-#> z3 0.03008545 0.447416
-

Tests correctly reject equality of the second, and correctly do not reject equality for the first and third.

-
-
- - - - - - - - From a52377230af64c2cd663bf7b747f509ec634dfdb Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 14 Jul 2015 12:04:32 +0200 Subject: [PATCH 159/323] add INDH data --- R/rddtools.R | 24 ++++++++++++++++++++++-- data/indh.rda | Bin 0 -> 994 bytes man/indh.Rd | 31 +++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 data/indh.rda create mode 100644 man/indh.Rd diff --git a/R/rddtools.R b/R/rddtools.R index d19c8b2..9832f5c 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -7,9 +7,29 @@ if (getRversion() >= "3.1.0") { utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high")) - utils::suppressForeignCheck(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high")) } +#' @name indh +#' @docType data +#' @title INDH data set +#' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" +#' @format A data frame with three variables with 740 observations each +#' @source Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} +#' @references Arcand, Reiger, Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' +#' @examples +#' # load the data +#' data(indh) +#' +#' # construct rdd_data frame +#' rdd_dat_indh <- rdd_data(y=choice_pg, x=poverty, data=indh, cutpoint=30) +#' +#' # inspect data frame +#' summary(rdd_dat_indh) +#' +#' # perform non-parametric regression +#' (reg_np_indh <- rdd_reg_np(rdd_dat_indh) +#' plot(rdd_np_indh) +NULL #' @name house #' @docType data #' @title Dataset used in Lee (2008) @@ -66,4 +86,4 @@ NULL #' # Regression of means, with weighted average: #' reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs) #' coef(summary(reg_krug_gls))[2,2] -NULL +NULL \ No newline at end of file diff --git a/data/indh.rda b/data/indh.rda new file mode 100644 index 0000000000000000000000000000000000000000..a876fd5a3667014a518ab89f90495c7a449f1cc6 GIT binary patch literal 994 zcmb2|=3oE=HtwQMgGXHtk`fXUk`mIGCY^Cmo3Cu=40q_StbsXO1mpmp-6&{)R&YzcOQ?n@m!V#UH0N_dBm1 z_i*{~n43N6Y_h^3`<6#NjV$#7lb1=H5*;45k6cMV za%ssE<)l-ZY)Yqdl3r`NX)USuI%Sk}S!AJw%CfknDszK_{yfCnJNBI zTe>ro+c03I%t9A=X3<*=Pp&+kaz(M_61!RP4~Mr!?AG_3-do;|%Jk=!xA?LAen;At zw^MF<%d`Jin7!?@-Hgf;yC$V=Ir~1kankb}nSQt5)*apZ;k4SS%iGS(=~EXe&hWo4 zz*$kB&iD1@ui`ew?ei|o-4~ z1ApPJi)O-SD&K8s51PMk)`J_F@0{zccJ};!{grRk<+A(Bw;a>cT4ooUzxik8O3}A3 zUHDH#X&$h%y+acRO5jYed}pNnezht36*tf?*B0HB`g6!+@ms#RAAeu8 zo%?M|QQ^7TtuntZSBVOJ6P|yu-;Vq3`M}xh3a>>*g*ukrQoEE?Cg3c4HDmXIAKOn0 znP#}%p0dGDXhX+ByS;mTwH|s&+|9VXIIN8Q3-5_#Z)I+$&FK0TFn60^_TJcSmHbDy z#9pj>TxRI^>E*tEymyw*51hO0u3hX>l^ye|w%oY2T9|LmQtRC3sY@&O6j`3lxa}QY zlJjiuQv0*NzBye;$-i~^{GkXHwdt4o>w;2m9;uiH42RtQX{+CJ-@4c?&3nW~=B597 z@B6eFTJm}ynW8O{@K&L%S3Ih{Ol-1n~t9h{MNAP znd-A;V$70E4}2F0IG%gb^XJTyD?ge_Rxnf-)#c@7#%c9LPl%ru6%y2$CYBypw^Qzn zP27cJ!57@t{{R2~)Pm?)b0$adY!*>FF?CYJq!rV{Sg!Ct`OBQhaC2ub=V2=b1^~JG B@JRpw literal 0 HcmV?d00001 diff --git a/man/indh.Rd b/man/indh.Rd new file mode 100644 index 0000000..b470d54 --- /dev/null +++ b/man/indh.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2 (4.1.1): do not edit by hand +% Please edit documentation in R/rddtools.R +\docType{data} +\name{indh} +\alias{indh} +\title{INDH data set} +\format{A data frame with three variables with 740 observations each} +\source{ +Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} +} +\description{ +Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" +} +\examples{ +# load the data +data(indh) + +# construct rdd_data frame +rdd_dat_indh <- rdd_data(y=choice_pg, x=poverty, data=indh, cutpoint=30) + +# inspect data frame +summary(rdd_dat_indh) + +# perform non-parametric regression +(reg_np_indh <- rdd_reg_np(rdd_dat_indh) +plot(rdd_np_indh) +} +\references{ +Arcand, Reiger, Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' +} + From 7ffa984f29d86d1c9f1f696a6b8ad192daf7e1a7 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 14 Jul 2015 12:07:22 +0200 Subject: [PATCH 160/323] small fixes --- R/rddtools.R | 6 +++--- man/indh.Rd | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index 9832f5c..249ef11 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -15,7 +15,7 @@ if (getRversion() >= "3.1.0") { #' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" #' @format A data frame with three variables with 740 observations each #' @source Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} -#' @references Arcand, Reiger, Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' +#' @references Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' #' @examples #' # load the data #' data(indh) @@ -27,8 +27,8 @@ if (getRversion() >= "3.1.0") { #' summary(rdd_dat_indh) #' #' # perform non-parametric regression -#' (reg_np_indh <- rdd_reg_np(rdd_dat_indh) -#' plot(rdd_np_indh) +#' ( reg_np_indh <- rdd_reg_np(rdd_dat_indh) ) +#' plot(reg_np_indh) NULL #' @name house #' @docType data diff --git a/man/indh.Rd b/man/indh.Rd index b470d54..6063535 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -22,10 +22,10 @@ rdd_dat_indh <- rdd_data(y=choice_pg, x=poverty, data=indh, cutpoint=30) summary(rdd_dat_indh) # perform non-parametric regression -(reg_np_indh <- rdd_reg_np(rdd_dat_indh) -plot(rdd_np_indh) +( reg_np_indh <- rdd_reg_np(rdd_dat_indh) ) +plot(reg_np_indh) } \references{ -Arcand, Reiger, Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' +Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' } From 15a28a13fd8297b6d454c4de3617b501c42ea0aa Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 15 Jul 2015 10:35:25 +0200 Subject: [PATCH 161/323] cleanup --- R/rdd_data_methods.R | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R index d6426be..8164f1d 100644 --- a/R/rdd_data_methods.R +++ b/R/rdd_data_methods.R @@ -143,27 +143,3 @@ as.lm.rdd_reg_np <- function(x) as.lm_RDD(x) #' @export as.lm.rdd_reg <- function(x) as.lm_RDD(x) - - - - -# subset.rdd_data <- function(x,...){ res <- subset.data.frame(x,...) attributes(res) <- attributes(x) res } - - -### EXAMPLE -if (FALSE) { - library(RDDtools) - # data(house) - - - environment(plot.rdd_data) <- environment(rdd_data) - - house_rdd <- rdd_data(y = house$y, x = house$x, cutpoint = 0) - plot(house_rdd) - - plot(house_rdd, h = 0.2) - plot(house_rdd, h = c(0.2, 0.3, 0.4), nplot = 3) - - plot(house_rdd, nbins = 21) - -} From 9990bcc0c62fd4eac8dd3c3064283ac423909fc0 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 15 Jul 2015 10:35:40 +0200 Subject: [PATCH 162/323] remove NAs --- R/rddtools.R | 2 +- data/indh.rda | Bin 994 -> 2504 bytes man/indh.Rd | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index 249ef11..ab0fa76 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -13,7 +13,7 @@ if (getRversion() >= "3.1.0") { #' @docType data #' @title INDH data set #' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" -#' @format A data frame with three variables with 740 observations each +#' @format A data frame with three variables with 729 observations each #' @source Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} #' @references Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' #' @examples diff --git a/data/indh.rda b/data/indh.rda index a876fd5a3667014a518ab89f90495c7a449f1cc6..2bbf97fcfa02e10176494354480fe2b68383c443 100644 GIT binary patch literal 2504 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 B@JRpw diff --git a/man/indh.Rd b/man/indh.Rd index 6063535..5c13718 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -4,7 +4,7 @@ \name{indh} \alias{indh} \title{INDH data set} -\format{A data frame with three variables with 740 observations each} +\format{A data frame with three variables with 729 observations each} \source{ Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} } From ef2d3122cdea071b94609692b7f3c6a070c9b0a2 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 15 Jul 2015 10:35:47 +0200 Subject: [PATCH 163/323] add vignette morocco --- vignettes/morocco.Rmd | 101 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 vignettes/morocco.Rmd diff --git a/vignettes/morocco.Rmd b/vignettes/morocco.Rmd new file mode 100644 index 0000000..d9d09c2 --- /dev/null +++ b/vignettes/morocco.Rmd @@ -0,0 +1,101 @@ +--- +title: "Vignette Title" +author: "Bastiaan Quast" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Morocco} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +we use the data from the Initiative Nationale du Development Humaine (INDH) a development project in Morocco. +The data is included with the `rddtools` package under the name `indh`. + +We start by loading the package. + +```{r} +library(rddtools) +``` + +We can now load the included data set. + +```{r} +data("indh") +``` + +Now that we have loading the data we can briefly inspect the structure of the data + +```{r} +str(indh) +``` + +The `indh` object is a `data.frame` containing 729 observations (representing individuals) of three variables: + +- `choice_pg` +- `commune` +- `poverty` + +The variable of interest is `choice_pg`, which represent the decision to contibute to a public good or not. +The observations are individuals choosing to contribute or not, these individuals are clustered by the variable `commune` which is the municiple structure at which funding was distributed as part of the INDH project. +The forcing variable is `poverty` which represents the number of households in a commune living below the poverty threshold. +As part of the INDH, commune with a proportion of household below the poverty threshhold greater than 30% were allowed to distribute the funding using a **Community Driven Development** scheme. +The cutoff point for our analysis is therefore `30`. + +We can now transform the `data.frame` to a special `rdd_data` `data.frame` using the `rdd_data()` function. + +```{r} +rdd_dat_indh <- rdd_data(y=choice_pg, + x=poverty, + data=indh, + cutpoint=30 ) +``` + +The structure is similar but contains some additional information. + +```{r} +str(rdd_dat_indh) +``` + +In order to best understand our data, we start with an exploratory data analysis using tables... + +```{r} +summary(rdd_dat_indh) +``` + +...and plots. + +```{r} +plot(rdd_dat_indh[1:715,]) +``` + +We can now continue with a standard Regression Discontinuity Design (RDD) estimation. + +```{r} +(reg_para <- rdd_reg_lm(rdd_dat_indh, order=4)) +``` + +and visualising this estimation. + +```{r} +plot(reg_para) +``` + +In addition to the parametric estimation, we can also perform a non-parametric estimation. + +```{r} +bw_ik <- rdd_bw_ik(rdd_dat_indh) +(reg_nonpara <- rdd_reg_np(rdd_object=rdd_dat_indh, bw=bw_ik)) +``` + +and visualising the non-parametric estimation. + +```{r} +plot(reg_nonpara) +``` + +Sensitity tests. + +```{r} +plotSensi(reg_nonpara, from=0.05, to=1, by=0.1) +``` From 9e133a374681b9abb20f436a4a46d36cbca96751 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 17 Jul 2015 10:24:02 +0200 Subject: [PATCH 164/323] fix data set --- R/rddtools.R | 2 +- data/indh.rda | Bin 2504 -> 2410 bytes man/indh.Rd | 2 +- vignettes/morocco.Rmd | 5 ++--- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index ab0fa76..ba23950 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -13,7 +13,7 @@ if (getRversion() >= "3.1.0") { #' @docType data #' @title INDH data set #' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" -#' @format A data frame with three variables with 729 observations each +#' @format A data frame with two variables with 720 observations each #' @source Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} #' @references Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' #' @examples diff --git a/data/indh.rda b/data/indh.rda index 2bbf97fcfa02e10176494354480fe2b68383c443..b6d857cddd45c8f81b038d3a99edce06e8fa5672 100644 GIT binary patch literal 2410 zcmeIuc{Cdc9tZHgomHJ$W$Jnv4bwHHWf&S0S0!7wWJt@nH9A#C98F1FK~z;))KDsQ z22rgtN!@KoXssx1f*g(v_3EgE5F(v_G-- zxbUY7`998l=Z#HunnNW%iB>l)n;!lCY!UaV@t1TBeO8`oPv=HW=W3dGe>LuJouZ^1 z9E^8zdiQV0b`NvaPTDpFJx9e&oh53=@%yZV8dU6L>=W!Tr;jgV@BPf)wIo z(Kkh_89`-=e&dmxF*0g#HqW_cbt09VWNHs)VD4xg$DU{zRXF{Qwek2}x3d@d9waPh zCP}I@DJS79QWFv-QA;{z8spK#u1d#rWn;=duuWDZ3#}Y@y#Bt4`Le-0lNFo-V@F~? zkfkOv2w|(T*579J&W_q$=mLbary8R7CEh!9n!H!BafVo0m@GnBCS;98B|k42S!+u( zjR5f%FDrPpUwh2FuA35F7aK%1$GJr&Lz33H`dUyMbynIF423)1-!9w-Lrb;*j+W_? zK@)cqym!%8^H$ApNz}FK7oMGl2*q5F^39LH0$+$xfW~W_bZK7;it#?UoTiMyuof!L#75ti`CQ7fcF}U-JH$Eh!aF>fsT0 z175??2}pM2Rj;ALy+9;E0@$EleLon{8vt1st<(EIyeS_SjSlaG)K1x=K-3tfy6Quw zm$Lsl_IXc*N(&LNRCP(Y#o{u%BM!tcX@6_Tx~mrBREFENv6=;&xw0pK4N&wR=h=^U z!A7UL4N>>gFpH}lXPByJ5wW9E5kn9Zfa6;oNp`;Pl48y}z6G(d5{GaC{ktWAIsU;A zw>ha5YFM=$C$DzUf^-s?@fX=>x5Y@#aCIa(utox)kzbvn{E%gg0;LZzrb=`Be4(*o ze5<&vZj|V-KOF;({dVo0?9-sKF0c@U+mpg6R3&Yh$=mCW=Np;qVn(0nL2zkd?5L~L zHD=>2JoDY1Idi>UYDCtZC|O-)pRO)FZ1&tH&7fNishJZ7_<3_fKEQWAPS_dFy{2lD); zAlytc8*-(?YTAb#)QQE^$64+e6o=0bF1SFjKI+;cMkBeS@RB<tluXYo0U#j+#w}(ONWiAK<0mP)p^UY1E;4mxX#Xn`vD_cg=~mTw$A+yE{jpo`(%Z z+pcipu?{*DN3Mv~U9IoBU9=iTj?bt;ZZp_G>*6mojVEfcdh=d;6E0N3Cdm^E&8#-& zXjj2BCUT^}DmRX>PpZkRuasIkI(0^anGNnJ3npnqkWhtC6Qp;Q&=Jsj6M-kL0Pj&K zK;drVU7*dx34}1J>wd+=xG+er;^+<+rs1-YO%YPKTt`t=!GTNlah1phovyq7lQD90 z8jLczEBSkJ;b}LzGc`BXlwnSFQXuL;&Q&vKj{1V7b1cR(W2` zPUfF?5E7*Zio)d2MxJk>`CbPN8Ukl|z7n1u{q+V(fxU5zeIN+8cgYhTJW$QO-Xt2& z$T%*`&HO%WM(;OrU$;3I^?mR!FkC$MRF|9^`!@Lh{C6X8hapxN-QfXdPr>9nu}l1a z0qoPwSI`Wn8Qlr-q58ju-NR}O^_Rvr`lJ2S t$H(da#OUcIATLkbC(fy)(oQ}*^$gIfi)p!(%up=*E{V(QM=cH=`YXU|KkWbj literal 2504 zcmeH^X;2de8iwsCC^Cq)B7#V;x(qBwU<2VyQm$|b@hlZARH!5nj=F@1fdmZ5DU?%= z5bjHE&StB zkLuczdfZ&>*@;c1p!@#Vp%aHr^bQ+*IXjRM@dFk^gcHaArshqwGpq_pwmiN;3{Fy2 zJ9^~k<#3eEGuL`rp?9FySLcs7XL=d@Yx27@ z9A&H`k>Hp{fT&_yVV#8IhmNtP--Sgqbe}Nt&|G<{u&6-^Hw-+`G_1Hl<3r7|>g`cX zK2cdVW(>XiqysV+>5E;o*n@tg%=;Yd)U__gRY?0U>p_<$1=lADErVod$L%5rw{uV3 z*|DOT5a?vB?_R?5w2q4+<^nntQcVlEcFi>H;fiUps)MK{O8 zv>GQ`z4YBtzKL4j{6;31zMu3 zB`axOL7sk_aD&7f26r63{w+JjE;TtR z(QENDyX?=wwI*1kW7j*%0HeGIM~S}qP00rezZD9I2so{@3&W>D1MXhH!_7IA{?~N} zJuB@VxByy)WRL6Us3{kX7Z{3B6bOlvoX6uT$UQoxb9`weJL;iw$?C%Pm^rloCYiV` zUY38ggp~eTZk$}9_l45V_(_D|WqU^Dy|qk3#y!WKn7x4QsMTxvQXLBRlB^c63{aNF zzfD8qD$i`|P(f&EF6DtI$*xTk9JMLmN?{0-YPQ{by}Xwq`kO^E;%A$coGkDtHqJ#Z z$e+${%U+yM0Dof#tL3Yxk@9-8b-CE@@hoJ|BI|YXqvgQ&twW;|nWy&hp)n1GrYJnT zAcZbm>9x@-g90}tZ!8}y251>3hUP>Q_&*Kh+sqd!sU}=W`+B4{LJzR5Lor4>js99O zKu0Z)#aGOr$(=gJZ4!^#RuT_ZjEJ=So|jZdFZUaQ`}LuNcsg{l{b&qZ=T2o_=vA&x zzqsC?ftoZSH(0m$Np_giNDy~PYrC{NA#jSN0P$={W*jRtKfjJ4jQtiEkEemuNOoty zec7f91@aq6#^QeHwwHX#+JL$v?wTYy7=|KV41N^y3bb%DW7om4x%yqC}y=F+HU*@{a!dsQDH+Ha2mU*#-pW$*x z;OsC}JXyb{)GABA!5syrS5u@$^x7TiX^5{n>Ks1#)U1stKzaz`iJ0vVvxN9Cn0JLk zQphfJKj{(k%I-OcH>^g0(t#j=%&eYr!bMnhCF>|Ig8&DzO?vXbo(=bRfi?PxtZ`&+ zRS**>^6~dxMM0=;(d-V?!TmBY%WzjCvcc@6q_>D$9VvC#g+w;Om;ez%YQ9!Q?#WVI zd^a0}vU#e=TkYscQ@{btH0gg}(n1R`V(T z=krq%U}Ai2{%9$(6M4%YZ2rQZQb4U24|4v?7M1t2`mUTdY&iiG{+QUQU=Fi}rvtnP zz_86Ssu2(b9L2a=PPqFgZ>?^;q-ciFN-PW?s{M}et9>AVnG&nRcZe0VZngE~+~6oV z(@{ZPoa*52kf))Ine-_Wu!CPj;N>n(eK4p+OsE4uUf*ie{!#C;Kf&jpt%(O& Date: Tue, 21 Jul 2015 13:08:03 +0200 Subject: [PATCH 165/323] remove na.action attribute --- data/indh.rda | Bin 2410 -> 2293 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/indh.rda b/data/indh.rda index b6d857cddd45c8f81b038d3a99edce06e8fa5672..54949c1ec7fdfb7ba9c1b341b5d9bb8c74c99166 100644 GIT binary patch literal 2293 zcmeIudo&w{0>^P(Gkq9i?PZe%t)cFnM@zj$RnbvSTB%=;0KNvm2KkD?wC zF_EOIq7}&qiIoagX%Y$1M9Qs}q>3V_q>L-pi7d!2>X z>_%yCnoRe|XGz}rE+Y>=g1v*AuX}qF%pA6B_(OyKAA9??na>;ma6U%@F65^+prM>u zK$QE7t;SgF90C|KVN&5cPX^|pxaM^C}YGxdY ziFWfSwI8m0vpNkpgzVs^5Z%7)NOLtAn2MLJhYDEe^7KVj%0T@CdD^~p&om~!Sa!7S z#&BRwZcB4hDc3i`G(i8cx^R`NsfBukn~;T^YYJ-ftGR z=St`_yR(`xoN&H#PX-A|Y1_#N5w4d;g6=}<4sPF$m_hJ=ou!P#eE%y?3N?JylE6L- z^b$5pbotyhIid*h8&q<;f7(2d|0swFJB(Bg1cY&mbJ(3vU(|QMEY#+n8V!huxeA-i z2ivRU4@4P$;JMd2;%dEmkaR4Po&_1|?BYI|@U+cNTMM$ru41rmPwu{jXcGEVn1U1) zDQ|fUDU4aZuHY;MF`xoQ7552_YRg)y&-m6^G%c|1g+?kD)+)HU?_RR1xKotvkcNqS zAali=mZCr?Q?&LQ>M>c60XnnG$m&RIs%6vP;~UY{0;0xby+* zpDmA~ElZDB<8sE>br#WyPdype2qCxbDeqU9*HnL%|IzU?%h$k_(>L#g;IHyWFGwsj zFb@}^64G$i#yV?b6fUgql&8k|z`hA{t9;f>l~Wb2Zbi?C>$03Uf1__ujPhjJVMZ+& z3Xf~0~672#*-uOvdt%i<3_AzeTl06vc>_8;r4yD;H$W*yM;(Tta zX@rkxJfzi2x2eGKCd*G02+qZ63pNzGN=xYpA6b}V)s4Vi($j^G4Su}yj(7a{v5dOJ zpAR#ti{YPOh)KaGM@7^sOWr94#?oNV3H!oCvbzkzC?SnYQ$IaVK*=S+ege3*)PGBm z5o^h5UK!u*h@IzMQ|NPuS&n!U(#KupCO`Yb4Qxm&{LhqN^-m^*VfjAgAseEV+*)a% zuFX5?Ma1)ug+jc@WVw;zllCT<+%>!LH+hZXAIjtHEk-hD#bM^DzjYN~6c{UQnCCip zZ3<&`X&$sg5E|;g2;Xh7^r66M+!THQLGt1oW>@ZGtK?ds77f2B^`@RcBR5xeD{I1Y^fwE0 zuS885{g2cdk_zEhLjQyfvv3{J0PRPczxcl;7ZxziUc>~^AH;^)NwCVeg3 zY+I5T4ivFzNr?YO%z5W{#$^GgK5;UYO2QtOK9K)$ts*}FHSGSs`11tL!MFqe(dQ8& w0VrY9e=$X+M_vlH-;q7v<^!>Mc1LVRn61~>m*2eJB0#l_juI~kZM3w02j9~1tN;K2 literal 2410 zcmeIuc{Cdc9tZHgomHJ$W$Jnv4bwHHWf&S0S0!7wWJt@nH9A#C98F1FK~z;))KDsQ z22rgtN!@KoXssx1f*g(v_3EgE5F(v_G-- zxbUY7`998l=Z#HunnNW%iB>l)n;!lCY!UaV@t1TBeO8`oPv=HW=W3dGe>LuJouZ^1 z9E^8zdiQV0b`NvaPTDpFJx9e&oh53=@%yZV8dU6L>=W!Tr;jgV@BPf)wIo z(Kkh_89`-=e&dmxF*0g#HqW_cbt09VWNHs)VD4xg$DU{zRXF{Qwek2}x3d@d9waPh zCP}I@DJS79QWFv-QA;{z8spK#u1d#rWn;=duuWDZ3#}Y@y#Bt4`Le-0lNFo-V@F~? zkfkOv2w|(T*579J&W_q$=mLbary8R7CEh!9n!H!BafVo0m@GnBCS;98B|k42S!+u( zjR5f%FDrPpUwh2FuA35F7aK%1$GJr&Lz33H`dUyMbynIF423)1-!9w-Lrb;*j+W_? zK@)cqym!%8^H$ApNz}FK7oMGl2*q5F^39LH0$+$xfW~W_bZK7;it#?UoTiMyuof!L#75ti`CQ7fcF}U-JH$Eh!aF>fsT0 z175??2}pM2Rj;ALy+9;E0@$EleLon{8vt1st<(EIyeS_SjSlaG)K1x=K-3tfy6Quw zm$Lsl_IXc*N(&LNRCP(Y#o{u%BM!tcX@6_Tx~mrBREFENv6=;&xw0pK4N&wR=h=^U z!A7UL4N>>gFpH}lXPByJ5wW9E5kn9Zfa6;oNp`;Pl48y}z6G(d5{GaC{ktWAIsU;A zw>ha5YFM=$C$DzUf^-s?@fX=>x5Y@#aCIa(utox)kzbvn{E%gg0;LZzrb=`Be4(*o ze5<&vZj|V-KOF;({dVo0?9-sKF0c@U+mpg6R3&Yh$=mCW=Np;qVn(0nL2zkd?5L~L zHD=>2JoDY1Idi>UYDCtZC|O-)pRO)FZ1&tH&7fNishJZ7_<3_fKEQWAPS_dFy{2lD); zAlytc8*-(?YTAb#)QQE^$64+e6o=0bF1SFjKI+;cMkBeS@RB<tluXYo0U#j+#w}(ONWiAK<0mP)p^UY1E;4mxX#Xn`vD_cg=~mTw$A+yE{jpo`(%Z z+pcipu?{*DN3Mv~U9IoBU9=iTj?bt;ZZp_G>*6mojVEfcdh=d;6E0N3Cdm^E&8#-& zXjj2BCUT^}DmRX>PpZkRuasIkI(0^anGNnJ3npnqkWhtC6Qp;Q&=Jsj6M-kL0Pj&K zK;drVU7*dx34}1J>wd+=xG+er;^+<+rs1-YO%YPKTt`t=!GTNlah1phovyq7lQD90 z8jLczEBSkJ;b}LzGc`BXlwnSFQXuL;&Q&vKj{1V7b1cR(W2` zPUfF?5E7*Zio)d2MxJk>`CbPN8Ukl|z7n1u{q+V(fxU5zeIN+8cgYhTJW$QO-Xt2& z$T%*`&HO%WM(;OrU$;3I^?mR!FkC$MRF|9^`!@Lh{C6X8hapxN-QfXdPr>9nu}l1a z0qoPwSI`Wn8Qlr-q58ju-NR}O^_Rvr`lJ2S t$H(da#OUcIATLkbC(fy)(oQ}*^$gIfi)p!(%up=*E{V(QM=cH=`YXU|KkWbj From 48e396dc454a1b91aca651d80db571a020b7d89a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2015 09:28:57 +0200 Subject: [PATCH 166/323] add comments file --- cran-comments.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 cran-comments.md diff --git a/cran-comments.md b/cran-comments.md new file mode 100644 index 0000000..78fd2f0 --- /dev/null +++ b/cran-comments.md @@ -0,0 +1,9 @@ +## Test environments + +- local Windows 7 install, R 3.2.1 Rtools 3.3.0 +- local Linux (Arch) install, R 3.2.0 +- ubuntu 12.04 (on travis-ci), R 3.2.1 +- win-builder (devel and R 3.2.1) + +## R CMD check results +There were no ERRORs or WARNINGs or notes From 226652a460ae1eb6ba8b78cec6f4a629671be35f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2015 09:29:31 +0200 Subject: [PATCH 167/323] add as globalvar --- R/rddtools.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/rddtools.R b/R/rddtools.R index ba23950..8428d0a 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -6,7 +6,7 @@ #' @title Regression Discontinuity Design if (getRversion() >= "3.1.0") { - utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high")) + utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd")) } #' @name indh From 27440c4eb0882ae57b5f3720e4e22dfdc122a726 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2015 09:44:55 +0200 Subject: [PATCH 168/323] final things --- DESCRIPTION | 2 +- R/rddtools.R | 2 +- R/various_code.R | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 392dd9e..fe3cc17 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 0.3.0.9990 +Version: 0.4.0 Title: Toolbox for Regression Discontinuity Design (RDD) Description: Set of functions for Regression Discontinuity Design (RDD), for data visualisation, estimation and testing. diff --git a/R/rddtools.R b/R/rddtools.R index 8428d0a..49a73b3 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -6,7 +6,7 @@ #' @title Regression Discontinuity Design if (getRversion() >= "3.1.0") { - utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd")) + utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd", "quantile", "ks.test", "t.test")) } #' @name indh diff --git a/R/various_code.R b/R/various_code.R index 674f60c..6dfbc82 100644 --- a/R/various_code.R +++ b/R/various_code.R @@ -11,5 +11,3 @@ Kernel_tri <- function(X, center, bw) { Kernel_uni <- function(X, center, bw) { ifelse(abs(X - center) > bw, 0, 1) } - -.onAttach <- function(libname, pkgname) packageStartupMessage("IMPORTANT, this is an ALPHA VERSION\n many changes to the API will follow") From 956162d61799e0b37e03b196676bfa7751ca353c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2015 09:45:21 +0200 Subject: [PATCH 169/323] spell check --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index fe3cc17..3b1ba76 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: rddtools Version: 0.4.0 Title: Toolbox for Regression Discontinuity Design (RDD) -Description: Set of functions for Regression Discontinuity Design (RDD), for +Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. Authors@R: c( person("Matthieu", "Stigler", role = "aut"), From 821ff83a84ad1f1ca7fd7ee7789db44e02c9e5f1 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2015 12:17:03 +0200 Subject: [PATCH 170/323] spell check --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3b1ba76..9875f9f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: rddtools Version: 0.4.0 -Title: Toolbox for Regression Discontinuity Design (RDD) +Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. Authors@R: c( From 8cee7fad33a1fda30e212cb926b47c656de08ffb Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 4 Aug 2015 11:52:15 +0200 Subject: [PATCH 171/323] small stuff --- DESCRIPTION | 4 ++-- R/rddtools.R | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9875f9f..78fce83 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,6 +26,6 @@ Suggests: knitr, testthat License: GPL (>= 2) -URL: https://github.com/bquast/RDDtools -BugReports: https://github.com/bquast/RDDtools/issues +URL: https://github.com/bquast/rddtools +BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr diff --git a/R/rddtools.R b/R/rddtools.R index 49a73b3..e10c197 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -5,9 +5,11 @@ #' @import ggplot2 #' @title Regression Discontinuity Design -if (getRversion() >= "3.1.0") { - utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd", "quantile", "ks.test", "t.test")) -} + +utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd", "quantile", "ks.test", "t.test", "coef", "density")) +utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", "fitted", "glm", "hist", "ksmooth", +"lines", "lm", "model.frame", "model.matrix", "na.pass", "par", "pnorm", "points", "poly", +"predict", "printCoefmat", "qnorm", "qt", "rbeta", "residuals", "rnorm", "segments", "title", "var", "vcov")) #' @name indh #' @docType data From 7cef511eb61c5c55ba61f33677da2bc90a74af4e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 4 Aug 2015 11:53:06 +0200 Subject: [PATCH 172/323] title --- vignettes/morocco.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/morocco.Rmd b/vignettes/morocco.Rmd index fc37721..ebc5cf0 100644 --- a/vignettes/morocco.Rmd +++ b/vignettes/morocco.Rmd @@ -1,5 +1,5 @@ --- -title: "Vignette Title" +title: "Morocco" author: "Bastiaan Quast" date: "`r Sys.Date()`" output: rmarkdown::html_vignette From f0adb046b9f328f4d5fef448086c6bab032435da Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 5 Aug 2015 09:55:32 +0200 Subject: [PATCH 173/323] dev version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 78fce83..761a62b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 0.4.0 +Version: 0.4.0.9000 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 88efbb10682879e4d86d46149e656a85c984c0e0 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 24 Aug 2015 13:27:43 +0200 Subject: [PATCH 174/323] add badges --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ae35d7b..f5eef1b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ rddtools ======================================================== +[![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](http://cran.r-project.org/package=rddtools) +[![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.rstudio.com/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) [![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) From d741eb82c77e94b098afb1a85c3e48b33e0c7409 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 31 Aug 2015 13:42:12 +0200 Subject: [PATCH 175/323] license --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f5eef1b..4625cb3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ rddtools ======================================================== +[![License](http://img.shields.io/badge/license-GPL%30%28%3E=%202%29-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](http://cran.r-project.org/package=rddtools) [![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.rstudio.com/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) From fea7b005a4804f836075cc301f785366162183ba Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 29 Sep 2015 12:12:17 +0200 Subject: [PATCH 176/323] fix badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4625cb3..96cdd83 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ rddtools ======================================================== -[![License](http://img.shields.io/badge/license-GPL%30%28%3E=%202%29-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) +[![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](http://cran.r-project.org/package=rddtools) [![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.rstudio.com/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) From 68f69705caa10ad34f39d02037be5173d2e40b82 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 11 Nov 2015 08:30:43 +0100 Subject: [PATCH 177/323] compile using new roxygen2 --- DESCRIPTION | 3 ++- NAMESPACE | 2 +- man/STAR_MHE.Rd | 16 ++++++++-------- man/as.lm.Rd | 2 +- man/as.npregbw.Rd | 10 +++++----- man/clusterInf.Rd | 4 ++-- man/covarTest_dis.Rd | 6 +++--- man/covarTest_mean.Rd | 6 +++--- man/dens_test.Rd | 2 +- man/gen_mc_ik.Rd | 2 +- man/house.Rd | 8 +++++--- man/indh.Rd | 2 +- man/plot.rdd_data.Rd | 4 ++-- man/plotBin.Rd | 4 ++-- man/plotPlacebo.Rd | 2 +- man/plotSensi.Rd | 4 ++-- man/rdd_bw_ik.Rd | 4 ++-- man/rdd_bw_rsw.Rd | 6 +++--- man/rdd_coef.Rd | 4 ++-- man/rdd_data.Rd | 4 ++-- man/rdd_gen_reg.Rd | 7 ++++--- man/rdd_pred.Rd | 26 +++++++++++++------------- man/rdd_reg_lm.Rd | 16 ++++++++-------- man/rdd_reg_np.Rd | 4 ++-- man/rddtools.Rd | 5 +---- man/rot_bw.Rd | 2 +- man/vcovCluster.Rd | 8 +++----- man/waldci.Rd | 2 +- 28 files changed, 82 insertions(+), 83 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 761a62b..bad81a4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 0.4.0.9000 +Version: 0.4.0.9900 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. @@ -29,3 +29,4 @@ License: GPL (>= 2) URL: https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr +RoxygenNote: 5.0.0 diff --git a/NAMESPACE b/NAMESPACE index db40cad..9c0cca1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,4 @@ -# Generated by roxygen2 (4.1.1): do not edit by hand +# Generated by roxygen2: do not edit by hand S3method("[",rdd_data) S3method(as.data.frame,rdd_data) diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 7da199f..05d11ad 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -1,10 +1,10 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rddtools.R \docType{data} \name{STAR_MHE} \alias{STAR_MHE} \title{Transformation of the STAR dataset as used in Angrist and Pischke (2008)} -\format{A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, +\format{A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, all other are created by Angrist and Pischke STAT code. \describe{ \item{schidkn}{School ID in kindergarden (original variable, schoolidk in \code{\link[AER]{STAR}})} @@ -14,7 +14,7 @@ all other are created by Angrist and Pischke STAT code. \item{female, nwhite}{Various covariates (computed by A & P)} }} \source{ -Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website +Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website \url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. } \usage{ @@ -24,9 +24,9 @@ STAR_MHE Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke (2008) } \details{ -). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. -The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. -The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website +). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. +The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. +The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website (\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. } \examples{ @@ -41,10 +41,10 @@ reg_krug_gls <- lm(pscore~cs, data=STAR_MHE_means, weights=cs) coef(summary(reg_krug_gls))[2,2] } \references{ -Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' +Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May. -Angrist, A. ad Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, +Angrist, A. ad Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, Princeton University press } \seealso{ diff --git a/man/as.lm.Rd b/man/as.lm.Rd index 036e6a8..d6ca20b 100644 --- a/man/as.lm.Rd +++ b/man/as.lm.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rdd_data_methods.R \name{as.lm} \alias{as.lm} diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index 36fe879..11ed8ed 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/as.npreg.R \name{as.npregbw} \alias{as.npreg} @@ -22,9 +22,9 @@ Convert an rdd_object to a non-parametric regression \code{npreg} from package \ } \details{ This function converts an rdd_reg object into an \code{npreg} object from package \code{np} -Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one. -Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while rdd_reg -proceeds as if the kernel was univariate. A simple solution to make the multivariate kernel similar to the univariate one +Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one. +Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while rdd_reg +proceeds as if the kernel was univariate. A simple solution to make the multivariate kernel similar to the univariate one is to set the bandwidth for x and Dx to a large number, so that they converge towards a constant, and one obtains back the univariate kernel. } \examples{ @@ -41,7 +41,7 @@ is to set the bandwidth for x and Dx to a large number, so that they converge to ## Compare with result obtained with a Gaussian kernel: bw_lm <- dnorm(house_rdd$x, sd=rddtools:::getBW(reg_nonpara)) reg_nonpara_gaus <- rdd_reg_lm(rdd_object=house_rdd, w=bw_lm) - all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) + all.equal(rdd_coef(reg_nonpara_gaus),rdd_coef(reg_nonpara_np)) } \seealso{ \code{\link{as.lm}} which converts \code{rdd_reg} objects into \code{lm}. diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index ddf667d..47054b4 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clusterInf.R \name{clusterInf} \alias{clusterInf} @@ -38,7 +38,7 @@ clusterInf(reg_para, clusterVar=clusRandom) clusterInf(reg_para, clusterVar=clusRandom, type='HC') } \references{ -Wooldridge (2003) Cluster-sample methods in applied econometrics. +Wooldridge (2003) Cluster-sample methods in applied econometrics. \emph{AmericanEconomic Review}, 93, p. 133-138 } \seealso{ diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index 4db8528..d3a04a4 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/covarTests.R \name{covarTest_dis} \alias{covarTest_dis} @@ -40,8 +40,8 @@ data(house) ## Add randomly generated covariates set.seed(123) n_Lee <- nrow(house) -Z <- data.frame(z1 = rnorm(n_Lee, sd=2), - z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), +Z <- data.frame(z1 = rnorm(n_Lee, sd=2), + z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), z3 = sample(letters, size = n_Lee, replace = TRUE)) house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0) diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index 81b7697..d34b2f3 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/covarTests.R \name{covarTest_mean} \alias{covarTest_mean} @@ -43,8 +43,8 @@ data(house) ## Add randomly generated covariates set.seed(123) n_Lee <- nrow(house) -Z <- data.frame(z1 = rnorm(n_Lee, sd=2), - z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), +Z <- data.frame(z1 = rnorm(n_Lee, sd=2), + z2 = rnorm(n_Lee, mean = ifelse(house<0, 5, 8)), z3 = sample(letters, size = n_Lee, replace = TRUE)) house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0) diff --git a/man/dens_test.Rd b/man/dens_test.Rd index eb83d2a..39c690c 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dens_test.R \name{dens_test} \alias{dens_test} diff --git a/man/gen_mc_ik.Rd b/man/gen_mc_ik.Rd index 8fcd0b1..46f0833 100644 --- a/man/gen_mc_ik.Rd +++ b/man/gen_mc_ik.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gen_mc_ik.R \name{gen_mc_ik} \alias{gen_mc_ik} diff --git a/man/house.Rd b/man/house.Rd index 100ad18..bfb0fa5 100644 --- a/man/house.Rd +++ b/man/house.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rddtools.R \docType{data} \name{house} @@ -14,6 +14,8 @@ Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/re } \description{ Randomized experiments from non-random selection in U.S. House elections + +Dataset described used in Imbens and Kalyamaran (2012), and probably the same dataset used in Lee (2008), } \examples{ data(house) @@ -22,10 +24,10 @@ summary(rdd_house) plot(rdd_house) } \references{ -Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' +Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' Review of Economic Studies (2012) 79, 933-959 -Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, +Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, \emph{Journal of Econometrics}, 142, 675-697 } diff --git a/man/indh.Rd b/man/indh.Rd index baebe04..74326d9 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rddtools.R \docType{data} \name{indh} diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd index b25d3cc..c542902 100644 --- a/man/plot.rdd_data.Rd +++ b/man/plot.rdd_data.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rdd_data_methods.R \name{plot.rdd_data} \alias{plot.rdd_data} @@ -33,7 +33,7 @@ Binned plot of the forcing and outcome variable \details{ Produces a simple binned plot averaging values within each interval. The length of the intervals is specified with the argument \code{h}, specifying the whole binwidth (contrary to the usual bandwidth -argument, that gives half of the length of the kernel window. +argument, that gives half of the length of the kernel window. When no bandwidth is given, the bandwidth of Ruppert et al is used, see \code{\link{rdd_bw_rsw}}. } \examples{ diff --git a/man/plotBin.Rd b/man/plotBin.Rd index fa63c3c..e1a3603 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plotBin.R \name{plotBin} \alias{plotBin} @@ -23,7 +23,7 @@ plotBin(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, \item{type}{Whether returns the y averages, or the x frequencies} -\item{xlim,cex,main,xlab,ylab}{Usual parameters passed to plot(), see \code{\link{par}}} +\item{xlim, cex, main, xlab, ylab}{Usual parameters passed to plot(), see \code{\link{par}}} \item{\ldots}{further arguments passed to plot.} } diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index da799ea..3a1711b 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/placebo.R \name{plotPlacebo} \alias{computePlacebo} diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index c29397d..bbf105f 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plotSensi.R \name{plotSensi} \alias{plotSensi} @@ -52,7 +52,7 @@ Draw a plot showing the LATE estimates depending on multiple bandwidths data(house) house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0) -#Non-parametric estimate +#Non-parametric estimate bw_ik <- rdd_bw_ik(house_rdd) reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik) plotSensi(reg_nonpara) diff --git a/man/rdd_bw_ik.Rd b/man/rdd_bw_ik.Rd index 68a36d8..4f09caf 100644 --- a/man/rdd_bw_ik.Rd +++ b/man/rdd_bw_ik.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bw_ik.R \name{rdd_bw_ik} \alias{rdd_bw_ik} @@ -27,7 +27,7 @@ rdd_bw_ik(rd) Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> } \references{ -Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' +Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' Review of Economic Studies (2012) 79, 933-959 } \seealso{ diff --git a/man/rdd_bw_rsw.Rd b/man/rdd_bw_rsw.Rd index 6c221a9..576a15c 100644 --- a/man/rdd_bw_rsw.Rd +++ b/man/rdd_bw_rsw.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bw_rot.R \name{rdd_bw_rsw} \alias{rdd_bw_rsw} @@ -9,14 +9,14 @@ rdd_bw_rsw(object, type = c("global", "sided")) \arguments{ \item{object}{object of class rdd_data created by \code{\link{rdd_data}}} -\item{type}{Whether to choose a global bandwidth for the whole function (\code{global}) +\item{type}{Whether to choose a global bandwidth for the whole function (\code{global}) or for each side (\code{sided})} } \value{ One (or two for \code{sided}) bandwidth value. } \description{ -Uses the global bandwidth selector of Ruppert, Sheather and Wand (1995) +Uses the global bandwidth selector of Ruppert, Sheather and Wand (1995) either to the whole function, or to the functions below and above the cutpoint. } \examples{ diff --git a/man/rdd_coef.Rd b/man/rdd_coef.Rd index 298c08a..c65d682 100644 --- a/man/rdd_coef.Rd +++ b/man/rdd_coef.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rdd_coef.R \name{rdd_coef} \alias{rdd_coef} @@ -22,7 +22,7 @@ rdd_coef(object, allInfo = FALSE, allCo = FALSE, ...) \item{\ldots}{Further arguments passed to/from specific methods} } \value{ -Either a numeric value of the RDD coefficient estimate, or a data frame with the estimate, +Either a numeric value of the RDD coefficient estimate, or a data frame with the estimate, its standard value, t test and p-value and } \description{ diff --git a/man/rdd_data.Rd b/man/rdd_data.Rd index 75718ed..976dc02 100644 --- a/man/rdd_data.Rd +++ b/man/rdd_data.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rdd_data.R \name{rdd_data} \alias{rdd_data} @@ -19,7 +19,7 @@ rdd_data(y, x, covar, cutpoint, z, labels, data) \item{labels}{Additional labels to provide as list (with entries \code{x}, \code{y}, and eventually vector \code{covar}). Unused currently.} -\item{data}{A data-frame for the \code{x} and \code{y} variables. If this is provided, +\item{data}{A data-frame for the \code{x} and \code{y} variables. If this is provided, the column names can be entered directly for argument \code{x} and \code{y}} } \value{ diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd index 6b14484..2b90bae 100644 --- a/man/rdd_gen_reg.Rd +++ b/man/rdd_gen_reg.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.1.1): do not edit by hand +% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reg_gen.R \name{rdd_gen_reg} \alias{rdd_gen_reg} @@ -36,14 +36,14 @@ Compute RDD estimate allowing a locally kernel weighted version of any estimatio possibly on the range specified by bandwidth } \details{ -This function allows the user to use a custom estimating function, instead of the traditional \code{lm()}. +This function allows the user to use a custom estimating function, instead of the traditional \code{lm()}. It is assumed that the custom funciton has following behaviour: \enumerate{ \item A formula interface, together with a \code{data} argument \item A \code{weight} argument \item A coef(summary(x)) returning a data-frame containing a column Estimate } -Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rdd_coef}} +Note that for the last requirement, this can be accomodated by writing a specific \code{\link{rdd_coef}} function for the class of the object returned by \code{fun}. } \examples{ @@ -56,6 +56,7 @@ house_rdd$y <- with(house_rdd, ifelse(y Date: Wed, 11 Nov 2015 08:34:56 +0100 Subject: [PATCH 178/323] add description --- R/rddtools.R | 6 ++---- man/rddtools.Rd | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index e10c197..cf50c05 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -1,10 +1,8 @@ #' @name rddtools #' @docType package -#' @import KernSmooth -#' @import np -#' @import ggplot2 #' @title Regression Discontinuity Design - +#' @import np ggplot2 KernSmooth +#' @description Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd", "quantile", "ks.test", "t.test", "coef", "density")) utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", "fitted", "glm", "hist", "ksmooth", diff --git a/man/rddtools.Rd b/man/rddtools.Rd index 3e82cb7..15f0b6e 100644 --- a/man/rddtools.Rd +++ b/man/rddtools.Rd @@ -5,4 +5,7 @@ \alias{rddtools} \alias{rddtools-package} \title{Regression Discontinuity Design} +\description{ +Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. +} From a76d686fab0f3a8a1190abb30cbf8b076786718c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 11 Nov 2015 10:44:17 +0100 Subject: [PATCH 179/323] prepare for release --- DESCRIPTION | 2 +- NEWS | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index bad81a4..900c749 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 0.4.0.9900 +Version: 0.5.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. diff --git a/NEWS b/NEWS index 124c620..cf19385 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,10 @@ -RDDtools 0.3.0.9000 +RDDtools 0.5.0 +===================== + +* cleanup documentation + + +RDDtools 0.3.0 ===================== * development taken over by Bastiaan From 839e870e6a022ca110a69717853635a0b08ed95e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 18 Dec 2015 11:42:20 +0100 Subject: [PATCH 180/323] use CRAN version of covr package --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 72bcdc5..26001c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,13 +4,11 @@ warnings_are_errors: true env: global: - CRAN: http://cran.rstudio.com - -r_github_packages: - - jimhester/covr r_packages: - testthat - rmarkdown + - covr after_success: From e96c4521195c9942130b69e3856ba7490204784f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 18 Dec 2015 15:25:15 +0100 Subject: [PATCH 181/323] new version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 900c749..6de7191 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,4 +29,4 @@ License: GPL (>= 2) URL: https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 5.0.0 +RoxygenNote: 5.0.1 From fbaf70beb5241e883cb8fce0700e86e8717195bf Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 3 Apr 2016 16:30:38 +0200 Subject: [PATCH 182/323] Update .travis.yml --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 26001c6..b33e2eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,11 +6,9 @@ env: - CRAN: http://cran.rstudio.com r_packages: - - testthat - rmarkdown - covr - after_success: - Rscript -e 'library(covr);coveralls()' From d4eb636c743536f5361c7f5d4342cffde410cc77 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 15 May 2016 11:53:21 +0200 Subject: [PATCH 183/323] add total downloads --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 96cdd83..a897265 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ rddtools ======================================================== [![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](http://cran.r-project.org/package=rddtools) +[![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](http://cran.rstudio.com/web/packages/rddtools/index.html) [![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.rstudio.com/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) [![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) From 65cbd78ee7a6e7839694fdcd160aac13cd7f95da Mon Sep 17 00:00:00 2001 From: Paul Testa Date: Fri, 19 Aug 2016 09:33:42 -0400 Subject: [PATCH 184/323] fixing tab escape --- R/plotBin.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/plotBin.R b/R/plotBin.R index d253b00..ccfb304 100644 --- a/R/plotBin.R +++ b/R/plotBin.R @@ -61,7 +61,7 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ ## plot if (plot) { plot(mid_points_bk, as.numeric(y2), pch = 19, cex = cex, xlab = x_name, ylab = y_name, xlim = xlim, ...) - title(main = main, sub = paste("h=", round(h, 4), ",\\tn bins=", n_non0_intervs, sep = "")) + title(main = main, sub = paste("h=", round(h, 4), ",\tn bins=", n_non0_intervs, sep = "")) abline(v = cutpoint, lty = 2) } From 4b567f60efc26b5567d12c9c30ce774da525524b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 22 Sep 2016 20:39:08 +0200 Subject: [PATCH 185/323] add website --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6de7191..35b0954 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Suggests: knitr, testthat License: GPL (>= 2) -URL: https://github.com/bquast/rddtools +URL: http://qua.st/rnn, https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr RoxygenNote: 5.0.1 From 75c85ba3f59ed02aa01e8ef4c666539c0ffa3ca4 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 22 Sep 2016 22:50:13 +0200 Subject: [PATCH 186/323] add citation --- inst/CITATION | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 inst/CITATION diff --git a/inst/CITATION b/inst/CITATION new file mode 100644 index 0000000..4c7fb14 --- /dev/null +++ b/inst/CITATION @@ -0,0 +1,16 @@ +bibentry(bibtype = "Article", + title = "rddtools: A toolbox for regression discontinuity in R", + author = c(person("Matthieu", "Stigler"), + person("Bastiaan", "Quast") ), + organization = "The Graduate Institute", + address = "Maison de la paix, Geneva, Switzerland", + year = "2016", + url = "http://qua.st/rddtools", + textVersion = "Stigler, M. and B. Quast, B (2015). rddtools: A toolbox for regression discontinuity in R. ", + + + mheader = "To cite rddtools in publications please use:", + + mfooter = "We have invested a lot of time and effort in creating rddtools, please cite it when using it for data analysis. See also 'citation()' for citing R." + +) From f0332954b2e2dee6a0ac21b80e516eb0f1c7767d Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 12:03:29 -0800 Subject: [PATCH 187/323] Just commenting code --- R/plotBin.R | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/R/plotBin.R b/R/plotBin.R index ccfb304..6f8a842 100644 --- a/R/plotBin.R +++ b/R/plotBin.R @@ -32,9 +32,12 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ if (!is.null(nbins)) h <- diff(xlim)/nbins - K0 <- ceiling((cutpoint - min_x)/h) # Number of cells on left - K1 <- ceiling((cutpoint + max_x)/h) # Number of cells on right + ## Number of bins + K0 <- ceiling((cutpoint - min_x)/h) # Number of bins on left + K1 <- ceiling((cutpoint + max_x)/h) # Number of bins on right K <- K0 + K1 + + ## correction in case we had nbins if (!is.null(nbins) && K != nbins) { ranges <- c(cutpoint - min_x, cutpoint + max_x) if (which.min(ranges) == 1) { @@ -45,6 +48,7 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ K <- K0 + K1 } + ## get bins midpoints, breaks b_k <- cutpoint - (K0 - c(1:K) + 1) * h # Lee and Lemieux (2010) p. 308 mid_points_bk <- b_k + h/2 n_bins <- length(mid_points_bk) @@ -55,7 +59,8 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ table_intervs <- table(intervs) n_non0_intervs <- sum(table_intervs != 0) - y2 <- switch(type, value = tapply(y, intervs, mean, na.rm = TRUE), number = table_intervs) + y2 <- switch(type, value = tapply(y, intervs, mean, na.rm = TRUE), + number = table_intervs) ## plot From bb09757e2b2b01afbf3f716d581a4143822d4f26 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 15:37:25 -0800 Subject: [PATCH 188/323] Roxygen auto update --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 35b0954..aeb4353 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,4 +29,4 @@ License: GPL (>= 2) URL: http://qua.st/rnn, https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 5.0.1 +RoxygenNote: 6.0.1 From f22f75134209eea8820135febefc1641141d7efb Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 15:38:19 -0800 Subject: [PATCH 189/323] CITATION: change bibstyle after R CMD check complains --- inst/CITATION | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inst/CITATION b/inst/CITATION index 4c7fb14..541481c 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,9 +1,9 @@ -bibentry(bibtype = "Article", +bibentry(bibtype = "TechReport", title = "rddtools: A toolbox for regression discontinuity in R", author = c(person("Matthieu", "Stigler"), person("Bastiaan", "Quast") ), - organization = "The Graduate Institute", - address = "Maison de la paix, Geneva, Switzerland", + institution = "The Graduate Institute", + address = "Maison de la paix, Geneva, Switzerland", year = "2016", url = "http://qua.st/rddtools", textVersion = "Stigler, M. and B. Quast, B (2015). rddtools: A toolbox for regression discontinuity in R. ", From b2594368481778e52f336a537a045e8c5b152eee Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 15:39:18 -0800 Subject: [PATCH 190/323] PlotBin: accepts now two values for left/right h or nbins --- NAMESPACE | 1 + R/plotBin.R | 92 ++++++++++++++++++++++++++++++++------------ R/rdd_data_methods.R | 14 +++---- R/reg_lm.R | 2 +- R/reg_np.R | 2 +- 5 files changed, 77 insertions(+), 34 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 9c0cca1..3a16253 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -67,3 +67,4 @@ importFrom(AER,ivreg) importFrom(locpol,gaussK) importFrom(locpol,locpol) importFrom(stats,getCall) +importFrom(utils,head) diff --git a/R/plotBin.R b/R/plotBin.R index 6f8a842..38de8e4 100644 --- a/R/plotBin.R +++ b/R/plotBin.R @@ -13,10 +13,13 @@ #' @param \ldots further arguments passed to plot. #' @return Returns silently values #' @references McCrary, Justin. +#' @importFrom utils head -plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, type = c("value", "number"), xlim = range(x, na.rm = TRUE), +plotBin <- function(x, y, h = NULL, nbins = NULL, cutpoint = 0, plot = TRUE, type = c("value", "number"), xlim = range(x, na.rm = TRUE), cex = 0.9, main = NULL, xlab, ylab, ...) { + + if(sum(c(is.null(h), is.null(nbins)))!=1) stop("Should provide only one of `h`` or `nbins`") type <- match.arg(type) x_name <- if (missing(xlab)) @@ -29,33 +32,52 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ min_x <- min(xlim) max_x <- max(xlim) - if (!is.null(nbins)) - h <- diff(xlim)/nbins + ## set h given nBins + if (!is.null(nbins)) { + if(length(nbins)==1){ + h_both <- diff(xlim)/nbins + + ## compute actual number of bins + K0 <- (cutpoint - min_x)/h_both + K1 <- (max_x -cutpoint )/h_both + + ## round number of bins + nbins <- roundEqual(c(K0, K1)) + } + + ## compute corresponding h_L + K0 <- nbins[1] + K1 <- nbins[2] + h_L <- c(cutpoint - min_x)/K0 + h_R <- c(max_x -cutpoint)/K1 + + } else if(!is.null(h)) { + if(length(h)==1){ + h_L <- h_R <- h + } else { + h_L <- h[1] + h_R <- h[2] + } + K0 <- ceiling((cutpoint - min_x)/h_L) # Number of bins on left + K1 <- ceiling((cutpoint + max_x)/h_R) # Number of bins on right + } - ## Number of bins - K0 <- ceiling((cutpoint - min_x)/h) # Number of bins on left - K1 <- ceiling((cutpoint + max_x)/h) # Number of bins on right + ## K <- K0 + K1 - ## correction in case we had nbins - if (!is.null(nbins) && K != nbins) { - ranges <- c(cutpoint - min_x, cutpoint + max_x) - if (which.min(ranges) == 1) { - K0 <- K0 - 1 - } else { - K1 <- K1 - 1 - } - K <- K0 + K1 - } + ## get bins midpoints, breaks, inspired by # Lee and Lemieux (2010) p. 308 + breaks_L <- cutpoint - (K0 - c(1:K0) + 1) * h_L + breaks_H <- cutpoint + c(0:K1) * h_R + breaks <- c(breaks_L, breaks_H) - ## get bins midpoints, breaks - b_k <- cutpoint - (K0 - c(1:K) + 1) * h # Lee and Lemieux (2010) p. 308 - mid_points_bk <- b_k + h/2 - n_bins <- length(mid_points_bk) - brk <- c(b_k, cutpoint + (K1 + 2) * h) + # mid_points + mid_points_bk <- head(breaks, -1)+diff(breaks)/2 ## compute output (mean of count) - intervs <- cut(x, breaks = brk, include.lowest = TRUE) + intervs <- cut(x, breaks = breaks, include.lowest = TRUE) + if(any(is.na(intervs))) warning("NA intervs...") + + ## table_intervs <- table(intervs) n_non0_intervs <- sum(table_intervs != 0) @@ -65,8 +87,9 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ ## plot if (plot) { + sub <- paste("h=", paste(round(c(h_L, h_R), 4),collapse="/"), ",\t\tn bins=", K, " (", K0, "/", K1,")", sep = "") plot(mid_points_bk, as.numeric(y2), pch = 19, cex = cex, xlab = x_name, ylab = y_name, xlim = xlim, ...) - title(main = main, sub = paste("h=", round(h, 4), ",\tn bins=", n_non0_intervs, sep = "")) + title(main = main, sub = sub) abline(v = cutpoint, lty = 2) } @@ -77,4 +100,25 @@ plotBin <- function(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, typ - +## Small utility funciton +roundEqual <- function(x){ + if(isTRUE(all.equal(x[1], x[2]))) { + r <- c(floor(x[1]), ceiling(x[2])) + } else { + r <- round(x) + } + r +} + + +if(FALSE){ + xt <- rnorm(100) + yt <- 1.2*x+rnorm(100) + plotBin(x=xt, y=yt) + plotBin(x=xt, y=yt, h=.05) + plotBin(x=xt, y=yt, h=c(0.05, 0.06)) + + pl_nb1 <- plotBin(x=xt, y=yt, nbins=25) + pl_nb2 <- plotBin(x=xt, y=yt, nbins=c(12, 13)) + pl_nb2 +} diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R index 8164f1d..6ecc813 100644 --- a/R/rdd_data_methods.R +++ b/R/rdd_data_methods.R @@ -51,7 +51,7 @@ summary.rdd_data <- function(object, ...) { ### PLOT method -plot.rdd_data <- function(x, h, nbins = NULL, xlim = range(object$x, na.rm = TRUE), cex = 0.7, nplot = 1, device = c("base", +plot.rdd_data <- function(x, h=NULL, nbins = NULL, xlim = range(object$x, na.rm = TRUE), cex = 0.7, nplot = 1, device = c("base", "ggplot"), ...) { object <- x @@ -59,7 +59,7 @@ plot.rdd_data <- function(x, h, nbins = NULL, xlim = range(object$x, na.rm = TRU device <- match.arg(device) ## bandwidth: use Ruppert, Sheather and Wand (KernSmooth:::dpill) - if (missing(h) & is.null(nbins)) { + if (is.null(h) & is.null(nbins)) { if (!all(xlim == range(object$x, na.rm = TRUE))) { object <- subset(object, x > min(xlim) & x < max(xlim)) } @@ -69,17 +69,15 @@ plot.rdd_data <- function(x, h, nbins = NULL, xlim = range(object$x, na.rm = TRU } else { se <- seq(from = 1 - floor(nplot/2) * 0.2, to = 1 + floor(nplot/2) * 0.2, by = 0.2) } - hs <- if (nplot == 1) - h else se * h - } else if (!missing(h) & is.null(nbins)) { + hs <- ifelse(nplot == 1, h, se * h) + } else if (!is.null(h) & is.null(nbins)) { if (length(h) == 1) { if (is_even(nplot)) { se <- seq(from = 1 - (sum(1:nplot < (nplot/2))) * 0.2, to = 1 + (sum(1:nplot > (nplot/2))) * 0.2, by = 0.2) } else { se <- seq(from = 1 - floor(nplot/2) * 0.2, to = 1 + floor(nplot/2) * 0.2, by = 0.2) } - hs <- if (nplot == 1) - h else se * h + hs <- ifelse(nplot == 1, h, se * h) } else { if (length(h == nplot)) { hs <- h @@ -88,7 +86,7 @@ plot.rdd_data <- function(x, h, nbins = NULL, xlim = range(object$x, na.rm = TRU } } } else if (!is.null(nbins)) { - hs <- rep(0.05, nplot) + hs <- NULL if (length(nbins) != nplot) { stop("Length of nbins should be equal to nplot (", nplot, ")") } diff --git a/R/reg_lm.R b/R/reg_lm.R index f92ae2e..e2b3034 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -146,6 +146,6 @@ plot.rdd_reg_lm <- function(x, ...) { pred <- data.frame(x = dat$x, y = fitted(x))[subw, ] ## plot - plotBin(dat$x, dat$y, ...) + plotBin(dat$x, dat$y, h=0.05, cutpoint=getCutpoint(x), ...) lines(pred[order(pred$x), ]) } diff --git a/R/reg_np.R b/R/reg_np.R index 7ef2b28..a61eee8 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -192,7 +192,7 @@ plot.rdd_reg_np <- function(x, binwidth, chart = c("locpoly", "np"), ...) { pred_right <- predict(np_reg_right, newdata = newDat_right, se.fit = TRUE) } ## plot - plotBin(dat$x, dat$y, h = binwidth, ...) + plotBin(dat$x, dat$y, h = binwidth, cutpoint=cutpoint, ...) if (chart == "locpoly") { lines(llp_left$x, llp_left$y) lines(llp_right$x, llp_right$y) From 266529effeaa00881545a83d1184f08ae6dfd41d Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 15:40:01 -0800 Subject: [PATCH 191/323] Rd files: cosmectic changes from roxygen --- man/STAR_MHE.Rd | 1 - man/as.lm.Rd | 1 - man/as.npregbw.Rd | 3 +-- man/clusterInf.Rd | 1 - man/covarTest_dis.Rd | 7 +++---- man/covarTest_mean.Rd | 7 +++---- man/dens_test.Rd | 1 - man/gen_mc_ik.Rd | 1 - man/house.Rd | 1 - man/indh.Rd | 1 - man/plot.rdd_data.Rd | 5 ++--- man/plotBin.Rd | 3 +-- man/plotPlacebo.Rd | 3 +-- man/plotSensi.Rd | 3 +-- man/rdd_bw_ik.Rd | 7 +++---- man/rdd_bw_rsw.Rd | 1 - man/rdd_coef.Rd | 1 - man/rdd_data.Rd | 1 - man/rdd_gen_reg.Rd | 1 - man/rdd_pred.Rd | 1 - man/rdd_reg_lm.Rd | 1 - man/rdd_reg_np.Rd | 1 - man/rddtools.Rd | 1 - man/rot_bw.Rd | 1 - man/vcovCluster.Rd | 7 +++---- man/waldci.Rd | 1 - 26 files changed, 18 insertions(+), 44 deletions(-) diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 05d11ad..a1e3f25 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -50,4 +50,3 @@ Princeton University press \seealso{ \code{\link[AER]{STAR}} for the original dataset. } - diff --git a/man/as.lm.Rd b/man/as.lm.Rd index d6ca20b..ec2b19d 100644 --- a/man/as.lm.Rd +++ b/man/as.lm.Rd @@ -26,4 +26,3 @@ plot(reg_para_lm, which=4) \seealso{ \code{\link{as.npreg}} which converts \code{rdd_reg} objects into \code{npreg} from package \code{np}. } - diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index 11ed8ed..bb60c79 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -1,8 +1,8 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/as.npreg.R \name{as.npregbw} -\alias{as.npreg} \alias{as.npregbw} +\alias{as.npreg} \title{Convert an rdd_reg object to a \code{npreg} object} \usage{ as.npregbw(x, ...) @@ -46,4 +46,3 @@ is to set the bandwidth for x and Dx to a large number, so that they converge to \seealso{ \code{\link{as.lm}} which converts \code{rdd_reg} objects into \code{lm}. } - diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index 47054b4..7a730e2 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -44,4 +44,3 @@ Wooldridge (2003) Cluster-sample methods in applied econometrics. \seealso{ \code{\link{vcovCluster}}, which implements the cluster-robust covariance matrix estimator used by \code{cluserInf} } - diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index d3a04a4..a90d5e0 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -54,10 +54,9 @@ covarTest_mean(house_rdd_Z, bw=0.3) reg_nonpara <- rdd_reg_np(rdd_object=house_rdd_Z) covarTest_dis(reg_nonpara) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} \seealso{ \code{\link{covarTest_mean}} for the t-test of equality of means } - +\author{ +Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> +} diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index d34b2f3..6d72e98 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -58,10 +58,9 @@ covarTest_dis(house_rdd_Z, bw=0.3) reg_nonpara <- rdd_reg_np(rdd_object=house_rdd_Z) covarTest_mean(reg_nonpara) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} \seealso{ \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution } - +\author{ +Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> +} diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 39c690c..4537fb5 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -25,4 +25,3 @@ data(house) house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0) dens_test(house_rdd) } - diff --git a/man/gen_mc_ik.Rd b/man/gen_mc_ik.Rd index 46f0833..521c2af 100644 --- a/man/gen_mc_ik.Rd +++ b/man/gen_mc_ik.Rd @@ -49,4 +49,3 @@ plotCu(version=3) plotCu(version=4) layout(matrix(1)) } - diff --git a/man/house.Rd b/man/house.Rd index bfb0fa5..fc96bf1 100644 --- a/man/house.Rd +++ b/man/house.Rd @@ -30,4 +30,3 @@ Review of Economic Studies (2012) 79, 933-959 Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, \emph{Journal of Econometrics}, 142, 675-697 } - diff --git a/man/indh.Rd b/man/indh.Rd index 74326d9..367ba70 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -28,4 +28,3 @@ plot(reg_np_indh) \references{ Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' } - diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd index c542902..b9eee25 100644 --- a/man/plot.rdd_data.Rd +++ b/man/plot.rdd_data.Rd @@ -4,8 +4,8 @@ \alias{plot.rdd_data} \title{Plot rdd_data} \usage{ -\method{plot}{rdd_data}(x, h, nbins = NULL, xlim = range(object$x, na.rm = - TRUE), cex = 0.7, nplot = 1, device = c("base", "ggplot"), ...) +\method{plot}{rdd_data}(x, h = NULL, nbins = NULL, xlim = range(object$x, + na.rm = TRUE), cex = 0.7, nplot = 1, device = c("base", "ggplot"), ...) } \arguments{ \item{x}{Object of class rdd_data} @@ -56,4 +56,3 @@ plot(house_rdd, nbins=21) \author{ Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> } - diff --git a/man/plotBin.Rd b/man/plotBin.Rd index e1a3603..070e880 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -4,7 +4,7 @@ \alias{plotBin} \title{Bin plotting} \usage{ -plotBin(x, y, h = 0.05, nbins = NULL, cutpoint = 0, plot = TRUE, +plotBin(x, y, h = NULL, nbins = NULL, cutpoint = 0, plot = TRUE, type = c("value", "number"), xlim = range(x, na.rm = TRUE), cex = 0.9, main = NULL, xlab, ylab, ...) } @@ -36,4 +36,3 @@ Do a 'scatterplot bin smoothing' \references{ McCrary, Justin. } - diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index 3a1711b..5b52e77 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/placebo.R \name{plotPlacebo} -\alias{computePlacebo} \alias{plotPlacebo} \alias{plotPlacebo.rdd_reg} \alias{plotPlaceboDens} \alias{plotPlaceboDens.rdd_reg} +\alias{computePlacebo} \title{Draw a (density) plot of placebo tests} \usage{ plotPlacebo(object, device = c("ggplot", "base"), ...) @@ -67,4 +67,3 @@ plotPlacebo(reg_nonpara_lminf, vcov. = vc) \author{ Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> } - diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index bbf105f..5c402fb 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -2,8 +2,8 @@ % Please edit documentation in R/plotSensi.R \name{plotSensi} \alias{plotSensi} -\alias{plotSensi.rdd_reg_lm} \alias{plotSensi.rdd_reg_np} +\alias{plotSensi.rdd_reg_lm} \title{Plot the sensitivity to the bandwidth} \usage{ plotSensi(rdd_regobject, from, to, by = 0.01, level = 0.95, @@ -66,4 +66,3 @@ plotSensi(reg_para_ik, type='facet') \author{ Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> } - diff --git a/man/rdd_bw_ik.Rd b/man/rdd_bw_ik.Rd index 4f09caf..3847201 100644 --- a/man/rdd_bw_ik.Rd +++ b/man/rdd_bw_ik.Rd @@ -23,9 +23,6 @@ data(house) rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) rdd_bw_ik(rd) } -\author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> -} \references{ Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' Review of Economic Studies (2012) 79, 933-959 @@ -33,4 +30,6 @@ Review of Economic Studies (2012) 79, 933-959 \seealso{ \code{\link{rdd_bw_rsw}} Global bandwidth selector of Ruppert, Sheather and Wand (1995) } - +\author{ +Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> +} diff --git a/man/rdd_bw_rsw.Rd b/man/rdd_bw_rsw.Rd index 576a15c..feb71f5 100644 --- a/man/rdd_bw_rsw.Rd +++ b/man/rdd_bw_rsw.Rd @@ -30,4 +30,3 @@ See \code{\link[KernSmooth]{dpill}} \seealso{ \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) } - diff --git a/man/rdd_coef.Rd b/man/rdd_coef.Rd index c65d682..e7a0e9c 100644 --- a/man/rdd_coef.Rd +++ b/man/rdd_coef.Rd @@ -28,4 +28,3 @@ its standard value, t test and p-value and \description{ Function to access the RDD coefficient in the various regressions } - diff --git a/man/rdd_data.Rd b/man/rdd_data.Rd index 976dc02..47febb0 100644 --- a/man/rdd_data.Rd +++ b/man/rdd_data.Rd @@ -43,4 +43,3 @@ plot(rd) \author{ Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> } - diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd index 2b90bae..fe96cfd 100644 --- a/man/rdd_gen_reg.Rd +++ b/man/rdd_gen_reg.Rd @@ -61,4 +61,3 @@ summary(reg_bin_glm) \references{ TODO } - diff --git a/man/rdd_pred.Rd b/man/rdd_pred.Rd index 2692f40..9bf2255 100644 --- a/man/rdd_pred.Rd +++ b/man/rdd_pred.Rd @@ -75,4 +75,3 @@ rdd_pred(reg_para_cov, covdata=data.frame(z1=0.5)) \references{ Froehlich (2007) Regression discontinuity design with covariates, IZA discussion paper 3024 } - diff --git a/man/rdd_reg_lm.Rd b/man/rdd_reg_lm.Rd index d5566d0..fffe367 100644 --- a/man/rdd_reg_lm.Rd +++ b/man/rdd_reg_lm.Rd @@ -71,4 +71,3 @@ reg_para_ik <- rdd_reg_lm(rdd_object=house_rdd, bw=bw_ik, order=4) reg_para_ik plot(reg_para_ik) } - diff --git a/man/rdd_reg_np.Rd b/man/rdd_reg_np.Rd index 42875b1..e3451e0 100644 --- a/man/rdd_reg_np.Rd +++ b/man/rdd_reg_np.Rd @@ -44,4 +44,3 @@ TODO \seealso{ \code{\link{rdd_bw_ik}} Bandwidth selection using the plug-in bandwidth of Imbens and Kalyanaraman (2012) } - diff --git a/man/rddtools.Rd b/man/rddtools.Rd index 15f0b6e..095916f 100644 --- a/man/rddtools.Rd +++ b/man/rddtools.Rd @@ -8,4 +8,3 @@ \description{ Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. } - diff --git a/man/rot_bw.Rd b/man/rot_bw.Rd index d338156..97fdfc2 100644 --- a/man/rot_bw.Rd +++ b/man/rot_bw.Rd @@ -18,4 +18,3 @@ implements dpill \references{ McCrary, Justin. (2008) 'Manipulation of the running variable in the regression discontinuity design: A density test,' \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} } - diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index d192b6d..9040791 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -36,9 +36,6 @@ coeftest(reg_krug,vcov.=vcovHC(reg_krug, 'HC1'))[2,2] coeftest(reg_krug,vcov.=vcovCluster(reg_krug, clusterVar=STAR_MHE$classid))[2,2] } } -\author{ -Mahmood Arai, see \url{http://people.su.se/~ma/econometrics.html} -} \references{ Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway Clustering, \emph{Journal of Business and Economic Statistics}, vol. 29(2), pages 238-249. @@ -50,4 +47,6 @@ Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http \seealso{ \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. } - +\author{ +Mahmood Arai, see \url{http://people.su.se/~ma/econometrics.html} +} diff --git a/man/waldci.Rd b/man/waldci.Rd index 7bc1359..f0e9a1c 100644 --- a/man/waldci.Rd +++ b/man/waldci.Rd @@ -22,4 +22,3 @@ waldci(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) \description{ Version of vcov allowing for confint } - From c0cccdf537e0e3336470edebd0a2a633a4d9def5 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 17:04:25 -0800 Subject: [PATCH 192/323] Add new rdd_bw_cct calonico et al bandwidth, import now form rdrobust --- DESCRIPTION | 3 ++- NAMESPACE | 3 +++ R/bw_cct.R | 39 +++++++++++++++++++++++++++++++++++++++ R/rddtools.R | 2 +- man/rdd_bw_cct.Rd | 41 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 R/bw_cct.R create mode 100644 man/rdd_bw_cct.Rd diff --git a/DESCRIPTION b/DESCRIPTION index aeb4353..4c5e725 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -16,7 +16,8 @@ Imports: lmtest, Formula, locpol, - methods + methods, + rdrobust Depends: AER, np diff --git a/NAMESPACE b/NAMESPACE index 3a16253..0cfde24 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -44,6 +44,7 @@ export(gen_mc_ik) export(plotPlacebo) export(plotPlaceboDens) export(plotSensi) +export(rdd_bw_cct) export(rdd_bw_ik) export(rdd_bw_rsw) export(rdd_coef) @@ -62,9 +63,11 @@ import(lmtest) import(methods) import(np) import(rdd) +import(rdrobust) import(sandwich) importFrom(AER,ivreg) importFrom(locpol,gaussK) importFrom(locpol,locpol) +importFrom(rdrobust,rdbwselect) importFrom(stats,getCall) importFrom(utils,head) diff --git a/R/bw_cct.R b/R/bw_cct.R new file mode 100644 index 0000000..00d8486 --- /dev/null +++ b/R/bw_cct.R @@ -0,0 +1,39 @@ +#' Imbens-Kalyanaraman Optimal Bandwidth Calculation +#' +#' Simple wrapper for the Calonico-Cattaneo-Titiunik bandwidth function \code{\link[rdrobust]{rdbwselect}}. +#' +#' @param rdd_object of class rdd_data created by \code{\link{rdd_data}} +#' @param kernel The type of kernel used: either \code{Triangular}, \code{Uniform} or \code{Epanechnikov}. +#' @param method The type of method used. See +#' @param \ldots further arguments passed to \code{\link[rdrobust]{rdbwselect}}. +#' @return See documentation of \code{\link[rdrobust]{rdbwselect}} +#' @references Calonico, S., M. D. Cattaneo, and R. Titiunik. 2014a. Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs. Econometrica 82(6): 2295-2326. +#' \url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2014_ECMA.pdf}. +#' @seealso \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) +#' @author Original code written by Calonico, Cattaneo, Farrell and Titiuni, see \code{\link[rdrobust]{rdbwselect}} +#' @importFrom rdrobust rdbwselect +#' @export +#' @examples +#' data(house) +#' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) +#' rdd_bw_cct(rd) +#' + + + +rdd_bw_cct <- function(rdd_object, + method=c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", "cerrd", "certwo", "cersum", "cercomb1"), + kernel = c("Triangular", "Uniform", "Epanechnikov"),...) { + + kernel <- tolower(match.arg(kernel)) + method <- match.arg(method) + + checkIsRDD(rdd_object) + + res <- rdbwselect(y=rdd_object$y, x=rdd_object$x, + c = getCutpoint(rdd_object), + kernel = "tri", + bwselect = method, + ...) + return(res) +} diff --git a/R/rddtools.R b/R/rddtools.R index cf50c05..66b0e1b 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -1,7 +1,7 @@ #' @name rddtools #' @docType package #' @title Regression Discontinuity Design -#' @import np ggplot2 KernSmooth +#' @import np ggplot2 KernSmooth rdrobust #' @description Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd", "quantile", "ks.test", "t.test", "coef", "density")) diff --git a/man/rdd_bw_cct.Rd b/man/rdd_bw_cct.Rd new file mode 100644 index 0000000..f43747c --- /dev/null +++ b/man/rdd_bw_cct.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bw_cct.R +\name{rdd_bw_cct} +\alias{rdd_bw_cct} +\title{Imbens-Kalyanaraman Optimal Bandwidth Calculation} +\usage{ +rdd_bw_cct(rdd_object, method = c("mserd", "msetwo", "msesum", "msecomb1", + "msecomb2", "cerrd", "certwo", "cersum", "cercomb1"), + kernel = c("Triangular", "Uniform", "Epanechnikov"), ...) +} +\arguments{ +\item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}} + +\item{method}{The type of method used. See} + +\item{kernel}{The type of kernel used: either \code{Triangular}, \code{Uniform} or \code{Epanechnikov}.} + +\item{\ldots}{further arguments passed to \code{\link[rdrobust]{rdbwselect}}.} +} +\value{ +See documentation of \code{\link[rdrobust]{rdbwselect}} +} +\description{ +Simple wrapper for the Calonico-Cattaneo-Titiunik bandwidth function \code{\link[rdrobust]{rdbwselect}}. +} +\examples{ +data(house) +rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) +rdd_bw_cct(rd) + +} +\references{ +Calonico, S., M. D. Cattaneo, and R. Titiunik. 2014a. Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs. Econometrica 82(6): 2295-2326. +\url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2014_ECMA.pdf}. +} +\seealso{ +\code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) +} +\author{ +Original code written by Calonico, Cattaneo, Farrell and Titiuni, see \code{\link[rdrobust]{rdbwselect}} +} From 7464d0d47bc12d2c38f043aa86b8dfd15247cdda Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 18:45:32 -0800 Subject: [PATCH 193/323] Add new wrapper for CCT plot --- NAMESPACE | 4 ++- R/bw_cct.R | 13 +++---- R/bw_cct_plot.R | 41 ++++++++++++++++++++++ man/{rdd_bw_cct.Rd => rdd_bw_cct_estim.Rd} | 15 ++++---- man/rdd_bw_cct_plot.Rd | 40 +++++++++++++++++++++ 5 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 R/bw_cct_plot.R rename man/{rdd_bw_cct.Rd => rdd_bw_cct_estim.Rd} (72%) create mode 100644 man/rdd_bw_cct_plot.Rd diff --git a/NAMESPACE b/NAMESPACE index 0cfde24..3717789 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -44,7 +44,8 @@ export(gen_mc_ik) export(plotPlacebo) export(plotPlaceboDens) export(plotSensi) -export(rdd_bw_cct) +export(rdd_bw_cct_estim) +export(rdd_bw_cct_plot) export(rdd_bw_ik) export(rdd_bw_rsw) export(rdd_coef) @@ -69,5 +70,6 @@ importFrom(AER,ivreg) importFrom(locpol,gaussK) importFrom(locpol,locpol) importFrom(rdrobust,rdbwselect) +importFrom(rdrobust,rdplot) importFrom(stats,getCall) importFrom(utils,head) diff --git a/R/bw_cct.R b/R/bw_cct.R index 00d8486..396f2df 100644 --- a/R/bw_cct.R +++ b/R/bw_cct.R @@ -1,6 +1,7 @@ -#' Imbens-Kalyanaraman Optimal Bandwidth Calculation +#' Bandwidth selection for Regression Discontinuity estimators, CTT 2014 #' -#' Simple wrapper for the Calonico-Cattaneo-Titiunik bandwidth function \code{\link[rdrobust]{rdbwselect}}. +#' Simple wrapper of the Calonico-Cattaneo-Titiunik (2014) bandwidth selection procedures +#' for RDD estimators \code{\link[rdrobust]{rdbwselect}}. #' #' @param rdd_object of class rdd_data created by \code{\link{rdd_data}} #' @param kernel The type of kernel used: either \code{Triangular}, \code{Uniform} or \code{Epanechnikov}. @@ -16,21 +17,21 @@ #' @examples #' data(house) #' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) -#' rdd_bw_cct(rd) +#' rdd_bw_cct_estim(rd) #' -rdd_bw_cct <- function(rdd_object, +rdd_bw_cct_estim <- function(rdd_object, method=c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", "cerrd", "certwo", "cersum", "cercomb1"), - kernel = c("Triangular", "Uniform", "Epanechnikov"),...) { + kernel = c("Triangular", "Uniform", "Epanechnikov"), ...) { kernel <- tolower(match.arg(kernel)) method <- match.arg(method) checkIsRDD(rdd_object) - res <- rdbwselect(y=rdd_object$y, x=rdd_object$x, + res <- rdrobust::rdbwselect(y=rdd_object$y, x=rdd_object$x, c = getCutpoint(rdd_object), kernel = "tri", bwselect = method, diff --git a/R/bw_cct_plot.R b/R/bw_cct_plot.R new file mode 100644 index 0000000..1badc13 --- /dev/null +++ b/R/bw_cct_plot.R @@ -0,0 +1,41 @@ +#' Bandwidth selection for Regression Discontinuity visualisation, CTT 2015 +#' +#' Simple wrapper of the Calonico-Cattaneo-Titiunik (2015) bandwidth selection procedures +#' for RDD visualisation \code{\link[rdrobust]{rdplot}}. +#' +#' @param rdd_object of class rdd_data created by \code{\link{rdd_data}} +#' @param method The type of method used. See \code{\link[rdrobust]{rdplot}}. +#' Default is \code{esmv}, the variance mimicking evenly-spaced method. +#' @param \ldots further arguments passed to \code{\link[rdrobust]{rdplot}}. +#' @return See documentation of \code{\link[rdrobust]{rdplot}} +#' @references Calonico, S., M. D. Cattaneo, and R. Titiunik. 2015a. Optimal Data-Driven Regression Discontinuity Plots. Journal of the American Statistical Association 110(512): 1753-1769. +#' \url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2015_JASA.pdf}. +#' @seealso \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) +#' @author Original code written by Calonico, Cattaneo, Farrell and Titiuni, see \code{\link[rdrobust]{rdplot}} +#' @importFrom rdrobust rdplot +#' @export +#' @examples +#' data(house) +#' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) +#' rdd_bw_cct_plot(rd) +#' + + +rdd_bw_cct_plot <- function(rdd_object, method=c("esmv", "es", "espr", "esmvpr", "qs", "qspr", "qsmv", "qsmvpr"), ...) { + method <- match.arg(method) + checkIsRDD(rdd_object) + + rdp <- rdrobust::rdplot(y=rdd_object$y, x=rdd_object$x, + c = getCutpoint(rdd_object), hide=TRUE, + ...) + rdp +} + + +if(FALSE){ + # data(house) + rd <- rdd_data(x=x, y=y, data=house, cutpoint=0) + + rdd_bw_cct_plot(rd, plot=FALSE) + +} diff --git a/man/rdd_bw_cct.Rd b/man/rdd_bw_cct_estim.Rd similarity index 72% rename from man/rdd_bw_cct.Rd rename to man/rdd_bw_cct_estim.Rd index f43747c..d95cc7d 100644 --- a/man/rdd_bw_cct.Rd +++ b/man/rdd_bw_cct_estim.Rd @@ -1,11 +1,11 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/bw_cct.R -\name{rdd_bw_cct} -\alias{rdd_bw_cct} -\title{Imbens-Kalyanaraman Optimal Bandwidth Calculation} +\name{rdd_bw_cct_estim} +\alias{rdd_bw_cct_estim} +\title{Bandwidth selection for Regression Discontinuity estimators, CTT 2014} \usage{ -rdd_bw_cct(rdd_object, method = c("mserd", "msetwo", "msesum", "msecomb1", - "msecomb2", "cerrd", "certwo", "cersum", "cercomb1"), +rdd_bw_cct_estim(rdd_object, method = c("mserd", "msetwo", "msesum", + "msecomb1", "msecomb2", "cerrd", "certwo", "cersum", "cercomb1"), kernel = c("Triangular", "Uniform", "Epanechnikov"), ...) } \arguments{ @@ -21,12 +21,13 @@ rdd_bw_cct(rdd_object, method = c("mserd", "msetwo", "msesum", "msecomb1", See documentation of \code{\link[rdrobust]{rdbwselect}} } \description{ -Simple wrapper for the Calonico-Cattaneo-Titiunik bandwidth function \code{\link[rdrobust]{rdbwselect}}. +Simple wrapper of the Calonico-Cattaneo-Titiunik (2014) bandwidth selection procedures +for RDD estimators \code{\link[rdrobust]{rdbwselect}}. } \examples{ data(house) rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) -rdd_bw_cct(rd) +rdd_bw_cct_estim(rd) } \references{ diff --git a/man/rdd_bw_cct_plot.Rd b/man/rdd_bw_cct_plot.Rd new file mode 100644 index 0000000..2e2675c --- /dev/null +++ b/man/rdd_bw_cct_plot.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bw_cct_plot.R +\name{rdd_bw_cct_plot} +\alias{rdd_bw_cct_plot} +\title{Bandwidth selection for Regression Discontinuity visualisation, CTT 2015} +\usage{ +rdd_bw_cct_plot(rdd_object, method = c("esmv", "es", "espr", "esmvpr", "qs", + "qspr", "qsmv", "qsmvpr"), ...) +} +\arguments{ +\item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}} + +\item{method}{The type of method used. See \code{\link[rdrobust]{rdplot}}. +Default is \code{esmv}, the variance mimicking evenly-spaced method.} + +\item{\ldots}{further arguments passed to \code{\link[rdrobust]{rdplot}}.} +} +\value{ +See documentation of \code{\link[rdrobust]{rdplot}} +} +\description{ +Simple wrapper of the Calonico-Cattaneo-Titiunik (2015) bandwidth selection procedures +for RDD visualisation \code{\link[rdrobust]{rdplot}}. +} +\examples{ +data(house) +rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) +rdd_bw_cct_plot(rd) + +} +\references{ +Calonico, S., M. D. Cattaneo, and R. Titiunik. 2015a. Optimal Data-Driven Regression Discontinuity Plots. Journal of the American Statistical Association 110(512): 1753-1769. +\url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2015_JASA.pdf}. +} +\seealso{ +\code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) +} +\author{ +Original code written by Calonico, Cattaneo, Farrell and Titiuni, see \code{\link[rdrobust]{rdplot}} +} From c2ce02e9be05748b5145461ece76df93bf287648 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 18 Feb 2017 18:46:57 -0800 Subject: [PATCH 194/323] Rename files --- R/{bw_cct.R => bw_cct_estim.R} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename R/{bw_cct.R => bw_cct_estim.R} (100%) diff --git a/R/bw_cct.R b/R/bw_cct_estim.R similarity index 100% rename from R/bw_cct.R rename to R/bw_cct_estim.R From b854cf06ad318bac558064a390f7a017e4b71e7c Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 19 Feb 2017 17:20:37 -0800 Subject: [PATCH 195/323] Add getOriginal Data for simple rdd data --- R/get_methods.R | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/R/get_methods.R b/R/get_methods.R index 88147d4..e8f06e8 100644 --- a/R/get_methods.R +++ b/R/get_methods.R @@ -130,6 +130,15 @@ getOriginalData.rdd_reg <- function(object, na.rm = TRUE, classRDD = TRUE) { res } +getOriginalData.rdd_data <- function(object, na.rm = TRUE, classRDD = TRUE) { + res <- object + if (na.rm) + res <- res[apply(res, 1, function(x) all(!is.na(x))), ] # remove na rows + if (!classRDD) + res <- as.data.frame(res) + res +} + #' @importFrom stats getCall From 759237b7c5e1f404539b666da130826cf4ae2b13 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 19 Feb 2017 17:21:21 -0800 Subject: [PATCH 196/323] bw cct: correct mistake --- R/bw_cct_estim.R | 4 +++- R/bw_cct_plot.R | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/R/bw_cct_estim.R b/R/bw_cct_estim.R index 396f2df..669048d 100644 --- a/R/bw_cct_estim.R +++ b/R/bw_cct_estim.R @@ -31,7 +31,9 @@ rdd_bw_cct_estim <- function(rdd_object, checkIsRDD(rdd_object) - res <- rdrobust::rdbwselect(y=rdd_object$y, x=rdd_object$x, + rdd_data <- getOriginalData(rdd_object) + + res <- rdrobust::rdbwselect(y=rdd_data$y, x=rdd_data$x, c = getCutpoint(rdd_object), kernel = "tri", bwselect = method, diff --git a/R/bw_cct_plot.R b/R/bw_cct_plot.R index 1badc13..a5eb0ff 100644 --- a/R/bw_cct_plot.R +++ b/R/bw_cct_plot.R @@ -25,7 +25,8 @@ rdd_bw_cct_plot <- function(rdd_object, method=c("esmv", "es", "espr", "esmvpr", method <- match.arg(method) checkIsRDD(rdd_object) - rdp <- rdrobust::rdplot(y=rdd_object$y, x=rdd_object$x, + rdd_data <- getOriginalData(rdd_object) + rdp <- rdrobust::rdplot(y=rdd_data$y, x=rdd_data$x, c = getCutpoint(rdd_object), hide=TRUE, ...) rdp @@ -36,6 +37,8 @@ if(FALSE){ # data(house) rd <- rdd_data(x=x, y=y, data=house, cutpoint=0) - rdd_bw_cct_plot(rd, plot=FALSE) + rdd_bw_cct_plot(rdd_object=rd) + reg_np <- rdd_reg_np(rd) + rdd_bw_cct_plot(reg_np) } From 51e7ec2b07b74e68ae9d151e5fd5da24d58e1443 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 19 Feb 2017 18:39:49 -0800 Subject: [PATCH 197/323] bw_ik: works now on regression object --- R/bw_ik.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/bw_ik.R b/R/bw_ik.R index 09c69ce..c74ed82 100644 --- a/R/bw_ik.R +++ b/R/bw_ik.R @@ -23,7 +23,9 @@ rdd_bw_ik <- function(rdd_object, kernel = c("Triangular", "Uniform", "Normal")) checkIsRDD(rdd_object) cutpoint <- getCutpoint(rdd_object) - res <- rdd_bw_ik_low(X = rdd_object$x, Y = rdd_object$y, threshold = cutpoint, verbose = FALSE, type = "RES", returnBig = FALSE, + rdd_data <- getOriginalData(rdd_object) + res <- rdd_bw_ik_low(X = rdd_data$x, Y = rdd_data$y, threshold = cutpoint, + verbose = FALSE, type = "RES", returnBig = FALSE, kernel = kernel) return(res) From 0a48428de1a172f739bb9d61b29c9bf40eb37697 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 19 Feb 2017 18:40:06 -0800 Subject: [PATCH 198/323] Uses now default cct bandwidth for bin plot --- R/reg_lm.R | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/R/reg_lm.R b/R/reg_lm.R index e2b3034..cb6f59f 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -137,8 +137,14 @@ print.rdd_reg_lm <- function(x, ...) { #' @export -plot.rdd_reg_lm <- function(x, ...) { - +plot.rdd_reg_lm <- function(x, binwidth=NULL, ...) { + + ## set default binwitdh + if(is.null(binwidth)) { + bw_plot <- rdd_bw_cct_plot(x) + binwidth <- bw_plot$results["Bin Length",, drop=TRUE] + } + ## data dat <- getOriginalData(x) subw <- if (!is.null(x$weights)) @@ -146,6 +152,6 @@ plot.rdd_reg_lm <- function(x, ...) { pred <- data.frame(x = dat$x, y = fitted(x))[subw, ] ## plot - plotBin(dat$x, dat$y, h=0.05, cutpoint=getCutpoint(x), ...) + plotBin(dat$x, dat$y, h=0.05, cutpoint=getCutpoint(x), binwidth=binwidth, ...) lines(pred[order(pred$x), ]) } From 28a6a8f2074bef860c292e6384a7c3d9c23adfac Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 19 Feb 2017 18:40:30 -0800 Subject: [PATCH 199/323] help file update --- man/rdd_bw_cct_estim.Rd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/rdd_bw_cct_estim.Rd b/man/rdd_bw_cct_estim.Rd index d95cc7d..e7632ca 100644 --- a/man/rdd_bw_cct_estim.Rd +++ b/man/rdd_bw_cct_estim.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bw_cct.R +% Please edit documentation in R/bw_cct_estim.R \name{rdd_bw_cct_estim} \alias{rdd_bw_cct_estim} \title{Bandwidth selection for Regression Discontinuity estimators, CTT 2014} From c8d6e9b9914a9250679b8be60868feb7bbfac485 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 19 Feb 2017 18:40:43 -0800 Subject: [PATCH 200/323] Add test file --- tests/testthat/test_rdd_bw_all.R | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/testthat/test_rdd_bw_all.R diff --git a/tests/testthat/test_rdd_bw_all.R b/tests/testthat/test_rdd_bw_all.R new file mode 100644 index 0000000..063d1e9 --- /dev/null +++ b/tests/testthat/test_rdd_bw_all.R @@ -0,0 +1,22 @@ +# load the package +library(rddtools) + +# load the example data set +data(house) + +# create rdd_data sets +rd <- rdd_data(x=x, y=y, data=house, cutpoint=0) +reg_np <- rdd_reg_np(rd) + +# define context +context("rd: output format") + +test_that("bw work on direct data and reg output", { + expect_equal(rdd_bw_cct_plot(rdd_object=rd), + rdd_bw_cct_plot(reg_np) ) + expect_equal(rdd_bw_cct_estim(rdd_object=rd), + rdd_bw_cct_estim(reg_np) ) + expect_equal(rdd_bw_ik(rdd_object=rd), + rdd_bw_ik(reg_np) ) +}) + From 6c209e1151d21aff9c3a51518c38d71f3ce52804 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 20 Feb 2017 10:53:21 -0800 Subject: [PATCH 201/323] Correct mistake --- R/reg_lm.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/reg_lm.R b/R/reg_lm.R index cb6f59f..cb2faca 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -152,6 +152,6 @@ plot.rdd_reg_lm <- function(x, binwidth=NULL, ...) { pred <- data.frame(x = dat$x, y = fitted(x))[subw, ] ## plot - plotBin(dat$x, dat$y, h=0.05, cutpoint=getCutpoint(x), binwidth=binwidth, ...) + plotBin(dat$x, dat$y, h=binwidth, cutpoint=getCutpoint(x), ...) lines(pred[order(pred$x), ]) } From 032628f4d254d8001467318f35e8e73297ca67b4 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 20 Feb 2017 10:53:36 -0800 Subject: [PATCH 202/323] reg np: use now default cct binwidth --- R/reg_np.R | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/R/reg_np.R b/R/reg_np.R index a61eee8..83f08c5 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -160,13 +160,17 @@ print.summary.rdd_reg_np <- function(x, digits = max(3, getOption("digits") - 3) #' @export -plot.rdd_reg_np <- function(x, binwidth, chart = c("locpoly", "np"), ...) { +plot.rdd_reg_np <- function(x, binwidth=NULL, chart = c("locpoly", "np"), ...) { chart <- match.arg(chart) cutpoint <- getCutpoint(x) bw <- getBW(x) - if (missing(binwidth)) - binwidth <- bw/5 # binwidth!=bandwidth + + ## set default binwitdh + if(is.null(binwidth)) { + bw_plot <- rdd_bw_cct_plot(x) + binwidth <- bw_plot$results["Bin Length",, drop=TRUE] + } ## data dat <- getOriginalData(x, classRDD = FALSE) From 75264ed5a1ab6caf87d39af30186119bbbe7441f Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 20 Feb 2017 10:55:07 -0800 Subject: [PATCH 203/323] Add simple tests --- tests/bw_all.R | 39 +++++++++++ tests/bw_all.Rout.save | 149 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 tests/bw_all.R create mode 100644 tests/bw_all.Rout.save diff --git a/tests/bw_all.R b/tests/bw_all.R new file mode 100644 index 0000000..6ea5f5d --- /dev/null +++ b/tests/bw_all.R @@ -0,0 +1,39 @@ +library(rddtools) + +# load the example data set +data(house) + +# create rdd_data sets +rd_dat <- rdd_data(x=x, y=y, data=house, cutpoint=0) +reg_lm <- rdd_reg_lm(rd_dat) +reg_np <- rdd_reg_np(rd_dat) +reg_dat <- list(rd=rd_dat, reg_np=reg_np) + +## plots +plot(rd_dat) +plot(reg_np) +plot(reg_lm) + +## IK +mapply(function(kernel) rdd_bw_ik(rd_dat, kernel=kernel), kernel = c("Triangular", "Uniform", "Normal")) + +## CCT estim +rdd_bw_cct_estim_ARG_1 <- c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", + "cerrd", "certwo", "cersum", "cercomb1") +rdd_bw_cct_estim_ARG_2 <- c("Triangular", "Uniform", "Epanechnikov") +mapply(function(arg1, arg2) rdd_bw_cct_estim(rd_dat, method=arg1, kernel=arg2)$bws, + arg1 = rdd_bw_cct_estim_ARG_1, + arg2 = rdd_bw_cct_estim_ARG_2) + +## CCT plot +rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", + "qs", "qspr", "qsmv", "qsmvpr") +mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1)$results, + arg1 = rdd_bw_cct_plot_ARG_1) + +## rsw +rdd_bw_rsw_ARG_1 <- c("global", "sided") +mapply(function(arg1) rdd_bw_rsw(rd_dat, type=arg1), + arg1 = rdd_bw_rsw_ARG_1) + + diff --git a/tests/bw_all.Rout.save b/tests/bw_all.Rout.save new file mode 100644 index 0000000..20b7c8e --- /dev/null +++ b/tests/bw_all.Rout.save @@ -0,0 +1,149 @@ + +R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch" +Copyright (C) 2016 The R Foundation for Statistical Computing +Platform: x86_64-pc-linux-gnu (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. + +[Previously saved workspace restored] + +> library(rddtools) +Loading required package: AER +Loading required package: car +Loading required package: lmtest +Loading required package: zoo + +Attaching package: ‘zoo’ + +The following objects are masked from ‘package:base’: + + as.Date, as.Date.numeric + +Loading required package: sandwich +Loading required package: survival +Loading required package: np +Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-2) +[vignette("np_faq",package="np") provides answers to frequently asked questions] +> +> # load the example data set +> data(house) +> +> # create rdd_data sets +> rd_dat <- rdd_data(x=x, y=y, data=house, cutpoint=0) +> reg_lm <- rdd_reg_lm(rd_dat) +> reg_np <- rdd_reg_np(rd_dat) +> reg_dat <- list(rd=rd_dat, reg_np=reg_np) +> +> ## plots +> plot(rd_dat) +Warning messages: +1: In title(main = main, sub = sub) : font width unknown for character 0x9 +2: In title(main = main, sub = sub) : font width unknown for character 0x9 +> plot(reg_np) +Warning messages: +1: In title(main = main, sub = sub) : font width unknown for character 0x9 +2: In title(main = main, sub = sub) : font width unknown for character 0x9 +> plot(reg_lm) +Warning messages: +1: In title(main = main, sub = sub) : font width unknown for character 0x9 +2: In title(main = main, sub = sub) : font width unknown for character 0x9 +> +> ## IK +> mapply(function(kernel) rdd_bw_ik(rd_dat, kernel=kernel), kernel = c("Triangular", "Uniform", "Normal")) +Triangular.h_opt Uniform.h_opt Normal.h_opt + 0.2938561 0.2309748 0.1075954 +> +> ## CCT estim +> rdd_bw_cct_estim_ARG_1 <- c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", ++ "cerrd", "certwo", "cersum", "cercomb1") +> rdd_bw_cct_estim_ARG_2 <- c("Triangular", "Uniform", "Epanechnikov") +> mapply(function(arg1, arg2) rdd_bw_cct_estim(rd_dat, method=arg1, kernel=arg2)$bws, ++ arg1 = rdd_bw_cct_estim_ARG_1, ++ arg2 = rdd_bw_cct_estim_ARG_2) + mserd msetwo msesum msecomb1 msecomb2 cerrd certwo +[1,] 0.1335798 0.1268747 0.1549915 0.1335798 0.1335798 0.0860800 0.08175915 +[2,] 0.1335798 0.1908366 0.1549915 0.1335798 0.1549915 0.0860800 0.12297680 +[3,] 0.2379239 0.2149461 0.2354573 0.2354573 0.2354573 0.2379239 0.21494611 +[4,] 0.2379239 0.3081993 0.2354573 0.2354573 0.2379239 0.2379239 0.30819933 + cersum cercomb1 +[1,] 0.0998779 0.0860800 +[2,] 0.0998779 0.0860800 +[3,] 0.2354573 0.2354573 +[4,] 0.2354573 0.2354573 +> +> ## CCT plot +> rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", ++ "qs", "qspr", "qsmv", "qsmvpr") +> mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1)$results, ++ arg1 = rdd_bw_cct_plot_ARG_1) + esmv es espr esmvpr qs + [1,] 2.740000e+03 2.740000e+03 2.740000e+03 2.740000e+03 2.740000e+03 + [2,] 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 + [3,] 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 + [4,] 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 + [5,] 1.190476e-02 1.190476e-02 1.190476e-02 1.190476e-02 1.190476e-02 + [6,] 2.000000e+01 2.000000e+01 2.000000e+01 2.000000e+01 2.000000e+01 + [7,] 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 + [8,] 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 + [9,] 1.331771e-02 1.331771e-02 1.331771e-02 1.331771e-02 1.331771e-02 +[10,] 9.866823e-01 9.866823e-01 9.866823e-01 9.866823e-01 9.866823e-01 +[11,] 3.818000e+03 3.818000e+03 3.818000e+03 3.818000e+03 3.818000e+03 +[12,] 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 +[13,] 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 +[14,] 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 +[15,] 7.692308e-03 7.692308e-03 7.692308e-03 7.692308e-03 7.692308e-03 +[16,] 1.700000e+01 1.700000e+01 1.700000e+01 1.700000e+01 1.700000e+01 +[17,] 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 +[18,] 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 +[19,] 2.231242e-03 2.231242e-03 2.231242e-03 2.231242e-03 2.231242e-03 +[20,] 9.977688e-01 9.977688e-01 9.977688e-01 9.977688e-01 9.977688e-01 + qspr qsmv qsmvpr + [1,] 2.740000e+03 2.740000e+03 2.740000e+03 + [2,] 4.000000e+00 4.000000e+00 4.000000e+00 + [3,] 4.200000e+00 4.200000e+00 4.200000e+00 + [4,] 8.400000e+01 8.400000e+01 8.400000e+01 + [5,] 1.190476e-02 1.190476e-02 1.190476e-02 + [6,] 2.000000e+01 2.000000e+01 2.000000e+01 + [7,] 8.400000e+01 8.400000e+01 8.400000e+01 + [8,] 4.200000e+00 4.200000e+00 4.200000e+00 + [9,] 1.331771e-02 1.331771e-02 1.331771e-02 +[10,] 9.866823e-01 9.866823e-01 9.866823e-01 +[11,] 3.818000e+03 3.818000e+03 3.818000e+03 +[12,] 4.000000e+00 4.000000e+00 4.000000e+00 +[13,] 7.647059e+00 7.647059e+00 7.647059e+00 +[14,] 1.300000e+02 1.300000e+02 1.300000e+02 +[15,] 7.692308e-03 7.692308e-03 7.692308e-03 +[16,] 1.700000e+01 1.700000e+01 1.700000e+01 +[17,] 1.300000e+02 1.300000e+02 1.300000e+02 +[18,] 7.647059e+00 7.647059e+00 7.647059e+00 +[19,] 2.231242e-03 2.231242e-03 2.231242e-03 +[20,] 9.977688e-01 9.977688e-01 9.977688e-01 +> +> ## rsw +> rdd_bw_rsw_ARG_1 <- c("global", "sided") +> mapply(function(arg1) rdd_bw_rsw(rd_dat, type=arg1), ++ arg1 = rdd_bw_rsw_ARG_1) +$global +[1] 0.03863514 + +$sided +[1] 0.03454186 0.10109994 + +> +> +> +> proc.time() + user system elapsed + 7.800 0.088 7.881 From a04e8585e75eec09c1f27496b7395996d6b4a0e6 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 20 Feb 2017 11:07:32 -0800 Subject: [PATCH 204/323] Use new website in DESC --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4c5e725..5d0248e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -27,7 +27,7 @@ Suggests: knitr, testthat License: GPL (>= 2) -URL: http://qua.st/rnn, https://github.com/bquast/rddtools +URL: http://qua.st/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr RoxygenNote: 6.0.1 From 93cbeb8238ea8d8e6057bdf2925198c8c0e714f5 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 29 Jan 2018 21:55:02 -0800 Subject: [PATCH 205/323] test: adjsut output for new rdplot --- tests/bw_all.Rout.save | 156 ++++++++++++++++++++++++++++------------- 1 file changed, 109 insertions(+), 47 deletions(-) diff --git a/tests/bw_all.Rout.save b/tests/bw_all.Rout.save index 20b7c8e..b62dc27 100644 --- a/tests/bw_all.Rout.save +++ b/tests/bw_all.Rout.save @@ -17,8 +17,6 @@ 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. -[Previously saved workspace restored] - > library(rddtools) Loading required package: AER Loading required package: car @@ -34,8 +32,10 @@ The following objects are masked from ‘package:base’: Loading required package: sandwich Loading required package: survival Loading required package: np -Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-2) +Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-6) [vignette("np_faq",package="np") provides answers to frequently asked questions] +[vignette("np",package="np") an overview] +[vignette("entropy_np",package="np") an overview of entropy-based methods] > > # load the example data set > data(house) @@ -86,50 +86,112 @@ Triangular.h_opt Uniform.h_opt Normal.h_opt > ## CCT plot > rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", + "qs", "qspr", "qsmv", "qsmvpr") -> mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1)$results, -+ arg1 = rdd_bw_cct_plot_ARG_1) - esmv es espr esmvpr qs - [1,] 2.740000e+03 2.740000e+03 2.740000e+03 2.740000e+03 2.740000e+03 - [2,] 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 - [3,] 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 - [4,] 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 - [5,] 1.190476e-02 1.190476e-02 1.190476e-02 1.190476e-02 1.190476e-02 - [6,] 2.000000e+01 2.000000e+01 2.000000e+01 2.000000e+01 2.000000e+01 - [7,] 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 8.400000e+01 - [8,] 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 4.200000e+00 - [9,] 1.331771e-02 1.331771e-02 1.331771e-02 1.331771e-02 1.331771e-02 -[10,] 9.866823e-01 9.866823e-01 9.866823e-01 9.866823e-01 9.866823e-01 -[11,] 3.818000e+03 3.818000e+03 3.818000e+03 3.818000e+03 3.818000e+03 -[12,] 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 -[13,] 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 -[14,] 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 -[15,] 7.692308e-03 7.692308e-03 7.692308e-03 7.692308e-03 7.692308e-03 -[16,] 1.700000e+01 1.700000e+01 1.700000e+01 1.700000e+01 1.700000e+01 -[17,] 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 1.300000e+02 -[18,] 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 7.647059e+00 -[19,] 2.231242e-03 2.231242e-03 2.231242e-03 2.231242e-03 2.231242e-03 -[20,] 9.977688e-01 9.977688e-01 9.977688e-01 9.977688e-01 9.977688e-01 - qspr qsmv qsmvpr - [1,] 2.740000e+03 2.740000e+03 2.740000e+03 - [2,] 4.000000e+00 4.000000e+00 4.000000e+00 - [3,] 4.200000e+00 4.200000e+00 4.200000e+00 - [4,] 8.400000e+01 8.400000e+01 8.400000e+01 - [5,] 1.190476e-02 1.190476e-02 1.190476e-02 - [6,] 2.000000e+01 2.000000e+01 2.000000e+01 - [7,] 8.400000e+01 8.400000e+01 8.400000e+01 - [8,] 4.200000e+00 4.200000e+00 4.200000e+00 - [9,] 1.331771e-02 1.331771e-02 1.331771e-02 -[10,] 9.866823e-01 9.866823e-01 9.866823e-01 -[11,] 3.818000e+03 3.818000e+03 3.818000e+03 -[12,] 4.000000e+00 4.000000e+00 4.000000e+00 -[13,] 7.647059e+00 7.647059e+00 7.647059e+00 -[14,] 1.300000e+02 1.300000e+02 1.300000e+02 -[15,] 7.692308e-03 7.692308e-03 7.692308e-03 -[16,] 1.700000e+01 1.700000e+01 1.700000e+01 -[17,] 1.300000e+02 1.300000e+02 1.300000e+02 -[18,] 7.647059e+00 7.647059e+00 7.647059e+00 -[19,] 2.231242e-03 2.231242e-03 2.231242e-03 -[20,] 9.977688e-01 9.977688e-01 9.977688e-01 +> mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1), ++ arg1 = rdd_bw_cct_plot_ARG_1, SIMPLIFY=FALSE) +$esmv +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$es +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$espr +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$esmvpr +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$qs +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$qspr +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$qsmv +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + +$qsmvpr +Call: rdplot + +Number of Obs. 6558 +Kernel Uniform + +Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 +Order poly. fit (p) 4 4 +BW poly. fit (h) 1.000 1.000 +Number of bins scale 1 1 + + > > ## rsw > rdd_bw_rsw_ARG_1 <- c("global", "sided") From 2f6368cc8a6daf9b38e3ba23e3e7edd6297d6862 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 29 Jan 2018 22:26:22 -0800 Subject: [PATCH 206/323] Adjust for new output of rdplot package --- R/reg_lm.R | 3 ++- R/reg_np.R | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/R/reg_lm.R b/R/reg_lm.R index cb2faca..ceea656 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -142,7 +142,8 @@ plot.rdd_reg_lm <- function(x, binwidth=NULL, ...) { ## set default binwitdh if(is.null(binwidth)) { bw_plot <- rdd_bw_cct_plot(x) - binwidth <- bw_plot$results["Bin Length",, drop=TRUE] + # binwidth <- bw_plot$results["Bin Length",, drop=TRUE] old version + binwidth <- bw_plot$h[1] } ## data diff --git a/R/reg_np.R b/R/reg_np.R index 83f08c5..e590201 100644 --- a/R/reg_np.R +++ b/R/reg_np.R @@ -169,7 +169,8 @@ plot.rdd_reg_np <- function(x, binwidth=NULL, chart = c("locpoly", "np"), ...) { ## set default binwitdh if(is.null(binwidth)) { bw_plot <- rdd_bw_cct_plot(x) - binwidth <- bw_plot$results["Bin Length",, drop=TRUE] + # binwidth <- bw_plot$results["Bin Length",, drop=TRUE] old version + binwidth <- bw_plot$h[1] } ## data From 7f1c2421fddab802bf8824269cf4c035e444ff2c Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 29 Jan 2018 22:26:38 -0800 Subject: [PATCH 207/323] Add Changelog --- inst/ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 inst/ChangeLog diff --git a/inst/ChangeLog b/inst/ChangeLog new file mode 100644 index 0000000..a5052e6 --- /dev/null +++ b/inst/ChangeLog @@ -0,0 +1,6 @@ +Version 0.5.0: Matthieu Stigler (2018-01-29) + -new: plotBin allows for separate bin on each side + -new: wrapper for CCT plots + -fix issues with new output from rdtable + -add test file + -bw_ik work on regression output objects From bc77d0ea3a0ba2ed4ddfd4d9b096ff39c1ace373 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 29 Jan 2018 22:27:02 -0800 Subject: [PATCH 208/323] Add date of actual version in DESCRIPTION --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 5d0248e..9625411 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,6 @@ Package: rddtools Version: 0.5.0 +Date: 2018-01-29 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 1843ce685afe780397c6d3933a63b773093f7348 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 29 Jan 2018 22:41:57 -0800 Subject: [PATCH 209/323] test re update, small git issue --- tests/bw_all.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bw_all.R b/tests/bw_all.R index 6ea5f5d..5fbac43 100644 --- a/tests/bw_all.R +++ b/tests/bw_all.R @@ -28,8 +28,8 @@ mapply(function(arg1, arg2) rdd_bw_cct_estim(rd_dat, method=arg1, kernel=arg2)$b ## CCT plot rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", "qs", "qspr", "qsmv", "qsmvpr") -mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1)$results, - arg1 = rdd_bw_cct_plot_ARG_1) +mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1), + arg1 = rdd_bw_cct_plot_ARG_1, SIMPLIFY=FALSE) ## rsw rdd_bw_rsw_ARG_1 <- c("global", "sided") From 1045da50a9b65c4296bc9e0dea704196fbd36e77 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 19 Feb 2018 21:28:41 -0800 Subject: [PATCH 210/323] print rdd: add info on fuzzy --- R/rdd_data_methods.R | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/R/rdd_data_methods.R b/R/rdd_data_methods.R index 6ecc813..1a40c83 100644 --- a/R/rdd_data_methods.R +++ b/R/rdd_data_methods.R @@ -7,9 +7,16 @@ summary.rdd_data <- function(object, ...) { cutpoint <- getCutpoint(object) hasCovar_eng <- ifelse(hasCovar(object), "yes", "no") cat("### rdd_data object ###\n") - cat("\nCutpoint:", cutpoint, "\n") - cat("Sample size:", "\n\t-Full :", nrow(object), "\n\t-Left :", sum(object$x < cutpoint), "\n\t-Right:", sum(object$x >= - cutpoint)) + cat("\nCutpoint:", cutpoint) + cat("\nType:", getType(object), "\n") + if(isFuzzy(object)) { + n_treat <- sum(object$z) + untr <- paste(", untreated:", nrow(object)-n_treat) + tr <- paste(", treated:", n_treat) + } + cat("Sample size:", "\n\t-Full :", nrow(object), + "\n\t-Left :", sum(object$x < cutpoint), if(isFuzzy(object)) untr else NULL, + "\n\t-Right:", sum(object$x >= cutpoint), if(isFuzzy(object)) tr else NULL) cat("\nCovariates:", hasCovar_eng, "\n") } From 4617eaeb4f1439c93bff0928db923a66d5309acb Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 19 Feb 2018 22:49:45 -0800 Subject: [PATCH 211/323] test: update bw_all, with much more output --- tests/bw_all.R | 28 ++++- tests/bw_all.Rout.save | 245 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 270 insertions(+), 3 deletions(-) diff --git a/tests/bw_all.R b/tests/bw_all.R index 5fbac43..9f41e7a 100644 --- a/tests/bw_all.R +++ b/tests/bw_all.R @@ -4,10 +4,36 @@ library(rddtools) data(house) # create rdd_data sets +set.seed(123) +cov_df <- data.frame(cov=rnorm(nrow(house))) +set.seed(123) +z_fake <- ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0) rd_dat <- rdd_data(x=x, y=y, data=house, cutpoint=0) +rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, z=ifelse(house$x>0,1,0), cutpoint=0) +rd_dat_fuzzy <- rdd_data(x=house$x, y=house$y, z=z_fake, + cutpoint=0, covar=cov_df) +rd_dat_covar <- rdd_data(x=house$x, y=house$y, covar=cov_df, cutpoint=0) + +summary(rd_dat) +summary(rd_dat_fakefuzzy) +summary(rd_dat_fuzzy) +summary(rd_dat_covar) + reg_lm <- rdd_reg_lm(rd_dat) +reg_lm_covar <- rdd_reg_lm(rd_dat_covar, covariates="cov") +reg_lm_fak_fuz <- rdd_reg_lm(rd_dat_fakefuzzy) +reg_lm_fuz <- rdd_reg_lm(rd_dat_fuzzy) +# reg_lm_fuz_cov <- rdd_reg_lm(rd_dat_fuzzy, covariates="cov") reg_np <- rdd_reg_np(rd_dat) -reg_dat <- list(rd=rd_dat, reg_np=reg_np) + +reg_dat <- list(reg_lm=reg_lm, reg_np=reg_np, + reg_lm_fak_fuz=reg_lm_fak_fuz, reg_lm_fuz=reg_lm_fuz, + reg_lm_covar=reg_lm_covar) + + +res <- lapply(reg_dat, print) +lapply(reg_dat, summary) +lapply(reg_dat, coef) ## plots plot(rd_dat) diff --git a/tests/bw_all.Rout.save b/tests/bw_all.Rout.save index b62dc27..052ead0 100644 --- a/tests/bw_all.Rout.save +++ b/tests/bw_all.Rout.save @@ -41,10 +41,251 @@ Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-6) > data(house) > > # create rdd_data sets +> set.seed(123) +> cov_df <- data.frame(cov=rnorm(nrow(house))) +> set.seed(123) +> z_fake <- ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0) > rd_dat <- rdd_data(x=x, y=y, data=house, cutpoint=0) +> rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, z=ifelse(house$x>0,1,0), cutpoint=0) +> rd_dat_fuzzy <- rdd_data(x=house$x, y=house$y, z=z_fake, ++ cutpoint=0, covar=cov_df) +> rd_dat_covar <- rdd_data(x=house$x, y=house$y, covar=cov_df, cutpoint=0) +> +> summary(rd_dat) +### rdd_data object ### + +Cutpoint: 0 +Type: Sharp +Sample size: + -Full : 6558 + -Left : 2740 + -Right: 3818 +Covariates: no +> summary(rd_dat_fakefuzzy) +### rdd_data object ### + +Cutpoint: 0 +Type: Fuzzy +Sample size: + -Full : 6558 + -Left : 2740 , untreated: 2740 + -Right: 3818 , treated: 3818 +Covariates: no +> summary(rd_dat_fuzzy) +### rdd_data object ### + +Cutpoint: 0 +Type: Fuzzy +Sample size: + -Full : 6558 + -Left : 2740 , untreated: 2767 + -Right: 3818 , treated: 3791 +Covariates: yes +> summary(rd_dat_covar) +### rdd_data object ### + +Cutpoint: 0 +Type: Sharp +Sample size: + -Full : 6558 + -Left : 2740 + -Right: 3818 +Covariates: yes +> > reg_lm <- rdd_reg_lm(rd_dat) +> reg_lm_covar <- rdd_reg_lm(rd_dat_covar, covariates="cov") +> reg_lm_fak_fuz <- rdd_reg_lm(rd_dat_fakefuzzy) +> reg_lm_fuz <- rdd_reg_lm(rd_dat_fuzzy) +> # reg_lm_fuz_cov <- rdd_reg_lm(rd_dat_fuzzy, covariates="cov") > reg_np <- rdd_reg_np(rd_dat) -> reg_dat <- list(rd=rd_dat, reg_np=reg_np) +> +> reg_dat <- list(reg_lm=reg_lm, reg_np=reg_np, ++ reg_lm_fak_fuz=reg_lm_fak_fuz, reg_lm_fuz=reg_lm_fuz, ++ reg_lm_covar=reg_lm_covar) +> +> +> res <- lapply(reg_dat, print) +### RDD regression: parametric ### + Polynomial order: 1 + Slopes: separate + Number of obs: 6558 (left: 2740, right: 3818) + + Coefficient: + Estimate Std. Error t value Pr(>|t|) +D 0.1182314 0.0056799 20.816 < 2.2e-16 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 +### RDD regression: nonparametric local linear### + Bandwidth: 0.2938561 + Number of obs: 3200 (left: 1594, right: 1606) + + Coefficient: + Estimate Std. Error z value Pr(>|z|) +D 0.079924 0.009465 8.4443 < 2.2e-16 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 +### RDD regression: parametric ### + Polynomial order: 1 + Slopes: separate + Number of obs: 6558 (left: 2740, right: 3818) + + Coefficient: + Estimate Std. Error t value Pr(>|t|) +D 0.1182314 0.0056799 20.816 < 2.2e-16 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 +### RDD regression: parametric ### + Polynomial order: 1 + Slopes: separate + Number of obs: 6558 (left: 2740, right: 3818) + + Coefficient: + Estimate Std. Error t value Pr(>|t|) +D 0.1449633 0.0070384 20.596 < 2.2e-16 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 +### RDD regression: parametric ### + Polynomial order: 1 + Slopes: separate + Number of obs: 6558 (left: 2740, right: 3818) + + Coefficient: + Estimate Std. Error t value Pr(>|t|) +D 0.1182307 0.0056803 20.814 < 2.2e-16 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 +> lapply(reg_dat, summary) +$reg_lm + +Call: +lm(formula = y ~ ., data = dat_step1, weights = weights) + +Residuals: + Min 1Q Median 3Q Max +-0.89406 -0.06189 0.00231 0.07129 0.86396 + +Coefficients: + Estimate Std. Error t value Pr(>|t|) +(Intercept) 0.432948 0.004276 101.254 < 2e-16 *** +D 0.118231 0.005680 20.816 < 2e-16 *** +x 0.296906 0.011546 25.714 < 2e-16 *** +x_right 0.045978 0.013501 3.405 0.000665 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 + +Residual standard error: 0.1384 on 6554 degrees of freedom +Multiple R-squared: 0.6707, Adjusted R-squared: 0.6706 +F-statistic: 4450 on 3 and 6554 DF, p-value: < 2.2e-16 + + +$reg_np +### RDD regression: nonparametric local linear### + Bandwidth: 0.2938561 + Number of obs: 3200 (left: 1594, right: 1606) + + Weighted Residuals: + Min 1Q Median 3Q Max +-0.97755 -0.06721 -0.00497 0.04504 0.93761 + + Coefficient: + Estimate Std. Error z value Pr(>|z|) +D 0.079924 0.009465 8.4443 < 2.2e-16 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 + + Local R squared: 0.3563 + +$reg_lm_fak_fuz + +Call: +ivreg(formula = y ~ . - ins | . - D, data = dat_step1, weights = weights) + +Residuals: + Min 1Q Median 3Q Max +-0.894063 -0.061892 0.002313 0.071286 0.863959 + +Coefficients: + Estimate Std. Error t value Pr(>|t|) +(Intercept) 0.432948 0.004276 101.254 < 2e-16 *** +D 0.118231 0.005680 20.816 < 2e-16 *** +x 0.296906 0.011546 25.714 < 2e-16 *** +x_right 0.045978 0.013501 3.405 0.000665 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 + +Residual standard error: 0.1384 on 6554 degrees of freedom +Multiple R-Squared: 0.6707, Adjusted R-squared: 0.6706 +Wald test: 4450 on 3 and 6554 DF, p-value: < 2.2e-16 + + +$reg_lm_fuz + +Call: +ivreg(formula = y ~ . - ins | . - D, data = dat_step1, weights = weights) + +Residuals: + Min 1Q Median 3Q Max +-0.887954 -0.065471 0.003594 0.075692 0.850055 + +Coefficients: + Estimate Std. Error t value Pr(>|t|) +(Intercept) 0.419478 0.004833 86.794 < 2e-16 *** +D 0.144963 0.007038 20.596 < 2e-16 *** +x 0.269533 0.012502 21.559 < 2e-16 *** +x_right 0.053981 0.013741 3.928 8.64e-05 *** +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 + +Residual standard error: 0.1398 on 6554 degrees of freedom +Multiple R-Squared: 0.6636, Adjusted R-squared: 0.6635 +Wald test: 4356 on 3 and 6554 DF, p-value: < 2.2e-16 + + +$reg_lm_covar + +Call: +lm(formula = y ~ ., data = dat_step1, weights = weights) + +Residuals: + Min 1Q Median 3Q Max +-0.89425 -0.06205 0.00225 0.07119 0.86410 + +Coefficients: + Estimate Std. Error t value Pr(>|t|) +(Intercept) 0.4329494 0.0042761 101.248 < 2e-16 *** +D 0.1182307 0.0056803 20.814 < 2e-16 *** +x 0.2969090 0.0115472 25.713 < 2e-16 *** +x_right 0.0459813 0.0135024 3.405 0.000665 *** +cov -0.0005211 0.0017143 -0.304 0.761150 +--- +Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 + +Residual standard error: 0.1384 on 6553 degrees of freedom +Multiple R-squared: 0.6707, Adjusted R-squared: 0.6705 +F-statistic: 3337 on 4 and 6553 DF, p-value: < 2.2e-16 + + +> lapply(reg_dat, coef) +$reg_lm +(Intercept) D x x_right + 0.43294793 0.11823144 0.29690647 0.04597763 + +$reg_np + D +0.07992454 + +$reg_lm_fak_fuz +(Intercept) D x x_right + 0.43294793 0.11823144 0.29690647 0.04597763 + +$reg_lm_fuz +(Intercept) D x x_right + 0.41947751 0.14496332 0.26953272 0.05398077 + +$reg_lm_covar + (Intercept) D x x_right cov + 0.4329494035 0.1182306693 0.2969090017 0.0459812895 -0.0005211234 + > > ## plots > plot(rd_dat) @@ -208,4 +449,4 @@ $sided > > proc.time() user system elapsed - 7.800 0.088 7.881 + 6.533 0.108 6.628 From a39f9e46f5795a692bd026dc3bded4962ffe4f99 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Tue, 20 Feb 2018 07:31:51 -0800 Subject: [PATCH 212/323] rdd_reg: small docu update --- R/rdd_data.R | 8 +++++++- man/rdd_data.Rd | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/R/rdd_data.R b/R/rdd_data.R index 3e537b4..6d5214a 100644 --- a/R/rdd_data.R +++ b/R/rdd_data.R @@ -9,7 +9,7 @@ #' @param labels Additional labels to provide as list (with entries \code{x}, \code{y}, and eventually vector \code{covar}). Unused currently. #' @param data A data-frame for the \code{x} and \code{y} variables. If this is provided, #' the column names can be entered directly for argument \code{x} and \code{y} -#' @param z Assignment variable for the fuzzy case. +#' @param z Assignment variable for the fuzzy case. Should be 0/1 or TRUE/FALSE variable. #' @return Object of class \code{rdd_data}, inheriting from \code{data.frame} #' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @export @@ -24,6 +24,12 @@ #' # The summary() and plot() function are specific to rdd_data #' summary(rd) #' plot(rd) +#' +#' # for the fuzzy case, you need to specify the assignment variable z: +#' rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, +#' z=ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0), +#' cutpoint=0) +#' summary(rd_dat_fakefuzzy) rdd_data <- function(y, x, covar, cutpoint, z, labels, data) { diff --git a/man/rdd_data.Rd b/man/rdd_data.Rd index 47febb0..81d3ec9 100644 --- a/man/rdd_data.Rd +++ b/man/rdd_data.Rd @@ -15,7 +15,7 @@ rdd_data(y, x, covar, cutpoint, z, labels, data) \item{cutpoint}{Cutpoint} -\item{z}{Assignment variable for the fuzzy case.} +\item{z}{Assignment variable for the fuzzy case. Should be 0/1 or TRUE/FALSE variable.} \item{labels}{Additional labels to provide as list (with entries \code{x}, \code{y}, and eventually vector \code{covar}). Unused currently.} @@ -39,6 +39,12 @@ rd # The summary() and plot() function are specific to rdd_data summary(rd) plot(rd) + +# for the fuzzy case, you need to specify the assignment variable z: +rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, + z=ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0), + cutpoint=0) +summary(rd_dat_fakefuzzy) } \author{ Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> From 80c489e8106ffb57f4c210e3bff826a1a126203b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 28 Feb 2018 19:41:22 +0100 Subject: [PATCH 213/323] fix CRAN urls --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a897265..48681c5 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ rddtools ======================================================== [![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) -[![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](http://cran.r-project.org/package=rddtools) -[![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](http://cran.rstudio.com/web/packages/rddtools/index.html) -[![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.rstudio.com/package=rddtools) +[![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) +[![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.rstudio.com/web/packages/rddtools/index.html) +[![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.r-project.org/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) [![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) From 321c2e91876ce4a76a650d3c2fea6f2e88d74a98 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 1 Mar 2018 09:58:47 +0100 Subject: [PATCH 214/323] update CRAN URL to HTTPS --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 48681c5..c5dfdfd 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ rddtools [![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) [![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.rstudio.com/web/packages/rddtools/index.html) -[![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](http://cran.r-project.org/package=rddtools) +[![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) [![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) From fb143194279ab489d5c470ab9be59b377be5f8e2 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 2 Mar 2018 15:46:12 +0100 Subject: [PATCH 215/323] update citation to 2016 in text --- inst/CITATION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/CITATION b/inst/CITATION index 541481c..9fb0baf 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -6,7 +6,7 @@ bibentry(bibtype = "TechReport", address = "Maison de la paix, Geneva, Switzerland", year = "2016", url = "http://qua.st/rddtools", - textVersion = "Stigler, M. and B. Quast, B (2015). rddtools: A toolbox for regression discontinuity in R. ", + textVersion = "Stigler, M. and B. Quast, B (2016). rddtools: A toolbox for regression discontinuity in R. ", mheader = "To cite rddtools in publications please use:", From e89516449d4ba225e9c95cad2ecce4c5422182a7 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 3 Mar 2018 11:21:46 +0100 Subject: [PATCH 216/323] fix more urls --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c5dfdfd..933e0df 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ rddtools ======================================================== [![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) -[![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.rstudio.com/web/packages/rddtools/index.html) +[![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) [![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) [![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) @@ -20,7 +20,7 @@ if (!require('devtools')) install.packages('devtools') devtools::install_github( "bquast/rddtools" ) ``` -Note however the latest version of rddtools only works with R 3.0, and that you might need to install [Rtools](http://stat.ethz.ch/CRAN/bin/windows/Rtools/) if on Windows. +Note however the latest version of rddtools only works with R 3.0, and that you might need to install [Rtools](https://cran.r-project.org/bin/windows/Rtools/) if on Windows. Documentation From aa24a56cf4d688d905bc028e73749afc58115b11 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 5 Mar 2018 11:50:02 +0100 Subject: [PATCH 217/323] update date --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9625411..1d07b36 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: rddtools Version: 0.5.0 -Date: 2018-01-29 +Date: 2018-03-05 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 0f39a5c2c437562617cb7db7424bc46e255807ad Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Jan 2020 15:45:24 +0100 Subject: [PATCH 218/323] redo roxygen2 --- DESCRIPTION | 2 +- man/clusterInf.Rd | 3 ++- man/covarTest_dis.Rd | 4 ++-- man/covarTest_mean.Rd | 8 ++++---- man/gen_mc_ik.Rd | 4 ++-- man/plot.rdd_data.Rd | 5 +++-- man/plotBin.Rd | 4 ++-- man/plotPlacebo.Rd | 13 +++++++------ man/rdd_bw_cct_plot.Rd | 4 ++-- man/rdd_coef.Rd | 3 ++- man/rdd_gen_reg.Rd | 6 +++--- man/rdd_reg_lm.Rd | 4 ++-- 12 files changed, 32 insertions(+), 28 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1d07b36..55bacb5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,4 +31,4 @@ License: GPL (>= 2) URL: http://qua.st/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 6.0.1 +RoxygenNote: 6.1.1 diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index 7a730e2..5fccec3 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -4,7 +4,8 @@ \alias{clusterInf} \title{Post-inference for clustered data} \usage{ -clusterInf(object, clusterVar, vcov. = NULL, type = c("df-adj", "HC"), ...) +clusterInf(object, clusterVar, vcov. = NULL, type = c("df-adj", "HC"), + ...) } \arguments{ \item{object}{Object of class lm, from which rdd_reg also inherits.} diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index a90d5e0..35c72dd 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -6,8 +6,8 @@ \alias{covarTest_dis.rdd_reg} \title{Testing for balanced covariates: equality of distribution} \usage{ -covarTest_dis(object, bw, exact = NULL, p.adjust = c("none", "holm", "BH", - "BY", "hochberg", "hommel", "bonferroni")) +covarTest_dis(object, bw, exact = NULL, p.adjust = c("none", "holm", + "BH", "BY", "hochberg", "hommel", "bonferroni")) \method{covarTest_dis}{rdd_data}(object, bw = NULL, exact = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index 6d72e98..e695dd9 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -11,12 +11,12 @@ covarTest_mean(object, bw = NULL, paired = FALSE, var.equal = FALSE, "bonferroni")) \method{covarTest_mean}{rdd_data}(object, bw = NULL, paired = FALSE, - var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", - "hommel", "bonferroni")) + var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", + "hochberg", "hommel", "bonferroni")) \method{covarTest_mean}{rdd_reg}(object, bw = NULL, paired = FALSE, - var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", - "hommel", "bonferroni")) + var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", + "hochberg", "hommel", "bonferroni")) } \arguments{ \item{object}{object of class rdd_data} diff --git a/man/gen_mc_ik.Rd b/man/gen_mc_ik.Rd index 521c2af..09ea638 100644 --- a/man/gen_mc_ik.Rd +++ b/man/gen_mc_ik.Rd @@ -4,8 +4,8 @@ \alias{gen_mc_ik} \title{Generate Monte Carlo simulations of Imbens and Kalyanaraman} \usage{ -gen_mc_ik(n = 200, version = 1, sd = 0.1295, output = c("data.frame", - "rdd_data"), size) +gen_mc_ik(n = 200, version = 1, sd = 0.1295, + output = c("data.frame", "rdd_data"), size) } \arguments{ \item{n}{The size of sampel to generate} diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd index b9eee25..62b5b44 100644 --- a/man/plot.rdd_data.Rd +++ b/man/plot.rdd_data.Rd @@ -4,8 +4,9 @@ \alias{plot.rdd_data} \title{Plot rdd_data} \usage{ -\method{plot}{rdd_data}(x, h = NULL, nbins = NULL, xlim = range(object$x, - na.rm = TRUE), cex = 0.7, nplot = 1, device = c("base", "ggplot"), ...) +\method{plot}{rdd_data}(x, h = NULL, nbins = NULL, + xlim = range(object$x, na.rm = TRUE), cex = 0.7, nplot = 1, + device = c("base", "ggplot"), ...) } \arguments{ \item{x}{Object of class rdd_data} diff --git a/man/plotBin.Rd b/man/plotBin.Rd index 070e880..307a57c 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -5,8 +5,8 @@ \title{Bin plotting} \usage{ plotBin(x, y, h = NULL, nbins = NULL, cutpoint = 0, plot = TRUE, - type = c("value", "number"), xlim = range(x, na.rm = TRUE), cex = 0.9, - main = NULL, xlab, ylab, ...) + type = c("value", "number"), xlim = range(x, na.rm = TRUE), + cex = 0.9, main = NULL, xlab, ylab, ...) } \arguments{ \item{x}{Forcing variable} diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index 5b52e77..56a09cb 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -11,17 +11,18 @@ plotPlacebo(object, device = c("ggplot", "base"), ...) \method{plotPlacebo}{rdd_reg}(object, device = c("ggplot", "base"), - from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, - vcov. = NULL, plot = TRUE, output = c("data", "ggplot"), ...) + from = 0.25, to = 0.75, by = 0.1, level = 0.95, + same_bw = FALSE, vcov. = NULL, plot = TRUE, output = c("data", + "ggplot"), ...) plotPlaceboDens(object, device = c("ggplot", "base"), ...) \method{plotPlaceboDens}{rdd_reg}(object, device = c("ggplot", "base"), - from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, - vcov. = NULL, ...) + from = 0.25, to = 0.75, by = 0.1, level = 0.95, + same_bw = FALSE, vcov. = NULL, ...) -computePlacebo(object, from = 0.25, to = 0.75, by = 0.1, level = 0.95, - same_bw = FALSE, vcov. = NULL) +computePlacebo(object, from = 0.25, to = 0.75, by = 0.1, + level = 0.95, same_bw = FALSE, vcov. = NULL) } \arguments{ \item{object}{the output of an RDD regression} diff --git a/man/rdd_bw_cct_plot.Rd b/man/rdd_bw_cct_plot.Rd index 2e2675c..ae90174 100644 --- a/man/rdd_bw_cct_plot.Rd +++ b/man/rdd_bw_cct_plot.Rd @@ -4,8 +4,8 @@ \alias{rdd_bw_cct_plot} \title{Bandwidth selection for Regression Discontinuity visualisation, CTT 2015} \usage{ -rdd_bw_cct_plot(rdd_object, method = c("esmv", "es", "espr", "esmvpr", "qs", - "qspr", "qsmv", "qsmvpr"), ...) +rdd_bw_cct_plot(rdd_object, method = c("esmv", "es", "espr", "esmvpr", + "qs", "qspr", "qsmv", "qsmvpr"), ...) } \arguments{ \item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rdd_coef.Rd b/man/rdd_coef.Rd index e7a0e9c..ecf1ce5 100644 --- a/man/rdd_coef.Rd +++ b/man/rdd_coef.Rd @@ -10,7 +10,8 @@ rdd_coef(object, allInfo = FALSE, allCo = FALSE, ...) \method{rdd_coef}{default}(object, allInfo = FALSE, allCo = FALSE, ...) -\method{rdd_coef}{rdd_reg_np}(object, allInfo = FALSE, allCo = FALSE, ...) +\method{rdd_coef}{rdd_reg_np}(object, allInfo = FALSE, allCo = FALSE, + ...) } \arguments{ \item{object}{A RDD regression object} diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd index fe96cfd..a050123 100644 --- a/man/rdd_gen_reg.Rd +++ b/man/rdd_gen_reg.Rd @@ -5,9 +5,9 @@ \title{General polynomial estimator of the regression discontinuity} \usage{ rdd_gen_reg(rdd_object, fun = glm, covariates = NULL, order = 1, - bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy = - c("include", "residual"), slope = c("same", "separate"), bw = NULL), weights, - ...) + bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy + = c("include", "residual"), slope = c("same", "separate"), bw = NULL), + weights, ...) } \arguments{ \item{rdd_object}{Object of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rdd_reg_lm.Rd b/man/rdd_reg_lm.Rd index fffe367..5dfd8b0 100644 --- a/man/rdd_reg_lm.Rd +++ b/man/rdd_reg_lm.Rd @@ -5,8 +5,8 @@ \title{Parametric polynomial estimator of the regression discontinuity} \usage{ rdd_reg_lm(rdd_object, covariates = NULL, order = 1, bw = NULL, - slope = c("separate", "same"), covar.opt = list(strategy = c("include", - "residual"), slope = c("same", "separate"), bw = NULL), + slope = c("separate", "same"), covar.opt = list(strategy = + c("include", "residual"), slope = c("same", "separate"), bw = NULL), covar.strat = c("include", "residual"), weights) } \arguments{ From d05bc5216fdc8148e01122b94f247132c56fd1f2 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Jan 2020 15:46:06 +0100 Subject: [PATCH 219/323] bump version to stable --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 55bacb5..d7fe74c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 0.5.0 +Version: 1.0.0 Date: 2018-03-05 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for From 4714e7056518571f961e4a89acc0ff7a5101c8b9 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Jan 2020 16:04:39 +0100 Subject: [PATCH 220/323] redo using roxygen2 7.0.2 --- DESCRIPTION | 2 +- man/clusterInf.Rd | 3 +-- man/covarTest_dis.Rd | 26 +++++++++++++++++-------- man/covarTest_mean.Rd | 30 ++++++++++++++++++++--------- man/gen_mc_ik.Rd | 9 +++++++-- man/plot.rdd_data.Rd | 13 ++++++++++--- man/plotBin.Rd | 18 +++++++++++++++--- man/plotPlacebo.Rd | 42 ++++++++++++++++++++++++++++++++--------- man/plotSensi.Rd | 42 +++++++++++++++++++++++++++++++++-------- man/rdd_bw_cct_estim.Rd | 10 +++++++--- man/rdd_bw_cct_plot.Rd | 7 +++++-- man/rdd_coef.Rd | 3 +-- man/rdd_gen_reg.Rd | 16 ++++++++++++---- man/rdd_pred.Rd | 11 +++++++++-- man/rdd_reg_lm.Rd | 15 +++++++++++---- man/rdd_reg_np.Rd | 11 ++++++++--- man/rddtools.Rd | 1 - 17 files changed, 193 insertions(+), 66 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d7fe74c..7d5e375 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,4 +31,4 @@ License: GPL (>= 2) URL: http://qua.st/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 6.1.1 +RoxygenNote: 7.0.2 diff --git a/man/clusterInf.Rd b/man/clusterInf.Rd index 5fccec3..7a730e2 100644 --- a/man/clusterInf.Rd +++ b/man/clusterInf.Rd @@ -4,8 +4,7 @@ \alias{clusterInf} \title{Post-inference for clustered data} \usage{ -clusterInf(object, clusterVar, vcov. = NULL, type = c("df-adj", "HC"), - ...) +clusterInf(object, clusterVar, vcov. = NULL, type = c("df-adj", "HC"), ...) } \arguments{ \item{object}{Object of class lm, from which rdd_reg also inherits.} diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index 35c72dd..534eef0 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -6,16 +6,26 @@ \alias{covarTest_dis.rdd_reg} \title{Testing for balanced covariates: equality of distribution} \usage{ -covarTest_dis(object, bw, exact = NULL, p.adjust = c("none", "holm", - "BH", "BY", "hochberg", "hommel", "bonferroni")) +covarTest_dis( + object, + bw, + exact = NULL, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni") +) -\method{covarTest_dis}{rdd_data}(object, bw = NULL, exact = FALSE, - p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", - "bonferroni")) +\method{covarTest_dis}{rdd_data}( + object, + bw = NULL, + exact = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni") +) -\method{covarTest_dis}{rdd_reg}(object, bw = NULL, exact = FALSE, - p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", - "bonferroni")) +\method{covarTest_dis}{rdd_reg}( + object, + bw = NULL, + exact = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni") +) } \arguments{ \item{object}{object of class rdd_data} diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index e695dd9..86fca5f 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -6,17 +6,29 @@ \alias{covarTest_mean.rdd_reg} \title{Testing for balanced covariates: equality of means with t-test} \usage{ -covarTest_mean(object, bw = NULL, paired = FALSE, var.equal = FALSE, - p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", - "bonferroni")) +covarTest_mean( + object, + bw = NULL, + paired = FALSE, + var.equal = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni") +) -\method{covarTest_mean}{rdd_data}(object, bw = NULL, paired = FALSE, - var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", - "hochberg", "hommel", "bonferroni")) +\method{covarTest_mean}{rdd_data}( + object, + bw = NULL, + paired = FALSE, + var.equal = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni") +) -\method{covarTest_mean}{rdd_reg}(object, bw = NULL, paired = FALSE, - var.equal = FALSE, p.adjust = c("none", "holm", "BH", "BY", - "hochberg", "hommel", "bonferroni")) +\method{covarTest_mean}{rdd_reg}( + object, + bw = NULL, + paired = FALSE, + var.equal = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni") +) } \arguments{ \item{object}{object of class rdd_data} diff --git a/man/gen_mc_ik.Rd b/man/gen_mc_ik.Rd index 09ea638..70826f4 100644 --- a/man/gen_mc_ik.Rd +++ b/man/gen_mc_ik.Rd @@ -4,8 +4,13 @@ \alias{gen_mc_ik} \title{Generate Monte Carlo simulations of Imbens and Kalyanaraman} \usage{ -gen_mc_ik(n = 200, version = 1, sd = 0.1295, - output = c("data.frame", "rdd_data"), size) +gen_mc_ik( + n = 200, + version = 1, + sd = 0.1295, + output = c("data.frame", "rdd_data"), + size +) } \arguments{ \item{n}{The size of sampel to generate} diff --git a/man/plot.rdd_data.Rd b/man/plot.rdd_data.Rd index 62b5b44..155a8cd 100644 --- a/man/plot.rdd_data.Rd +++ b/man/plot.rdd_data.Rd @@ -4,9 +4,16 @@ \alias{plot.rdd_data} \title{Plot rdd_data} \usage{ -\method{plot}{rdd_data}(x, h = NULL, nbins = NULL, - xlim = range(object$x, na.rm = TRUE), cex = 0.7, nplot = 1, - device = c("base", "ggplot"), ...) +\method{plot}{rdd_data}( + x, + h = NULL, + nbins = NULL, + xlim = range(object$x, na.rm = TRUE), + cex = 0.7, + nplot = 1, + device = c("base", "ggplot"), + ... +) } \arguments{ \item{x}{Object of class rdd_data} diff --git a/man/plotBin.Rd b/man/plotBin.Rd index 307a57c..7f911c6 100644 --- a/man/plotBin.Rd +++ b/man/plotBin.Rd @@ -4,9 +4,21 @@ \alias{plotBin} \title{Bin plotting} \usage{ -plotBin(x, y, h = NULL, nbins = NULL, cutpoint = 0, plot = TRUE, - type = c("value", "number"), xlim = range(x, na.rm = TRUE), - cex = 0.9, main = NULL, xlab, ylab, ...) +plotBin( + x, + y, + h = NULL, + nbins = NULL, + cutpoint = 0, + plot = TRUE, + type = c("value", "number"), + xlim = range(x, na.rm = TRUE), + cex = 0.9, + main = NULL, + xlab, + ylab, + ... +) } \arguments{ \item{x}{Forcing variable} diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index 56a09cb..140db51 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -10,19 +10,43 @@ \usage{ plotPlacebo(object, device = c("ggplot", "base"), ...) -\method{plotPlacebo}{rdd_reg}(object, device = c("ggplot", "base"), - from = 0.25, to = 0.75, by = 0.1, level = 0.95, - same_bw = FALSE, vcov. = NULL, plot = TRUE, output = c("data", - "ggplot"), ...) +\method{plotPlacebo}{rdd_reg}( + object, + device = c("ggplot", "base"), + from = 0.25, + to = 0.75, + by = 0.1, + level = 0.95, + same_bw = FALSE, + vcov. = NULL, + plot = TRUE, + output = c("data", "ggplot"), + ... +) plotPlaceboDens(object, device = c("ggplot", "base"), ...) -\method{plotPlaceboDens}{rdd_reg}(object, device = c("ggplot", "base"), - from = 0.25, to = 0.75, by = 0.1, level = 0.95, - same_bw = FALSE, vcov. = NULL, ...) +\method{plotPlaceboDens}{rdd_reg}( + object, + device = c("ggplot", "base"), + from = 0.25, + to = 0.75, + by = 0.1, + level = 0.95, + same_bw = FALSE, + vcov. = NULL, + ... +) -computePlacebo(object, from = 0.25, to = 0.75, by = 0.1, - level = 0.95, same_bw = FALSE, vcov. = NULL) +computePlacebo( + object, + from = 0.25, + to = 0.75, + by = 0.1, + level = 0.95, + same_bw = FALSE, + vcov. = NULL +) } \arguments{ \item{object}{the output of an RDD regression} diff --git a/man/plotSensi.Rd b/man/plotSensi.Rd index 5c402fb..da793f1 100644 --- a/man/plotSensi.Rd +++ b/man/plotSensi.Rd @@ -6,16 +6,42 @@ \alias{plotSensi.rdd_reg_lm} \title{Plot the sensitivity to the bandwidth} \usage{ -plotSensi(rdd_regobject, from, to, by = 0.01, level = 0.95, - output = c("data", "ggplot"), plot = TRUE, ...) +plotSensi( + rdd_regobject, + from, + to, + by = 0.01, + level = 0.95, + output = c("data", "ggplot"), + plot = TRUE, + ... +) -\method{plotSensi}{rdd_reg_np}(rdd_regobject, from, to, by = 0.05, - level = 0.95, output = c("data", "ggplot"), plot = TRUE, - device = c("ggplot", "base"), vcov. = NULL, ...) +\method{plotSensi}{rdd_reg_np}( + rdd_regobject, + from, + to, + by = 0.05, + level = 0.95, + output = c("data", "ggplot"), + plot = TRUE, + device = c("ggplot", "base"), + vcov. = NULL, + ... +) -\method{plotSensi}{rdd_reg_lm}(rdd_regobject, from, to, by = 0.05, - level = 0.95, output = c("data", "ggplot"), plot = TRUE, order, - type = c("colour", "facet"), ...) +\method{plotSensi}{rdd_reg_lm}( + rdd_regobject, + from, + to, + by = 0.05, + level = 0.95, + output = c("data", "ggplot"), + plot = TRUE, + order, + type = c("colour", "facet"), + ... +) } \arguments{ \item{rdd_regobject}{object of a RDD regression, from either \code{\link{rdd_reg_lm}} or \code{\link{rdd_reg_np}}} diff --git a/man/rdd_bw_cct_estim.Rd b/man/rdd_bw_cct_estim.Rd index e7632ca..1eec0fd 100644 --- a/man/rdd_bw_cct_estim.Rd +++ b/man/rdd_bw_cct_estim.Rd @@ -4,9 +4,13 @@ \alias{rdd_bw_cct_estim} \title{Bandwidth selection for Regression Discontinuity estimators, CTT 2014} \usage{ -rdd_bw_cct_estim(rdd_object, method = c("mserd", "msetwo", "msesum", - "msecomb1", "msecomb2", "cerrd", "certwo", "cersum", "cercomb1"), - kernel = c("Triangular", "Uniform", "Epanechnikov"), ...) +rdd_bw_cct_estim( + rdd_object, + method = c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", "cerrd", "certwo", + "cersum", "cercomb1"), + kernel = c("Triangular", "Uniform", "Epanechnikov"), + ... +) } \arguments{ \item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rdd_bw_cct_plot.Rd b/man/rdd_bw_cct_plot.Rd index ae90174..aa650d2 100644 --- a/man/rdd_bw_cct_plot.Rd +++ b/man/rdd_bw_cct_plot.Rd @@ -4,8 +4,11 @@ \alias{rdd_bw_cct_plot} \title{Bandwidth selection for Regression Discontinuity visualisation, CTT 2015} \usage{ -rdd_bw_cct_plot(rdd_object, method = c("esmv", "es", "espr", "esmvpr", - "qs", "qspr", "qsmv", "qsmvpr"), ...) +rdd_bw_cct_plot( + rdd_object, + method = c("esmv", "es", "espr", "esmvpr", "qs", "qspr", "qsmv", "qsmvpr"), + ... +) } \arguments{ \item{rdd_object}{of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rdd_coef.Rd b/man/rdd_coef.Rd index ecf1ce5..e7a0e9c 100644 --- a/man/rdd_coef.Rd +++ b/man/rdd_coef.Rd @@ -10,8 +10,7 @@ rdd_coef(object, allInfo = FALSE, allCo = FALSE, ...) \method{rdd_coef}{default}(object, allInfo = FALSE, allCo = FALSE, ...) -\method{rdd_coef}{rdd_reg_np}(object, allInfo = FALSE, allCo = FALSE, - ...) +\method{rdd_coef}{rdd_reg_np}(object, allInfo = FALSE, allCo = FALSE, ...) } \arguments{ \item{object}{A RDD regression object} diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd index a050123..95612fd 100644 --- a/man/rdd_gen_reg.Rd +++ b/man/rdd_gen_reg.Rd @@ -4,10 +4,18 @@ \alias{rdd_gen_reg} \title{General polynomial estimator of the regression discontinuity} \usage{ -rdd_gen_reg(rdd_object, fun = glm, covariates = NULL, order = 1, - bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy - = c("include", "residual"), slope = c("same", "separate"), bw = NULL), - weights, ...) +rdd_gen_reg( + rdd_object, + fun = glm, + covariates = NULL, + order = 1, + bw = NULL, + slope = c("separate", "same"), + covar.opt = list(strategy = c("include", "residual"), slope = c("same", "separate"), + bw = NULL), + weights, + ... +) } \arguments{ \item{rdd_object}{Object of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rdd_pred.Rd b/man/rdd_pred.Rd index 9bf2255..1ccfe1a 100644 --- a/man/rdd_pred.Rd +++ b/man/rdd_pred.Rd @@ -4,8 +4,15 @@ \alias{rdd_pred} \title{RDD coefficient prediction} \usage{ -rdd_pred(object, covdata, se.fit = TRUE, vcov. = NULL, newdata, - stat = c("identity", "sum", "mean"), weights) +rdd_pred( + object, + covdata, + se.fit = TRUE, + vcov. = NULL, + newdata, + stat = c("identity", "sum", "mean"), + weights +) } \arguments{ \item{object}{A RDD regression object} diff --git a/man/rdd_reg_lm.Rd b/man/rdd_reg_lm.Rd index 5dfd8b0..1b38a9b 100644 --- a/man/rdd_reg_lm.Rd +++ b/man/rdd_reg_lm.Rd @@ -4,10 +4,17 @@ \alias{rdd_reg_lm} \title{Parametric polynomial estimator of the regression discontinuity} \usage{ -rdd_reg_lm(rdd_object, covariates = NULL, order = 1, bw = NULL, - slope = c("separate", "same"), covar.opt = list(strategy = - c("include", "residual"), slope = c("same", "separate"), bw = NULL), - covar.strat = c("include", "residual"), weights) +rdd_reg_lm( + rdd_object, + covariates = NULL, + order = 1, + bw = NULL, + slope = c("separate", "same"), + covar.opt = list(strategy = c("include", "residual"), slope = c("same", "separate"), + bw = NULL), + covar.strat = c("include", "residual"), + weights +) } \arguments{ \item{rdd_object}{Object of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rdd_reg_np.Rd b/man/rdd_reg_np.Rd index e3451e0..d4006a5 100644 --- a/man/rdd_reg_np.Rd +++ b/man/rdd_reg_np.Rd @@ -4,9 +4,14 @@ \alias{rdd_reg_np} \title{Parametric polynomial estimator of the regression discontinuity} \usage{ -rdd_reg_np(rdd_object, covariates = NULL, bw = rdd_bw_ik(rdd_object), - slope = c("separate", "same"), inference = c("np", "lm"), - covar.opt = list(slope = c("same", "separate"), bw = NULL)) +rdd_reg_np( + rdd_object, + covariates = NULL, + bw = rdd_bw_ik(rdd_object), + slope = c("separate", "same"), + inference = c("np", "lm"), + covar.opt = list(slope = c("same", "separate"), bw = NULL) +) } \arguments{ \item{rdd_object}{Object of class rdd_data created by \code{\link{rdd_data}}} diff --git a/man/rddtools.Rd b/man/rddtools.Rd index 095916f..8e2799d 100644 --- a/man/rddtools.Rd +++ b/man/rddtools.Rd @@ -3,7 +3,6 @@ \docType{package} \name{rddtools} \alias{rddtools} -\alias{rddtools-package} \title{Regression Discontinuity Design} \description{ Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From e7f3bcb52fbb70c524786dc8096c36bb2d7b3234 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Jan 2020 16:14:00 +0100 Subject: [PATCH 221/323] update NEWS --- NEWS | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index cf19385..3e0b8e0 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,20 @@ -RDDtools 0.5.0 +rddtools 1.0.0 +===================== + +* stable release + +* various mainenance updates + +* documentation updates + + +rddtools 0.5.0 ===================== * cleanup documentation -RDDtools 0.3.0 +rddtools 0.3.0 ===================== * development taken over by Bastiaan @@ -31,7 +41,8 @@ RDDtools 0.3.0 * fix empty package dependency bug -RDDtools 0.22 + +rddtools 0.22 =========== Updated on 21/5/14 @@ -44,7 +55,7 @@ Updated on 21/5/14 * Correct import, suggests, calls to ::: -RDDtools 0.21 +rddtools 0.21 =========== Updated on 25/7/13 @@ -60,7 +71,8 @@ Updated on 25/7/13 * Many small fixes -RDDtools 0.2 + +rddtools 0.2 =========== Updated on 16/7/13 @@ -72,7 +84,8 @@ Updated on 16/7/13 * Many fixes... -RDDtools 0.1 + +rddtools 0.1 =========== Initial commit on 29/04/2013 From 42ac847ff3f0b8aabd059927cdfc47c49cb5cece Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Jan 2020 16:14:10 +0100 Subject: [PATCH 222/323] update comments --- cran-comments.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index 78fd2f0..323acbf 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,9 +1,12 @@ ## Test environments -- local Windows 7 install, R 3.2.1 Rtools 3.3.0 -- local Linux (Arch) install, R 3.2.0 -- ubuntu 12.04 (on travis-ci), R 3.2.1 -- win-builder (devel and R 3.2.1) +- local Windows 7 install, R 3.6.2 +- local Linux (Arch) install, R 3.6.2 +- win-builder (devel) -## R CMD check results -There were no ERRORs or WARNINGs or notes +── R CMD check results ───────────────────────────────────── rddtools 1.0.0 ──── +Duration: 1m 15.1s + +0 errors ✓ | 0 warnings ✓ | 0 notes ✓ + +R CMD check succeeded From 206b4e612bc92a3540646caad6bb1d64ab899361 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Thu, 2 Jan 2020 16:17:12 +0100 Subject: [PATCH 223/323] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 933e0df..139353b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ rddtools [![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) [![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) -**rddtools** is a new R package under development, designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. +**rddtools** is an R package designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. Installing **rddtools** From cf511ddb067438bb8f7c12704f93a778c83b8339 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Jan 2020 10:04:25 +0100 Subject: [PATCH 224/323] update citation --- R/bw_cct_plot.R | 2 +- man/rdd_bw_cct_plot.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/bw_cct_plot.R b/R/bw_cct_plot.R index a5eb0ff..48f1a42 100644 --- a/R/bw_cct_plot.R +++ b/R/bw_cct_plot.R @@ -9,7 +9,7 @@ #' @param \ldots further arguments passed to \code{\link[rdrobust]{rdplot}}. #' @return See documentation of \code{\link[rdrobust]{rdplot}} #' @references Calonico, S., M. D. Cattaneo, and R. Titiunik. 2015a. Optimal Data-Driven Regression Discontinuity Plots. Journal of the American Statistical Association 110(512): 1753-1769. -#' \url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2015_JASA.pdf}. +#' \url{https://www.tandfonline.com/doi/abs/10.1080/01621459.2015.1017578}. #' @seealso \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) #' @author Original code written by Calonico, Cattaneo, Farrell and Titiuni, see \code{\link[rdrobust]{rdplot}} #' @importFrom rdrobust rdplot diff --git a/man/rdd_bw_cct_plot.Rd b/man/rdd_bw_cct_plot.Rd index aa650d2..5eff1df 100644 --- a/man/rdd_bw_cct_plot.Rd +++ b/man/rdd_bw_cct_plot.Rd @@ -33,7 +33,7 @@ rdd_bw_cct_plot(rd) } \references{ Calonico, S., M. D. Cattaneo, and R. Titiunik. 2015a. Optimal Data-Driven Regression Discontinuity Plots. Journal of the American Statistical Association 110(512): 1753-1769. -\url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2015_JASA.pdf}. +\url{https://www.tandfonline.com/doi/abs/10.1080/01621459.2015.1017578}. } \seealso{ \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) From 893ed69f73ba4cfce0b0e66bfdbb244d178094eb Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Jan 2020 10:37:18 +0100 Subject: [PATCH 225/323] fix link --- R/bw_cct_estim.R | 2 +- man/rdd_bw_cct_estim.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/bw_cct_estim.R b/R/bw_cct_estim.R index 669048d..4f3a99a 100644 --- a/R/bw_cct_estim.R +++ b/R/bw_cct_estim.R @@ -9,7 +9,7 @@ #' @param \ldots further arguments passed to \code{\link[rdrobust]{rdbwselect}}. #' @return See documentation of \code{\link[rdrobust]{rdbwselect}} #' @references Calonico, S., M. D. Cattaneo, and R. Titiunik. 2014a. Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs. Econometrica 82(6): 2295-2326. -#' \url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2014_ECMA.pdf}. +#' \url{https://www.tandfonline.com/doi/abs/10.1080/01621459.2015.1017578}. #' @seealso \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) #' @author Original code written by Calonico, Cattaneo, Farrell and Titiuni, see \code{\link[rdrobust]{rdbwselect}} #' @importFrom rdrobust rdbwselect diff --git a/man/rdd_bw_cct_estim.Rd b/man/rdd_bw_cct_estim.Rd index 1eec0fd..1e22ad1 100644 --- a/man/rdd_bw_cct_estim.Rd +++ b/man/rdd_bw_cct_estim.Rd @@ -36,7 +36,7 @@ rdd_bw_cct_estim(rd) } \references{ Calonico, S., M. D. Cattaneo, and R. Titiunik. 2014a. Robust Nonparametric Confidence Intervals for Regression-Discontinuity Designs. Econometrica 82(6): 2295-2326. -\url{http://www-personal.umich.edu/~cattaneo/papers/Calonico-Cattaneo-Titiunik_2014_ECMA.pdf}. +\url{https://www.tandfonline.com/doi/abs/10.1080/01621459.2015.1017578}. } \seealso{ \code{\link{rdd_bw_ik}} Local RDD bandwidth selector using the plug-in method of Imbens and Kalyanaraman (2012) From ee54d7ae7d8a1e6740ac60f6bf1cdb11680ba364 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Fri, 3 Jan 2020 10:38:23 +0100 Subject: [PATCH 226/323] update comments --- cran-comments.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cran-comments.md b/cran-comments.md index 323acbf..72e88e4 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -10,3 +10,10 @@ Duration: 1m 15.1s 0 errors ✓ | 0 warnings ✓ | 0 notes ✓ R CMD check succeeded + + +* checking for code/documentation mismatches ... WARNING +Variables with usage in documentation object 'STAR_MHE' but not in code: + 'STAR_MHE' + +STAR_MHE is documentation of a dataset, not a function From 8819cc9312ecfe1127bcfb369e6c6cfa69d92bbf Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 14:31:56 +0100 Subject: [PATCH 227/323] set encoding to UTF-8 --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 7d5e375..9c55e28 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,3 +32,4 @@ URL: http://qua.st/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr RoxygenNote: 7.0.2 +Encoding: UTF-8 From f45136659e580c918252993ce3ccea6097bf56bb Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 14:33:43 +0100 Subject: [PATCH 228/323] align title in different entries --- vignettes/rddtools.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd index d10f930..3e2da9b 100644 --- a/vignettes/rddtools.Rmd +++ b/vignettes/rddtools.Rmd @@ -4,7 +4,7 @@ author: "Matthieu Stigler" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{Data entry} + %\VignetteIndexEntry{rddtools} %\VignetteEngine{knitr::rmarkdown} \usepackage[utf8]{inputenc} --- From b170a9979b2df995de81e5c1bfcbd12f2e04dd72 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 14:35:12 +0100 Subject: [PATCH 229/323] vignette building stuff to ignore --- .Rbuildignore | 2 ++ .gitignore | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.Rbuildignore b/.Rbuildignore index 158b955..a9b960c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -4,3 +4,5 @@ misc ^\.travis\.yml$ ^cran-comments.md$ ^NEWS\.md$ +^doc$ +^Meta$ diff --git a/.gitignore b/.gitignore index 09a72cb..8c990fa 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .Rhistory .RData inst/doc +doc +Meta From c98919116653222ff99b9bd8ff0c41b59267cd11 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 14:41:50 +0100 Subject: [PATCH 230/323] cleanup vignettes --- vignettes/morocco.Rmd | 13 ++++++------- vignettes/rddtools.Rmd | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/vignettes/morocco.Rmd b/vignettes/morocco.Rmd index ebc5cf0..0b7a157 100644 --- a/vignettes/morocco.Rmd +++ b/vignettes/morocco.Rmd @@ -9,18 +9,17 @@ vignette: > %\VignetteEncoding{UTF-8} --- +```{r, echo = FALSE, message = FALSE} +knitr::opts_chunk$set(collapse = T, comment = "#>") +``` + we use the data from the Initiative Nationale du Development Humaine (INDH) a development project in Morocco. The data is included with the `rddtools` package under the name `indh`. -We start by loading the package. +We start by loading the package and the dataset. -```{r} +```{r, message=FALSE} library(rddtools) -``` - -We can now load the included data set. - -```{r} data("indh") ``` diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd index 3e2da9b..7db7cd3 100644 --- a/vignettes/rddtools.Rmd +++ b/vignettes/rddtools.Rmd @@ -6,7 +6,7 @@ output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{rddtools} %\VignetteEngine{knitr::rmarkdown} - \usepackage[utf8]{inputenc} + %\VignetteEncoding{UTF-8} --- From e0f17ad113443fc30fcf2eb72304ed9a84547325 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 15:10:50 +0100 Subject: [PATCH 231/323] correct windows test station to w10 --- cran-comments.md | 2 +- tests/testthat/test_rdddata.R | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index 72e88e4..aa0f521 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,6 +1,6 @@ ## Test environments -- local Windows 7 install, R 3.6.2 +- local Windows 10 install, R 3.6.2 - local Linux (Arch) install, R 3.6.2 - win-builder (devel) diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R index 29e7b37..823d964 100644 --- a/tests/testthat/test_rdddata.R +++ b/tests/testthat/test_rdddata.R @@ -1,6 +1,4 @@ -# test_e2r.R - -# load the decompr package +# load the rddtools package library(rddtools) # load the example data set From 6955126ed4d6ba8ba90f77b0da79729bb6ba9fd1 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 16:07:58 +0100 Subject: [PATCH 232/323] remove date --- DESCRIPTION | 1 - 1 file changed, 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9c55e28..935a482 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,5 @@ Package: rddtools Version: 1.0.0 -Date: 2018-03-05 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 314b54e2fb7a74ccfcba68f5422881a198e7f000 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 8 Jan 2020 16:08:08 +0100 Subject: [PATCH 233/323] add tests --- tests/testthat/test_plotPlacebo.R | 17 +++++++++++++++++ tests/testthat/test_plotSensi.R | 15 +++++++++++++++ tests/testthat/test_rdd_data.R | 12 ++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/testthat/test_plotPlacebo.R create mode 100644 tests/testthat/test_plotSensi.R create mode 100644 tests/testthat/test_rdd_data.R diff --git a/tests/testthat/test_plotPlacebo.R b/tests/testthat/test_plotPlacebo.R new file mode 100644 index 0000000..ff941ed --- /dev/null +++ b/tests/testthat/test_plotPlacebo.R @@ -0,0 +1,17 @@ +# load the rddtools package +library(rddtools) + +# load the example data set +data(house) + +# create rdd_data sets +reg_nonpara <- rdd_reg_np(rdd_object=rdd_data(y=house$y, x=house$x, cutpoint=0) ) + +# store plot in object +placeboplot <- plotPlacebo(reg_nonpara, device="ggplot") + + +test_that("rd: output values match", { + expect_equal( length(placeboplot), 8 ) + expect_equal( placeboplot$cutpoint[9], 0.563925 ) +}) diff --git a/tests/testthat/test_plotSensi.R b/tests/testthat/test_plotSensi.R new file mode 100644 index 0000000..b40e229 --- /dev/null +++ b/tests/testthat/test_plotSensi.R @@ -0,0 +1,15 @@ +# load the rddtools package +library(rddtools) + +# load the example data set +data(house) + +# create rdd_data sets +reg_nonpara <- rdd_reg_np(rdd_object=rdd_data(y=house$y, x=house$x, cutpoint=0) ) + +# store plot in object +sensiplot <- plotSensi(reg_nonpara) + +test_that("rd: output values match", { + expect_equal( length(sensiplot), 6 ) +}) diff --git a/tests/testthat/test_rdd_data.R b/tests/testthat/test_rdd_data.R new file mode 100644 index 0000000..4447fbf --- /dev/null +++ b/tests/testthat/test_rdd_data.R @@ -0,0 +1,12 @@ +# load the rddtools package +library(rddtools) + +# load the example data set +data(house) + +# create rdd_data sets +rdd_house <- rdd_data(y=house$y, x=house$x, cutpoint=0) + +test_that("rd: output values match", { + expect_equal( attributes(rdd_house)$cutpoint, 0 ) +}) From 38b1bcb79f8dd5970608e651b1cc5bf38b3511cc Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:12:24 +0200 Subject: [PATCH 234/323] Create R-cmd-check.yaml --- .github/workflows/R-cmd-check.yaml | 79 ++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .github/workflows/R-cmd-check.yaml diff --git a/.github/workflows/R-cmd-check.yaml b/.github/workflows/R-cmd-check.yaml new file mode 100644 index 0000000..39b7866 --- /dev/null +++ b/.github/workflows/R-cmd-check.yaml @@ -0,0 +1,79 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: windows-latest, r: '3.6'} + - {os: macOS-latest, r: '3.6'} + - {os: macOS-latest, r: 'devel'} + - {os: ubuntu-16.04, r: '3.6', rspm: "https://demo.rstudiopm.com/all/__linux__/xenial/latest"} + + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + RSPM: ${{ matrix.config.rspm }} + + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + with: + r-version: ${{ matrix.config.r }} + + - uses: r-lib/actions/setup-pandoc@master + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + shell: Rscript {0} + + - name: Cache R packages + if: runner.os != 'Windows' + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-r-${{ matrix.config.r }}-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-r-${{ matrix.config.r }}- + + - name: Install system dependencies + if: runner.os == 'Linux' + env: + RHUB_PLATFORM: linux-x86_64-ubuntu-gcc + run: | + Rscript -e "remotes::install_github('r-hub/sysreqs')" + sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))") + sudo -s eval "$sysreqs" + + - name: Install dependencies + run: | + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("rcmdcheck") + shell: Rscript {0} + + - name: Check + env: + _R_CHECK_CRAN_INCOMING_REMOTE_: false + run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") + shell: Rscript {0} + + - name: Upload check results + if: failure() + uses: actions/upload-artifact@master + with: + name: ${{ runner.os }}-r${{ matrix.config.r }}-results + path: check From 40bd01d204bb797ea59c104b29ccfd3a8a4ab03f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:13:00 +0200 Subject: [PATCH 235/323] Create test-coverage.yaml --- .github/workflows/test-coverage.yaml | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/test-coverage.yaml diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..1f9d0d2 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,43 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: test-coverage + +jobs: + test-coverage: + runs-on: macOS-latest + steps: + - uses: actions/checkout@v2 + + - uses: r-lib/actions/setup-r@master + + - uses: r-lib/actions/setup-pandoc@master + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + shell: Rscript {0} + + - name: Cache R packages + uses: actions/cache@v1 + with: + path: ${{ env.R_LIBS_USER }} + key: macOS-r-3.6-${{ hashFiles('.github/depends.Rds') }} + restore-keys: macOS-r-3.6- + + - name: Install dependencies + run: | + install.packages(c("remotes")) + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("covr") + shell: Rscript {0} + + - name: Test coverage + run: covr::codecov() + shell: Rscript {0} From f1d6681bb22a62e24c733abc4500f94a4f592776 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:16:28 +0200 Subject: [PATCH 236/323] cleanup README.md --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 139353b..58df49d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ rddtools -======================================================== +======== + + [![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) +[![R build status](https://github.com/bquast/rddtools/workflows/R-CMD-check/badge.svg)](https://github.com/bquast/rddtools/actions?workflow=R-CMD-check) +[![Coverage Status](https://img.shields.io/codecov/c/github/bquast/rddtools/master.svg)](https://codecov.io/bquast/rddtools/rddtools?branch=master) [![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) [![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) -[![Travis-CI Build Status](https://travis-ci.org/bquast/rddtools.png?branch=master)](https://travis-ci.org/bquast/rddtools) -[![Coverage Status](https://coveralls.io/repos/bquast/rddtools/badge.svg)](https://coveralls.io/r/bquast/rddtools) **rddtools** is an R package designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. @@ -16,8 +18,8 @@ Installing **rddtools** This github website hosts the source code. One of the easiest ways to install the package from github is by using the R package **devtools**: ```r -if (!require('devtools')) install.packages('devtools') -devtools::install_github( "bquast/rddtools" ) +if (!require('remotes')) install.packages('remotes') +remotes::install_github( "bquast/rddtools" ) ``` Note however the latest version of rddtools only works with R 3.0, and that you might need to install [Rtools](https://cran.r-project.org/bin/windows/Rtools/) if on Windows. @@ -28,7 +30,7 @@ Documentation The (preliminary) documentation is available in the help files directly, as well as in the *vignettes*. The vignettes can be accessed from R. ```r -vignette("rddtools") +vignette('rddtools') ``` rddtools: main features From fcada5d79a5d556afbbd235e04bd55552310ec2e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:17:18 +0200 Subject: [PATCH 237/323] NEWS -> NEWS.md --- NEWS => NEWS.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename NEWS => NEWS.md (100%) diff --git a/NEWS b/NEWS.md similarity index 100% rename from NEWS rename to NEWS.md From b77e1743d0c32322f85902d4b5eb530355412780 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:17:46 +0200 Subject: [PATCH 238/323] remove travis --- .travis.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b33e2eb..0000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: r -warnings_are_errors: true - -env: - global: - - CRAN: http://cran.rstudio.com - -r_packages: - - rmarkdown - - covr - -after_success: - - Rscript -e 'library(covr);coveralls()' - -notifications: - email: - on_success: change - on_failure: change From 1cbc1affc5ef5509cf1616d37185de3da3edcec0 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:18:16 +0200 Subject: [PATCH 239/323] new stable version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 935a482..83a2f63 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.0.0 +Version: 1.2.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From b289ab8ad4f21d037e668fc94f743534706b489c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:19:36 +0200 Subject: [PATCH 240/323] add 1.2.0 NEWS --- NEWS.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/NEWS.md b/NEWS.md index 3e0b8e0..094438d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,17 @@ +rddtools 1.2.0 +===================== + +* fix CRAN error + +* documentation cleanup + +* swtich to GitHub Actions + +* switch to codecov + +* test using R 4.0.0 + + rddtools 1.0.0 ===================== From d0b2f0f5c31ad95f8289a6a6af991e57b162a8dc Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:20:22 +0200 Subject: [PATCH 241/323] remove travis, add .github --- .Rbuildignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.Rbuildignore b/.Rbuildignore index a9b960c..08a34b4 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,7 +1,7 @@ misc ^.*\.Rproj$ +^.*\.github$ ^\.Rproj\.user$ -^\.travis\.yml$ ^cran-comments.md$ ^NEWS\.md$ ^doc$ From d0ff2d0e58e41d509f04cb3d3c0fbfc719ad4d38 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 12:21:36 +0200 Subject: [PATCH 242/323] update --- cran-comments.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index aa0f521..bfce4b1 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,13 +1,14 @@ ## Test environments -- local Windows 10 install, R 3.6.2 -- local Linux (Arch) install, R 3.6.2 -- win-builder (devel) - -── R CMD check results ───────────────────────────────────── rddtools 1.0.0 ──── -Duration: 1m 15.1s - -0 errors ✓ | 0 warnings ✓ | 0 notes ✓ +- local Windows 10 install, R 4.0.0 +- local Linux (Arch) install, R 4.0.0 +- GitHub Actions + - Windows Server 2019 (10.0.17763) + - MacOS (10.15) + - Ubuntu (16.04) , R 4.0.0 +- win-builder + - devel + - release R CMD check succeeded From 68713371b9b3ad153548ee13c6ff0a9a0717cb03 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 25 Apr 2020 13:21:10 -0700 Subject: [PATCH 243/323] Fix issue with help file --- R/covarTests.R | 2 -- man/covarTest_dis.Rd | 2 -- man/covarTest_mean.Rd | 2 -- 3 files changed, 6 deletions(-) diff --git a/R/covarTests.R b/R/covarTests.R index 19bff51..e11e43a 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -7,7 +7,6 @@ #' @param paired Argument of the \code{\link{t.test}} function: logical indicating whether you want paired t-tests. #' @param var.equal Argument of the \code{\link{t.test}} function: logical variable indicating whether to treat the two variances as being equal #' @param p.adjust Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function -#' @param \ldots currently not used #' @return A data frame with, for each covariate, the mean on each size, the difference, t-stat and ts p-value. #' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @seealso \code{\link{covarTest_dis}} for the Kolmogorov-Smirnov test of equality of distribution @@ -115,7 +114,6 @@ covarTest_mean_low <- function(covar, cutvar, cutpoint, bw = NULL, paired = FALS #' @param bw a bandwidth #' @param exact Argument of the \code{\link{ks.test}} function: NULL or a logical indicating whether an exact p-value should be computed. #' @param p.adjust Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function -#' @param \ldots currently not used #' @return A data frame with, for each covariate, the K-S statistic and its p-value. #' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> #' @seealso \code{\link{covarTest_mean}} for the t-test of equality of means diff --git a/man/covarTest_dis.Rd b/man/covarTest_dis.Rd index 534eef0..4de36e2 100644 --- a/man/covarTest_dis.Rd +++ b/man/covarTest_dis.Rd @@ -35,8 +35,6 @@ covarTest_dis( \item{exact}{Argument of the \code{\link{ks.test}} function: NULL or a logical indicating whether an exact p-value should be computed.} \item{p.adjust}{Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function} - -\item{\ldots}{currently not used} } \value{ A data frame with, for each covariate, the K-S statistic and its p-value. diff --git a/man/covarTest_mean.Rd b/man/covarTest_mean.Rd index 86fca5f..84dcba4 100644 --- a/man/covarTest_mean.Rd +++ b/man/covarTest_mean.Rd @@ -40,8 +40,6 @@ covarTest_mean( \item{var.equal}{Argument of the \code{\link{t.test}} function: logical variable indicating whether to treat the two variances as being equal} \item{p.adjust}{Whether to adjust the p-values for multiple testing. Uses the \code{\link{p.adjust}} function} - -\item{\ldots}{currently not used} } \value{ A data frame with, for each covariate, the mean on each size, the difference, t-stat and ts p-value. From 359261e5d8ad1037c6a0f982550861b2bd2442b6 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 22:30:30 +0200 Subject: [PATCH 244/323] redo documentation --- DESCRIPTION | 2 +- man/STAR_MHE.Rd | 6 ++++-- man/house.Rd | 6 ++++-- man/indh.Rd | 4 +++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 83a2f63..19d930d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,5 +30,5 @@ License: GPL (>= 2) URL: http://qua.st/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.0.2 +RoxygenNote: 7.1.0 Encoding: UTF-8 diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index a1e3f25..778bc5a 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -4,7 +4,8 @@ \name{STAR_MHE} \alias{STAR_MHE} \title{Transformation of the STAR dataset as used in Angrist and Pischke (2008)} -\format{A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, +\format{ +A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, all other are created by Angrist and Pischke STAT code. \describe{ \item{schidkn}{School ID in kindergarden (original variable, schoolidk in \code{\link[AER]{STAR}})} @@ -12,7 +13,8 @@ all other are created by Angrist and Pischke STAT code. \item{classid}{The id of the class (computed by A & P)} \item{cs}{Class size (computed by A & P)} \item{female, nwhite}{Various covariates (computed by A & P)} -}} +} +} \source{ Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website \url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. diff --git a/man/house.Rd b/man/house.Rd index fc96bf1..d37531b 100644 --- a/man/house.Rd +++ b/man/house.Rd @@ -4,11 +4,13 @@ \name{house} \alias{house} \title{Dataset used in Lee (2008)} -\format{A data frame with 6558 observations and two variables: +\format{ +A data frame with 6558 observations and two variables: \describe{ \item{x}{Vote at election t-1} \item{y}{Vote at election t} -}} +} +} \source{ Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity} } diff --git a/man/indh.Rd b/man/indh.Rd index 367ba70..3a9d71d 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -4,7 +4,9 @@ \name{indh} \alias{indh} \title{INDH data set} -\format{A data frame with two variables with 720 observations each} +\format{ +A data frame with two variables with 720 observations each +} \source{ Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} } From 121bbafb9d9e3823f4597251340e331dfbd13df6 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 25 Apr 2020 22:32:42 +0200 Subject: [PATCH 245/323] redoing this update??? --- vignettes/rddtools.Rmd | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd index 7db7cd3..a376326 100644 --- a/vignettes/rddtools.Rmd +++ b/vignettes/rddtools.Rmd @@ -107,14 +107,4 @@ Z <- data.frame(z1 = rnorm(n_Lee, sd=2), house_rdd_Z <- rdd_data(y = house$y, x = house$x, covar = Z, cutpoint = 0) ``` - -Run the tests: -```{r} -## test for equality of means around cutoff: -covarTest_mean(house_rdd_Z, bw=0.3) - -## Can also use function covarTest_dis() for Kolmogorov-Smirnov test: -covarTest_dis(house_rdd_Z, bw=0.3) -``` - Tests correctly reject equality of the second, and correctly do not reject equality for the first and third. From b7294275ecbfe10a05298549c5799ccba0997134 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 25 Apr 2020 15:13:32 -0700 Subject: [PATCH 246/323] tests: fix changes in bw_test, due to update in rdrobust --- tests/bw_all.Rout.save | 47 +++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/tests/bw_all.Rout.save b/tests/bw_all.Rout.save index 052ead0..1818250 100644 --- a/tests/bw_all.Rout.save +++ b/tests/bw_all.Rout.save @@ -32,7 +32,7 @@ The following objects are masked from ‘package:base’: Loading required package: sandwich Loading required package: survival Loading required package: np -Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-6) +Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-10) [vignette("np_faq",package="np") provides answers to frequently asked questions] [vignette("np",package="np") an overview] [vignette("entropy_np",package="np") an overview of entropy-based methods] @@ -313,16 +313,25 @@ Triangular.h_opt Uniform.h_opt Normal.h_opt > mapply(function(arg1, arg2) rdd_bw_cct_estim(rd_dat, method=arg1, kernel=arg2)$bws, + arg1 = rdd_bw_cct_estim_ARG_1, + arg2 = rdd_bw_cct_estim_ARG_2) - mserd msetwo msesum msecomb1 msecomb2 cerrd certwo -[1,] 0.1335798 0.1268747 0.1549915 0.1335798 0.1335798 0.0860800 0.08175915 -[2,] 0.1335798 0.1908366 0.1549915 0.1335798 0.1549915 0.0860800 0.12297680 -[3,] 0.2379239 0.2149461 0.2354573 0.2354573 0.2354573 0.2379239 0.21494611 -[4,] 0.2379239 0.3081993 0.2354573 0.2354573 0.2379239 0.2379239 0.30819933 - cersum cercomb1 -[1,] 0.0998779 0.0860800 -[2,] 0.0998779 0.0860800 -[3,] 0.2354573 0.2354573 -[4,] 0.2354573 0.2354573 +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." +[1] "Mass points detected in the running variable." + mserd msetwo msesum msecomb1 msecomb2 cerrd certwo +[1,] 0.1356263 0.1284715 0.1570765 0.1356263 0.1356263 0.08739878 0.08278814 +[2,] 0.1356263 0.1934515 0.1570765 0.1356263 0.1570765 0.08739878 0.12466184 +[3,] 0.2401720 0.2165579 0.2376643 0.2376643 0.2376643 0.24017201 0.21655788 +[4,] 0.2401720 0.3107726 0.2376643 0.2376643 0.2401720 0.24017201 0.31077256 + cersum cercomb1 +[1,] 0.1012215 0.08739878 +[2,] 0.1012215 0.08739878 +[3,] 0.2376643 0.23766427 +[4,] 0.2376643 0.23766427 > > ## CCT plot > rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", @@ -336,7 +345,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -349,7 +358,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -362,7 +371,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -375,7 +384,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -388,7 +397,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -401,7 +410,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -414,7 +423,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 @@ -427,7 +436,7 @@ Number of Obs. 6558 Kernel Uniform Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 +Eff. Number of Obs. 2740 3818 Order poly. fit (p) 4 4 BW poly. fit (h) 1.000 1.000 Number of bins scale 1 1 From 8a18eb05fe4865d686bf67a2964d2175550b0d02 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 26 Apr 2020 09:12:23 +0200 Subject: [PATCH 247/323] try with ubuntu latest and R 3.6 --- .github/workflows/R-cmd-check.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/R-cmd-check.yaml b/.github/workflows/R-cmd-check.yaml index 39b7866..4553046 100644 --- a/.github/workflows/R-cmd-check.yaml +++ b/.github/workflows/R-cmd-check.yaml @@ -21,7 +21,7 @@ jobs: - {os: windows-latest, r: '3.6'} - {os: macOS-latest, r: '3.6'} - {os: macOS-latest, r: 'devel'} - - {os: ubuntu-16.04, r: '3.6', rspm: "https://demo.rstudiopm.com/all/__linux__/xenial/latest"} + - {os: ubuntu-latest, r: '3.6', rspm: "https://demo.rstudiopm.com/all/__linux__/xenial/latest"} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true From f9742d053e4f78cb4785c9b27230bb3d121aa939 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 26 Apr 2020 09:37:00 +0200 Subject: [PATCH 248/323] switch to R 4.0 --- .github/workflows/R-cmd-check.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/R-cmd-check.yaml b/.github/workflows/R-cmd-check.yaml index 4553046..bd1e0af 100644 --- a/.github/workflows/R-cmd-check.yaml +++ b/.github/workflows/R-cmd-check.yaml @@ -18,10 +18,10 @@ jobs: fail-fast: false matrix: config: - - {os: windows-latest, r: '3.6'} - - {os: macOS-latest, r: '3.6'} + - {os: windows-latest, r: '4.0'} + - {os: macOS-latest, r: '4.0'} - {os: macOS-latest, r: 'devel'} - - {os: ubuntu-latest, r: '3.6', rspm: "https://demo.rstudiopm.com/all/__linux__/xenial/latest"} + - {os: ubuntu-latest, r: '4.0'} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true From 4b75adb0595c90d10f8b4967f36f6cbe0c8e0fda Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 26 Apr 2020 10:00:16 +0200 Subject: [PATCH 249/323] http -> https --- R/rddtools.R | 8 ++++---- README.md | 10 +++++----- cran-comments.md | 6 +++--- man/STAR_MHE.Rd | 4 ++-- man/house.Rd | 2 +- man/indh.Rd | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index 66b0e1b..cd61d4b 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -14,7 +14,7 @@ utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", #' @title INDH data set #' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" #' @format A data frame with two variables with 720 observations each -#' @source Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} +#' @source Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics} #' @references Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' #' @examples #' # load the data @@ -40,7 +40,7 @@ NULL #' \item{x}{Vote at election t-1} #' \item{y}{Vote at election t} #' } -#' @source Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity} +#' @source Guido Imbens webpage: \url{https://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity} #' @references Imbens, Guido and Karthik Kalyanaraman. (2012) 'Optimal Bandwidth Choice for the regression discontinuity estimator,' #' Review of Economic Studies (2012) 79, 933-959 #' @references Lee, D. (2008) Randomized experiments from non-random selection in U.S. House elections, @@ -69,13 +69,13 @@ NULL #' @details ). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. #' The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. #' The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website -#' (\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. +#' (\url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. #' @references Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' #' \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May. #' @references Angrist, A. ad Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, #' Princeton University press #' @source Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website -#' \url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. +#' \url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. #' @examples #' data(STAR_MHE) #' diff --git a/README.md b/README.md index 58df49d..1fffaad 100644 --- a/README.md +++ b/README.md @@ -61,12 +61,12 @@ rddtools: main features References ----------------------- - [Imbens and Kalyanaraman 2012]: http://ideas.repec.org/a/oup/restud/v79y2012i3p933-959.html "Imbens, G. & Kalyanaraman, K. (2012) Optimal Bandwidth Choice for the Regression Discontinuity Estimator, Review of Economic Studies, 79, 933-959" + [Imbens and Kalyanaraman 2012]: https://ideas.repec.org/a/oup/restud/v79y2012i3p933-959.html "Imbens, G. & Kalyanaraman, K. (2012) Optimal Bandwidth Choice for the Regression Discontinuity Estimator, Review of Economic Studies, 79, 933-959" - [Lee 2008]: http://ideas.repec.org/a/eee/econom/v142y2008i2p675-697.html "Lee, D. S. (2008) Randomized experiments from non-random selection in U.S. House elections, Journal of Econometrics, 142, 675-697" + [Lee 2008]: https://ideas.repec.org/a/eee/econom/v142y2008i2p675-697.html "Lee, D. S. (2008) Randomized experiments from non-random selection in U.S. House elections, Journal of Econometrics, 142, 675-697" - [Imbens and Lemieux 2008]: http://ideas.repec.org/a/eee/econom/v142y2008i2p615-635.html "Imbens, G. & Lemieux, T. (2008) Regression discontinuity designs: A guide to practice, Journal of Econometrics, Vol. 142(2), pages 615-635" + [Imbens and Lemieux 2008]: https://ideas.repec.org/a/eee/econom/v142y2008i2p615-635.html "Imbens, G. & Lemieux, T. (2008) Regression discontinuity designs: A guide to practice, Journal of Econometrics, Vol. 142(2), pages 615-635" - [Cameron et al. 2008]: http://ideas.repec.org/a/tpr/restat/v90y2008i3p414-427.html "Cameron, Gelbach and Miller (2008) Bootstrap-Based Improvements for Inference with Clustered Errors, The Review of Economics and Statistics, Vol. 90(3), pages 414-427" + [Cameron et al. 2008]: https://ideas.repec.org/a/tpr/restat/v90y2008i3p414-427.html "Cameron, Gelbach and Miller (2008) Bootstrap-Based Improvements for Inference with Clustered Errors, The Review of Economics and Statistics, Vol. 90(3), pages 414-427" - [Ruppert et al 1995]: http://www.jstor.org/stable/2291516 "Ruppert, D., Sheather, S. J. and Wand, M. P. (1995). An effective bandwidth selector for local least squares regression. Journal of the American Statistical Association, 90, 1257–1270." + [Ruppert et al 1995]: https://www.jstor.org/stable/2291516 "Ruppert, D., Sheather, S. J. and Wand, M. P. (1995). An effective bandwidth selector for local least squares regression. Journal of the American Statistical Association, 90, 1257–1270." diff --git a/cran-comments.md b/cran-comments.md index bfce4b1..4953a92 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -3,9 +3,9 @@ - local Windows 10 install, R 4.0.0 - local Linux (Arch) install, R 4.0.0 - GitHub Actions - - Windows Server 2019 (10.0.17763) - - MacOS (10.15) - - Ubuntu (16.04) , R 4.0.0 + - Windows Server 2019 (10.0.17763): R 4.0.0 + - MacOS (10.15): R 4.0.0 & devel + - Ubuntu (18.04): R 4.0.0 - win-builder - devel - release diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 778bc5a..1e88ca7 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -17,7 +17,7 @@ all other are created by Angrist and Pischke STAT code. } \source{ Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website -\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. +\url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. } \usage{ STAR_MHE @@ -29,7 +29,7 @@ Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke ). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website -(\url{http://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. +(\url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. } \examples{ data(STAR_MHE) diff --git a/man/house.Rd b/man/house.Rd index d37531b..cdbe867 100644 --- a/man/house.Rd +++ b/man/house.Rd @@ -12,7 +12,7 @@ A data frame with 6558 observations and two variables: } } \source{ -Guido Imbens webpage: \url{http://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity} +Guido Imbens webpage: \url{https://scholar.harvard.edu/imbens/scholar_software/regression-discontinuity} } \description{ Randomized experiments from non-random selection in U.S. House elections diff --git a/man/indh.Rd b/man/indh.Rd index 3a9d71d..80db39b 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -8,7 +8,7 @@ A data frame with two variables with 720 observations each } \source{ -Development Aid and social Dyanmics website: \url{http://qua.st/Development-Aid-Social-Dynamics} +Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics} } \description{ Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" From 7b8815717327d6c2eabd0054ad7dde8ab489437a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 26 Apr 2020 10:03:16 +0200 Subject: [PATCH 250/323] more httpsifying links --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1fffaad..51ecab2 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ rddtools ======== -[![License](http://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](http://www.gnu.org/licenses/gpl-3.0.html) -[![CRAN Version](http://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) +[![License](https://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](https://www.gnu.org/licenses/gpl-3.0.html) +[![CRAN Version](https://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) [![R build status](https://github.com/bquast/rddtools/workflows/R-CMD-check/badge.svg)](https://github.com/bquast/rddtools/actions?workflow=R-CMD-check) [![Coverage Status](https://img.shields.io/codecov/c/github/bquast/rddtools/master.svg)](https://codecov.io/bquast/rddtools/rddtools?branch=master) -[![Total RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) -[![RStudio Cloud Downloads](http://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) +[![Total RStudio Cloud Downloads](https://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) +[![RStudio Cloud Downloads](https://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) **rddtools** is an R package designed to offer a set of tools to run all the steps required for a Regression Discontinuity Design (RDD) Analysis, from primary data visualisation to discontinuity estimation, sensitivity and placebo testing. From f2f586b69f7e59c8d92ca407d160ebd3c7113e0f Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 12 Jul 2020 10:53:12 -0700 Subject: [PATCH 251/323] Fix issue with balance tests --- R/covarTests.R | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/R/covarTests.R b/R/covarTests.R index e11e43a..9d27434 100644 --- a/R/covarTests.R +++ b/R/covarTests.R @@ -48,8 +48,9 @@ covarTest_mean.rdd_data <- function(object, bw = NULL, paired = FALSE, var.equal covar <- getCovar(object) cutvar <- object$x - covarTest_mean_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, paired = paired, var.equal = var.equal, - p.adjust = p.adjust) + covarTest_mean_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, + bw = bw, paired = paired, var.equal = var.equal, + p.adjust = p.adjust) } @@ -86,14 +87,15 @@ covarTest_mean_low <- function(covar, cutvar, cutpoint, bw = NULL, paired = FALS regime <- cutvar < cutpoint ## Split data - covar_num <- sapply(covar, as.numeric) + covar_num <- sapply(covar, make_numeric) tests <- apply(covar_num, 2, function(x) t.test(x[regime], x[!regime], paired = paired, var.equal = var.equal)) tests_vals <- sapply(tests, function(x) c(x[["estimate"]], diff(x[["estimate"]]), x[c("statistic", "p.value")])) ## Adjust p values if required: - if (p.adjust != "none") + if (p.adjust != "none") { tests_vals["p.value", ] <- p.adjust(tests_vals["p.value", ], method = p.adjust) + } ## Print results res <- t(tests_vals) @@ -138,25 +140,27 @@ covarTest_mean_low <- function(covar, cutvar, cutpoint, bw = NULL, paired = FALS #' covarTest_dis(reg_nonpara) #' @export -covarTest_dis <- function(object, bw, exact = NULL, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni")) UseMethod("covarTest_dis") +covarTest_dis <- function(object, bw, exact = NULL, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni")) UseMethod("covarTest_dis") #' @rdname covarTest_dis #' @export -covarTest_dis.rdd_data <- function(object, bw = NULL, exact = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", - "bonferroni")) { +covarTest_dis.rdd_data <- function(object, bw = NULL, exact = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) covar <- getCovar(object) cutvar <- object$x - covarTest_dis_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, exact = exact, p.adjust = p.adjust) + covarTest_dis_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, + exact = exact, p.adjust = p.adjust) } #' @rdname covarTest_dis #' @export -covarTest_dis.rdd_reg <- function(object, bw = NULL, exact = FALSE, p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", - "bonferroni")) { +covarTest_dis.rdd_reg <- function(object, bw = NULL, exact = FALSE, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni")) { cutpoint <- getCutpoint(object) dat <- object$RDDslot$rdd_data @@ -165,12 +169,13 @@ covarTest_dis.rdd_reg <- function(object, bw = NULL, exact = FALSE, p.adjust = c if (is.null(bw)) bw <- getBW(object) - covarTest_dis_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, exact = exact, p.adjust = p.adjust) + covarTest_dis_low(covar = covar, cutvar = cutvar, cutpoint = cutpoint, bw = bw, + exact = exact, p.adjust = p.adjust) } -covarTest_dis_low <- function(covar, cutvar, cutpoint, bw = NULL, exact = NULL, p.adjust = c("none", "holm", "BH", "BY", "hochberg", - "hommel", "bonferroni")) { +covarTest_dis_low <- function(covar, cutvar, cutpoint, bw = NULL, exact = NULL, + p.adjust = c("none", "holm", "BH", "BY", "hochberg", "hommel", "bonferroni")) { p.adjust <- match.arg(p.adjust) @@ -185,7 +190,7 @@ covarTest_dis_low <- function(covar, cutvar, cutpoint, bw = NULL, exact = NULL, ## Split data - covar_num <- sapply(covar, as.numeric) + covar_num <- sapply(covar, make_numeric) tests <- apply(covar_num, 2, function(x) ks.test(x[regime], x[!regime], exact = exact)) tests_vals <- sapply(tests, function(x) x[c("statistic", "p.value")]) @@ -200,3 +205,9 @@ covarTest_dis_low <- function(covar, cutvar, cutpoint, bw = NULL, exact = NULL, } + +## small utility function +make_numeric <- function(x){ + if(is.character(x)) x <- as.factor(x) + as.numeric(x) +} \ No newline at end of file From d84f262254e80d95e2a7048cecc6014d7d4304a5 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 12 Jul 2020 10:58:17 -0700 Subject: [PATCH 252/323] fix documentation error --- R/rddtools.R | 3 ++- man/STAR_MHE.Rd | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index cd61d4b..7da4fdb 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -51,11 +51,12 @@ NULL #' summary(rdd_house) #' plot(rdd_house) NULL + + #' @name STAR_MHE #' @docType data #' @title Transformation of the STAR dataset as used in Angrist and Pischke (2008) #' @description Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke (2008) -#' @usage STAR_MHE #' @seealso \code{\link[AER]{STAR}} for the original dataset. #' @format A data frame containing 5743 observations and 6 variables. The first variable is from the original dataset, #' all other are created by Angrist and Pischke STAT code. diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 1e88ca7..c981769 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -19,9 +19,6 @@ all other are created by Angrist and Pischke STAT code. Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website \url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. } -\usage{ -STAR_MHE -} \description{ Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke (2008) } From b0bc027c2cbdec96aa576b3956f088cd7e31cba4 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 22 Jul 2020 18:44:41 +0200 Subject: [PATCH 253/323] new roxygen version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 19d930d..925d212 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,5 +30,5 @@ License: GPL (>= 2) URL: http://qua.st/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.1.0 +RoxygenNote: 7.1.1 Encoding: UTF-8 From 2122916b241b653dd85445da274807e677ab6436 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 22 Jul 2020 20:49:08 +0200 Subject: [PATCH 254/323] update CRAN-comments.md --- cran-comments.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index 4953a92..1d42f24 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,7 +1,7 @@ ## Test environments -- local Windows 10 install, R 4.0.0 -- local Linux (Arch) install, R 4.0.0 +- local Windows 10 install, R 4.0.2 +- local Linux (Arch) install, R 4.0.2 - GitHub Actions - Windows Server 2019 (10.0.17763): R 4.0.0 - MacOS (10.15): R 4.0.0 & devel @@ -12,9 +12,10 @@ R CMD check succeeded - * checking for code/documentation mismatches ... WARNING Variables with usage in documentation object 'STAR_MHE' but not in code: 'STAR_MHE' STAR_MHE is documentation of a dataset, not a function + +This is a rerelease of a package previously on CRAN under the same name, also maintained by me, following the changes to stringAsFactors default change. From 35cceb6a6b25af167f9825c39adc0d8f3c5a9218 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 22 Jul 2020 21:33:53 +0200 Subject: [PATCH 255/323] add rmarkdown dependency --- DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 925d212..1fe9840 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,8 @@ Imports: Formula, locpol, methods, - rdrobust + rdrobust, + rmarkdown Depends: AER, np From 307e0ad748bbbf3930619f696dc6539cb9a61e63 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 22 Jul 2020 21:34:41 +0200 Subject: [PATCH 256/323] add note on URL --- cran-comments.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cran-comments.md b/cran-comments.md index 1d42f24..c7ddf66 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -19,3 +19,5 @@ Variables with usage in documentation object 'STAR_MHE' but not in code: STAR_MHE is documentation of a dataset, not a function This is a rerelease of a package previously on CRAN under the same name, also maintained by me, following the changes to stringAsFactors default change. + +There is a note about a possibly invalid URL, it is mistaken, the URL works. From f0c8809da64df6e7308657c392d8b42ef3098144 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2020 22:08:45 +0200 Subject: [PATCH 257/323] yeah devtools okay --- .Rbuildignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.Rbuildignore b/.Rbuildignore index 08a34b4..3594482 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,3 +6,4 @@ misc ^NEWS\.md$ ^doc$ ^Meta$ +^CRAN-RELEASE$ From ee2cd14e6a02fe4b618fe7fa06e1fab6f4dce083 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 27 Jul 2020 22:29:39 +0200 Subject: [PATCH 258/323] mac-devel on GA is just bugged --- .github/workflows/R-cmd-check.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/R-cmd-check.yaml b/.github/workflows/R-cmd-check.yaml index bd1e0af..d5e93bb 100644 --- a/.github/workflows/R-cmd-check.yaml +++ b/.github/workflows/R-cmd-check.yaml @@ -20,7 +20,6 @@ jobs: config: - {os: windows-latest, r: '4.0'} - {os: macOS-latest, r: '4.0'} - - {os: macOS-latest, r: 'devel'} - {os: ubuntu-latest, r: '4.0'} env: From 715f0c8a30f87002116dcf3462015d94dc12b77f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 29 Jul 2020 21:28:16 +0200 Subject: [PATCH 259/323] small fix apparantly needed --- DESCRIPTION | 2 +- R/rddtools.R | 1 - man/indh.Rd | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 1fe9840..310474b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.2.0 +Version: 1.4.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. diff --git a/R/rddtools.R b/R/rddtools.R index 7da4fdb..6dc4c72 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -28,7 +28,6 @@ utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", #' #' # perform non-parametric regression #' ( reg_np_indh <- rdd_reg_np(rdd_dat_indh) ) -#' plot(reg_np_indh) NULL #' @name house #' @docType data diff --git a/man/indh.Rd b/man/indh.Rd index 80db39b..a0d122d 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -25,7 +25,6 @@ summary(rdd_dat_indh) # perform non-parametric regression ( reg_np_indh <- rdd_reg_np(rdd_dat_indh) ) -plot(reg_np_indh) } \references{ Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' From f546a3ecb4b7d1f3e6457710995080d40fe8f4ef Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 29 Jul 2020 21:39:09 +0200 Subject: [PATCH 260/323] small change --- .Rbuildignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.Rbuildignore b/.Rbuildignore index 3594482..0851fc9 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -3,7 +3,6 @@ misc ^.*\.github$ ^\.Rproj\.user$ ^cran-comments.md$ -^NEWS\.md$ ^doc$ ^Meta$ ^CRAN-RELEASE$ From 6b9326e7bbb1828b4a0b3566ce669667b34a819b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 2 Aug 2020 14:24:35 +0200 Subject: [PATCH 261/323] remove another plot --- vignettes/morocco.Rmd | 6 ------ 1 file changed, 6 deletions(-) diff --git a/vignettes/morocco.Rmd b/vignettes/morocco.Rmd index 0b7a157..a73c490 100644 --- a/vignettes/morocco.Rmd +++ b/vignettes/morocco.Rmd @@ -73,12 +73,6 @@ We can now continue with a standard Regression Discontinuity Design (RDD) estima (reg_para <- rdd_reg_lm(rdd_dat_indh, order=4)) ``` -and visualising this estimation. - -```{r} -plot(reg_para) -``` - In addition to the parametric estimation, we can also perform a non-parametric estimation. ```{r} From e2dec5d408b2e2af0c00ecbdb05ebdd39149ed12 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 2 Aug 2020 14:31:03 +0200 Subject: [PATCH 262/323] update note --- cran-comments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cran-comments.md b/cran-comments.md index c7ddf66..a96bb25 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -20,4 +20,4 @@ STAR_MHE is documentation of a dataset, not a function This is a rerelease of a package previously on CRAN under the same name, also maintained by me, following the changes to stringAsFactors default change. -There is a note about a possibly invalid URL, it is mistaken, the URL works. +There is a note about a possibly invalid URL, the URL works (JSTOR stable). From 687ccc7443793118f10a8661365188b2b13ba154 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 4 Aug 2020 13:56:18 +0200 Subject: [PATCH 263/323] remove one more plot --- CRAN-RELEASE | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CRAN-RELEASE diff --git a/CRAN-RELEASE b/CRAN-RELEASE new file mode 100644 index 0000000..7c32fc1 --- /dev/null +++ b/CRAN-RELEASE @@ -0,0 +1,2 @@ +This package was submitted to CRAN on 2020-08-02. +Once it is accepted, delete this file and tag the release (commit e442f40). From 88eb8dbdac6bc1684fb611c14da4fce3e7ac5da8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 4 Aug 2020 13:57:07 +0200 Subject: [PATCH 264/323] remove one more plot, the previous commit was this stupid devtools behaviour --- vignettes/morocco.Rmd | 6 ------ 1 file changed, 6 deletions(-) diff --git a/vignettes/morocco.Rmd b/vignettes/morocco.Rmd index a73c490..9f0795a 100644 --- a/vignettes/morocco.Rmd +++ b/vignettes/morocco.Rmd @@ -80,12 +80,6 @@ bw_ik <- rdd_bw_ik(rdd_dat_indh) (reg_nonpara <- rdd_reg_np(rdd_object=rdd_dat_indh, bw=bw_ik)) ``` -and visualising the non-parametric estimation. - -```{r} -plot(reg_nonpara) -``` - Sensitity tests. ```{r} From c8059f4aa64f8d8616b1b5bdc2ef1fb962f81e82 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Tue, 4 Aug 2020 13:58:09 +0200 Subject: [PATCH 265/323] yet another plot removed --- vignettes/rddtools.Rmd | 1 - 1 file changed, 1 deletion(-) diff --git a/vignettes/rddtools.Rmd b/vignettes/rddtools.Rmd index a376326..02c1126 100644 --- a/vignettes/rddtools.Rmd +++ b/vignettes/rddtools.Rmd @@ -59,7 +59,6 @@ Run a simple local regression, using the [Imbens and Kalyanaraman 2012] bandwidt bw_ik <- rdd_bw_ik(house_rdd) reg_nonpara <- rdd_reg_np(rdd_object=house_rdd, bw=bw_ik) print(reg_nonpara) -plot(x=reg_nonpara) ``` # Regression Sensitivity tests: From 7ec2d1bdda9fdeed51ee45476ff1dd507ca26983 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 5 Aug 2020 12:15:19 +0200 Subject: [PATCH 266/323] devtools nonsense --- CRAN-RELEASE | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 CRAN-RELEASE diff --git a/CRAN-RELEASE b/CRAN-RELEASE deleted file mode 100644 index 7c32fc1..0000000 --- a/CRAN-RELEASE +++ /dev/null @@ -1,2 +0,0 @@ -This package was submitted to CRAN on 2020-08-02. -Once it is accepted, delete this file and tag the release (commit e442f40). From 1cff22da94f74e36011471cb66320a9a79a16362 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Wed, 5 Aug 2020 16:13:26 +0200 Subject: [PATCH 267/323] remove codecov --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 51ecab2..836328c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ rddtools [![License](https://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](https://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](https://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) [![R build status](https://github.com/bquast/rddtools/workflows/R-CMD-check/badge.svg)](https://github.com/bquast/rddtools/actions?workflow=R-CMD-check) -[![Coverage Status](https://img.shields.io/codecov/c/github/bquast/rddtools/master.svg)](https://codecov.io/bquast/rddtools/rddtools?branch=master) [![Total RStudio Cloud Downloads](https://cranlogs.r-pkg.org/badges/grand-total/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) [![RStudio Cloud Downloads](https://cranlogs.r-pkg.org/badges/rddtools?color=brightgreen)](https://cran.r-project.org/package=rddtools) From 292327633d5f5beab0fc9dc4f8e197e9fa27998f Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 23 Nov 2020 10:19:42 -0800 Subject: [PATCH 268/323] Fix typose --- NEWS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 094438d..f105b20 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,7 +5,7 @@ rddtools 1.2.0 * documentation cleanup -* swtich to GitHub Actions +* switch to GitHub Actions * switch to codecov @@ -17,7 +17,7 @@ rddtools 1.0.0 * stable release -* various mainenance updates +* various maintenance updates * documentation updates From 979707b0d19c108ae2731f76ffc2fb059458f57d Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 23 Nov 2020 10:23:21 -0800 Subject: [PATCH 269/323] Add publication dates, and notes for 1.4 --- NEWS.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/NEWS.md b/NEWS.md index f105b20..4f7f25a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,13 @@ +rddtools 1.4.0 +===================== +Published on 2020-08-07 + +* fix CRAN error + + rddtools 1.2.0 ===================== +Published on 2020-07-22 * fix CRAN error From cb01ffacbc58146fd6b764777a16bbeffd54636b Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 23 Nov 2020 10:23:53 -0800 Subject: [PATCH 270/323] Matthieu add own ORCID info as author --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 310474b..cb43a7f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -4,7 +4,7 @@ Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. Authors@R: c( - person("Matthieu", "Stigler", role = "aut"), + person("Matthieu", "Stigler", role = "aut", comment =c(ORCID="0000-0002-6802-4290")), person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ) ) Maintainer: Bastiaan Quast From a8f1fac8de3fe9eb5f11b5a386361d0be1ae8db0 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 23 Nov 2020 16:41:25 -0800 Subject: [PATCH 271/323] Version increment --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index cb43a7f..41fa241 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.4.0 +Version: 1.4.1 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From a55554d955de71906ba49e4e471b04d1298a9e2b Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Mon, 23 Nov 2020 16:59:24 -0800 Subject: [PATCH 272/323] add R memo for itnernal tests --- inst/devtools_internal_tests.R | 1 + 1 file changed, 1 insertion(+) create mode 100644 inst/devtools_internal_tests.R diff --git a/inst/devtools_internal_tests.R b/inst/devtools_internal_tests.R new file mode 100644 index 0000000..d8a5cc4 --- /dev/null +++ b/inst/devtools_internal_tests.R @@ -0,0 +1 @@ +devtools::check_rhub(email="Matthieu.Stigler@gmail.com", interactive=FALSE) From 2076b0ec46f0682e75b9a73c6f2d800fa74c3b88 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Wed, 2 Dec 2020 10:25:53 -0800 Subject: [PATCH 273/323] Add Mat'as email --- DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 41fa241..5de4dda 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -4,7 +4,8 @@ Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. Authors@R: c( - person("Matthieu", "Stigler", role = "aut", comment =c(ORCID="0000-0002-6802-4290")), + person("Matthieu", "Stigler", role = "aut", comment =c(ORCID="0000-0002-6802-4290"), + email="Matthieu.Stigler@gmail.com"), person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ) ) Maintainer: Bastiaan Quast From 9bf7c4f2dc3e201fd74cee53607ca3db6daa77fb Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 06:57:35 -0600 Subject: [PATCH 274/323] switch R to release --- .github/workflows/R-cmd-check.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/R-cmd-check.yaml b/.github/workflows/R-cmd-check.yaml index d5e93bb..c90f5a0 100644 --- a/.github/workflows/R-cmd-check.yaml +++ b/.github/workflows/R-cmd-check.yaml @@ -18,9 +18,9 @@ jobs: fail-fast: false matrix: config: - - {os: windows-latest, r: '4.0'} - - {os: macOS-latest, r: '4.0'} - - {os: ubuntu-latest, r: '4.0'} + - {os: windows-latest, r: 'release'} + - {os: macOS-latest, r: 'release'} + - {os: ubuntu-latest, r: 'release'} env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: true From 9ba4a53b967918126b4440bbbbe6e568ed1e10a2 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:11:13 -0600 Subject: [PATCH 275/323] fix URL --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5de4dda..d271d07 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,7 +29,7 @@ Suggests: knitr, testthat License: GPL (>= 2) -URL: http://qua.st/rddtools +URL: https://qua.st/rddtools/ BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr RoxygenNote: 7.1.1 From e0dafdf934f42639449f9ee87f5495563a6444d0 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:14:04 -0600 Subject: [PATCH 276/323] fix URL --- R/rddtools.R | 2 +- man/indh.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index 6dc4c72..1563bd1 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -14,7 +14,7 @@ utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", #' @title INDH data set #' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" #' @format A data frame with two variables with 720 observations each -#' @source Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics} +#' @source Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics/} #' @references Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' #' @examples #' # load the data diff --git a/man/indh.Rd b/man/indh.Rd index a0d122d..167da3e 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -8,7 +8,7 @@ A data frame with two variables with 720 observations each } \source{ -Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics} +Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics/} } \description{ Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" From e4cc4740fb94f85b394e8050df39eb99827fc6c2 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:18:14 -0600 Subject: [PATCH 277/323] remove another URL for CRAN --- R/bw_rot.R | 2 +- man/rot_bw.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/bw_rot.R b/R/bw_rot.R index 3fd1d89..ad58e2c 100644 --- a/R/bw_rot.R +++ b/R/bw_rot.R @@ -3,7 +3,7 @@ #' implements dpill #' #' @param object object of class rdd_data -#' @references McCrary, Justin. (2008) 'Manipulation of the running variable in the regression discontinuity design: A density test,' \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +#' @references McCrary, Justin. (2008) 'Manipulation of the running variable in the regression discontinuity design: A density test,' \emph{Journal of Econometrics}. 142(2): 698-714. #' @export #' @examples #' #No discontinuity diff --git a/man/rot_bw.Rd b/man/rot_bw.Rd index 97fdfc2..6928ff5 100644 --- a/man/rot_bw.Rd +++ b/man/rot_bw.Rd @@ -16,5 +16,5 @@ implements dpill #No discontinuity } \references{ -McCrary, Justin. (2008) 'Manipulation of the running variable in the regression discontinuity design: A density test,' \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +McCrary, Justin. (2008) 'Manipulation of the running variable in the regression discontinuity design: A density test,' \emph{Journal of Econometrics}. 142(2): 698-714. } From 13ca7fd5d0492cbccbdc5004a1a2dc966f11f4f0 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:19:12 -0600 Subject: [PATCH 278/323] remove this error causing thing --- tests/bw_all.R | 65 ------ tests/bw_all.Rout.save | 461 ----------------------------------------- 2 files changed, 526 deletions(-) delete mode 100644 tests/bw_all.R delete mode 100644 tests/bw_all.Rout.save diff --git a/tests/bw_all.R b/tests/bw_all.R deleted file mode 100644 index 9f41e7a..0000000 --- a/tests/bw_all.R +++ /dev/null @@ -1,65 +0,0 @@ -library(rddtools) - -# load the example data set -data(house) - -# create rdd_data sets -set.seed(123) -cov_df <- data.frame(cov=rnorm(nrow(house))) -set.seed(123) -z_fake <- ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0) -rd_dat <- rdd_data(x=x, y=y, data=house, cutpoint=0) -rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, z=ifelse(house$x>0,1,0), cutpoint=0) -rd_dat_fuzzy <- rdd_data(x=house$x, y=house$y, z=z_fake, - cutpoint=0, covar=cov_df) -rd_dat_covar <- rdd_data(x=house$x, y=house$y, covar=cov_df, cutpoint=0) - -summary(rd_dat) -summary(rd_dat_fakefuzzy) -summary(rd_dat_fuzzy) -summary(rd_dat_covar) - -reg_lm <- rdd_reg_lm(rd_dat) -reg_lm_covar <- rdd_reg_lm(rd_dat_covar, covariates="cov") -reg_lm_fak_fuz <- rdd_reg_lm(rd_dat_fakefuzzy) -reg_lm_fuz <- rdd_reg_lm(rd_dat_fuzzy) -# reg_lm_fuz_cov <- rdd_reg_lm(rd_dat_fuzzy, covariates="cov") -reg_np <- rdd_reg_np(rd_dat) - -reg_dat <- list(reg_lm=reg_lm, reg_np=reg_np, - reg_lm_fak_fuz=reg_lm_fak_fuz, reg_lm_fuz=reg_lm_fuz, - reg_lm_covar=reg_lm_covar) - - -res <- lapply(reg_dat, print) -lapply(reg_dat, summary) -lapply(reg_dat, coef) - -## plots -plot(rd_dat) -plot(reg_np) -plot(reg_lm) - -## IK -mapply(function(kernel) rdd_bw_ik(rd_dat, kernel=kernel), kernel = c("Triangular", "Uniform", "Normal")) - -## CCT estim -rdd_bw_cct_estim_ARG_1 <- c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", - "cerrd", "certwo", "cersum", "cercomb1") -rdd_bw_cct_estim_ARG_2 <- c("Triangular", "Uniform", "Epanechnikov") -mapply(function(arg1, arg2) rdd_bw_cct_estim(rd_dat, method=arg1, kernel=arg2)$bws, - arg1 = rdd_bw_cct_estim_ARG_1, - arg2 = rdd_bw_cct_estim_ARG_2) - -## CCT plot -rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", - "qs", "qspr", "qsmv", "qsmvpr") -mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1), - arg1 = rdd_bw_cct_plot_ARG_1, SIMPLIFY=FALSE) - -## rsw -rdd_bw_rsw_ARG_1 <- c("global", "sided") -mapply(function(arg1) rdd_bw_rsw(rd_dat, type=arg1), - arg1 = rdd_bw_rsw_ARG_1) - - diff --git a/tests/bw_all.Rout.save b/tests/bw_all.Rout.save deleted file mode 100644 index 1818250..0000000 --- a/tests/bw_all.Rout.save +++ /dev/null @@ -1,461 +0,0 @@ - -R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch" -Copyright (C) 2016 The R Foundation for Statistical Computing -Platform: x86_64-pc-linux-gnu (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(rddtools) -Loading required package: AER -Loading required package: car -Loading required package: lmtest -Loading required package: zoo - -Attaching package: ‘zoo’ - -The following objects are masked from ‘package:base’: - - as.Date, as.Date.numeric - -Loading required package: sandwich -Loading required package: survival -Loading required package: np -Nonparametric Kernel Methods for Mixed Datatypes (version 0.60-10) -[vignette("np_faq",package="np") provides answers to frequently asked questions] -[vignette("np",package="np") an overview] -[vignette("entropy_np",package="np") an overview of entropy-based methods] -> -> # load the example data set -> data(house) -> -> # create rdd_data sets -> set.seed(123) -> cov_df <- data.frame(cov=rnorm(nrow(house))) -> set.seed(123) -> z_fake <- ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0) -> rd_dat <- rdd_data(x=x, y=y, data=house, cutpoint=0) -> rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, z=ifelse(house$x>0,1,0), cutpoint=0) -> rd_dat_fuzzy <- rdd_data(x=house$x, y=house$y, z=z_fake, -+ cutpoint=0, covar=cov_df) -> rd_dat_covar <- rdd_data(x=house$x, y=house$y, covar=cov_df, cutpoint=0) -> -> summary(rd_dat) -### rdd_data object ### - -Cutpoint: 0 -Type: Sharp -Sample size: - -Full : 6558 - -Left : 2740 - -Right: 3818 -Covariates: no -> summary(rd_dat_fakefuzzy) -### rdd_data object ### - -Cutpoint: 0 -Type: Fuzzy -Sample size: - -Full : 6558 - -Left : 2740 , untreated: 2740 - -Right: 3818 , treated: 3818 -Covariates: no -> summary(rd_dat_fuzzy) -### rdd_data object ### - -Cutpoint: 0 -Type: Fuzzy -Sample size: - -Full : 6558 - -Left : 2740 , untreated: 2767 - -Right: 3818 , treated: 3791 -Covariates: yes -> summary(rd_dat_covar) -### rdd_data object ### - -Cutpoint: 0 -Type: Sharp -Sample size: - -Full : 6558 - -Left : 2740 - -Right: 3818 -Covariates: yes -> -> reg_lm <- rdd_reg_lm(rd_dat) -> reg_lm_covar <- rdd_reg_lm(rd_dat_covar, covariates="cov") -> reg_lm_fak_fuz <- rdd_reg_lm(rd_dat_fakefuzzy) -> reg_lm_fuz <- rdd_reg_lm(rd_dat_fuzzy) -> # reg_lm_fuz_cov <- rdd_reg_lm(rd_dat_fuzzy, covariates="cov") -> reg_np <- rdd_reg_np(rd_dat) -> -> reg_dat <- list(reg_lm=reg_lm, reg_np=reg_np, -+ reg_lm_fak_fuz=reg_lm_fak_fuz, reg_lm_fuz=reg_lm_fuz, -+ reg_lm_covar=reg_lm_covar) -> -> -> res <- lapply(reg_dat, print) -### RDD regression: parametric ### - Polynomial order: 1 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.1182314 0.0056799 20.816 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Coefficient: - Estimate Std. Error z value Pr(>|z|) -D 0.079924 0.009465 8.4443 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -### RDD regression: parametric ### - Polynomial order: 1 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.1182314 0.0056799 20.816 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -### RDD regression: parametric ### - Polynomial order: 1 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.1449633 0.0070384 20.596 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -### RDD regression: parametric ### - Polynomial order: 1 - Slopes: separate - Number of obs: 6558 (left: 2740, right: 3818) - - Coefficient: - Estimate Std. Error t value Pr(>|t|) -D 0.1182307 0.0056803 20.814 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 -> lapply(reg_dat, summary) -$reg_lm - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.89406 -0.06189 0.00231 0.07129 0.86396 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.432948 0.004276 101.254 < 2e-16 *** -D 0.118231 0.005680 20.816 < 2e-16 *** -x 0.296906 0.011546 25.714 < 2e-16 *** -x_right 0.045978 0.013501 3.405 0.000665 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1384 on 6554 degrees of freedom -Multiple R-squared: 0.6707, Adjusted R-squared: 0.6706 -F-statistic: 4450 on 3 and 6554 DF, p-value: < 2.2e-16 - - -$reg_np -### RDD regression: nonparametric local linear### - Bandwidth: 0.2938561 - Number of obs: 3200 (left: 1594, right: 1606) - - Weighted Residuals: - Min 1Q Median 3Q Max --0.97755 -0.06721 -0.00497 0.04504 0.93761 - - Coefficient: - Estimate Std. Error z value Pr(>|z|) -D 0.079924 0.009465 8.4443 < 2.2e-16 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - - Local R squared: 0.3563 - -$reg_lm_fak_fuz - -Call: -ivreg(formula = y ~ . - ins | . - D, data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.894063 -0.061892 0.002313 0.071286 0.863959 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.432948 0.004276 101.254 < 2e-16 *** -D 0.118231 0.005680 20.816 < 2e-16 *** -x 0.296906 0.011546 25.714 < 2e-16 *** -x_right 0.045978 0.013501 3.405 0.000665 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1384 on 6554 degrees of freedom -Multiple R-Squared: 0.6707, Adjusted R-squared: 0.6706 -Wald test: 4450 on 3 and 6554 DF, p-value: < 2.2e-16 - - -$reg_lm_fuz - -Call: -ivreg(formula = y ~ . - ins | . - D, data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.887954 -0.065471 0.003594 0.075692 0.850055 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.419478 0.004833 86.794 < 2e-16 *** -D 0.144963 0.007038 20.596 < 2e-16 *** -x 0.269533 0.012502 21.559 < 2e-16 *** -x_right 0.053981 0.013741 3.928 8.64e-05 *** ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1398 on 6554 degrees of freedom -Multiple R-Squared: 0.6636, Adjusted R-squared: 0.6635 -Wald test: 4356 on 3 and 6554 DF, p-value: < 2.2e-16 - - -$reg_lm_covar - -Call: -lm(formula = y ~ ., data = dat_step1, weights = weights) - -Residuals: - Min 1Q Median 3Q Max --0.89425 -0.06205 0.00225 0.07119 0.86410 - -Coefficients: - Estimate Std. Error t value Pr(>|t|) -(Intercept) 0.4329494 0.0042761 101.248 < 2e-16 *** -D 0.1182307 0.0056803 20.814 < 2e-16 *** -x 0.2969090 0.0115472 25.713 < 2e-16 *** -x_right 0.0459813 0.0135024 3.405 0.000665 *** -cov -0.0005211 0.0017143 -0.304 0.761150 ---- -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 - -Residual standard error: 0.1384 on 6553 degrees of freedom -Multiple R-squared: 0.6707, Adjusted R-squared: 0.6705 -F-statistic: 3337 on 4 and 6553 DF, p-value: < 2.2e-16 - - -> lapply(reg_dat, coef) -$reg_lm -(Intercept) D x x_right - 0.43294793 0.11823144 0.29690647 0.04597763 - -$reg_np - D -0.07992454 - -$reg_lm_fak_fuz -(Intercept) D x x_right - 0.43294793 0.11823144 0.29690647 0.04597763 - -$reg_lm_fuz -(Intercept) D x x_right - 0.41947751 0.14496332 0.26953272 0.05398077 - -$reg_lm_covar - (Intercept) D x x_right cov - 0.4329494035 0.1182306693 0.2969090017 0.0459812895 -0.0005211234 - -> -> ## plots -> plot(rd_dat) -Warning messages: -1: In title(main = main, sub = sub) : font width unknown for character 0x9 -2: In title(main = main, sub = sub) : font width unknown for character 0x9 -> plot(reg_np) -Warning messages: -1: In title(main = main, sub = sub) : font width unknown for character 0x9 -2: In title(main = main, sub = sub) : font width unknown for character 0x9 -> plot(reg_lm) -Warning messages: -1: In title(main = main, sub = sub) : font width unknown for character 0x9 -2: In title(main = main, sub = sub) : font width unknown for character 0x9 -> -> ## IK -> mapply(function(kernel) rdd_bw_ik(rd_dat, kernel=kernel), kernel = c("Triangular", "Uniform", "Normal")) -Triangular.h_opt Uniform.h_opt Normal.h_opt - 0.2938561 0.2309748 0.1075954 -> -> ## CCT estim -> rdd_bw_cct_estim_ARG_1 <- c("mserd", "msetwo", "msesum", "msecomb1", "msecomb2", -+ "cerrd", "certwo", "cersum", "cercomb1") -> rdd_bw_cct_estim_ARG_2 <- c("Triangular", "Uniform", "Epanechnikov") -> mapply(function(arg1, arg2) rdd_bw_cct_estim(rd_dat, method=arg1, kernel=arg2)$bws, -+ arg1 = rdd_bw_cct_estim_ARG_1, -+ arg2 = rdd_bw_cct_estim_ARG_2) -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." -[1] "Mass points detected in the running variable." - mserd msetwo msesum msecomb1 msecomb2 cerrd certwo -[1,] 0.1356263 0.1284715 0.1570765 0.1356263 0.1356263 0.08739878 0.08278814 -[2,] 0.1356263 0.1934515 0.1570765 0.1356263 0.1570765 0.08739878 0.12466184 -[3,] 0.2401720 0.2165579 0.2376643 0.2376643 0.2376643 0.24017201 0.21655788 -[4,] 0.2401720 0.3107726 0.2376643 0.2376643 0.2401720 0.24017201 0.31077256 - cersum cercomb1 -[1,] 0.1012215 0.08739878 -[2,] 0.1012215 0.08739878 -[3,] 0.2376643 0.23766427 -[4,] 0.2376643 0.23766427 -> -> ## CCT plot -> rdd_bw_cct_plot_ARG_1 <- c("esmv", "es", "espr", "esmvpr", -+ "qs", "qspr", "qsmv", "qsmvpr") -> mapply(function(arg1) rdd_bw_cct_plot(rd_dat, method=arg1), -+ arg1 = rdd_bw_cct_plot_ARG_1, SIMPLIFY=FALSE) -$esmv -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$es -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$espr -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$esmvpr -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$qs -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$qspr -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$qsmv -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -$qsmvpr -Call: rdplot - -Number of Obs. 6558 -Kernel Uniform - -Number of Obs. 2740 3818 -Eff. Number of Obs. 2740 3818 -Order poly. fit (p) 4 4 -BW poly. fit (h) 1.000 1.000 -Number of bins scale 1 1 - - -> -> ## rsw -> rdd_bw_rsw_ARG_1 <- c("global", "sided") -> mapply(function(arg1) rdd_bw_rsw(rd_dat, type=arg1), -+ arg1 = rdd_bw_rsw_ARG_1) -$global -[1] 0.03863514 - -$sided -[1] 0.03454186 0.10109994 - -> -> -> -> proc.time() - user system elapsed - 6.533 0.108 6.628 From 9fc410a81dca053e85b9647faffd03aed3bf0173 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:42:08 -0600 Subject: [PATCH 279/323] stylistic fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 836328c..b2b371d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ This github website hosts the source code. One of the easiest ways to install th ```r if (!require('remotes')) install.packages('remotes') -remotes::install_github( "bquast/rddtools" ) +remotes::install_github('bquast/rddtools') ``` Note however the latest version of rddtools only works with R 3.0, and that you might need to install [Rtools](https://cran.r-project.org/bin/windows/Rtools/) if on Windows. From 34190480c7cd4e78ed09580b9d40ec214c5bba90 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:42:17 -0600 Subject: [PATCH 280/323] fix URL --- inst/CITATION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/CITATION b/inst/CITATION index 9fb0baf..c977295 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -5,7 +5,7 @@ bibentry(bibtype = "TechReport", institution = "The Graduate Institute", address = "Maison de la paix, Geneva, Switzerland", year = "2016", - url = "http://qua.st/rddtools", + url = "https://qua.st/rddtools/", textVersion = "Stigler, M. and B. Quast, B (2016). rddtools: A toolbox for regression discontinuity in R. ", From 6e1295ae27158b1eb516db5b4fa2064249f30b4f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:44:33 -0600 Subject: [PATCH 281/323] cooler version number --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index d271d07..6a60cb3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.4.1 +Version: 1.5.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 83a1c8d416e98369558e403f99c2c791564ee210 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 9 May 2021 07:46:09 -0600 Subject: [PATCH 282/323] update CRAN comments --- cran-comments.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index a96bb25..aa13431 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,11 +1,11 @@ ## Test environments -- local Windows 10 install, R 4.0.2 -- local Linux (Arch) install, R 4.0.2 +- local Windows 10 install, R 4.0.2]5 +- local Linux (Arch) install, R 4.0.5 - GitHub Actions - - Windows Server 2019 (10.0.17763): R 4.0.0 - - MacOS (10.15): R 4.0.0 & devel - - Ubuntu (18.04): R 4.0.0 + - Windows Server: R release + - MacOS: R release + - Ubuntu: R releae - win-builder - devel - release @@ -18,6 +18,6 @@ Variables with usage in documentation object 'STAR_MHE' but not in code: STAR_MHE is documentation of a dataset, not a function -This is a rerelease of a package previously on CRAN under the same name, also maintained by me, following the changes to stringAsFactors default change. +This is a rerelease of a package previously on CRAN under the same name, also maintained by me. There is a note about a possibly invalid URL, the URL works (JSTOR stable). From 05bfe83cf39f83ebd5438b584655527bc593738b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 11:20:23 +0100 Subject: [PATCH 283/323] add ORCID --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6a60cb3..0737b4d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -4,9 +4,9 @@ Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. Authors@R: c( - person("Matthieu", "Stigler", role = "aut", comment =c(ORCID="0000-0002-6802-4290"), + person("Matthieu", "Stigler", role = "aut", comment=c(ORCID="0000-0002-6802-4290"), email="Matthieu.Stigler@gmail.com"), - person("Bastiaan", "Quast", email = "bquast@gmail.com", role = c("aut", "cre") ) + person("Bastiaan", "Quast", email = "bquast@gmail.com", role=c("aut", "cre"), comment=c(ORCID="0000-0002-2951-3577") ) ) Maintainer: Bastiaan Quast Imports: From a30cece74dd77513fd5f877943498552e50f8393 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 11:20:43 +0100 Subject: [PATCH 284/323] bump version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0737b4d..bf0022e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.5.0 +Version: 1.6.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 49939ffcb049031892267deef90637c96817ee2e Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 11:21:41 +0100 Subject: [PATCH 285/323] add news for v 1.6.0 --- NEWS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS.md b/NEWS.md index 4f7f25a..b59d3e1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +rddtools 1.6.0 +===================== +* documentation update + rddtools 1.4.0 ===================== Published on 2020-08-07 From 0b7a3c19c8fa08417cae1fc41341c5f15bbcd18d Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 11:31:42 +0100 Subject: [PATCH 286/323] use new roxygen2 version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index bf0022e..b90673b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,5 +32,5 @@ License: GPL (>= 2) URL: https://qua.st/rddtools/ BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.1.1 +RoxygenNote: 7.1.2 Encoding: UTF-8 From 77410b88dba57826e10a5490ba80afb85990c71a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 12:17:53 +0100 Subject: [PATCH 287/323] add notice --- R/various_code.R | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/R/various_code.R b/R/various_code.R index 6dfbc82..5e6389d 100644 --- a/R/various_code.R +++ b/R/various_code.R @@ -11,3 +11,10 @@ Kernel_tri <- function(X, center, bw) { Kernel_uni <- function(X, center, bw) { ifelse(abs(X - center) > bw, 0, 1) } + +.onAttach <- function(...) { + packageStartupMessage(' +Please consider citing R and rddtools, +citation() +citation("rddtools") +')} From c0da5467bb8c6a3814e20809e7d480f94b48f900 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 12:18:02 +0100 Subject: [PATCH 288/323] update versions in cran comments --- cran-comments.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index aa13431..5824b32 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,7 +1,7 @@ ## Test environments -- local Windows 10 install, R 4.0.2]5 -- local Linux (Arch) install, R 4.0.5 +- local Windows 10 install, R 4.1.2 +- local Linux (Arch) install, R 4.1.2 - GitHub Actions - Windows Server: R release - MacOS: R release From 584e7e9998312126c813ed14cae047921077dfae Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 10 Jan 2022 18:07:52 +0100 Subject: [PATCH 289/323] formatting improvement --- R/various_code.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/various_code.R b/R/various_code.R index 5e6389d..b33b561 100644 --- a/R/various_code.R +++ b/R/various_code.R @@ -13,8 +13,8 @@ Kernel_uni <- function(X, center, bw) { } .onAttach <- function(...) { - packageStartupMessage(' + packageStartupMessage(" Please consider citing R and rddtools, citation() -citation("rddtools") -')} +citation('rddtools') +")} From 94513b55aa712a2c82dd015c373177b663cee772 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 13:33:13 +0200 Subject: [PATCH 290/323] Now handles more flexibly covar arg, solves #12 --- R/rdd_data.R | 29 +++++++++++++++++++++++------ tests/testthat/test_rdddata.R | 21 +++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/R/rdd_data.R b/R/rdd_data.R index 6d5214a..f1c5c18 100644 --- a/R/rdd_data.R +++ b/R/rdd_data.R @@ -47,10 +47,27 @@ rdd_data <- function(y, x, covar, cutpoint, z, labels, data) { pf <- parent.frame() x <- eval(substitute(x), data, enclos = pf) # copy from with.default y <- eval(substitute(y), data, enclos = pf) # copy from with.default - if (hasCovar) - covar <- eval(substitute(covar), data, enclos = pf) # idem + if (hasCovar) { + ## make sure it's not already a df!? + class_robust <- try(class(eval(substitute(covar))), silent=TRUE) + if(inherits(class_robust, "try-error")) class_robust <- "quote" + + if(any(c("data.frame", "numeric") %in% class_robust)) { + covar_df <- covar + } else { + ## copy code from subset.data.frame + nl <- as.list(seq_along(data)) + names(nl) <- names(data) + covar_index <- eval(substitute(covar), nl, parent.frame()) + + covar_df <- data[,covar_index, drop=FALSE] + } + } } + if (missing(data) & hasCovar) covar_df <- covar + + ### Check y, x univariate k_y <- NCOL(y) k_x <- NCOL(x) @@ -79,8 +96,8 @@ rdd_data <- function(y, x, covar, cutpoint, z, labels, data) { if (is.null(names(labels)) || !all(names(labels) %in% c("x", "y", "covar"))) stop("labels should be a list with components x, and/or y, and/or covar") if (hasCovar) { - if ("covar" %in% names(labels) && length(labels$covar) != NCOL(covar)) - stop("There should be ", NCOL(covar), " values (dim of covar) for component 'covar' in labels") + if ("covar" %in% names(labels) && length(labels$covar) != NCOL(covar_df)) + stop("There should be ", NCOL(covar_df), " values (dim of covar) for component 'covar' in labels") } } else { labels <- list() @@ -92,8 +109,8 @@ rdd_data <- function(y, x, covar, cutpoint, z, labels, data) { ## Assemble data rdd_dat <- data.frame(x = x, y = y) if (hasCovar) { - rdd_dat <- cbind(rdd_dat, covar) - if (NCOL(covar) == 1 && is.null(colnames(covar))) + rdd_dat <- cbind(rdd_dat, covar_df) + if (NCOL(covar_df) == 1 && is.null(colnames(covar_df))) colnames(rdd_dat)[3] <- covar_nam } diff --git a/tests/testthat/test_rdddata.R b/tests/testthat/test_rdddata.R index 823d964..7f3b046 100644 --- a/tests/testthat/test_rdddata.R +++ b/tests/testthat/test_rdddata.R @@ -31,3 +31,24 @@ test_that("rd: output values match", { expect_equal( rd[6558,1], -0.1982 ) expect_equal( rd[6558,2], 0.802 ) }) + +### use of covariates +r_cov_char <- rdd_data(y=mpg, x=wt, covar="drat", cutpoint=2, data=mtcars) +r_cov_quote <- rdd_data(y=mpg, x=wt, covar=drat, cutpoint=2, data=mtcars) + +r_cov2_char <- rdd_data(y=mpg, x=wt, covar=c('drat', 'hp'), cutpoint=2, data=mtcars) +r_cov2_quote <- rdd_data(y=mpg, x=wt, covar=c(drat, hp), cutpoint=2, data=mtcars) +r_cov2_df <- rdd_data(y=mpg, x=wt, covar= mtcars[,c('drat', 'hp')], cutpoint=2, data=mtcars) + +context("rd data: use of covariates") + +test_that("rd with covars: can use char or quote", { + expect_equal(r_cov_char, r_cov_quote) +}) +test_that("rd with 2 covars: can use char or quote", { + expect_equal(r_cov2_char, r_cov2_quote) +}) +test_that("rd with 2 covars: can use char or df", { + expect_equal(r_cov2_char, r_cov2_df) +}) + From 8726b62593ee3c7ed1fe0280dc45aed9019485d2 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 13:33:27 +0200 Subject: [PATCH 291/323] Increase version number for dev version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index b90673b..b44b547 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.6.0 +Version: 1.6.000001 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From b3e8d2cb07203f1d9e02cd7a263a14a2259e60ca Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 16:23:27 +0200 Subject: [PATCH 292/323] Simple code indenting --- R/model.matrix.rdd.R | 11 +++++++++-- R/reg_lm.R | 8 ++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/R/model.matrix.rdd.R b/R/model.matrix.rdd.R index 4a5e4da..7982ce0 100644 --- a/R/model.matrix.rdd.R +++ b/R/model.matrix.rdd.R @@ -1,7 +1,14 @@ #' @export -model.matrix.rdd_data <- function(object, covariates = NULL, order = 1, bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy = c("include", - "residual"), slope = c("same", "separate"), bw = NULL), covar.strat = c("include", "residual"), ...) { +model.matrix.rdd_data <- function(object, + covariates = NULL, + order = 1, + bw = NULL, + slope = c("separate", "same"), + covar.opt = list(strategy = c("include", "residual"), + slope = c("same", "separate"), + bw = NULL), + covar.strat = c("include", "residual"), ...) { checkIsRDD(object) rdd_object <- object diff --git a/R/reg_lm.R b/R/reg_lm.R index ceea656..2ad5c41 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -51,8 +51,12 @@ #' plot(reg_para_ik) -rdd_reg_lm <- function(rdd_object, covariates = NULL, order = 1, bw = NULL, slope = c("separate", "same"), covar.opt = list(strategy = c("include", - "residual"), slope = c("same", "separate"), bw = NULL), covar.strat = c("include", "residual"), weights) { +rdd_reg_lm <- function(rdd_object, covariates = NULL, order = 1, bw = NULL, + slope = c("separate", "same"), + covar.opt = list(strategy = c("include", "residual"), + slope = c("same", "separate"), + bw = NULL), + covar.strat = c("include", "residual"), weights) { checkIsRDD(rdd_object) cutpoint <- getCutpoint(rdd_object) From ef0883fd906b2615bb6fdb07547337149a8aef24 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 16:29:12 +0200 Subject: [PATCH 293/323] Verify that covar.opt is a list, change deprecated message from warning to stop --- R/model.matrix.rdd.R | 3 ++- R/reg_lm.R | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/R/model.matrix.rdd.R b/R/model.matrix.rdd.R index 7982ce0..c055881 100644 --- a/R/model.matrix.rdd.R +++ b/R/model.matrix.rdd.R @@ -15,9 +15,10 @@ model.matrix.rdd_data <- function(object, type <- getType(object) if (!missing(covar.strat)) - warning("covar.strat is (soon) deprecated arg!") + stop("covar.strat is deprecated, use covar.opt = list(strategy=...) instead") slope <- match.arg(slope) + if(!is.list(covar.opt)) stop("Argument 'covar.opt' should be a list") covar.strat <- match.arg(covar.opt$strategy, choices = c("include", "residual")) covar.slope <- match.arg(covar.opt$slope, choices = c("same", "separate")) diff --git a/R/reg_lm.R b/R/reg_lm.R index 2ad5c41..4a6020a 100644 --- a/R/reg_lm.R +++ b/R/reg_lm.R @@ -65,7 +65,7 @@ rdd_reg_lm <- function(rdd_object, covariates = NULL, order = 1, bw = NULL, slope <- match.arg(slope) if (!missing(covar.strat)) - warning("covar.strat is (soon) deprecated arg!") + stop("covar.strat is deprecated, use covar.opt = list(strategy=...) instead") if (!missing(weights) & !is.null(bw)) stop("Cannot give both 'bw' and 'weights'") From 0b957f30d60519b769f38b23b7c5f08f5f069828 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 16:29:34 +0200 Subject: [PATCH 294/323] Update versio number more tidy style --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index b44b547..832770d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.6.000001 +Version: 1.6.0.900002 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From 9b47a1ea04e96c7b707043936c8b75c148501380 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 16:44:25 +0200 Subject: [PATCH 295/323] add small testthat for reg_lm --- tests/testthat/test_rdd_reg_lm.R | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/testthat/test_rdd_reg_lm.R diff --git a/tests/testthat/test_rdd_reg_lm.R b/tests/testthat/test_rdd_reg_lm.R new file mode 100644 index 0000000..786c9c3 --- /dev/null +++ b/tests/testthat/test_rdd_reg_lm.R @@ -0,0 +1,15 @@ +# load the rddtools package +library(rddtools) + +# load the example data set +data(house) + +# create rdd_data sets +r_cov_char <- rdd_data(y=mpg, x=wt, covar="drat", cutpoint=3, data=mtcars) + +context("Arguments of rdd_reg_lm") + +test_that("rdd_reg_lm args: covar.opt should be a list", { + expect_error(rdd_reg_lm(r_cov_char, order=1, covar.opt = 'include'), + "Argument 'covar.opt' should be a list") +}) From 39bf63ba948beba67b9b565e0ddac81a8221d9b0 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 17:35:14 +0200 Subject: [PATCH 296/323] Update documentation --- R/rdd_data.R | 12 ++++++++---- man/rdd_data.Rd | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/R/rdd_data.R b/R/rdd_data.R index f1c5c18..6741c4d 100644 --- a/R/rdd_data.R +++ b/R/rdd_data.R @@ -8,14 +8,18 @@ #' @param cutpoint Cutpoint #' @param labels Additional labels to provide as list (with entries \code{x}, \code{y}, and eventually vector \code{covar}). Unused currently. #' @param data A data-frame for the \code{x} and \code{y} variables. If this is provided, -#' the column names can be entered directly for argument \code{x} and \code{y} +#' the column names can be entered directly for argument \code{x}, \code{y} and \code{covar}. +#' For \code{covar}, should be a character vector. #' @param z Assignment variable for the fuzzy case. Should be 0/1 or TRUE/FALSE variable. +#' @details Arguments \code{x}, \code{y} (and eventually \code{covar}) can be either given as: +#' * vectors (eventually data-frame for \code{covar}) +#' * quote/character when \code{data} is also provided. For multiple \code{covar}, use a vector of characters #' @return Object of class \code{rdd_data}, inheriting from \code{data.frame} -#' @author Matthieu Stigler <\email{Matthieu.Stigler@@gmail.com}> +#' @author Matthieu Stigler \email{Matthieu.Stigler@@gmail.com} #' @export #' @examples #' data(house) -#' rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) +#' rd <- rdd_data(x=house$x, y=house$y, cutpoint=0) #' rd2 <- rdd_data(x=x, y=y, data=house, cutpoint=0) #' #' # The print() function is the same as the print.data.frame: @@ -30,7 +34,7 @@ #' z=ifelse(house$x>0+rnorm(nrow(house), sd=0.05),1,0), #' cutpoint=0) #' summary(rd_dat_fakefuzzy) - +#' @md rdd_data <- function(y, x, covar, cutpoint, z, labels, data) { diff --git a/man/rdd_data.Rd b/man/rdd_data.Rd index 81d3ec9..03b1855 100644 --- a/man/rdd_data.Rd +++ b/man/rdd_data.Rd @@ -19,8 +19,9 @@ rdd_data(y, x, covar, cutpoint, z, labels, data) \item{labels}{Additional labels to provide as list (with entries \code{x}, \code{y}, and eventually vector \code{covar}). Unused currently.} -\item{data}{A data-frame for the \code{x} and \code{y} variables. If this is provided, -the column names can be entered directly for argument \code{x} and \code{y}} +\item{data}{A data-frame for the \code{x} and \code{y} variables. If this is provided, +the column names can be entered directly for argument \code{x}, \code{y} and \code{covar}. +For \code{covar}, should be a character vector.} } \value{ Object of class \code{rdd_data}, inheriting from \code{data.frame} @@ -28,9 +29,16 @@ Object of class \code{rdd_data}, inheriting from \code{data.frame} \description{ Construct the base RDD object, containing x, y and the cutpoint, eventuallay covariates. } +\details{ +Arguments \code{x}, \code{y} (and eventually \code{covar}) can be either given as: +\itemize{ +\item vectors (eventually data-frame for \code{covar}) +\item quote/character when \code{data} is also provided. For multiple \code{covar}, use a vector of characters +} +} \examples{ data(house) -rd<- rdd_data(x=house$x, y=house$y, cutpoint=0) +rd <- rdd_data(x=house$x, y=house$y, cutpoint=0) rd2 <- rdd_data(x=x, y=y, data=house, cutpoint=0) # The print() function is the same as the print.data.frame: @@ -47,5 +55,5 @@ rd_dat_fakefuzzy <- rdd_data(x=house$x, y=house$y, summary(rd_dat_fakefuzzy) } \author{ -Matthieu Stigler <\email{Matthieu.Stigler@gmail.com}> +Matthieu Stigler \email{Matthieu.Stigler@gmail.com} } From 2b8e77211ffb70eaf55b1fa556b9f77352aec54b Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 10 Apr 2022 17:46:18 +0200 Subject: [PATCH 297/323] Update NEWS --- NEWS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.md b/NEWS.md index b59d3e1..540b37f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +rddtools 1.6.1 +===================== +* Fix bug #12 (https://github.com/bquast/rddtools/issues/12) reported by @PhilipSpechler + + rddtools 1.6.0 ===================== * documentation update From 864d5d25305573542a5941233836d79ca1b1257c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 19 Jun 2022 21:05:31 +0200 Subject: [PATCH 298/323] roxygen2 v 7.2.0 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 832770d..3f41ec0 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,5 +32,5 @@ License: GPL (>= 2) URL: https://qua.st/rddtools/ BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.1.2 +RoxygenNote: 7.2.0 Encoding: UTF-8 From c72374c3a84ffce81e2a86c342191f031c833b83 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 20 Jun 2022 08:46:33 +0200 Subject: [PATCH 299/323] bump version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3f41ec0..4a8161a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.6.0.900002 +Version: 1.8.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From b95f492a1a5e72e1793d5582ead13157ba292a5c Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 20 Jun 2022 08:46:51 +0200 Subject: [PATCH 300/323] update test environments and outcomes --- cran-comments.md | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index 5824b32..2ea1eb2 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,23 +1,38 @@ -## Test environments +# Test environments -- local Windows 10 install, R 4.1.2 -- local Linux (Arch) install, R 4.1.2 +- local Windows 10 install, R 4.2.0 +- local Linux (Arch) install, R 4.2.0 +- local macOS install, R 4.2.0 - GitHub Actions - - Windows Server: R release - - MacOS: R release - - Ubuntu: R releae + - Windows Server, R release + - MacOS, R release + - MacOS, R dev + - Ubuntu, R release - win-builder - devel - release + +# R CMD check + +R CMD check succeeded + +── R CMD check results ─────────────────────────────────────────────────────────────────────── rddtools 1.8.0 ──── +Duration: 1m 36.3s + +0 errors ✔ | 0 warnings ✔ | 0 notes ✔ + R CMD check succeeded -* checking for code/documentation mismatches ... WARNING -Variables with usage in documentation object 'STAR_MHE' but not in code: - 'STAR_MHE' - -STAR_MHE is documentation of a dataset, not a function -This is a rerelease of a package previously on CRAN under the same name, also maintained by me. +# win builder There is a note about a possibly invalid URL, the URL works (JSTOR stable). + +Found the following (possibly) invalid URLs: + URL: https://www.jstor.org/stable/2291516 + From: README.md + Status: 403 + Message: Forbidden + +This is a valid URL that works fine. \ No newline at end of file From 2b56bca4a7556a67a0ec4b408380751d90d59b34 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 20 Jun 2022 08:48:52 +0200 Subject: [PATCH 301/323] add info on 1.8.0 --- NEWS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.md b/NEWS.md index 540b37f..256356b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +rddtools 1.8.0 +===================== +* redo documentation + + rddtools 1.6.1 ===================== * Fix bug #12 (https://github.com/bquast/rddtools/issues/12) reported by @PhilipSpechler From fbce99ef618d06026493e1f8df642d06870d306f Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Mon, 20 Jun 2022 08:50:25 +0200 Subject: [PATCH 302/323] this new devtools behaviour, rbuildignore the cran-submission file --- .Rbuildignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.Rbuildignore b/.Rbuildignore index 0851fc9..0167d8c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,3 +6,4 @@ misc ^doc$ ^Meta$ ^CRAN-RELEASE$ +^CRAN-SUBMISSION$ From 0b43d3794b2466978763fafe4071f7f410f44c89 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 23 Jul 2022 19:48:40 +0200 Subject: [PATCH 303/323] new roxygen2 version --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4a8161a..d4d0e1e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,5 +32,5 @@ License: GPL (>= 2) URL: https://qua.st/rddtools/ BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.2.0 +RoxygenNote: 7.2.1 Encoding: UTF-8 From 669a4c89f1f408b989a212e8ebe11d509c54d416 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sat, 23 Jul 2022 19:48:58 +0200 Subject: [PATCH 304/323] small automatic documentation change --- man/rdd_gen_reg.Rd | 4 ++-- man/rdd_reg_lm.Rd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/man/rdd_gen_reg.Rd b/man/rdd_gen_reg.Rd index 95612fd..c396f77 100644 --- a/man/rdd_gen_reg.Rd +++ b/man/rdd_gen_reg.Rd @@ -11,8 +11,8 @@ rdd_gen_reg( order = 1, bw = NULL, slope = c("separate", "same"), - covar.opt = list(strategy = c("include", "residual"), slope = c("same", "separate"), - bw = NULL), + covar.opt = list(strategy = c("include", "residual"), slope = c("same", "separate"), bw + = NULL), weights, ... ) diff --git a/man/rdd_reg_lm.Rd b/man/rdd_reg_lm.Rd index 1b38a9b..81dbc7e 100644 --- a/man/rdd_reg_lm.Rd +++ b/man/rdd_reg_lm.Rd @@ -10,8 +10,8 @@ rdd_reg_lm( order = 1, bw = NULL, slope = c("separate", "same"), - covar.opt = list(strategy = c("include", "residual"), slope = c("same", "separate"), - bw = NULL), + covar.opt = list(strategy = c("include", "residual"), slope = c("same", "separate"), bw + = NULL), covar.strat = c("include", "residual"), weights ) From d5232e81290e28dffe854984754e4e562079b0fa Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 12 Nov 2023 11:51:40 -0600 Subject: [PATCH 305/323] new roxygen2 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index d4d0e1e..42fb522 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,5 +32,5 @@ License: GPL (>= 2) URL: https://qua.st/rddtools/ BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.2.1 +RoxygenNote: 7.2.3 Encoding: UTF-8 From 81a935260bdbe0af77e1b4729b2375a9f9e4cd2a Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 12 Nov 2023 11:52:18 -0600 Subject: [PATCH 306/323] bump version for release --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 42fb522..faf211b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 1.8.0 +Version: 2.0.0 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. From b7605c99f7a45ce536924fc09fc65c8b339a410b Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 12 Nov 2023 15:05:02 -0600 Subject: [PATCH 307/323] delete URL that 404 --- DESCRIPTION | 2 +- R/rddtools.R | 4 +--- README.md | 1 - man/STAR_MHE.Rd | 3 +-- man/indh.Rd | 3 --- 5 files changed, 3 insertions(+), 10 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index faf211b..eae5b9d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,7 +29,7 @@ Suggests: knitr, testthat License: GPL (>= 2) -URL: https://qua.st/rddtools/ +URL: https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr RoxygenNote: 7.2.3 diff --git a/R/rddtools.R b/R/rddtools.R index 1563bd1..6ee8f00 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -14,7 +14,6 @@ utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", #' @title INDH data set #' @description Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" #' @format A data frame with two variables with 720 observations each -#' @source Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics/} #' @references Arcand, Rieger, and Nguyen (2015) 'Development Aid and Social Dyanmics Data Set' #' @examples #' # load the data @@ -68,8 +67,7 @@ NULL #' } #' @details ). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. #' The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. -#' The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website -#' (\url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. +#' The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website, on the webstar.dta. #' @references Krueger, A. (1999) 'Experimental Estimates Of Education Production Functions,' #' \emph{The Quarterly Journal of Economics}, Vol. 114(2), pages 497-532, May. #' @references Angrist, A. ad Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, diff --git a/README.md b/README.md index b2b371d..37b57a6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ rddtools ======== - [![License](https://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](https://www.gnu.org/licenses/gpl-3.0.html) [![CRAN Version](https://www.r-pkg.org/badges/version/rddtools)](https://cran.r-project.org/package=rddtools) [![R build status](https://github.com/bquast/rddtools/workflows/R-CMD-check/badge.svg)](https://github.com/bquast/rddtools/actions?workflow=R-CMD-check) diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index c981769..9e14ccd 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -25,8 +25,7 @@ Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke \details{ ). This is a transformation of the dataset from the project STAR (Student/Teacher Achievement Ratio. The full dataset is described and available in package AER, \code{\link[AER]{STAR}}. -The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website -(\url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}), on the webstar.dta. +The transformed data was obtained using the STATA script krueger.do, obtained from Joshua Angrist website, on the webstar.dta. } \examples{ data(STAR_MHE) diff --git a/man/indh.Rd b/man/indh.Rd index 167da3e..5b568a6 100644 --- a/man/indh.Rd +++ b/man/indh.Rd @@ -7,9 +7,6 @@ \format{ A data frame with two variables with 720 observations each } -\source{ -Development Aid and social Dyanmics website: \url{https://qua.st/Development-Aid-Social-Dynamics/} -} \description{ Data from the Initiative Nationale du Development Humaine, collected as the part of the SNSF project "Development Aid and Social Dynamics" } From 25f0bafacb81bdbec40fa73ef0e56bee3ba61eb8 Mon Sep 17 00:00:00 2001 From: Bastiaan Quast Date: Sun, 12 Nov 2023 17:48:38 -0600 Subject: [PATCH 308/323] fix more dead URLs --- R/rddtools.R | 1 - inst/CITATION | 2 +- man/STAR_MHE.Rd | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/R/rddtools.R b/R/rddtools.R index 6ee8f00..495fa04 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -73,7 +73,6 @@ NULL #' @references Angrist, A. ad Pischke J-S (2008) \emph{Mostly Harmless Econometrics: An Empiricist's Companion}, #' Princeton University press #' @source Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website -#' \url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. #' @examples #' data(STAR_MHE) #' diff --git a/inst/CITATION b/inst/CITATION index c977295..87f48da 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -5,7 +5,7 @@ bibentry(bibtype = "TechReport", institution = "The Graduate Institute", address = "Maison de la paix, Geneva, Switzerland", year = "2016", - url = "https://qua.st/rddtools/", + url = "https://bastiaanquast.com/rddtools/", textVersion = "Stigler, M. and B. Quast, B (2016). rddtools: A toolbox for regression discontinuity in R. ", diff --git a/man/STAR_MHE.Rd b/man/STAR_MHE.Rd index 9e14ccd..cf50faf 100644 --- a/man/STAR_MHE.Rd +++ b/man/STAR_MHE.Rd @@ -16,8 +16,7 @@ all other are created by Angrist and Pischke STAT code. } } \source{ -Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website -\url{https://economics.mit.edu/faculty/angrist/data1/mhe/krueger}, retrieved on 26 November 2012. +Data obtained using the script krueger.do on data webstar.rda, found on J. Angrist website } \description{ Transformation of the STAR dataset as used in Table 8.2.1 of Angrist and Pischke (2008) From 845d3ca15e1a38a4e4abf9b8b29a81e185eabb15 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 14 Jun 2025 23:14:19 +0200 Subject: [PATCH 309/323] solve multiple issues declaring internal methods --- R/as.npreg.R | 2 +- R/clusterInf.R | 3 +++ R/dens_test.R | 4 ++-- R/get_methods.R | 19 +++++++++++++------ R/waldci.R | 13 +++++++++---- man/as.npregbw.Rd | 2 +- man/dens_test.Rd | 4 ++-- man/rddtools.Rd | 1 + 8 files changed, 32 insertions(+), 16 deletions(-) diff --git a/R/as.npreg.R b/R/as.npreg.R index a6219df..1bef585 100644 --- a/R/as.npreg.R +++ b/R/as.npreg.R @@ -2,7 +2,7 @@ #' #' Convert an rdd_object to a non-parametric regression \code{npreg} from package \code{np} #' @param x Object of class \code{rdd_reg} created by \code{\link{rdd_reg_np}} or \code{\link{rdd_reg_lm}} -#' @param \ldots Further arguments passed to the \code{\link{npregbw}} or \code{\link{npreg}} +#' @param \ldots Further arguments passed to the \code{\link[np]{npregbw}} or \code{\link[np]{npreg}} #' @details This function converts an rdd_reg object into an \code{npreg} object from package \code{np} #' Note that the output won't be the same, since \code{npreg} does not offer a triangular kernel, but a Gaussian or Epanechinkov one. #' Another reason why estimates might differ slightly is that \code{npreg} implements a multivariate kernel, while rdd_reg diff --git a/R/clusterInf.R b/R/clusterInf.R index 9e83b48..142d714 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -139,8 +139,11 @@ vcovCluster2 <- function(object, clusterVar1, clusterVar2) { vcovMCL } +#' @noRd getModelRank <- function(object, ...) UseMethod("getModelRank") +#' @noRd getModelRank.default <- function(object, ...) object$rank +#' @noRd getModelRank.rdd_reg_np <- function(object, ...) getModelRank.default(object$RDDslot$model) diff --git a/R/dens_test.R b/R/dens_test.R index 79c247d..1bdbedb 100644 --- a/R/dens_test.R +++ b/R/dens_test.R @@ -3,8 +3,8 @@ #' Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{rdd_object}. #' #' @param rdd_object object of class rdd_data -#' @param bin Argument of the \code{\link{DCdensity}} function, the binwidth -#' @param bw Argument of the \code{\link{DCdensity}} function, the bandwidth +#' @param bin Argument of the \code{\link[rdd]{DCdensity}} function, the binwidth +#' @param bw Argument of the \code{\link[rdd]{DCdensity}} function, the bandwidth #' @param plot Whether to return a plot. Logical, default ot TRUE. #' @param \ldots Further arguments passed to \code{\link[rdd]{DCdensity}}. #' @export diff --git a/R/get_methods.R b/R/get_methods.R index e8f06e8..8a4c147 100644 --- a/R/get_methods.R +++ b/R/get_methods.R @@ -56,11 +56,13 @@ infType <- function(x) { "se" else getCall(x)$inference } - +#' @noRd hasCovar <- function(object) UseMethod("hasCovar") +#' @noRd hasCovar.rdd_data <- function(object) attr(object, "hasCovar") +#' @noRd hasCovar.rdd_reg <- function(object) { call <- getCall(object) !is.null(call$covariates) @@ -89,7 +91,11 @@ getCovarNames <- function(object) { colnames(object)[-rem] } -getOriginalX <- function(object) { +#' @noRd +getOriginalX <- function(object) UseMethod("getOriginalX") + +#' @noRd +getOriginalX.default <- function(object) { cutpoint <- getCutpoint(object) x <- object$model[, "x"] @@ -98,13 +104,13 @@ getOriginalX <- function(object) { x } -getOriginalX <- function(object) UseMethod("getOriginalX") - +#' @noRd getOriginalX.rdd_reg <- function(object) { object$RDDslot$rdd_data[, "x"] } +#' @noRd getOriginalX.rdd_data <- function(object) { object[, "x"] } @@ -112,7 +118,7 @@ getOriginalX.rdd_data <- function(object) { # getOriginalX.rdd_reg_np <- function(object){ cutpoint <- getCutpoint(object) Xnam <- getXname(object) x <- # object$model[,Xnam] if(cutpoint!=0) x <- x+cutpoint x } - +#' @noRd getOriginalData <- function(object, na.rm = TRUE, classRDD = TRUE) UseMethod("getOriginalData") # getOriginalData.rdd_reg_np <- function(object, na.rm=TRUE){ cutpoint <- getCutpoint(object) Xnam <- getXname(object) dat <- @@ -120,7 +126,7 @@ getOriginalData <- function(object, na.rm = TRUE, classRDD = TRUE) UseMethod("ge # function(x) all(!is.na(x))),] # remove na rows dat } - +#' @noRd getOriginalData.rdd_reg <- function(object, na.rm = TRUE, classRDD = TRUE) { res <- object$RDDslot$rdd_data if (na.rm) @@ -130,6 +136,7 @@ getOriginalData.rdd_reg <- function(object, na.rm = TRUE, classRDD = TRUE) { res } +#' @noRd getOriginalData.rdd_data <- function(object, na.rm = TRUE, classRDD = TRUE) { res <- object if (na.rm) diff --git a/R/waldci.R b/R/waldci.R index 33679e0..f1a7fc3 100644 --- a/R/waldci.R +++ b/R/waldci.R @@ -9,10 +9,12 @@ #' @param \ldots Further arguments +#' @export waldci <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) { UseMethod("waldci") } +#' @export waldci.default <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) { ## use S4 methods if loaded coef0 <- if ("stats4" %in% loadedNamespaces()) @@ -67,9 +69,10 @@ waldci.default <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL ## copy of stats:::format.perc -format.perc <- function(probs, digits) paste(format(100 * probs, trim = TRUE, scientific = FALSE, digits = digits), "%") +format_perc <- function(probs, digits) paste(format(100 * probs, trim = TRUE, scientific = FALSE, digits = digits), "%") -waldci.rdd_reg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...) { +#' @export +waldci.rdd_reg_np <- function(x, parm=NULL, level = 0.95, vcov. = NULL, df = Inf, ...) { inf_met <- infType(x) ## def in Misc.R if (inf_met == "se") { @@ -81,7 +84,7 @@ waldci.rdd_reg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...) { a <- (1 - level)/2 a <- c(a, 1 - a) fac <- qnorm(a) - pct <- format.perc(a, 3) ## import!! + pct <- format_perc(a, 3) ## import!! ci <- array(NA, dim = c(1, 2L), dimnames = list("D", pct)) ci[] <- co[, "Estimate"] + co[, "Std. Error"] %o% fac return(ci) @@ -92,10 +95,11 @@ waldci.rdd_reg_np <- function(x, level = 0.95, vcov. = NULL, df = Inf, ...) { - +#' @export waldci.glm <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = Inf, ...) waldci.default(x, parm = parm, level = level, vcov. = vcov., df = df, ...) +#' @export waldci.mlm <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, ...) { ## obtain vcov v <- if (is.null(vcov.)) @@ -109,6 +113,7 @@ waldci.mlm <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = NULL, .. waldci.default(x, parm = parm, level = level, vcov. = v, df = df, ...) } +#' @export waldci.survreg <- function(x, parm = NULL, level = 0.95, vcov. = NULL, df = Inf, ...) { if (is.null(vcov.)) v <- vcov(x) else { diff --git a/man/as.npregbw.Rd b/man/as.npregbw.Rd index bb60c79..ca74ea0 100644 --- a/man/as.npregbw.Rd +++ b/man/as.npregbw.Rd @@ -12,7 +12,7 @@ as.npreg(x, ...) \arguments{ \item{x}{Object of class \code{rdd_reg} created by \code{\link{rdd_reg_np}} or \code{\link{rdd_reg_lm}}} -\item{\ldots}{Further arguments passed to the \code{\link{npregbw}} or \code{\link{npreg}}} +\item{\ldots}{Further arguments passed to the \code{\link[np]{npregbw}} or \code{\link[np]{npreg}}} } \value{ An object of class \code{npreg} or \code{npregbw} diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 4537fb5..b0e50b7 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -9,9 +9,9 @@ dens_test(rdd_object, bin = NULL, bw = NULL, plot = TRUE, ...) \arguments{ \item{rdd_object}{object of class rdd_data} -\item{bin}{Argument of the \code{\link{DCdensity}} function, the binwidth} +\item{bin}{Argument of the \code{\link[rdd]{DCdensity}} function, the binwidth} -\item{bw}{Argument of the \code{\link{DCdensity}} function, the bandwidth} +\item{bw}{Argument of the \code{\link[rdd]{DCdensity}} function, the bandwidth} \item{plot}{Whether to return a plot. Logical, default ot TRUE.} diff --git a/man/rddtools.Rd b/man/rddtools.Rd index 8e2799d..5c9476d 100644 --- a/man/rddtools.Rd +++ b/man/rddtools.Rd @@ -2,6 +2,7 @@ % Please edit documentation in R/rddtools.R \docType{package} \name{rddtools} +\alias{-package} \alias{rddtools} \title{Regression Discontinuity Design} \description{ From 9faf0b230953f72f32f5bfb8442bed93a2cdcdd7 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 14 Jun 2025 23:22:18 +0200 Subject: [PATCH 310/323] New rpoxygen pkg documentation style --- R/rddtools.R | 3 +-- man/rddtools-package.Rd | 27 +++++++++++++++++++++++++++ man/rddtools.Rd | 10 ---------- 3 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 man/rddtools-package.Rd delete mode 100644 man/rddtools.Rd diff --git a/R/rddtools.R b/R/rddtools.R index 495fa04..dfa391a 100644 --- a/R/rddtools.R +++ b/R/rddtools.R @@ -1,8 +1,7 @@ -#' @name rddtools -#' @docType package #' @title Regression Discontinuity Design #' @import np ggplot2 KernSmooth rdrobust #' @description Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. +"_PACKAGE" utils::globalVariables(c("x", "y", "position", "cutpoint", "LATE", "CI_low", "CI_high", "sd", "quantile", "ks.test", "t.test", "coef", "density")) utils::globalVariables(c("abline", "as.formula", "coef density", "df.residual", "fitted", "glm", "hist", "ksmooth", diff --git a/man/rddtools-package.Rd b/man/rddtools-package.Rd new file mode 100644 index 0000000..55988ed --- /dev/null +++ b/man/rddtools-package.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rddtools.R +\docType{package} +\name{rddtools-package} +\alias{rddtools} +\alias{rddtools-package} +\title{Regression Discontinuity Design} +\description{ +Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. +} +\seealso{ +Useful links: +\itemize{ + \item \url{https://github.com/bquast/rddtools} + \item Report bugs at \url{https://github.com/bquast/rddtools/issues} +} + +} +\author{ +\strong{Maintainer}: Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) + +Authors: +\itemize{ + \item Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) +} + +} diff --git a/man/rddtools.Rd b/man/rddtools.Rd deleted file mode 100644 index 5c9476d..0000000 --- a/man/rddtools.Rd +++ /dev/null @@ -1,10 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rddtools.R -\docType{package} -\name{rddtools} -\alias{-package} -\alias{rddtools} -\title{Regression Discontinuity Design} -\description{ -Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. -} From b976a281eef7b2d5e12844041148f26d0564b461 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 14 Jun 2025 23:22:50 +0200 Subject: [PATCH 311/323] Update NEWS, DESCRIPTION, NAMESPACE --- DESCRIPTION | 8 ++++---- NAMESPACE | 6 ++++++ NEWS.md | 5 +++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index eae5b9d..e6c66da 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: rddtools -Version: 2.0.0 +Version: 2.0.1 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. @@ -18,8 +18,7 @@ Imports: Formula, locpol, methods, - rdrobust, - rmarkdown + rdrobust Depends: AER, np @@ -27,10 +26,11 @@ Suggests: stats4, car, knitr, + rmarkdown, testthat License: GPL (>= 2) URL: https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.2 Encoding: UTF-8 diff --git a/NAMESPACE b/NAMESPACE index 3717789..56140e8 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -32,6 +32,11 @@ S3method(subset,rdd_data) S3method(summary,rdd_data) S3method(summary,rdd_reg_np) S3method(vcov,rdd_reg_np) +S3method(waldci,default) +S3method(waldci,glm) +S3method(waldci,mlm) +S3method(waldci,rdd_reg_np) +S3method(waldci,survreg) export(as.lm) export(as.npreg) export(as.npregbw) @@ -57,6 +62,7 @@ export(rdd_reg_np) export(rot_bw) export(vcovCluster) export(vcovCluster2) +export(waldci) import(Formula) import(KernSmooth) import(ggplot2) diff --git a/NEWS.md b/NEWS.md index 256356b..1a2a98d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +rddtools 2.0.1 +===================== +* Fix minor R CRAN issues +* Update documentation + rddtools 1.8.0 ===================== * redo documentation From d60ec0e62e6c4af823f0df2238c6b08f757a77b4 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 15 Jun 2025 08:50:11 +0200 Subject: [PATCH 312/323] Add internal tests --- inst/devtools_internal_tests.R | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/inst/devtools_internal_tests.R b/inst/devtools_internal_tests.R index d8a5cc4..66d1ee4 100644 --- a/inst/devtools_internal_tests.R +++ b/inst/devtools_internal_tests.R @@ -1 +1,8 @@ devtools::check_rhub(email="Matthieu.Stigler@gmail.com", interactive=FALSE) + +devtools::check_win_devel() +devtools::check_win_release() +devtools::check_win_oldrelease() + +## then +# direct: devtools::submit_cran() \ No newline at end of file From a42684b813a3918d08ebf7f2a2d67f7f2590ead5 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 15 Jun 2025 09:39:52 +0200 Subject: [PATCH 313/323] Add output=ggplot argument to plotPlacebo, cf request #14 --- R/placebo.R | 28 ++++++++++++++++------------ man/plotPlacebo.Rd | 21 ++++++++++++++++----- man/rddtools-package.Rd | 4 ++-- tests/testthat/test_plotPlacebo.R | 7 +++++++ tests/testthat/test_plotSensi.R | 4 ++++ 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/R/placebo.R b/R/placebo.R index a393fca..914dd25 100644 --- a/R/placebo.R +++ b/R/placebo.R @@ -23,7 +23,7 @@ #' @export -plotPlacebo <- function(object, device = c("ggplot", "base"), ...) UseMethod("plotPlacebo") +plotPlacebo <- function(object, device = c("ggplot", "base"), output = c("data", "ggplot"), ...) UseMethod("plotPlacebo") #' @rdname plotPlacebo #' @export @@ -32,8 +32,9 @@ plotPlacebo <- function(object, device = c("ggplot", "base"), ...) UseMethod("pl #' @param by Increments of the from-to sequence #' @param level Level of the confidence interval shown #' @param same_bw Whether to re-estimate the bandwidth at each point -plotPlacebo.rdd_reg <- function(object, device = c("ggplot", "base"), from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, - vcov. = NULL, plot = TRUE, output = c("data", "ggplot"), ...) { +plotPlacebo.rdd_reg <- function(object, device = c("ggplot", "base"), output = c("data", "ggplot"), + from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, + vcov. = NULL, plot = TRUE, ...) { device <- match.arg(device) output <- match.arg(output) @@ -42,21 +43,23 @@ plotPlacebo.rdd_reg <- function(object, device = c("ggplot", "base"), from = 0.2 seq_vals <- computePlacebo(object = object, from = from, to = to, by = by, level = level, same_bw = same_bw, vcov. = vcov.) ## Use low-level to plot: - plotPlacebo_low(seq_vals, device = device, plot = plot, output = output, ...) + gg_out <- plotPlacebo_low(seq_vals, device = device, plot = plot, output = output, ...) - invisible(seq_vals) + ## export (silently) results: + out <- switch(output, data = seq_vals, ggplot = gg_out) + invisible(out) } #' @export -plotPlacebo.PlaceboVals <- function(object, device = c("ggplot", "base"), plot = TRUE, output = c("data", "ggplot"), ...) { +plotPlacebo.PlaceboVals <- function(object, device = c("ggplot", "base"), output = c("data", "ggplot"), plot = TRUE, ...) { device <- match.arg(device) output <- match.arg(output) - plotPlacebo_low(object, device = device, plot = plot, output = output, ...) + gg_out <- plotPlacebo_low(object, device = device, plot = plot, output = output, ...) - invisible(object) + return(gg_out) } @@ -118,11 +121,11 @@ plotPlacebo_low <- function(seq_vals, device = c("ggplot", "base"), output = c(" #' @rdname plotPlacebo #' @export -plotPlaceboDens <- function(object, device = c("ggplot", "base"), ...) UseMethod("plotPlaceboDens") +plotPlaceboDens <- function(object, device = c("ggplot", "base"), output = c("data", "ggplot"), ...) UseMethod("plotPlaceboDens") #' @rdname plotPlacebo #' @export -plotPlaceboDens.rdd_reg <- function(object, device = c("ggplot", "base"), from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, +plotPlaceboDens.rdd_reg <- function(object, device = c("ggplot", "base"), output = c("data", "ggplot"), from = 0.25, to = 0.75, by = 0.1, level = 0.95, same_bw = FALSE, vcov. = NULL, ...) { device <- match.arg(device) @@ -131,9 +134,10 @@ plotPlaceboDens.rdd_reg <- function(object, device = c("ggplot", "base"), from = seq_vals <- computePlacebo(object = object, from = from, to = to, by = by, level = level, same_bw = same_bw, vcov. = vcov.) ## Use low-level to plot: - plotPlaceboDens_low(seq_vals, device = device) + gg_out <- plotPlaceboDens_low(seq_vals, device = device) - invisible(seq_vals) + out <- switch(output, data = seq_vals, ggplot = gg_out) + invisible(out) } diff --git a/man/plotPlacebo.Rd b/man/plotPlacebo.Rd index 140db51..63a16c4 100644 --- a/man/plotPlacebo.Rd +++ b/man/plotPlacebo.Rd @@ -8,11 +8,17 @@ \alias{computePlacebo} \title{Draw a (density) plot of placebo tests} \usage{ -plotPlacebo(object, device = c("ggplot", "base"), ...) +plotPlacebo( + object, + device = c("ggplot", "base"), + output = c("data", "ggplot"), + ... +) \method{plotPlacebo}{rdd_reg}( object, device = c("ggplot", "base"), + output = c("data", "ggplot"), from = 0.25, to = 0.75, by = 0.1, @@ -20,15 +26,20 @@ plotPlacebo(object, device = c("ggplot", "base"), ...) same_bw = FALSE, vcov. = NULL, plot = TRUE, - output = c("data", "ggplot"), ... ) -plotPlaceboDens(object, device = c("ggplot", "base"), ...) +plotPlaceboDens( + object, + device = c("ggplot", "base"), + output = c("data", "ggplot"), + ... +) \method{plotPlaceboDens}{rdd_reg}( object, device = c("ggplot", "base"), + output = c("data", "ggplot"), from = 0.25, to = 0.75, by = 0.1, @@ -53,6 +64,8 @@ computePlacebo( \item{device}{Whether to draw a base or a ggplot graph.} +\item{output}{Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object} + \item{from}{Starting point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint} \item{to}{Ending point of the fake cutpoints sequence. Refers ot the quantile of each side of the true cutpoint} @@ -67,8 +80,6 @@ computePlacebo( \item{plot}{Whether to actually plot the data.} -\item{output}{Whether to return (invisibly) the data frame containing the bandwidths and corresponding estimates, or the ggplot object} - \item{\ldots}{Further arguments passed to specific methods.} } \value{ diff --git a/man/rddtools-package.Rd b/man/rddtools-package.Rd index 55988ed..9c8d75e 100644 --- a/man/rddtools-package.Rd +++ b/man/rddtools-package.Rd @@ -17,11 +17,11 @@ Useful links: } \author{ -\strong{Maintainer}: Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) +\strong{Maintainer}: Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) Authors: \itemize{ - \item Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) + \item Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) } } diff --git a/tests/testthat/test_plotPlacebo.R b/tests/testthat/test_plotPlacebo.R index ff941ed..7202069 100644 --- a/tests/testthat/test_plotPlacebo.R +++ b/tests/testthat/test_plotPlacebo.R @@ -6,12 +6,19 @@ data(house) # create rdd_data sets reg_nonpara <- rdd_reg_np(rdd_object=rdd_data(y=house$y, x=house$x, cutpoint=0) ) +reg_para <- rdd_reg_lm(rdd_object=rdd_data(y=house$y, x=house$x, cutpoint=0) ) # store plot in object placeboplot <- plotPlacebo(reg_nonpara, device="ggplot") +placeboplot_lm <- plotPlacebo(reg_para, device="ggplot") test_that("rd: output values match", { expect_equal( length(placeboplot), 8 ) expect_equal( placeboplot$cutpoint[9], 0.563925 ) }) + +test_that("output=ggplot works", { + expect_s3_class(plotPlacebo(reg_nonpara, output = "ggplot"), class = "ggplot") + expect_s3_class(plotPlacebo(reg_para, output = "ggplot"), class = "ggplot") +}) diff --git a/tests/testthat/test_plotSensi.R b/tests/testthat/test_plotSensi.R index b40e229..8722144 100644 --- a/tests/testthat/test_plotSensi.R +++ b/tests/testthat/test_plotSensi.R @@ -13,3 +13,7 @@ sensiplot <- plotSensi(reg_nonpara) test_that("rd: output values match", { expect_equal( length(sensiplot), 6 ) }) + +test_that("output=ggplot works", { + expect_s3_class(plotSensi(reg_nonpara, output = "ggplot"), class = "ggplot") +}) \ No newline at end of file From d897c6a35a62aaee74ad64e4cb49e375790d4e2a Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 15 Jun 2025 17:02:58 +0200 Subject: [PATCH 314/323] Correct outdated URLs --- R/clusterInf.R | 4 ++-- man/vcovCluster.Rd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/clusterInf.R b/R/clusterInf.R index 142d714..7af245e 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -77,12 +77,12 @@ model.frame.rdd_reg_np <- function(formula, ...) model.frame(formula$RDDslot$mod #' @param object Object of class lm, from which rdd_reg also inherits. #' @param clusterVar The variable containing the cluster attributions. #' @return A matrix containing the covariance matrix estimate. -#' @author Mahmood Arai, see \url{http://people.su.se/~ma/econometrics.html} +#' @author Mahmood Arai, see \url{https://www.su.se/profiles/ma-1.181536} #' @references Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway Clustering, #' \emph{Journal of Business and Economic Statistics}, vol. 29(2), pages 238-249. #' #' @references Wooldridge (2003) Cluster-sample methods in applied econometrics. #' \emph{American Economic Review}, 93, p. 133-138 -#' @references Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http://people.su.se/~ma/clustering.pdf}. +#' @references Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{https://www.ne.su.se/polopoly_fs/1.216115.1426234213!/menu/standard/file/clustering1.pdf}. #' @export #' @seealso \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. #' @examples diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index 9040791..7c84d07 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -42,11 +42,11 @@ Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway C #' @references Wooldridge (2003) Cluster-sample methods in applied econometrics. \emph{American Economic Review}, 93, p. 133-138 -Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{http://people.su.se/~ma/clustering.pdf}. +Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{https://www.ne.su.se/polopoly_fs/1.216115.1426234213!/menu/standard/file/clustering1.pdf}. } \seealso{ \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. } \author{ -Mahmood Arai, see \url{http://people.su.se/~ma/econometrics.html} +Mahmood Arai, see \url{https://www.su.se/profiles/ma-1.181536} } From 618650b1673d8369cd98abfefc7b54a7e72ce92c Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sun, 15 Jun 2025 17:10:44 +0200 Subject: [PATCH 315/323] Try to avoid issue of Author field differs from that derived from Authors@R, cf #15 --- DESCRIPTION | 1 - man/rddtools-package.Rd | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e6c66da..accc17b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -8,7 +8,6 @@ Authors@R: c( email="Matthieu.Stigler@gmail.com"), person("Bastiaan", "Quast", email = "bquast@gmail.com", role=c("aut", "cre"), comment=c(ORCID="0000-0002-2951-3577") ) ) -Maintainer: Bastiaan Quast Imports: KernSmooth, ggplot2, diff --git a/man/rddtools-package.Rd b/man/rddtools-package.Rd index 9c8d75e..55988ed 100644 --- a/man/rddtools-package.Rd +++ b/man/rddtools-package.Rd @@ -17,11 +17,11 @@ Useful links: } \author{ -\strong{Maintainer}: Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) +\strong{Maintainer}: Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) Authors: \itemize{ - \item Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) + \item Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) } } From 197a38c1915b36a70aae0ac39cd0d4beef23c9f5 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Wed, 18 Jun 2025 14:54:32 +0200 Subject: [PATCH 316/323] remove github workflow, cf #15 --- .github/workflows/R-cmd-check.yaml | 78 ---------------------------- .github/workflows/test-coverage.yaml | 43 --------------- 2 files changed, 121 deletions(-) delete mode 100644 .github/workflows/R-cmd-check.yaml delete mode 100644 .github/workflows/test-coverage.yaml diff --git a/.github/workflows/R-cmd-check.yaml b/.github/workflows/R-cmd-check.yaml deleted file mode 100644 index c90f5a0..0000000 --- a/.github/workflows/R-cmd-check.yaml +++ /dev/null @@ -1,78 +0,0 @@ -on: - push: - branches: - - master - pull_request: - branches: - - master - -name: R-CMD-check - -jobs: - R-CMD-check: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - - {os: windows-latest, r: 'release'} - - {os: macOS-latest, r: 'release'} - - {os: ubuntu-latest, r: 'release'} - - env: - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - RSPM: ${{ matrix.config.rspm }} - - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-r@master - with: - r-version: ${{ matrix.config.r }} - - - uses: r-lib/actions/setup-pandoc@master - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - shell: Rscript {0} - - - name: Cache R packages - if: runner.os != 'Windows' - uses: actions/cache@v1 - with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-r-${{ matrix.config.r }}-${{ hashFiles('.github/depends.Rds') }} - restore-keys: ${{ runner.os }}-r-${{ matrix.config.r }}- - - - name: Install system dependencies - if: runner.os == 'Linux' - env: - RHUB_PLATFORM: linux-x86_64-ubuntu-gcc - run: | - Rscript -e "remotes::install_github('r-hub/sysreqs')" - sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))") - sudo -s eval "$sysreqs" - - - name: Install dependencies - run: | - remotes::install_deps(dependencies = TRUE) - remotes::install_cran("rcmdcheck") - shell: Rscript {0} - - - name: Check - env: - _R_CHECK_CRAN_INCOMING_REMOTE_: false - run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") - shell: Rscript {0} - - - name: Upload check results - if: failure() - uses: actions/upload-artifact@master - with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results - path: check diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml deleted file mode 100644 index 1f9d0d2..0000000 --- a/.github/workflows/test-coverage.yaml +++ /dev/null @@ -1,43 +0,0 @@ -on: - push: - branches: - - master - pull_request: - branches: - - master - -name: test-coverage - -jobs: - test-coverage: - runs-on: macOS-latest - steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-r@master - - - uses: r-lib/actions/setup-pandoc@master - - - name: Query dependencies - run: | - install.packages('remotes') - saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) - shell: Rscript {0} - - - name: Cache R packages - uses: actions/cache@v1 - with: - path: ${{ env.R_LIBS_USER }} - key: macOS-r-3.6-${{ hashFiles('.github/depends.Rds') }} - restore-keys: macOS-r-3.6- - - - name: Install dependencies - run: | - install.packages(c("remotes")) - remotes::install_deps(dependencies = TRUE) - remotes::install_cran("covr") - shell: Rscript {0} - - - name: Test coverage - run: covr::codecov() - shell: Rscript {0} From 59e266143cbe1de574b6b2a1ee2779b5aef7ceb6 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Wed, 18 Jun 2025 15:33:17 +0200 Subject: [PATCH 317/323] Fix CRAN complaint URLs --- R/clusterInf.R | 4 ++-- man/rddtools-package.Rd | 4 ++-- man/vcovCluster.Rd | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/clusterInf.R b/R/clusterInf.R index 7af245e..6cb51a6 100644 --- a/R/clusterInf.R +++ b/R/clusterInf.R @@ -77,12 +77,12 @@ model.frame.rdd_reg_np <- function(formula, ...) model.frame(formula$RDDslot$mod #' @param object Object of class lm, from which rdd_reg also inherits. #' @param clusterVar The variable containing the cluster attributions. #' @return A matrix containing the covariance matrix estimate. -#' @author Mahmood Arai, see \url{https://www.su.se/profiles/ma-1.181536} +#' @author Mahmood Arai, #' @references Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway Clustering, #' \emph{Journal of Business and Economic Statistics}, vol. 29(2), pages 238-249. #' #' @references Wooldridge (2003) Cluster-sample methods in applied econometrics. #' \emph{American Economic Review}, 93, p. 133-138 -#' @references Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{https://www.ne.su.se/polopoly_fs/1.216115.1426234213!/menu/standard/file/clustering1.pdf}. +#' @references Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{https://web.archive.org/web/20230101000000/https://www.ne.su.se/polopoly_fs/1.216115.1426234213!/menu/standard/file/clustering1.pdf}. #' @export #' @seealso \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. #' @examples diff --git a/man/rddtools-package.Rd b/man/rddtools-package.Rd index 55988ed..9c8d75e 100644 --- a/man/rddtools-package.Rd +++ b/man/rddtools-package.Rd @@ -17,11 +17,11 @@ Useful links: } \author{ -\strong{Maintainer}: Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) +\strong{Maintainer}: Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) Authors: \itemize{ - \item Matthieu Stigler \email{Matthieu.Stigler@gmail.com} (\href{https://orcid.org/0000-0002-6802-4290}{ORCID}) + \item Bastiaan Quast \email{bquast@gmail.com} (\href{https://orcid.org/0000-0002-2951-3577}{ORCID}) } } diff --git a/man/vcovCluster.Rd b/man/vcovCluster.Rd index 7c84d07..440af7a 100644 --- a/man/vcovCluster.Rd +++ b/man/vcovCluster.Rd @@ -42,11 +42,11 @@ Cameron, C., Gelbach, J. and Miller, D. (2011) Robust Inference With Multiway C #' @references Wooldridge (2003) Cluster-sample methods in applied econometrics. \emph{American Economic Review}, 93, p. 133-138 -Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{https://www.ne.su.se/polopoly_fs/1.216115.1426234213!/menu/standard/file/clustering1.pdf}. +Arai, M. (2011) Cluster-robust standard errors using R, Note available \url{https://web.archive.org/web/20230101000000/https://www.ne.su.se/polopoly_fs/1.216115.1426234213!/menu/standard/file/clustering1.pdf}. } \seealso{ \code{\link{clusterInf}} for a direct function, allowing also alternative cluster inference methods. } \author{ -Mahmood Arai, see \url{https://www.su.se/profiles/ma-1.181536} +Mahmood Arai, } From fb5074e73c0f64dca6a010b5ac3e3e2a74e2b855 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Wed, 2 Jul 2025 18:50:52 +0200 Subject: [PATCH 318/323] Change maintainer to Matthieu --- DESCRIPTION | 4 ++-- NEWS.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index accc17b..3bcfee4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -4,9 +4,9 @@ Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. Authors@R: c( - person("Matthieu", "Stigler", role = "aut", comment=c(ORCID="0000-0002-6802-4290"), + person("Matthieu", "Stigler", role = c("aut", "cre"), comment=c(ORCID="0000-0002-6802-4290"), email="Matthieu.Stigler@gmail.com"), - person("Bastiaan", "Quast", email = "bquast@gmail.com", role=c("aut", "cre"), comment=c(ORCID="0000-0002-2951-3577") ) + person("Bastiaan", "Quast", email = "bquast@gmail.com", role=c("aut"), comment=c(ORCID="0000-0002-2951-3577") ) ) Imports: KernSmooth, diff --git a/NEWS.md b/NEWS.md index 1a2a98d..7e41c31 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ rddtools 2.0.1 ===================== * Fix minor R CRAN issues * Update documentation +* Chainge maintainer to Matthieu rddtools 1.8.0 ===================== From a2eca6dc90a4da94d3a0bc9cf0133658e0b75ef5 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 25 Oct 2025 10:19:42 +0200 Subject: [PATCH 319/323] Internal changes, update CRAN comments --- cran-comments.md | 37 +--------------------------------- inst/devtools_internal_tests.R | 7 ++++++- 2 files changed, 7 insertions(+), 37 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index 2ea1eb2..b27341d 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,38 +1,3 @@ # Test environments -- local Windows 10 install, R 4.2.0 -- local Linux (Arch) install, R 4.2.0 -- local macOS install, R 4.2.0 -- GitHub Actions - - Windows Server, R release - - MacOS, R release - - MacOS, R dev - - Ubuntu, R release -- win-builder - - devel - - release - - -# R CMD check - -R CMD check succeeded - -── R CMD check results ─────────────────────────────────────────────────────────────────────── rddtools 1.8.0 ──── -Duration: 1m 36.3s - -0 errors ✔ | 0 warnings ✔ | 0 notes ✔ - -R CMD check succeeded - - -# win builder - -There is a note about a possibly invalid URL, the URL works (JSTOR stable). - -Found the following (possibly) invalid URLs: - URL: https://www.jstor.org/stable/2291516 - From: README.md - Status: 403 - Message: Forbidden - -This is a valid URL that works fine. \ No newline at end of file +There is a change in maintainers, the package is now maintained by Matthieu Stigler. \ No newline at end of file diff --git a/inst/devtools_internal_tests.R b/inst/devtools_internal_tests.R index 66d1ee4..ad40c07 100644 --- a/inst/devtools_internal_tests.R +++ b/inst/devtools_internal_tests.R @@ -4,5 +4,10 @@ devtools::check_win_devel() devtools::check_win_release() devtools::check_win_oldrelease() +devtools::build() + + ## then -# direct: devtools::submit_cran() \ No newline at end of file +# direct: devtools::submit_cran() + +curl::curl_fetch_memory("ftp://win-builder.r-project.org") From 64c75d51fdfe03958646e2afda80e419c412ed93 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 25 Oct 2025 10:20:15 +0200 Subject: [PATCH 320/323] Import code from archived rdd package, DCdesnity --- DESCRIPTION | 33 +++++- NAMESPACE | 9 +- R/dens_test.R | 17 +-- R/rdd_pkg_old_DCdensity.R | 244 ++++++++++++++++++++++++++++++++++++++ R/rdd_pkg_old_kernelwts.R | 51 ++++++++ man/dens_test.Rd | 19 ++- 6 files changed, 357 insertions(+), 16 deletions(-) create mode 100644 R/rdd_pkg_old_DCdensity.R create mode 100644 R/rdd_pkg_old_kernelwts.R diff --git a/DESCRIPTION b/DESCRIPTION index 3bcfee4..8dda720 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,6 @@ Package: rddtools Version: 2.0.1 +Date: 2025-07-02 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. @@ -11,7 +12,6 @@ Authors@R: c( Imports: KernSmooth, ggplot2, - rdd, sandwich, lmtest, Formula, @@ -31,5 +31,34 @@ License: GPL (>= 2) URL: https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Encoding: UTF-8 +Collate: + 'as.npreg.R' + 'bw_cct_estim.R' + 'bw_cct_plot.R' + 'bw_ik.R' + 'bw_rot.R' + 'clusterInf.R' + 'covarTests.R' + 'dens_test.R' + 'gen_mc_ik.R' + 'get_methods.R' + 'model.matrix.rdd.R' + 'placebo.R' + 'plotBin.R' + 'plotSensi.R' + 'qplot_experim.R' + 'rdd_coef.R' + 'rdd_data.R' + 'rdd_data_methods.R' + 'rdd_pkg_old_kernelwts.R' + 'rdd_pkg_old_DCdensity.R' + 'rdd_pred.R' + 'rddtools.R' + 'reg_gen.R' + 'reg_lm.R' + 'reg_np.R' + 'var_estim.R' + 'various_code.R' + 'waldci.R' diff --git a/NAMESPACE b/NAMESPACE index 56140e8..335103f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -69,13 +69,20 @@ import(ggplot2) import(lmtest) import(methods) import(np) -import(rdd) import(rdrobust) import(sandwich) importFrom(AER,ivreg) +importFrom(graphics,lines) +importFrom(graphics,points) importFrom(locpol,gaussK) importFrom(locpol,locpol) importFrom(rdrobust,rdbwselect) importFrom(rdrobust,rdplot) +importFrom(stats,coef) +importFrom(stats,complete.cases) importFrom(stats,getCall) +importFrom(stats,lm) +importFrom(stats,pnorm) +importFrom(stats,predict) +importFrom(stats,sd) importFrom(utils,head) diff --git a/R/dens_test.R b/R/dens_test.R index 1bdbedb..274192b 100644 --- a/R/dens_test.R +++ b/R/dens_test.R @@ -1,14 +1,17 @@ -#' Run the McCracy test for manipulation of the forcing variable +#' McCrary Sorting Test #' -#' Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{rdd_object}. +#' Run the McCracy test for manipulation of the forcing variable #' #' @param rdd_object object of class rdd_data -#' @param bin Argument of the \code{\link[rdd]{DCdensity}} function, the binwidth -#' @param bw Argument of the \code{\link[rdd]{DCdensity}} function, the bandwidth -#' @param plot Whether to return a plot. Logical, default ot TRUE. -#' @param \ldots Further arguments passed to \code{\link[rdd]{DCdensity}}. +#' @param bin the binwidth (defaults to \code{2*sd(runvar)*length(runvar)^(-.5)}) +#' @param bw the bandwidth to use (by default uses bandwidth selection calculation from McCrary (2008)) +#' @param plot Whether to return a plot. Logical, default to TRUE. +#' @param \ldots Further arguments passed to the unexported \code{DCdensity} function. +#' @description +#' This calls the original \code{DCdensity} function which was in the package \code{rdd} by Drew Dimmery, +#' which has been archived and is now internally stored in the Rddtools package. +#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} #' @export -#' @import rdd #' @examples #' data(house) #' house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0) diff --git a/R/rdd_pkg_old_DCdensity.R b/R/rdd_pkg_old_DCdensity.R new file mode 100644 index 0000000..1521a75 --- /dev/null +++ b/R/rdd_pkg_old_DCdensity.R @@ -0,0 +1,244 @@ +#' McCrary Sorting Test +#' +#' \code{DCdensity} implements the McCrary (2008) sorting test. +#' +#' @param runvar numerical vector of the running variable +#' @param cutpoint the cutpoint (defaults to 0) +#' @param bin the binwidth (defaults to \code{2*sd(runvar)*length(runvar)^(-.5)}) +#' @param bw the bandwidth to use (by default uses bandwidth selection calculation from McCrary (2008)) +#' @param verbose logical flag specifying whether to print diagnostic information to the terminal. (defaults to \code{FALSE}) +#' @param plot logical flag indicating whether to plot the histogram and density estimations (defaults to \code{TRUE}). The user may wrap this function in additional graphical options to modify the plot. +#' @param ext.out logical flag indicating whether to return extended output. When \code{FALSE} (the default) \code{DCdensity} will return only the p-value of the test. When \code{TRUE}, \code{DCdensity} will return the additional information documented below. +#' @param htest logical flag indicating whether to return an \code{"htest"} object compatible with base R's hypothesis test output. +#' @return If \code{ext.out} is \code{FALSE}, only the p value will be returned. Additional output is enabled when \code{ext.out} is \code{TRUE}. In this case, a list will be returned with the following elements: +#' \item{theta}{the estimated log difference in heights at the cutpoint} +#' \item{se}{the standard error of \code{theta}} +#' \item{z}{the z statistic of the test} +#' \item{p}{the p-value of the test. A p-value below the significance threshhold indicates that the user can reject the null hypothesis of no sorting.} +#' \item{binsize}{the calculated size of bins for the test} +#' \item{bw}{the calculated bandwidth for the test} +#' \item{cutpoint}{the cutpoint used} +#' \item{data}{a dataframe for the binning of the histogram. Columns are \code{cellmp} (the midpoints of each cell) and \code{cellval} (the normalized height of each cell)} +#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +#' @include rdd_pkg_old_kernelwts.R +#' @importFrom stats complete.cases sd lm coef predict pnorm +#' @importFrom graphics lines points +#' @author Drew Dimmery <\email{drewd@@nyu.edu}> +#' @examples +#' #No discontinuity +#' x<-runif(1000,-1,1) +#' DCdensity(x,0) +#' +#' #Discontinuity +#' x<-runif(1000,-1,1) +#' x<-x+2*(runif(1000,-1,1)>0&x<0) +#' DCdensity(x,0) +#' @noRd + +DCdensity <- function(runvar, cutpoint, bin=NULL, bw=NULL, verbose=FALSE, plot=TRUE, ext.out=FALSE, htest=FALSE) { + runvar <- runvar[complete.cases(runvar)] + #Grab some summary vars + rn <- length(runvar) + rsd <- sd(runvar) + rmin <- min(runvar) + rmax <- max(runvar) + if(missing(cutpoint)) { + if(verbose) cat("Assuming cutpoint of zero.\n") + cutpoint<-0 + } + + if(cutpoint<=rmin | cutpoint>=rmax){ + stop("Cutpoint must lie within range of runvar") + } + + if(is.null(bin)) { + bin <- 2*rsd*rn^(-1/2) + if(verbose) cat("Using calculated bin size: ",sprintf("%.3f",bin),"\n") + } + + l <- floor((rmin - cutpoint)/bin)*bin + bin/2 + cutpoint #Midpoint of lowest bin + r <- floor((rmax - cutpoint)/bin)*bin + bin/2 + cutpoint #Midpoint of highest bin + lc <- cutpoint-(bin/2) #Midpoint of bin just left of breakpoint + rc <- cutpoint+(bin/2) #Midpoint of bin just right of breakpoint + j <- floor((rmax - rmin)/bin) + 2 + + binnum <- round((((floor((runvar - cutpoint)/bin)*bin + bin/2 + cutpoint) - l)/bin) + 1) + + cellval <- rep(0,j) + for(i in seq(1,rn)){ + cnum <- binnum[i] + cellval[cnum] <- cellval[cnum]+1 + } + cellval <- ( cellval / rn ) / bin + + cellmp <- seq(from=1,to=j,by=1) + cellmp <- floor(((l + (cellmp - 1)*bin ) - cutpoint)/bin)*bin + bin/2 + cutpoint + + #If no bandwidth is given, calc it + if(is.null(bw)){ + #bin number just left of breakpoint + leftofc <- round((((floor((lc - cutpoint)/bin)*bin + bin/2 + cutpoint) - l)/bin) + 1) + #bin number just right of breakpoint + rightofc <- round((((floor((rc - cutpoint)/bin)*bin + bin/2 + cutpoint) - l)/bin) + 1) + if ( rightofc - leftofc != 1) { + stop("Error occurred in bandwidth calculation") + } + cellmpleft <- cellmp[1:leftofc] + cellmpright <- cellmp[rightofc:j] + + #Estimate 4th order polynomial to the left + P.lm <- lm( + cellval ~ poly(cellmp,degree=4,raw=T), + subset=cellmp=cutpoint + ) + mse4 <- summary(P.lm)$sigma^2 + rcoef <- coef(P.lm) + fppright <- 2*rcoef[3] + + 6*rcoef[4]*cellmpright + + 12*rcoef[5]*cellmpright*cellmpright + hright <- 3.348*(mse4*( r - cutpoint ) / sum(fppright*fppright))^(1/5) + + + bw = .5*( hleft + hright ) + if(verbose) cat("Using calculated bandwidth: ",sprintf("%.3f",bw),"\n") + } + if( sum(runvar>cutpoint-bw & runvar=cutpoint) ==0) + stop("Insufficient data within the bandwidth.") + if(plot){ + #estimate density to either side of the cutpoint using a triangular kernel + d.l<-data.frame(cellmp=cellmp[cellmp=cutpoint],cellval=cellval[cellmp>=cutpoint],dist=NA,est=NA,lwr=NA,upr=NA) + for(i in 1:nrow(d.r)) { + d.r$dist<-d.r$cellmp-d.r[i,"cellmp"] + w<-kernelwts(d.r$dist,0,bw,kernel="triangular") + newd<-data.frame(dist=0) + pred<-predict(lm(cellval~dist,weights=w,data=d.r),interval="confidence",newdata=newd) + d.r$est[i]<-pred[1] + d.r$lwr[i]<-pred[2] + d.r$upr[i]<-pred[3] + } + #plot to the left + #return(list(d.l,d.r)) + plot(d.l$cellmp,d.l$est, + lty=1,lwd=2,col="black",type="l", + xlim=c(pmin,pmax), + ylim=c(min(cellval[cellmp<=pmax&cellmp>=pmin]), + max(cellval[cellmp<=pmax&cellmp>=pmin])), + xlab=NA, + ylab=NA, + main=NA + ) + + lines(d.l$cellmp,d.l$lwr, + lty=2,lwd=1,col="black",type="l" + ) + lines(d.l$cellmp,d.l$upr, + lty=2,lwd=1,col="black",type="l" + ) + + #plot to the right + lines(d.r$cellmp,d.r$est, + lty=1,lwd=2,col="black",type="l" + ) + lines(d.r$cellmp,d.r$lwr, + lty=2,lwd=1,col="black",type="l" + ) + lines(d.r$cellmp,d.r$upr, + lty=2,lwd=1,col="black",type="l" + ) + + #plot the histogram as points + points(cellmp,cellval,type="p",pch=20) + } + cmp<-cellmp + cval<-cellval + padzeros <- ceiling(bw/bin) + jp <- j + 2*padzeros + if(padzeros>=1) { + cval <- c(rep(0,padzeros), + cellval, + rep(0,padzeros) + ) + cmp <- c(seq(l-padzeros*bin,l-bin,bin), + cellmp, + seq(r+bin,r+padzeros*bin,bin) + ) + } + + #Estimate to the left + dist <- cmp - cutpoint + w <- 1-abs(dist/bw) + w <- ifelse(w>0, w*(cmp0, w*(cmp>=cutpoint), 0) + w <- (w/sum(w))*jp + fhatr<-predict(lm(cval~dist,weights=w),newdata=data.frame(dist=0))[[1]] + + #Calculate and display dicontinuity estimate + thetahat <- log(fhatr) - log(fhatl) + sethetahat <- sqrt( (1/(rn*bw)) * (24/5) * ((1/fhatr) + (1/fhatl)) ) + z<-thetahat/sethetahat + p<-2*pnorm(abs(z),lower.tail=FALSE) + + if(verbose) { + cat("Log difference in heights is ", + sprintf("%.3f",thetahat), + " with SE ", + sprintf("%.3f",sethetahat),"\n" + ) + cat(" this gives a z-stat of ",sprintf("%.3f",z),"\n") + cat(" and a p value of ",sprintf("%.3f",p),"\n") + } + if(ext.out) + return(list(theta=thetahat, + se=sethetahat, + z=z, + p=p, + binsize=bin, + bw=bw, + cutpoint=cutpoint, + data=data.frame(cellmp,cellval) + ) + ) + else if (htest) { + # Return an htest object, for compatibility with base R test output. + structure(list( + statistic = c(`z` = z), + p.value = p, + method = "McCrary (2008) sorting test", + parameter = c(`binwidth` = bin, + `bandwidth` = bw, + `cutpoint` = cutpoint), + alternative = "no apparent sorting"), + class = "htest") + } + else return(p) +} diff --git a/R/rdd_pkg_old_kernelwts.R b/R/rdd_pkg_old_kernelwts.R new file mode 100644 index 0000000..fc7248c --- /dev/null +++ b/R/rdd_pkg_old_kernelwts.R @@ -0,0 +1,51 @@ +#' Kernel Weighting function +#' +#' This function will calculate the appropriate kernel weights +#' for a vector. This is useful when, for instance, one wishes to +#' perform local regression. +#' +#' @param X input x values. This variable represents the axis along which kernel weighting should be performed. +#' @param center the point from which distances should be calculated. +#' @param bw the bandwidth. +#' @param kernel a string indicating the kernel to use. Options are \code{"triangular"} (the default), +#' \code{"epanechnikov"}, \code{"quartic"}, \code{"triweight"}, \code{"tricube"}, \code{"gaussian"}, +#' and \code{"cosine"}. +#' @return A vector of weights with length equal to that of the \code{X} input (one weight per element of \code{X}). +#' @author Drew Dimmery <\email{drewd@@nyu.edu}> +#' @noRd +#' @examples +#' require(graphics) +#' +#' X<-seq(-1,1,.01) +#' triang.wts<-kernelwts(X,0,1,kernel="triangular") +#' plot(X,triang.wts,type="l") +#' +#' cos.wts<-kernelwts(X,0,1,kernel="cosine") +#' plot(X,cos.wts,type="l") + + +kernelwts<-function(X, center, bw, kernel="triangular"){ + dist <-(X-center)/bw + if(kernel=="triangular"){ + w<-(1-abs(dist)) + } else if (kernel=="rectangular") { + w<-1/2 + } else if (kernel=="epanechnikov") { + w<-3/4*(1-dist^2) + } else if (kernel=="quartic" | kernel=="biweight") { + w<-15/16*(1-dist^2)^2 + } else if (kernel=="triweight") { + w<-35/32*(1-dist^2)^3 + } else if (kernel=="tricube") { + w<-70/81*(1-abs(dist)^3)^3 + } else if (kernel=="gaussian") { + w<-1/sqrt(2*pi)*exp(-1/2*dist^2) + } else if (kernel=="cosine") { + w<-pi/4*cos(pi/2 * dist) + } else { + stop("Invalid kernel selection.") + } + w<-ifelse(abs(dist)>1&kernel!="gaussian",0,w) + w<-w/sum(w) + return(w) +} \ No newline at end of file diff --git a/man/dens_test.Rd b/man/dens_test.Rd index b0e50b7..2d5386d 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -2,26 +2,33 @@ % Please edit documentation in R/dens_test.R \name{dens_test} \alias{dens_test} -\title{Run the McCracy test for manipulation of the forcing variable} +\title{McCrary Sorting Test} \usage{ dens_test(rdd_object, bin = NULL, bw = NULL, plot = TRUE, ...) } \arguments{ \item{rdd_object}{object of class rdd_data} -\item{bin}{Argument of the \code{\link[rdd]{DCdensity}} function, the binwidth} +\item{bin}{the binwidth (defaults to \code{2*sd(runvar)*length(runvar)^(-.5)})} -\item{bw}{Argument of the \code{\link[rdd]{DCdensity}} function, the bandwidth} +\item{bw}{the bandwidth to use (by default uses bandwidth selection calculation from McCrary (2008))} -\item{plot}{Whether to return a plot. Logical, default ot TRUE.} +\item{plot}{Whether to return a plot. Logical, default to TRUE.} -\item{\ldots}{Further arguments passed to \code{\link[rdd]{DCdensity}}.} +\item{\ldots}{Further arguments passed to the unexported \code{DCdensity} function.} } \description{ -Calls the \code{\link[rdd]{DCdensity}} test from package \code{rdd} on a \code{rdd_object}. +This calls the original \code{DCdensity} function which was in the package \code{rdd} by Drew Dimmery, +which has been archived and is now internally stored in the Rddtools package. +} +\details{ +Run the McCracy test for manipulation of the forcing variable } \examples{ data(house) house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0) dens_test(house_rdd) } +\references{ +McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +} From 23e48e5020474c80b512e648607634db8a1a8c00 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Sat, 25 Oct 2025 10:22:16 +0200 Subject: [PATCH 321/323] Update to license GPL 3 --- .Rbuildignore | 1 + DESCRIPTION | 2 +- LICENSE.md | 595 +++++++++++++++++++++++++++++++++ inst/devtools_internal_tests.R | 2 +- 4 files changed, 598 insertions(+), 2 deletions(-) create mode 100644 LICENSE.md diff --git a/.Rbuildignore b/.Rbuildignore index 0167d8c..f55b2bf 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -7,3 +7,4 @@ misc ^Meta$ ^CRAN-RELEASE$ ^CRAN-SUBMISSION$ +^LICENSE\.md$ diff --git a/DESCRIPTION b/DESCRIPTION index 8dda720..3dae34c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -27,7 +27,7 @@ Suggests: knitr, rmarkdown, testthat -License: GPL (>= 2) +License: GPL (>= 3) URL: https://github.com/bquast/rddtools BugReports: https://github.com/bquast/rddtools/issues VignetteBuilder: knitr diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..175443c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,595 @@ +GNU General Public License +========================== + +_Version 3, 29 June 2007_ +_Copyright © 2007 Free Software Foundation, Inc. <>_ + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +## Preamble + +The GNU General Public License is a free, copyleft license for software and other +kinds of works. + +The licenses for most software and other practical works are designed to take away +your freedom to share and change the works. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change all versions of a +program--to make sure it remains free software for all its users. We, the Free +Software Foundation, use the GNU General Public License for most of our software; it +applies also to any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General +Public Licenses are designed to make sure that you have the freedom to distribute +copies of free software (and charge for them if you wish), that you receive source +code or can get it if you want it, that you can change the software or use pieces of +it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or +asking you to surrender the rights. Therefore, you have certain responsibilities if +you distribute copies of the software, or if you modify it: responsibilities to +respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, +you must pass on to the recipients the same freedoms that you received. You must make +sure that they, too, receive or can get the source code. And you must show them these +terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: **(1)** assert +copyright on the software, and **(2)** offer you this License giving you legal permission +to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is +no warranty for this free software. For both users' and authors' sake, the GPL +requires that modified versions be marked as changed, so that their problems will not +be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of +the software inside them, although the manufacturer can do so. This is fundamentally +incompatible with the aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we have designed +this version of the GPL to prohibit the practice for those products. If such problems +arise substantially in other domains, we stand ready to extend this provision to +those domains in future versions of the GPL, as needed to protect the freedom of +users. + +Finally, every program is threatened constantly by software patents. States should +not allow patents to restrict development and use of software on general-purpose +computers, but in those that do, we wish to avoid the special danger that patents +applied to a free program could make it effectively proprietary. To prevent this, the +GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + +## TERMS AND CONDITIONS + +### 0. Definitions + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in +a fashion requiring copyright permission, other than the making of an exact copy. The +resulting work is called a “modified version” of the earlier work or a +work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on +the Program. + +To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for infringement under +applicable copyright law, except executing it on a computer or modifying a private +copy. Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the +extent that it includes a convenient and prominently visible feature that **(1)** +displays an appropriate copyright notice, and **(2)** tells the user that there is no +warranty for the work (except to the extent that warranties are provided), that +licensees may convey the work under this License, and how to view a copy of this +License. If the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +### 1. Source Code + +The “source code” for a work means the preferred form of the work for +making modifications to it. “Object code” means any non-source form of a +work. + +A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of interfaces +specified for a particular programming language, one that is widely used among +developers working in that language. + +The “System Libraries” of an executable work include anything, other than +the work as a whole, that **(a)** is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and **(b)** serves only to +enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code form. +A “Major Component”, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on which +the executable work runs, or a compiler used to produce the work, or an object code +interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the +source code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. However, +it does not include the work's System Libraries, or general-purpose tools or +generally available free programs which are used unmodified in performing those +activities but which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for the work, and +the source code for shared libraries and dynamically linked subprograms that the work +is specifically designed to require, such as by intimate data communication or +control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +### 2. Basic Permissions + +All rights granted under this License are granted for the term of copyright on the +Program, and are irrevocable provided the stated conditions are met. This License +explicitly affirms your unlimited permission to run the unmodified Program. The +output from running a covered work is covered by this License only if the output, +given its content, constitutes a covered work. This License acknowledges your rights +of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey covered +works to others for the sole purpose of having them make modifications exclusively +for you, or provide you with facilities for running those works, provided that you +comply with the terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for you must do so +exclusively on your behalf, under your direction and control, on terms that prohibit +them from making any copies of your copyrighted material outside their relationship +with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law + +No covered work shall be deemed part of an effective technological measure under any +applicable law fulfilling obligations under article 11 of the WIPO copyright treaty +adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention +of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of +technological measures to the extent such circumvention is effected by exercising +rights under this License with respect to the covered work, and you disclaim any +intention to limit operation or modification of the work as a means of enforcing, +against the work's users, your or third parties' legal rights to forbid circumvention +of technological measures. + +### 4. Conveying Verbatim Copies + +You may convey verbatim copies of the Program's source code as you receive it, in any +medium, provided that you conspicuously and appropriately publish on each copy an +appropriate copyright notice; keep intact all notices stating that this License and +any non-permissive terms added in accord with section 7 apply to the code; keep +intact all notices of the absence of any warranty; and give all recipients a copy of +this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer +support or warranty protection for a fee. + +### 5. Conveying Modified Source Versions + +You may convey a work based on the Program, or the modifications to produce it from +the Program, in the form of source code under the terms of section 4, provided that +you also meet all of these conditions: + +* **a)** The work must carry prominent notices stating that you modified it, and giving a +relevant date. +* **b)** The work must carry prominent notices stating that it is released under this +License and any conditions added under section 7. This requirement modifies the +requirement in section 4 to “keep intact all notices”. +* **c)** You must license the entire work, as a whole, under this License to anyone who +comes into possession of a copy. This License will therefore apply, along with any +applicable section 7 additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no permission to license the +work in any other way, but it does not invalidate such permission if you have +separately received it. +* **d)** If the work has interactive user interfaces, each must display Appropriate Legal +Notices; however, if the Program has interactive interfaces that do not display +Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are +not by their nature extensions of the covered work, and which are not combined with +it such as to form a larger program, in or on a volume of a storage or distribution +medium, is called an “aggregate” if the compilation and its resulting +copyright are not used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work in an aggregate +does not cause this License to apply to the other parts of the aggregate. + +### 6. Conveying Non-Source Forms + +You may convey a covered work in object code form under the terms of sections 4 and +5, provided that you also convey the machine-readable Corresponding Source under the +terms of this License, in one of these ways: + +* **a)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by the Corresponding Source fixed on a +durable physical medium customarily used for software interchange. +* **b)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by a written offer, valid for at least +three years and valid for as long as you offer spare parts or customer support for +that product model, to give anyone who possesses the object code either **(1)** a copy of +the Corresponding Source for all the software in the product that is covered by this +License, on a durable physical medium customarily used for software interchange, for +a price no more than your reasonable cost of physically performing this conveying of +source, or **(2)** access to copy the Corresponding Source from a network server at no +charge. +* **c)** Convey individual copies of the object code with a copy of the written offer to +provide the Corresponding Source. This alternative is allowed only occasionally and +noncommercially, and only if you received the object code with such an offer, in +accord with subsection 6b. +* **d)** Convey the object code by offering access from a designated place (gratis or for +a charge), and offer equivalent access to the Corresponding Source in the same way +through the same place at no further charge. You need not require recipients to copy +the Corresponding Source along with the object code. If the place to copy the object +code is a network server, the Corresponding Source may be on a different server +(operated by you or a third party) that supports equivalent copying facilities, +provided you maintain clear directions next to the object code saying where to find +the Corresponding Source. Regardless of what server hosts the Corresponding Source, +you remain obligated to ensure that it is available for as long as needed to satisfy +these requirements. +* **e)** Convey the object code using peer-to-peer transmission, provided you inform +other peers where the object code and Corresponding Source of the work are being +offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the +Corresponding Source as a System Library, need not be included in conveying the +object code work. + +A “User Product” is either **(1)** a “consumer product”, which +means any tangible personal property which is normally used for personal, family, or +household purposes, or **(2)** anything designed or sold for incorporation into a +dwelling. In determining whether a product is a consumer product, doubtful cases +shall be resolved in favor of coverage. For a particular product received by a +particular user, “normally used” refers to a typical or common use of +that class of product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected to use, the +product. A product is a consumer product regardless of whether the product has +substantial commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified version of +its Corresponding Source. The information must suffice to ensure that the continued +functioning of the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for +use in, a User Product, and the conveying occurs as part of a transaction in which +the right of possession and use of the User Product is transferred to the recipient +in perpetuity or for a fixed term (regardless of how the transaction is +characterized), the Corresponding Source conveyed under this section must be +accompanied by the Installation Information. But this requirement does not apply if +neither you nor any third party retains the ability to install modified object code +on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to +continue to provide support service, warranty, or updates for a work that has been +modified or installed by the recipient, or for the User Product in which it has been +modified or installed. Access to a network may be denied when the modification itself +materially and adversely affects the operation of the network or violates the rules +and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with +this section must be in a format that is publicly documented (and with an +implementation available to the public in source code form), and must require no +special password or key for unpacking, reading or copying. + +### 7. Additional Terms + +“Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. Additional +permissions that are applicable to the entire Program shall be treated as though they +were included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may be +used separately under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when you +modify the work.) You may place additional permissions on material, added by you to a +covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +* **a)** Disclaiming warranty or limiting liability differently from the terms of +sections 15 and 16 of this License; or +* **b)** Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices displayed by works +containing it; or +* **c)** Prohibiting misrepresentation of the origin of that material, or requiring that +modified versions of such material be marked in reasonable ways as different from the +original version; or +* **d)** Limiting the use for publicity purposes of names of licensors or authors of the +material; or +* **e)** Declining to grant rights under trademark law for use of some trade names, +trademarks, or service marks; or +* **f)** Requiring indemnification of licensors and authors of that material by anyone +who conveys the material (or modified versions of it) with contractual assumptions of +liability to the recipient, for any liability that these contractual assumptions +directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you received +it, or any part of it, contains a notice stating that it is governed by this License +along with a term that is a further restriction, you may remove that term. If a +license document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms of +that license document, provided that the further restriction does not survive such +relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in +the relevant source files, a statement of the additional terms that apply to those +files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements apply +either way. + +### 8. Termination + +You may not propagate or modify a covered work except as expressly provided under +this License. Any attempt otherwise to propagate or modify it is void, and will +automatically terminate your rights under this License (including any patent licenses +granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated **(a)** provisionally, unless and until the +copyright holder explicitly and finally terminates your license, and **(b)** permanently, +if the copyright holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently +if the copyright holder notifies you of the violation by some reasonable means, this +is the first time you have received notice of violation of this License (for any +work) from that copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify to +receive new licenses for the same material under section 10. + +### 9. Acceptance Not Required for Having Copies + +You are not required to accept this License in order to receive or run a copy of the +Program. Ancillary propagation of a covered work occurring solely as a consequence of +using peer-to-peer transmission to receive a copy likewise does not require +acceptance. However, nothing other than this License grants you permission to +propagate or modify any covered work. These actions infringe copyright if you do not +accept this License. Therefore, by modifying or propagating a covered work, you +indicate your acceptance of this License to do so. + +### 10. Automatic Licensing of Downstream Recipients + +Each time you convey a covered work, the recipient automatically receives a license +from the original licensors, to run, modify and propagate that work, subject to this +License. You are not responsible for enforcing compliance by third parties with this +License. + +An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an organization, or +merging organizations. If propagation of a covered work results from an entity +transaction, each party to that transaction who receives a copy of the work also +receives whatever licenses to the work the party's predecessor in interest had or +could give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if the predecessor +has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or +affirmed under this License. For example, you may not impose a license fee, royalty, +or other charge for exercise of rights granted under this License, and you may not +initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging +that any patent claim is infringed by making, using, selling, offering for sale, or +importing the Program or any portion of it. + +### 11. Patents + +A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The work thus +licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, that +would be infringed by some manner, permitted by this License, of making, using, or +selling its contributor version, but do not include claims that would be infringed +only as a consequence of further modification of the contributor version. For +purposes of this definition, “control” includes the right to grant patent +sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license +under the contributor's essential patent claims, to make, use, sell, offer for sale, +import and otherwise run, modify and propagate the contents of its contributor +version. + +In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent (such as an +express permission to practice a patent or covenant not to sue for patent +infringement). To “grant” such a patent license to a party means to make +such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of charge +and under the terms of this License, through a publicly available network server or +other readily accessible means, then you must either **(1)** cause the Corresponding +Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the +patent license for this particular work, or **(3)** arrange, in a manner consistent with +the requirements of this License, to extend the patent license to downstream +recipients. “Knowingly relying” means you have actual knowledge that, but +for the patent license, your conveying the covered work in a country, or your +recipient's use of the covered work in a country, would infringe one or more +identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a patent +license to some of the parties receiving the covered work authorizing them to use, +propagate, modify or convey a specific copy of the covered work, then the patent +license you grant is automatically extended to all recipients of the covered work and +works based on it. + +A patent license is “discriminatory” if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on the +non-exercise of one or more of the rights that are specifically granted under this +License. You may not convey a covered work if you are a party to an arrangement with +a third party that is in the business of distributing software, under which you make +payment to the third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties who would receive +the covered work from you, a discriminatory patent license **(a)** in connection with +copies of the covered work conveyed by you (or copies made from those copies), or **(b)** +primarily for and in connection with specific products or compilations that contain +the covered work, unless you entered into that arrangement, or that patent license +was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + +### 12. No Surrender of Others' Freedom + +If conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot convey a covered work so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not convey it at all. For example, if you +agree to terms that obligate you to collect a royalty for further conveying from +those to whom you convey the Program, the only way you could satisfy both those terms +and this License would be to refrain entirely from conveying the Program. + +### 13. Use with the GNU Affero General Public License + +Notwithstanding any other provision of this License, you have permission to link or +combine any covered work with a work licensed under version 3 of the GNU Affero +General Public License into a single combined work, and to convey the resulting work. +The terms of this License will continue to apply to the part which is the covered +work, but the special requirements of the GNU Affero General Public License, section +13, concerning interaction through a network will apply to the combination as such. + +### 14. Revised Versions of this License + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in spirit +to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that +a certain numbered version of the GNU General Public License “or any later +version” applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by the +Free Software Foundation. If the Program does not specify a version number of the GNU +General Public License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU +General Public License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no +additional obligations are imposed on any author or copyright holder as a result of +your choosing to follow a later version. + +### 15. Disclaimer of Warranty + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +### 16. Limitation of Liability + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE +OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE +WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16 + +If the disclaimer of warranty and limitation of liability provided above cannot be +given local legal effect according to their terms, reviewing courts shall apply local +law that most closely approximates an absolute waiver of all civil liability in +connection with the Program, unless a warranty or assumption of liability accompanies +a copy of the Program in return for a fee. + +_END OF TERMS AND CONDITIONS_ + +## How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to +the public, the best way to achieve this is to make it free software which everyone +can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them +to the start of each source file to most effectively state the exclusion of warranty; +and each file should have at least the “copyright” line and a pointer to +where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this +when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type 'show c' for details. + +The hypothetical commands `show w` and `show c` should show the appropriate parts of +the General Public License. Of course, your program's commands might be different; +for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to +sign a “copyright disclaimer” for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +<>. + +The GNU General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may consider it +more useful to permit linking proprietary applications with the library. If this is +what you want to do, use the GNU Lesser General Public License instead of this +License. But first, please read +<>. diff --git a/inst/devtools_internal_tests.R b/inst/devtools_internal_tests.R index ad40c07..67aa2d5 100644 --- a/inst/devtools_internal_tests.R +++ b/inst/devtools_internal_tests.R @@ -5,7 +5,7 @@ devtools::check_win_release() devtools::check_win_oldrelease() devtools::build() - +usethis::use_gpl_license(version = 3, include_future = TRUE) ## then # direct: devtools::submit_cran() From f8ca5749d99ed09415ed7e71ac0f48e867648971 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Wed, 29 Oct 2025 10:40:01 +0100 Subject: [PATCH 322/323] Update url to doi --- R/dens_test.R | 2 +- R/rdd_pkg_old_DCdensity.R | 2 +- man/dens_test.Rd | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/R/dens_test.R b/R/dens_test.R index 274192b..f658fad 100644 --- a/R/dens_test.R +++ b/R/dens_test.R @@ -10,7 +10,7 @@ #' @description #' This calls the original \code{DCdensity} function which was in the package \code{rdd} by Drew Dimmery, #' which has been archived and is now internally stored in the Rddtools package. -#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \doi{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} #' @export #' @examples #' data(house) diff --git a/R/rdd_pkg_old_DCdensity.R b/R/rdd_pkg_old_DCdensity.R index 1521a75..52bbcb7 100644 --- a/R/rdd_pkg_old_DCdensity.R +++ b/R/rdd_pkg_old_DCdensity.R @@ -19,7 +19,7 @@ #' \item{bw}{the calculated bandwidth for the test} #' \item{cutpoint}{the cutpoint used} #' \item{data}{a dataframe for the binning of the histogram. Columns are \code{cellmp} (the midpoints of each cell) and \code{cellval} (the normalized height of each cell)} -#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +#' @references McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \doi{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} #' @include rdd_pkg_old_kernelwts.R #' @importFrom stats complete.cases sd lm coef predict pnorm #' @importFrom graphics lines points diff --git a/man/dens_test.Rd b/man/dens_test.Rd index 2d5386d..1f11abf 100644 --- a/man/dens_test.Rd +++ b/man/dens_test.Rd @@ -30,5 +30,5 @@ house_rdd <- rdd_data(y=house$y, x=house$x, cutpoint=0) dens_test(house_rdd) } \references{ -McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \url{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} +McCrary, Justin. (2008) "Manipulation of the running variable in the regression discontinuity design: A density test," \emph{Journal of Econometrics}. 142(2): 698-714. \doi{http://dx.doi.org/10.1016/j.jeconom.2007.05.005} } From 61da6140ed6943d276421f186db6017eb38475c4 Mon Sep 17 00:00:00 2001 From: Matthieu Stigler Date: Wed, 29 Oct 2025 11:04:11 +0100 Subject: [PATCH 323/323] NEW VERSION 2.0.2: increment version, NEWS, etc --- DESCRIPTION | 4 ++-- NEWS.md | 7 ++++++- cran-comments.md | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3dae34c..e23c40b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: rddtools -Version: 2.0.1 -Date: 2025-07-02 +Version: 2.0.2 +Date: 2025-10-29 Title: Toolbox for Regression Discontinuity Design ('RDD') Description: Set of functions for Regression Discontinuity Design ('RDD'), for data visualisation, estimation and testing. diff --git a/NEWS.md b/NEWS.md index 7e41c31..e108c0d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,8 +1,13 @@ +rddtools 2.0.2 +===================== +* Directly host code of rdd::DCdensity, since rdd was archived with no apparent plans from the author to update. +* Change license to GPL 3. + rddtools 2.0.1 ===================== * Fix minor R CRAN issues * Update documentation -* Chainge maintainer to Matthieu +* Change maintainer to Matthieu rddtools 1.8.0 ===================== diff --git a/cran-comments.md b/cran-comments.md index b27341d..52a2f35 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,3 +1,3 @@ # Test environments -There is a change in maintainers, the package is now maintained by Matthieu Stigler. \ No newline at end of file +This is a re-submission of package rddtools, which was archived following the archival of package rdd. The dependence on archived rdd has been removed. \ No newline at end of file