From 73949ad53a32de9750baa66c25bfe056b1dbc5d9 Mon Sep 17 00:00:00 2001 From: camille-s Date: Wed, 22 May 2024 18:57:29 -0400 Subject: [PATCH] Rewrite neighborhood weights --- Makefile | 5 +- data-raw/make_neighborhood_weights.R | 80 ++++++++++++++++++++++--- data-raw/make_neighborhood_weights19.R | 66 -------------------- data/bridgeport_tracts.rda | Bin 823 -> 779 bytes data/bridgeport_tracts19.rda | Bin 711 -> 719 bytes data/hartford_tracts.rda | Bin 1027 -> 1262 bytes data/hartford_tracts19.rda | Bin 839 -> 1055 bytes data/new_haven_tracts.rda | Bin 721 -> 973 bytes data/new_haven_tracts19.rda | Bin 613 -> 844 bytes data/stamford_tracts.rda | Bin 885 -> 698 bytes data/stamford_tracts19.rda | Bin 659 -> 468 bytes man/neighborhood_tracts.Rd | 16 ++--- tests/testthat/test-multi_geo_fetch.R | 16 ++--- 13 files changed, 88 insertions(+), 95 deletions(-) delete mode 100644 data-raw/make_neighborhood_weights19.R diff --git a/Makefile b/Makefile index 1b99d83..3d69b59 100644 --- a/Makefile +++ b/Makefile @@ -62,10 +62,7 @@ data/occ_codes.rda data/naics_codes.rda &: data-raw/make_lehd.R data/msa.rda: data-raw/make_msas.R $(SRC) -data/%_tracts.rda &: data-raw/make_neighborhood_weights.R data/town_sf.rda data/%_sf.rda - $(SRC) - -data/%_tracts19.rda &: data-raw/make_neighborhood_weights19.R data/town_sf.rda data/%_sf19.rda +data/%_tracts.rda &: data-raw/make_neighborhood_weights.R data/town_sf.rda data/%_sf.rda $(SRC) data/regions.rda: data-raw/make_regions.R data-raw/files/town_region_lookup.csv diff --git a/data-raw/make_neighborhood_weights.R b/data-raw/make_neighborhood_weights.R index 5fb44f0..fcd9b18 100644 --- a/data-raw/make_neighborhood_weights.R +++ b/data-raw/make_neighborhood_weights.R @@ -4,27 +4,38 @@ # previously had an error where spatial joins had tracts assigned to wrong towns # for nhv manually move long wharf to hill # for hartford drop north meadows +# combine 2020, 2019 in one script # for 2022 switch to COGs, need to add COG-based fips codes as another column sf::sf_use_s2(FALSE) min_hh <- 3 -nhoods <- list(bridgeport = bridgeport_sf, - new_haven = new_haven_sf, - hartford = hartford_sf, - stamford = stamford_sf) |> +nhoods <- list(bridgeport = cwi::bridgeport_sf, + new_haven = cwi::new_haven_sf, + hartford = cwi::hartford_sf, + stamford = cwi::stamford_sf) |> dplyr::bind_rows(.id = "city") |> dplyr::mutate(name = dplyr::recode(name, "Long Wharf" = "Hill")) |> - dplyr::mutate(town = coalesce(town, city) |> + dplyr::mutate(town = dplyr::coalesce(town, city) |> stringr::str_replace_all("_", " ") |> stringr::str_to_title()) |> dplyr::filter(!name %in% c("North Meadows")) +# 2020 shapefile includes pop & households hh20 <- tigris::blocks(state = "09", year = 2020, refresh = FALSE) |> janitor::clean_names() |> - dplyr::filter(aland20 > 0) |> + dplyr::filter(aland20 > 0, housing20 > 0) |> dplyr::select(block = geoid20, hh = housing20) |> dplyr::left_join(dplyr::select(cwi::xwalk, block, tract, town), by = "block") +# 2010 shapefile doesn't +hh10 <- tidycensus::get_decennial("block", variables = c(hh10 = "H003001"), year = 2010, sumfile = "sf1", + state = "09", geometry = TRUE, keep_geo_vars = TRUE) |> + janitor::clean_names() |> + dplyr::filter(aland10 > 0, value > 0) |> + dplyr::select(block10 = geoid, hh = value) |> + # use towns since don't have xwalk for old geos + sf::st_join(cwi::town_sf |> dplyr::select(town = name), left = FALSE, largest = TRUE) + # assign each block to 1 neighborhood block2nhood <- hh20 |> sf::st_join(nhoods, left = TRUE, largest = TRUE) |> @@ -32,9 +43,23 @@ block2nhood <- hh20 |> dplyr::filter(town.x == town.y) |> sf::st_drop_geometry() +block2nhood10 <- hh10 |> + sf::st_join(nhoods, left = TRUE, largest = TRUE) |> + dplyr::filter(town.x == town.y) |> + dplyr::mutate(tract10 = substr(block10, 1, 11)) |> + sf::st_drop_geometry() + + +# tract pops for denominators tract_pops <- block2nhood |> dplyr::group_by(city, town = town.x, tract) |> - dplyr::summarise(tract_hh = sum(hh)) + dplyr::summarise(tract_hh = sum(hh)) |> + dplyr::filter(tract_hh >= min_hh) + +tract_pops10 <- block2nhood10 |> + dplyr::group_by(city, town = town.x, tract10) |> + dplyr::summarise(tract_hh = sum(hh)) |> + dplyr::filter(tract_hh >= min_hh) tract2nhood <- block2nhood |> dplyr::group_by(city, town = town.x, name, tract) |> @@ -46,6 +71,15 @@ tract2nhood <- block2nhood |> dplyr::left_join(dplyr::distinct(cwi::xwalk, tract, tract_cog), by = "tract") |> dplyr::select(city, town, name, geoid = tract, geoid_cog = tract_cog, weight) +tract2nhood10 <- block2nhood10 |> + dplyr::group_by(city, town = town.x, name, tract10) |> + dplyr::summarise(inter_hh = sum(hh)) |> + dplyr::ungroup() |> + dplyr::left_join(tract_pops10, by = c("city", "town", "tract10")) |> + dplyr::mutate(weight = round(inter_hh / tract_hh, digits = 3)) |> + dplyr::filter(weight > 0.01) |> + dplyr::select(city, town, name, geoid10 = tract10, weight) + # sanity check: # tract2nhood |> # dplyr::left_join(cwi::tract_sf, by = c("geoid" = "name")) |> @@ -53,11 +87,33 @@ tract2nhood <- block2nhood |> # split(~city) |> # purrr::map(sf::st_geometry) |> # purrr::map(plot) +# tract2nhood10 |> +# dplyr::left_join(cwi::tract_sf19, by = c("geoid10" = "name")) |> +# sf::st_as_sf() |> +# split(~city) |> +# purrr::map(sf::st_geometry) |> +# purrr::map(plot) out <- tract2nhood |> split(~city) |> - purrr::map(janitor::remove_constant) |> + # purrr::map(janitor::remove_constant) |> + purrr::map(function(df) { + if (length(unique(df$town)) == 1) { + df$town <- NULL + } + dplyr::select(df, -city) + }) |> rlang::set_names(\(x) paste(x, "tracts", sep = "_")) +out10 <- tract2nhood10 |> + split(~city) |> + # purrr::map(janitor::remove_constant) |> + purrr::map(function(df) { + if (length(unique(df$town)) == 1) { + df$town <- NULL + } + dplyr::select(df, -city) + }) |> + rlang::set_names(\(x) paste(x, "tracts19", sep = "_")) # dropping block groups for now, but can add back in if we want # block2nhood |> @@ -66,9 +122,15 @@ out <- tract2nhood |> # dplyr::mutate(weight = round(hh / sum(hh), 3)) # wow can't believe i'm doing list2env -list2env(tract2nhood, .GlobalEnv) +list2env(out, .GlobalEnv) +list2env(out10, .GlobalEnv) usethis::use_data(bridgeport_tracts, hartford_tracts, new_haven_tracts, stamford_tracts, overwrite = TRUE) +usethis::use_data(bridgeport_tracts19, + hartford_tracts19, + new_haven_tracts19, + stamford_tracts19, + overwrite = TRUE) diff --git a/data-raw/make_neighborhood_weights19.R b/data-raw/make_neighborhood_weights19.R deleted file mode 100644 index 52160a9..0000000 --- a/data-raw/make_neighborhood_weights19.R +++ /dev/null @@ -1,66 +0,0 @@ -sf::sf_use_s2(FALSE) -# same as other neighborhood weights, but need to make a copy reverted back to 2019 -min_hh <- 3 -counties <- sprintf("%03d", c(1, 3, 9)) - -block_sf <- tigris::blocks(state = "09", year = 2019) |> - janitor::clean_names() |> - dplyr::filter(aland10 > 0, countyfp10 %in% counties) |> - dplyr::mutate(tract = paste0(statefp10, countyfp10, tractce10)) |> - dplyr::select(block = geoid10, tract) -tract_sf <- tigris::tracts(state = "09", cb = TRUE, year = 2019) |> - janitor::clean_names() |> - dplyr::filter(aland > 0, countyfp %in% counties) |> - dplyr::select(tract = geoid) - -# from other weights script -min_area <- 3.5e4 - -# occupied housing units -hh10 <- tidycensus::get_decennial("block", variables = "H003002", sumfile = "sf1", state = "09", county = counties, year = 2010) |> - dplyr::select(block = GEOID, hh = value) - - -nhoods <- list(bridgeport = cwi::bridgeport_sf, - new_haven = cwi::new_haven_sf, - hartford = cwi::hartford_sf, - stamford = cwi::stamford_sf) |> - dplyr::bind_rows(.id = "city") |> - dplyr::mutate(name = dplyr::recode(name, "Long Wharf" = "Hill")) |> - dplyr::filter(!name %in% c("North Meadows")) - - -block2town <- block_sf |> - sf::st_join(cwi::town_sf, largest = TRUE) |> - dplyr::select(-name:-GEOID) - -block2nhood <- block2town |> - sf::st_intersection(nhoods) |> - dplyr::mutate(area = sf::st_area(geometry) |> - units::set_units("ft2") |> - as.numeric()) |> - sf::st_drop_geometry() |> - dplyr::arrange(area) |> - dplyr::group_by(block) |> - dplyr::filter(area == max(area), area > min_area) |> - dplyr::ungroup() |> - dplyr::left_join(hh10, by = "block") |> - dplyr::filter(hh >= min_hh) - -tract2nhood19 <- block2nhood |> - dplyr::group_by(city, town, tract, name) |> - dplyr::summarise(hh = sum(hh)) |> - dplyr::mutate(weight = round(hh / sum(hh), 3)) |> - dplyr::ungroup() |> - dplyr::select(-hh) |> - split(.$city) |> - purrr::map(dplyr::select, town, name, geoid = tract, weight) |> - purrr::map(janitor::remove_empty, "cols") |> - rlang::set_names(~paste(., "tracts19", sep = "_")) - -list2env(tract2nhood19, .GlobalEnv) -usethis::use_data(bridgeport_tracts19, - hartford_tracts19, - new_haven_tracts19, - stamford_tracts19, - overwrite = TRUE) diff --git a/data/bridgeport_tracts.rda b/data/bridgeport_tracts.rda index 987ac5804ed7e863e7e97b0f106ff1f3c5c9af5c..79ef5b747316ff4a84b67c65b914b9928909abe2 100644 GIT binary patch literal 779 zcmV+m1N8htT4*^jL0KkKSzaT9GynxWfB*k`|3Xj$f9RIOo6x`i-?2yv2#7LqRRm@j zUI?m|cq_mH{21ojxCk_qWQ>3TqXIP0(@chep@L)@02mR7F*8s!Z6~674G2aNC;$M^ z0000CAOHXW000000S{490000000003KmY&$0002c0ThtbB=tQ4WIap}4Ge%Z0MkG; z2Gk7zXlMWfKnK_Wpf0FYvv+3tRw|@G4t^Y&7I?JMt!Db4?aKm%h<%+YAc26 z$PAcOOo#)&Ng?bN{8S-hnVjAo6d^AjxqMJA3g~=2XT)a2Bf>~tBFxxOfCNM*0`B%R zA)GT+GghKSQw3K=SjbOsJ>wP3mT?M1f2dT=jto?gzY>^;baBY7?G@ zL_~lhAVMG^06+pF3K>2oANob=P14fUr+!VV0^rC8gB{3gc*wvA+s&G3MQQ z+KD%$`_}6g*I!t>Sa71ff?H_Q&2nyjrY+PccVTKKKUC9*T JLP2y>+SO5iDfB*k~{|&@T|LV5uKh^*L-@Rg>tOy!~iBwjB zCZZ}IN|V3?91P|<0tSj`hzF6WW2?g;6~JzvZfTP^y_<#Q-mFQ4W@e zr|^BT?Yyo8EJP-Y?wvtVd=>imn|$-DT{OO3US6gr@r_Yb$avA?+S^-`wN+I_L_$JE zTbE&g02lxOD@4$2W&tXys-hwxAtI;&fB+Z(04qe$Y-VO=_{K4WXo{%>j1^T-N97Sw zgZKadf&c&j000Oef&c&jqJRJjC;$Kv5fMYb6-riaR<*5!f{+%flxPPI3R`JxlQK+& zRY(?S!9Ze?P1%_yYyq;%ENq#XX2G&%l%x+TrL~%stzsf7D|}!=E|k+VLWm?G2qYj8 z5f3WoKJTj?=Txk+R@q51eWm~&1`bRdSPqOD-wqR9dD8ig#1RmIWA}cQPAF@fD~NRG zBVf1zF53RSqbstKxH+6`dUWu(+<2kh9qUeNmeFiIYZrX*4X=`tyRe5gneZ)E~o}2hTS6kpGkdm0}}9h1C7rK)9fv8eC>|yT=M5T9oHJ_+;f&3 zk#|b-QVfj-79fVbdfJK8B&&yZjtk8|3>Zq5SJhHb83!i{L~$W*x;MAa;0PBFA0c^2 zZ`x_U#NPWPAgvC60)0j>QXfpV(rdE+`Go*n91|b_ZHAg{;8Y*@yOJrwgohwXqQFM+ BT?YUF diff --git a/data/bridgeport_tracts19.rda b/data/bridgeport_tracts19.rda index 791ce3079c3d53bcbdd661bc1941bd8a7871e624..697bb48856c24a80454cf3bf8262223d789dec4a 100644 GIT binary patch literal 719 zcmV;=0xRxWbN~aB|NsC0-_TG?|LDHgo5cU`-?(6^s)T|eL?Ipl zYAUO|!hyg7XrXmRf=UxfJxKPbW=%~$RDP()0MO6_)X)F}L8qwE>K>o~^*s~HdWO{W znLQ_p2^1QpQW-P=0MI=^00Te_fDHfu000000D}NbCIrG^G{G?#0$>Qx$$(4%004{x zzyJV}l82;d0000002vJc003wJ00z_m003$UCkCm=N<2IwIG)rY9sG8tkab*=gq-W% zScHR6{d~y?NnSL7;maOd&r`mg&Q}zgBM>Hr%QX0qR(6RZD3n?&mn(}|MkSU335Y^q z%`nlcXcZmvD$)>}3^AZUa9C?t0)d%2Ed_EW)nW>{+7n71WjxJ5#7_!^0m4*L&b3JQ zA8hhjq+<(G=-^~eo6qkUk~4DN-Fxb2DG^FUt6V6d5pxPK>o~H>J0|RixooE@&gGS* zQb@Mck{F;89@!*|`clgXpd>M-wa)BFq!NY&6GW*x6TGNNzifb%L`4d!(rhIsSx#vy z)Xaaxni$E8^28VrH}ffT_m zHal|JjUlE1Q2{3oWfnF%C`SZi4*PW*HY5<0^>eEUV$=Exs8dQ2V2v$!VkM3C6pIWX+3w+3HWS9JaSyghgo$L# zHHk2lgtp!j8JAKM0fVj7p$NZ9_Pvdi6h{F$X>c&_lg1*}18`DgWvaa&%@V}Fqi=DR zYoCll-JLjeC^WXqx=n9Qw~Ke&TrS?YYF@iB_nUoyg89EJlSY5V+>uTcBsdr$T>t~u BGvNRL literal 711 zcmV;&0yzCbT4*^jL0KkKS@38+695CGfB*k`-%vzD|LV5K+rVSx$4gp+1 zS%Rk;Vg>00037n3w_J~pQ?E#fb}%driPw` z(-G=4$bP7LO*W&{05tZL^&X&T8&EsSvJ9yz;KQ6|UkZtjTE@a#a#qtnYyIuu0Xb2_ zo7s|z;eSNpgssx1Fiafl1^+WJW#g6aPfS)bKitBx!bRAP8K2)P(DLcki7NscJv47VN>+e1paTO$ zQau0%E_1r#lSLqg9&B=ARG~?UCI-pMWU{RbA~-Apl%=gLZJgone)B6kVkE9}0>516 zY~oC$01;K8mm>p!?(8YdckAyP20=$fFGvVTctDm!E{b8SyS-=Balr&Y1+LHaA?61n zfuum>4XkBACiYj_eR-}ln(@4?&Hk4=iYzuxgJ$ZT8y6n;1;@K`LrfV7=|8*HfCOj-c-S%kX>EQi2b3sv@Lc`Akike&n^}_g}O_g zB?5uq2B;f)nw4Hi27<#+?_tDSz-BI(X)eC_>bc=PZH?-=d<`6ubPK+GS2&l=tA$`S zuDy{4Cc%IrA=lViB4{pcH+l4WwuBH_%JBGUQMf2RoT%v#ydBk}N89hxa0@un9&6Nq tt&@fXg_}FwJ`<5!KfV9} diff --git a/data/hartford_tracts.rda b/data/hartford_tracts.rda index a10d3f6595c4fe4accdb4f8f4d4003069d7775ef..bfc58b603e1dac35f89e4948fabb794386f6f52b 100644 GIT binary patch literal 1262 zcmVEY8ksb}BM`}nfS3q0!ZK;6kN`{o34s^{3``><)W(LV zg$AjN)M}}S4K!#5ngbz`qYxc^Mof$m ziKdwvFaaD5DL+?H46YQly@1k^n+5w4byB{I$jGj*JmOp zX7ywW>8VGUN_*F}000LZS-R4e&e8Lc*xJG5vprReiba|1Ar*lVSe1z?uPj;;5nzPH zUeJ>><0fc4mS?K5kw~*Wgd(saOA@gqRppC9LM#%hu2U-OB`FnwK%hbuK@o6-WduZm z1R#MS0tiH42p~d85(q?K-~xdIz%9Eww$VitQD9am777I-8>;J_F<6NNat8^g1k(or zG=U|RVo4;IfF2wiK0l}clZoe@fb+~_7{)$MC&)rhAvo{=00000004wBuiqj28rHF> zYg+5^2mnF{$vWr&06LSdfCxYU0uTTI2tWWK004vn5QHQoA!0yK7^2|!2e?j&fJB6x zvQFtdKk+ezXE`Jixk$*B8LpUMDh^SUZZ-l)A)#6v!Lym$F?gMkTQy5;XH_eXZIl+wP-AuJB!AOW_ zCS%bO5^q);xu)5L5TG)XI^EP>)6FNNDNLD@G_LEAy<7xD5dbp2G~Q4tua)9Rx}q9L zS=qA*ojJFu-e>(M%$d&W2cri(KO#Ydj?`$thx#NVQe(D+aFP{<`PBCc=aJ!}ZEr|^ z&WzK7?wUM{IA>k6#-+owhKsm-okKVo-f?+UWiv9q>{a3<< YOZET~3z#XaNsIp%az!{$kb<1LI-iytoB#j- literal 1027 zcmV+e1pNC#T4*^jL0KkKSs#`O!T<8K}Yqpj4nP?ltZIGEI?7}D8oTNTpm#aHD8 z0Ez;@haiA0b?IoT0U&nb_~HU5>jz#aA&`K)$fy5}2N?aD9fwQ1YHFIyG(GT$o)Fh| zTPaCyy`nUf5qO$HgAS74IOL!G(Gn8WS-wWT?LRK0er;5eNfsrEZ~#fkGK^%I;z=@2 z@rq2O@RZq#A2A za#s8AD}DFaE+DE-%sLunpC*U009Tqxa3Wcnk*ZHNJ? zpxR{Bym{I64?uSO+l}|4nh!*xgkcTBwfM4p24e=Df#;$`Io8#ac`_hV9ivhrYX-93 z-6$rua3&m9QonSJAz%ELY^hQJ-nGSjtIBw_Poao`WYkQ& zNxGa35)|IZY-lic4b}0GB8>_HetRJVRxo;;N`wYdQ+NlV=UmQ>Xx!sQD$f`$2)3D0 xHC9ImnPMya^BI$CJa(`IEgyrUkHmYzWwa5+s7ji{7P>>&%3BvWkvcCWT diff --git a/data/hartford_tracts19.rda b/data/hartford_tracts19.rda index 3368f660f17fccc9d17ff8adb664bc61c06923a3..b793230e98ebd12d407098d39c3c237f264e903a 100644 GIT binary patch literal 1055 zcmV+)1mOEZT4*^jL0KkKS(eiKj{pWJfB*mg?RiB@|LDK#|JDEh|MX&}sEvaJ1y@u- zR0AK(U6D9&+CV>=)CXA+y024se9*6;;G{^vH zrc6Pj)B_=)#-MtGX*2);00-_WOfXFp#>l%SR#QL%n$RJs0V3UQ6$svP_uT(}e)Z1V$7DfP<}pQh8FM5K)K^4`M;ehut6*1I2{S zg+#Ixdni);57mH^y*+0o(=vlOnV@B`W`~?Gp~wvP&uDBk%k!n*Gfg)_2V-#i%h8#b zUI2xSs%a{n7E?_m)B+GW|8Z-1 z3FXE+P7M2^}^gv7n!~n(%*~+(Q z8!}3A=Ft0XZOI+ru#z(64~0FjIfpGcM!FzI8$+67&3G4KHdB+XQ%Hl5!UO~m?CX=! z=VKO^nQ_UydeTzNaXSnJ1=Trk8j|~auXZ~^+{_Wr2qa-HHg1T39Y1{0#8@aB8chc` zM&h9{&3P|4%yQ2AE|S`J0ni9`nl5pdq;m5Q|f`Jc28oG*Sw%!fn zebo+tXcv@o-_VbQ$!4v7%# Z7$6B%e}uxkA{-z1yOJrwgoL)2+;}`Kv$+5O literal 839 zcmV-N1GxM`T4*^jL0KkKS*PHq*#HHo|NZ}e>?A<}f9$`@+t9!N|FJ*-2tWV?00aa8 z006)d&;veblb`^O27^q7nlvzhkkG*z8f4L+83rH#G#W_p8jwIV44O3127nqdGyuo} zrkZ2|3Z7{|34j2G00008$%NBPCP9r)LxG^vA*PKCAY?Q!MuwR*Xa+%u01X6EASQuN z)XAXGjG^TkdY-3=G0B?NDUSM}+~t8`zN`96sNnBFrWW~+5gJ>M+lI6l-PlPF4Y0tK(J5Sevh zHZe2_4Khm%Vxr4bDy9gt9kZh)GoYSq$}Xa+kb;CIk_Bf1fX)Q}VMSkD4e+43;SPLm zhbwzC5siZ*)DVg6Z+hArOLR^tINAePNbxLgk;5<$BC03wI&@q-RacIiGcz+FL_~R+ zn={c83b1HF>Z+>GdaE#HjY$9^CjgBR6Py5Zm;{IcA&6Kw!B{6v>cnFhsoh34Cr3@gM{KZ+6qFKicdwviNN{Fn%R_qkRcGIaPrLMNsJt@ zNVw*0n?V6%30q=^F@x2;=8hA5kADZ1pFvARKF7E^N7jD9$aD&^j|tBVWSH_|$aaV2 z&eKn}087|Vh6p+3qx{BUEM@2?=&U6zR`acdpu<*k?xewC_Pu>Z92%#&f<{9V?ZiNi z-}G$W+N$*PQjqfvUZvLHY|oaf<+T6l%iB>JI*qb zu*&>;$tD^H8_w>ygBjy4i$d9_Ugq8*q}#QTTwNmpbIcVqd!2{KZ5mA-Dy%!nzr2RK zhR2A&@4e2!U}X}#Q~(9x;@o5e-WSg>@-ToDCP2Z#2JP_#wc-sonQU~IR}4TxjEpVX z@Q71yXKag518s19WYTAp_^LRxd^^KC@{sEZtV4{9nuLJ4z1;BzW&dpd>n#;@2!M+J R0Dvyy?ntK!5)}Lt`yk25cas1B diff --git a/data/new_haven_tracts.rda b/data/new_haven_tracts.rda index abd507d10fc01f2363a0f8f18b2affa819c77974..9dcc713c3a5d5703a3b21a10487611061a81014c 100644 GIT binary patch literal 973 zcmV;;12X(VT4*^jL0KkKS@V!!0RROR|NsC0T{T?`|LDKx{m}pa|M6<70?6VuaaUEj zbSkU9{HxFdGd%7&Siu5HYDhEPq|HGjk&ua_CZo{Q8foePGyni-0B8Wv003wJ05oJY0000DJxN72rVs`M zXahiKz(Y)iKm#UBLq<(7022to8U{cB$&hH!K*@wOG|8caG{BfcBLveXjT$t-CIK1% zWMXK*j3Z1<0LV1SrV}7CRDb{sfB*n!0g%uD003lU10VnZ000000Qv$V3GpNq^k`VR zXT~7`bj4;)E48u4i53Ds?+RfGW>@>iAVMpd0@%N975Lr_N)5T5Puk9$o(&`}h1?*k zW8m@1G-=t@K`fLY=rw~lkU@Am}2D;z0y61I2bui0dfQK+;hZgiVQr zLP1hN1Oxz(0sw+t03oSLhO`6{0w5L$NWlm|&w#kYQ`_v23WZU;<)zs$kkzk;+e1nmZe+cG1}{xSGp(Mv^DZb>0I&iG}6lG zpG_tx68Hq%Y>0rdJVkn|wComHLh9em;$Z(<@Fu<+^kuV5h zBrpo#gu^iP5ipsx3AHc~oin%q00=+;0}LSm00=@DK!hO(KmZU)(=#Rq2(0nYW{d!I zOwkGIB*}#0As{6Tv~-YnqD3S zEgIHgMEpSE&t*>NPB@s%q*=EG{(J&D^o3HwxPBF4s}N0Wiiox6lr2>E z36Tz^Nz8c4(3zwv(Pt8py@8l=ak8i?X^+_N6(T~q!Q@?l3m+=O8>%pba$1f<07L$gViXML_{{yNLz;H1>)yo`h2Gr z^F<9U4cHfC{py}=U1V!%hOEA@wa)5Y1T|h5jd}H^LB6T78suReyi?^)+NC>&f(lQU zM?)ScAbB8uz|?{_Dj?3Lx~ky_i$PkWM8YJRKEvuPFkT5j6owfNpp8v+BT>Y2DOUi& zit8XkVBpZpqPh&ha{4lKvwR557g@M~x-4cYWSD!cgyUhOe*YHXV!Ban88)nwW*Bp* z9}yWS!Q{rkS%fg7(N*K&okdQ;e0cQJJ8U3@aLA=8@pPnRBMlY_mOH`bLOvm;$g&%4 zuZ0{`AW)Vc?``Bw;4mj6ZD7D%;nc(=23|6afs&EzPEm-VZKf&UkBML1B9UYZGn Dp%gUr diff --git a/data/new_haven_tracts19.rda b/data/new_haven_tracts19.rda index d1dd5385542932648c957179c7b4821037742305..03c1528f57c01c43b4544bdf00fe593a7e03ba1d 100644 GIT binary patch literal 844 zcmZ>Y%CIzaj8qGb)LeLa7Xx#6{r~^}V;w_1>tF5v{pTu>^XJj3RkPl2483Z4^2(xB z``+~*VA>EE!Xf1n_$ot+0Sqnx$qNk34j_(HMwQ!)UY1S;CFx)#->q(${J~ce`U79_ z8nMk{b}-<$@Rf0aft&jZ=FEjFF00Kl$y|IT!{j2fv)U|)o>>_@y^ISx7aU4S;cI2#&?Q`YRNFd=$EGuJ!G)|d~9%0*|&7R*jp3`p|+_jR>L z)b{Vc1em-oGgi)!E||UX%q8hnC*NHS+UeA>xJdfA(vI6fq2cM-nk{7$#3cj{Oy)S% z;_&j!YSyhvm#6VQU7jSiz(bg2!oj&KE^*qp`CL#mliVvIxL3+k_1Wiz;^GFd_V_=x7IxO*+aAYE% z*rK2b30(n3o(oknN_bmm+C7$E7+;VlvZQ*AEB8h}tNn4NizL>1$1ixCaYgNi!6ie! zt7gn@7Yy!Q*v9riUw4&}>e<#^aeRlr^Lw(lw2AYT$j{3(m-ynHKJodL4t=gzhA{Vt z73ycUy;^qq)#--F)lv=1Io0s`yr1m zE!t1PkeNk_>&dPF$!n~f+3TOAK3tVMm9^>UR$Z$%yFQitx^R@I_=@hFn9@c?li(vq zx1D9yYr1N2Bafq0G~nPS5pAZQ0mARM1;qxGiL6QsE4r>()Sc;bM(Oy)O{ZrrlsJ{3 z*tg+j=$qQag)_H4n>EkO_x_=*(|kd%c^_KWn~17gN58tV|HG6@AvL4-n>QMKjAn}0 zn5;d&L~HtH2ffUUARWo&-y|50nEjOg{o#?up^76X4$f>)I53O<*8hiBF5j_buJ7Kd NG)Kcjq84oDQwFHqPOpwtg)W)Ws zkZ2E300x>gXvk<}GyrG@ng9*}8fl;a$N&In003wJ0gwO<4FEU*X{LY!AOHcN00E!? z20#EbGz0XIpcbGZS+>S3oh~5;n_*$fG++@g=YMspNDdQiYB(TR%m8Rx(hDtJ+q+Rm zUWn$tmZemw(^O}xL<=Qf4GCi6abQDQcO><|vgSTG3w9twAs}Qy(3BYhL>NGpgCh$d z7m0zgHhCseEg24Jx=woys@HE{>|jYO7qasD9UhlYe>u)-bDX6jQk01klwwE_PM~IH z7cdZ3k_g6xsf#iIb%mq2YO0`01Qa4bga!l-&O5rcLHzGT8QFk9rGi{iHX(6BE3*L1 z7F*~AG*E1Fw%`s<0koh&NgJeEL<|M0Pf@i93h|c%Y$K9$QtQihX4gRnQdFu1s1V-j zAgpk>n(+)&(zi{AS5fO@IVNUwXo_sy1AG-TCIZ3Y4N|m2PPB$VUg_%*z>_NRQw#!N z0~gXI5V_F8t;$0D6Xs|@7sYXfI3^EW)kw@7Y#1?KDy~6A)L*WR$(y{SZO~r~%^P`z zr$YpF=X}n^a-z9pjd`ayvoJX7qbf;LtIdIu8|sRvSGEsrVuKehv1ZA3&okuG1G7%A zcT?(YVf(WH_7f_>jaCn#3PN~;`oeY2%t(qGDMVxlwIZw|1OFFtML1B9)^6|E(VhCl diff --git a/data/stamford_tracts.rda b/data/stamford_tracts.rda index 313c96118d5ae6f16939d7d95fce8d9ed6546626..69f723ad2f29c72a82ce6406a908b6eb3148d66e 100644 GIT binary patch literal 698 zcmV;r0!95oT4*^jL0KkKSsz8Ai~s~8|NsC0*#uMrf9SrW9MS*p-=RP#005A51Q7s0 zPz-{B;3>cYuE`OqDiTr&lS%0Trh`BY0000D0iXcT(dim#qY!E8Nt#lIMnRE?F$_aS zLjahDjDsUa5Xp&?5sn6dpc)2-fDH_WngD5_8UOR=NBsuFA@HVH|!hTW*{xRM1vV@PPSp5uZZR~z;F;8Zcn_iWm!Lv<8C zZZ0Nfg{B>CYxXNX)`@b&p#Ka!Gks(u+@6W zn73}w$t!kdOu|W-p&uzqtFtY9DypQar5)JED5C@`(G`Xr{dVxsssG5E#lVqkR{|ys;5fgiwSk zQppyjq_Jc*?6DB@S!GEiD1{IpilzFb$t)71Y|^B_$71}m@ti5Ew{SI702ZVy(WP9`|I-EMIy zupeN1d<aCF)? znN3FC6M*zT;^z5Z{t7h78rMP|#7E!2Vz|CW4(|~9{+TO51WQ5pb5DD1uA~7f> zm(My3y<_)547V6DGJ{0Nm0ysy&zk&N=-~33TAj*>ARS`v5 zB*5+?%tO!vUUCqP0D~ly13(6V13&-(05kvq00003Kn*lx@v3@=GGGM2CMHan022aW zCMF4h0000JBLOfWgaFk2Dn|7bjWTEknq&c^)G`c>27u5QO#lNR0h1AsWB>*r$$%38 zn3*zQ089yhn3yI20000?j0C`j5CTO4G*v%MPf3z~r>Ulp(?Dp@12mqH^p8^}BLre? z6Hib!r>IuC7U{&c{oztnrEPhh=`sc3Ym!^gG~}rk^mYeqKYV@cmza5L{Ab$04WFn2@(Ma074Le zLI3~&00000003#Wn*c+g2?T*8z`IIGN}`feAVD$$4Yq-?w1F^V1g;P)kp$Q$yMa64 zLKFyzv9TnkRc$1B#?lBd!LA>yzd?^ zm4)aj@&P2A&y+jS+HPteI|tq5w*|j@h z*3e;^)h3FQO2ce35EARFwSx6TwRUpWW_`PC0Bil(RXK8O4>y*%KUtA;CKjU^vTa(o zi(wdukti{Z1~6{Qh~AY}3;X)8P{NDRw@W-(r`Q=3*cMc52z z-dGb9vPU`BC^s=|8rFiP5K91|sjVX7qMF{LJbq3-z-8hVXxPr{#gv6amZPK^?Pn4P zhmiNaZP@%{v(~Nr5XFq70SSLlSzB&>lsG~BQ2=9X-%M75&&>oI6TC7Pw{so LQ-uixt9uv_A`fi| diff --git a/data/stamford_tracts19.rda b/data/stamford_tracts19.rda index f81e504a2ecba202edbbae2c6f8d43c356e9b020..78657aa5440ea6cd9054924360e83005fc85fede 100644 GIT binary patch literal 468 zcmV;_0W1DOT4*^jL0KkKSu;ZybpQesf5HFzc_2Uof8d^h9KgTt-=IJM0DwRNzyZ7+ z0CPr6OaM$q1ZjZ=BLvBSMjX+T695wtff`^zh`};o5ri_S>H{DFhyVZpXaE2Rq#%t< zDU72unl#hUL5(9pqZ8EiJV~(zVRXQ7ZsRcCs!FGq1ep}_niZSf+jd_-Iiqf=3Wd-s z-^Y5H2*=+;OhiPaRVjZe&j=RtNG-6oR?Q;kf)UIL!m9xaGL6V53amncejvXHB_Mop zIKoZO@Y?Xc8+Ui$Q?6Kgr%ufkW~PbRD73D+cH32zAktQ#%2Yvx`5>%%0bweLp;0Y@ z;4B4E098O00su%PfFdD?gdbjD9SOvD^&IDJg14dQn@6$&znLesn|hyrhD`jOEXikR z8teR(_~&aZKD_0#zD$XlrKrU;(+~S>Mi90mt;1X5P`_YeykltTZrI$`9$TjsZX1K8 z)wy(;$1B|C^qDBwYc^K!n$4`v1fUs6g6F3%9fz|aVV$NT@wyqE{fDZk4pWzMviMbc z_*QQ@O!id4!){jwTB0Ldvse_u%fnqT-fHA7Ik@?qub?uqjlm3u1J~!~gQSrk@pmLs Kg$V;RF?UdQ>C?Ud literal 659 zcmV;E0&M+4T4*^jL0KkKS%Cv{3jhM~|NsC0c>zR=|KPsc{lNeK-{ESa0)h}A5kx@H zlxiugXe+=1A=_I42_y+q@h7Ozo=|!~4H`59L8DC?X`lm52AK^qJxmd%ng9T4q@>Sk zp`ZW&0004?00000000002rvLl00h7Q00000000000004zRP_K20B8rOGyoa~hK7Iu zXaLXvG6OXlY3gjJ+!AsJ!hOpLx!4~t!oOiu2;zzIq0Rquks$%BpF7E~F zFksBg%=f+Td!GSN!9+kAV8V(Z5lm_%$QV>(rz0Iv1W1lgQy1yX#(K;hhM+AOylQOY3Pi!F-RDnkv!u>N zwO$~4+eE5ikj!c-qO(YZ@kGVQ#nK_3sL)iY3pVLp%Bn@|r%w^=$iVF`wt=)=xUG4@ z$)st{ua&T_Jb5987z-@HSz+0+FmC5lEa+4dh2X6tXKigrvM<$*{lv5Sx%%p>%doIBF