MethodOfThresholds <- function(G1, G2,
epsilon = .00001,
deltaS = 0,
rhoS = 1,
sum = T,
rnd = 3,
DG = c("GDelta", "Cd")){
DG = ifelse(is.na(DG), "GDelta", DG)
colMax <- function(data) sapply(as.data.frame(data), max, na.rm = TRUE)
if (sum == T) {G1C = cumsum(G1); G2C = cumsum(G2)} else {G1C = G1; G2C = G2}
if (sum == T) {G1M = mapply('/', G1C, colMax(G1C)); G2M = mapply('/', G2C, colMax(G2C))} else {G1M = G1C; G2M = G2C}
GDF = rbind(as.numeric(unlist(G1M)), as.numeric(unlist(G2M)))
GDF[which(GDF == 1)] = GDF[which(GDF == 1)] - epsilon
GDF[which(GDF == 0)] = GDF[which(GDF == 0)] + epsilon
P_G1 = GDF[1,]
P_G2 = GDF[2,]
f0 = function(t){
1/sqrt(2*pi)*exp(-t^2/2)}
thresholds = rep(0, length(P_G1))
for(i in 1:length(P_G1)){
F0_temp = function(t){
-P_G1[i] + integrate(f0, t, Inf)$value}
thresholds[i] = uniroot(F0_temp, lower = -10, upper = 10)$root}
F_fit = function(t, delta, rho){
f0_full = function(x, mu = delta, sigma = rho){
1/sqrt(2*pi*sigma^2)*exp(-(x-mu)^2/(2*sigma^2))}
outp = rep(0, length(t))
for(i in 1:length(outp)){
outp[i] = integrate(f0_full,t[i],Inf)$value}
return(outp)}
fitLS1 = nls(P_G2 ~ F_fit(thresholds, delta, rho), start = list(delta = deltaS, rho = rhoS))
deltaF = unname(coef(fitLS1)[1])
rhoF = unname(coef(fitLS1)[2])
out = c(deltaF, rhoF)
thresholds = rep(0, length(P_G1))
for(i in 1:length(P_G1)){
F0_temp = function(t){
-P_G2[i] + integrate(f0, t, Inf)$value}
thresholds[i] = uniroot(F0_temp, lower = -10, upper = 10)$root}
fitLS2 = nls(P_G1 ~ F_fit(thresholds, delta, rho), start = list(delta = -deltaS, rho = 1/rhoS))
deltaOF = unname(coef(fitLS2)[1])
rhoOF = unname(coef(fitLS2)[2])
rhoOF = 1/rhoOF
deltaOF = -deltaOF*rhoOF
out = c((deltaF + deltaOF)/2, (rhoF + rhoOF)/2)
suppressWarnings(if (DG == "Cd") {out[3] = sqrt((1 + out[2]^2)/2); out[1] = out[1]/out[3]})
out = round(out[1:2], rnd)
names(out) = suppressWarnings(if (DG == "GDelta") {c("Glass' Delta", "SD Ratio")} else {c("Cohen's d", "SD Ratio")})
return(out)}
ThresholdMean <- function(FracA, FracB, rnd = 3){
Gap = qnorm(FracA) - qnorm(FracB)
return(Gap)}
CRITR <- function(n, alpha = .05) {
df <- n - 2; CRITT <- qt(alpha/2, df, lower.tail = F)
CRITR <- sqrt((CRITT^2)/((CRITT^2) + df ))
return(CRITR)}
library(pacman);p_load(usmap, ggplot2, dplyr)
PreData
In a previous post on the method of multiple thresholds (https://rpubs.com/JLLJ/MMTMICH22), I speculated that some states’ populations may be unrepresentative of their national-level populations and those differences may be the reason for differences between states in the extents of their Black-White gaps. This would work such that individuals in some states migrated there in a way that selected for ability in some fashion. An alternative explanation is that some states are simply richer or are more equal racially, in terms of class, or both. In the example that prompted that speculation, I noticed that in New Hampshire, the Black-White gap was a bit under half as large as it was nationally. Because there are hardly any Blacks in New Hampshire (167 took the SAT there in 2022), their results won’t make any difference for computing the national average. However, this reduced gap is consistent across test years, so it is still a fact in need of explanation. Who knows - it may inform gap reduction in other states.
The issue of why group differences may differ between states has been discussed ad infinitum (e.g., Jensen, 1973), but there is surprisingly little data explicitly mapping how genetic ancestry might impact them. If, in the U.S., we have a large enough sample of African Americans - a recently strongly admixed population - and their European admixture predicts ability, as several large studies now indicated, we may also expect this relationship to operate across states if immigration is selective with respect to ability. We know that admixture is related to socioeconomic status (Cheng et al., 2012) and this does not appear attributable to non-genetic family background or skin color (Kirkegaard et al., 2019), so this hypothesis is quite plausible.
Assessing this question hinges not on the extent of Black-White gaps across states relative to admixture, although that can be interesting, but on whether the relationship holds up when comparing different states’ African American populations with respect to their abilities and their admixture. Unfortunately, gathering measures of admixture in each state is a difficult endeavor. There are no datasets with adequate coverage of all states, and values are scarcely available for any of those except where there are large numbers of African Americans (i.e., the American South). Because of this, data for many states is simply missing, and for many others, it may be unrepresentative of the state it comes from. For this analysis to work requires believing that sampling is not systematic with respect to ability in a way that differs between states. That said, sources range from 23&Me’s multi-state dataset (Bryc et al., 2015) to medical studies done on sometimes disease-riddled populations. Test data is less often missing, but may be even less representative. SAT and ACT data is available for African Americans for every state, but in states where few people take a given test, the people who take it tend to be relatively cognitively elite, since they are usually taking it to receive an out-of-state education. For this reason, when using the SAT or ACT for this purpose, one would have to subset to “SAT States” and “ACT States”, or those states which have a large enough preference for either test that the sample is representative of the general population and not merely a population’s social and cognitive elite. This restricts the possible dataset further because due to how SAT and ACT data are typically presented (i.e., with scoring given as proportions of a group within certain ranges, or percentages of groups passing benchmark thresholds), they are not comparable and thus there is no way to easily combine results with them into one dataset.
The analysis below is a preliminary assessment of the relationship between African admixture in different states’ African American populations and their test scores using data from the SAT and ACT in places that have plausibly representative sampling. In future years, this dataset will grow as more states make deals to switch to one test or the other exclusively, allowing for NHST with this data to be considered. As it stands, the datasets being used are too small. Thus, this analysis is conducted in a purely exploratory manner.
StateData <- PreData %>% group_by(State) %>% summarise(WPer = weighted.mean(Percentage, N)) %>% as.data.frame()
StateData$Short <- c("AL", "AZ", "AR", "CA", "CO", "CT", "DC", "FL", "GA", "IL", "IN", "KS", "KY", "LA", "MD", "MA", "MI", "MS", "MO", "NJ", "NY", "NC", "OH", "OK", "PA", "SC", "TN", "TX", "VA", "WA", "WV", "WI")
StateData[,c(1, 3, 2)]
Admixture data is present for the following map of states:
StateData$fips <- fips(StateData[,1])
plot_usmap(data = StateData, values = "WPer", color = "steelblue", labels = F, exclude = c("AK", "HI")) +
scale_fill_continuous(low = "white", high = "steelblue", name = "African Admixture in AAs") +
labs(title = "States with African American Admixture Data") +
theme(plot.title = element_text(hjust = .5),
text = element_text(family = "serif", size = 15))
The following states in the above sample are SAT states (i.e., >=80% participation).
plot_usmap(include = c("CO", "CT", "DC", "FL", "IL", "MI", "WV"), color = "steelblue", fill = "burlywood") +
labs(title = "SAT States with African American Admixture Data") +
theme(plot.title = element_text(hjust = .5), text = element_text(family = "serif", size = 15))
The following states in the above sample are ACT states (i.e., >=80% participation).
plot_usmap(include = c("AL", "AR", "KY", "LA", "MS", "NC", "OH", "OK", "TN", "WI"), color = "steelblue", fill = "honeydew3") +
labs(title = "ACT States with African American Admixture Data") +
theme(plot.title = element_text(hjust = .5), text = element_text(family = "serif", size = 15))
CRITR(7)
## [1] 0.7544922
Colorado <- c(.01, .07, .22, .46, .23, .01) #1,972, 84% participation
Connecticut <- c(.01, .04, .17, .44, .32, .01) #4,090, 89%
DC <- c(.01, .06, .15, .43, .33, .02) #2,174, >100%
Florida <- c(.01, .04, .16, .48, .30, .01) #33,461, 87%
Illinois <- c(.01, .04, .15, .46, .35, .01) #16,255, 97%
Michigan <- c(.00, .03, .13, .44, .38, .01) #9,980, 84%
WestVirginia <- c(.00, .03, .16, .53, .27, .00) #489, 84%
COCTG <- MethodOfThresholds(Colorado, Connecticut, DG = "GDelta")
CODCG <- MethodOfThresholds(Colorado, DC, DG = "GDelta")
COFLG <- MethodOfThresholds(Colorado, Florida, DG = "GDelta")
COILG <- MethodOfThresholds(Colorado, Illinois, DG = "GDelta")
COMIG <- MethodOfThresholds(Colorado, Michigan, DG = "GDelta")
COWVG <- MethodOfThresholds(Colorado, WestVirginia, DG = "GDelta")
COCTD <- MethodOfThresholds(Colorado, Connecticut, DG = "Cd")
CODCD <- MethodOfThresholds(Colorado, DC, DG = "Cd")
COFLD <- MethodOfThresholds(Colorado, Florida, DG = "Cd")
COILD <- MethodOfThresholds(Colorado, Illinois, DG = "Cd")
COMID <- MethodOfThresholds(Colorado, Michigan, DG = "Cd")
COWVD <- MethodOfThresholds(Colorado, WestVirginia, DG = "Cd")
CohD <- c(0, COCTD[1], CODCD[1], COFLD[1], COILD[1], COMID[1], COWVD[1])
GlaD <- c(0, COCTG[1], CODCG[1], COFLG[1], COILG[1], COMIG[1], COWVG[1])
MeData <- c(.72, .77, .70, .81, .74, .75, .64)
Short <- c("CO", "CT", "DC", "FL", "IL", "MI", "WV")
SATData <- data.frame(CohD, GlaD, MeData, Short)
SATDataMerge <- merge(StateData, SATData, by = "Short"); SATDataMerge
cor(SATDataMerge$WPer, SATDataMerge$CohD)
## [1] -0.3744878
cor(SATDataMerge$WPer, SATDataMerge$GlaD)
## [1] -0.4064796
cor(SATDataMerge$MeData, SATDataMerge$CohD)
## [1] -0.196544
cor(SATDataMerge$MeData, SATDataMerge$GlaD)
## [1] -0.2158909
ggplot(SATDataMerge, aes(x = WPer, y = CohD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and SAT Scoring", x = "African Admixture", y = "Cohen's d") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(SATDataMerge, aes(x = MeData, y = CohD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and SAT Scoring", x = "African Admixture", y = "Cohen's d") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(SATDataMerge, aes(x = WPer, y = CohD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and SAT Scoring", x = "African Admixture", y = "Glass' Delta") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(SATDataMerge, aes(x = MeData, y = CohD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and SAT Scoring", x = "African Admixture", y = "Glass' Delta") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
Due to range restriction/limited variance, the method of multiple thresholds may be too noisy for the ACT. Averaging the individual benchmark pass rate deltas could be more powerful. Results from both methods are presented. Averaging over individual ranges would not be appropriate for the SAT, regardless, since those values all sum to 1 and distortions follow.
CRITR(10)
## [1] 0.6318969
Alabama <- c(.219, .041, .124, .060) #12,530, 100% participation, English, Math, Reading, Science
Arkansas <- c(.248, .054, .130, .074) #4,113, 93%
Kentucky <- c(.239, .065, .157, .073) #3,151, 96%
Louisiana <- c(.256, .057, .149, .070) #17,084, 100%
Mississippi <- c(.231, .052, .125, .062) #12,084, 100%
NorthCarolina <- c(.204, .078, .152, .079) #15,694, 88%
Ohio <- c(.249, .093, .177, .096) #8,591, 82%
Oklahoma <- c(.263, .078, .176, .086) #1,526, 94%
Tennessee <- c(.258, .069, .145, .082) #12,383, 100%
Wisconsin <- c(.208, .066, .131, .072) #2,565, 93%
ALARG <- MethodOfThresholds(Arkansas, Alabama, DG = "GDelta", sum = F)
ALKYG <- MethodOfThresholds(Kentucky, Alabama, DG = "GDelta", sum = F)
ALLAG <- MethodOfThresholds(Louisiana, Alabama, DG = "GDelta", sum = F)
ALMSG <- MethodOfThresholds(Mississippi, Alabama, DG = "GDelta", sum = F)
ALNCG <- MethodOfThresholds(NorthCarolina, Alabama, DG = "GDelta", sum = F)
ALOHG <- MethodOfThresholds(Ohio, Alabama, DG = "GDelta", sum = F)
ALOKG <- MethodOfThresholds(Oklahoma, Alabama, DG = "GDelta", sum = F)
ALTNG <- MethodOfThresholds(Tennessee, Alabama, DG = "GDelta", sum = F)
ALWIG <- MethodOfThresholds(Wisconsin, Alabama, DG = "GDelta", sum = F)
ALARD <- MethodOfThresholds(Arkansas, Alabama, DG = "Cd", sum = F)
ALKYD <- MethodOfThresholds(Kentucky, Alabama, DG = "Cd", sum = F)
ALLAD <- MethodOfThresholds(Louisiana, Alabama, DG = "Cd", sum = F)
ALMSD <- MethodOfThresholds(Mississippi, Alabama, DG = "Cd", sum = F)
ALNCD <- MethodOfThresholds(NorthCarolina, Alabama, DG = "Cd", sum = F)
ALOHD <- MethodOfThresholds(Ohio, Alabama, DG = "Cd", sum = F)
ALOKD <- MethodOfThresholds(Oklahoma, Alabama, DG = "Cd", sum = F)
ALTND <- MethodOfThresholds(Tennessee, Alabama, DG = "Cd", sum = F)
ALWID <- MethodOfThresholds(Wisconsin, Alabama, DG = "Cd", sum = F)
AVDAR <- mean(ThresholdMean(Arkansas, Alabama))
AVDKY <- mean(ThresholdMean(Kentucky, Alabama))
AVDLA <- mean(ThresholdMean(Louisiana, Alabama))
AVDMS <- mean(ThresholdMean(Mississippi, Alabama))
AVDNC <- mean(ThresholdMean(NorthCarolina, Alabama))
AVDOH <- mean(ThresholdMean(Ohio, Alabama))
AVDOK <- mean(ThresholdMean(Oklahoma, Alabama))
AVDTN <- mean(ThresholdMean(Tennessee, Alabama))
AVDWI <- mean(ThresholdMean(Wisconsin, Alabama))
AveD <- c(0, AVDAR, AVDKY, AVDLA, AVDMS, AVDNC, AVDOH, AVDOK, AVDTN, AVDWI)
CohD <- c(0, ALARD[1], ALKYD[1], ALLAD[1], ALMSD[1], ALNCD[1], ALOHD[1], ALOKD[1], ALTND[1], ALWID[1])
GlaD <- c(0, ALARG[1], ALKYG[1], ALLAG[1], ALMSG[1], ALNCG[1], ALOHG[1], ALOKG[1], ALTNG[1], ALWIG[1])
Short <- c("AL", "AR", "KY", "LA", "MS", "NC", "OH", "OK", "TN", "WI")
MeData <- c(.81, .80, .69, .75, .80, .74, .73, .73, .77, .71)
ACTData <- data.frame(GlaD, CohD, AveD, MeData, Short)
ACTDataMerge <- merge(StateData, ACTData, by = "Short"); ACTDataMerge
cor(ACTDataMerge$WPer, ACTDataMerge$CohD)
## [1] -0.3295827
cor(ACTDataMerge$WPer, ACTDataMerge$GlaD)
## [1] -0.3548223
cor(ACTDataMerge$MeData, ACTDataMerge$CohD)
## [1] -0.4280298
cor(ACTDataMerge$MeData, ACTDataMerge$GlaD)
## [1] -0.4382051
cor(ACTDataMerge$WPer, ACTDataMerge$AveD)
## [1] -0.1446907
cor(ACTDataMerge$MeData, ACTDataMerge$AveD)
## [1] -0.5708865
ggplot(ACTDataMerge, aes(x = WPer, y = CohD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and ACT Scoring", x = "African Admixture (Meta-Analytic)", y = "Cohen's d") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(ACTDataMerge, aes(x = MeData, y = CohD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and ACT Scoring", x = "African Admixture (23&Me)", y = "Cohen's d") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(ACTDataMerge, aes(x = WPer, y = GlaD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and ACT Scoring", x = "African Admixture (Meta-Analytic)", y = "Glass' Delta") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(ACTDataMerge, aes(x = MeData, y = GlaD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and ACT Scoring", x = "African Admixture (23&Me)", y = "Glass' Delta") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(ACTDataMerge, aes(x = WPer, y = AveD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and ACT Scoring", x = "African Admixture (Meta-Analytic)", y = "Average SMD") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
ggplot(ACTDataMerge, aes(x = MeData, y = AveD, label = Short)) +
geom_point(alpha = .5, color = "steelblue", size = 3) +
geom_smooth(method = lm, color = "gray", formula = "y ~ x") +
geom_text(hjust = 0, vjust = -1) +
labs(title = "Relationship between Admixture and ACT Scoring", x = "African Admixture (23&Me)", y = "Average SMD") +
theme_minimal() +
theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
Effects go in the expected direction if historical migration has been selective with respect to African admixture in the African American population and this admixture has a causal impact on test scores, as it appears to for socioeconomic status and various disease risks. The extent of gaps between and across states may be due to selective migration that has left its mark in the form of differences in admixture.
Future assessments will have to increase the numbers of states represented in this dataset and the comprehensiveness of the measures used. Commensurability between datasets using the SAT and ACT or simply more still representative state-level samples with either would be very helpful, as would quality variance information for admixture estimates, so that a formal meta-analysis could be performed instead of the use of N-weighted means of the estimates in the literature. Variance information, as it stands, is not very high-quality, as it typically takes the form of SEs computed from SDs obtained from IQRs, SEs computed based on provided 68% CIs, and so on, and many studies simply do not have it. Moreover, variance between samples may be due to the type of arrays and admixture assignment methods used, and even to the number of populations modeled. The greater consistency of the 23&Me estimates makes that idea ring true. The use of a factor score for the independent variable and better IQ measures in general may also impact the results.
With greater precision, it seems plausible - and likely - that the results will become more clearly supportive of the general tenor of admixture studies in this domain since the factors that are probably impacting the present results are generally known to produce attenuation. A similar analysis has already supported this idea and these conclusions (Kirkegaard & Fuerst, 2016).
Jensen, A. (1973). Educability and Group Differences (1st edition). Routledge.
Cheng, C.Y., Reich, D., Haiman, C. A., Tandon, A., Patterson, N., Elizabeth, S., Akylbekova, E. L., Brancati, F. L., Coresh, J., Boerwinkle, E., Altshuler, D., Taylor, H. A., Henderson, B. E., Wilson, J. G., & Kao, W. H. L. (2012). African Ancestry and Its Correlation to Type 2 Diabetes in African Americans: A Genetic Admixture Analysis in Three U.S. Population Cohorts. PLOS ONE, 7(3), e32840. https://doi.org/10.1371/journal.pone.0032840
Kirkegaard, E. O. W., Woodley of Menie, M. A., Williams, R. L., Fuerst, J., & Meisenberg, G. (2019). Biogeographic Ancestry, Cognitive Ability and Socioeconomic Outcomes. Psych, 1(1), Article 1. https://doi.org/10.3390/psych1010001
Bryc, K., Durand, E. Y., Macpherson, J. M., Reich, D., & Mountain, J. L. (2015). The Genetic Ancestry of African Americans, Latinos, and European Americans across the United States. The American Journal of Human Genetics, 96(1), 37–53. https://doi.org/10.1016/j.ajhg.2014.11.010
Kirkegaard, E. O. W., & Fuerst, J. G. R. (2016). Inequality in the United States: Ethnicity, Racial Admixture and Environmental Causes. Mankind Quarterly, 56(4). https://doi.org/10.46469/mq.2016.56.4.7
sessionInfo()
## R version 4.2.1 (2022-06-23 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19044)
##
## Matrix products: default
##
## locale:
## [1] LC_COLLATE=English_United States.utf8
## [2] LC_CTYPE=English_United States.utf8
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.utf8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] dplyr_1.0.10 ggplot2_3.3.6 usmap_0.6.0 pacman_0.5.1
##
## loaded via a namespace (and not attached):
## [1] highr_0.9 bslib_0.4.0 compiler_4.2.1 pillar_1.8.1
## [5] jquerylib_0.1.4 tools_4.2.1 digest_0.6.29 lattice_0.20-45
## [9] nlme_3.1-157 jsonlite_1.8.2 evaluate_0.17 lifecycle_1.0.3
## [13] tibble_3.1.8 gtable_0.3.1 mgcv_1.8-40 pkgconfig_2.0.3
## [17] rlang_1.0.6 Matrix_1.4-1 cli_3.4.1 rstudioapi_0.14
## [21] yaml_2.3.5 xfun_0.33 fastmap_1.1.0 usmapdata_0.1.0
## [25] withr_2.5.0 stringr_1.4.1 knitr_1.40 generics_0.1.3
## [29] sass_0.4.2 vctrs_0.4.2 tidyselect_1.2.0 grid_4.2.1
## [33] glue_1.6.2 R6_2.5.1 fansi_1.0.3 rmarkdown_2.17
## [37] farver_2.1.1 magrittr_2.0.3 splines_4.2.1 scales_1.2.1
## [41] htmltools_0.5.3 colorspace_2.0-3 labeling_0.4.2 utf8_1.2.2
## [45] stringi_1.7.8 munsell_0.5.0 cachem_1.0.6