library(pacman); p_load(ggplot2, ggthemr, DT, sandwich, lmtest, robustbase, plyr)
ggthemr("dust")
set_swatch(c("#555555", "#db735c", "#EFA86E", "#9A8A76", "#F3C57B", "#7A6752", "#2A91A2", "#87F28A", "#6EDCEF",
"#AA65C7", "#F1948A", "#C7C065", "#E1DFC9", "#819FC7", "#AD1D47", "#E1B24C", "#78B380", "#4A56EA",
"#E71414", "#FCD9D9", "#065F4C", "#0EF4C3", "#4BAF4B", "#AC4BAF", "#DEC735"))
datatable(data, extensions = c("Buttons", "FixedColumns"), options = list(dom = 'Bfrtip', buttons = c('copy', 'csv', 'print'), scrollX = T, fixedColumns = list(leftColumns = 2)))
data$Age <- factor(data$Age,
levels = c("Paleolithic", "Mesolithic", "Neolithic", "Bronze Age", "Iron Age", "Antiquity", "Medieval"))
Hui et al. (2023) provided evidence that modern height polygenic scores predict heights in a medieval English sample. Cox et al. (2021) has provided additional data that can be used to supplement this finding.
Cox et al. (2019) and Mathieson et al. (2015) are worth reading on the topic of height and other traits as predicted in ancient genomes.
The correlations in locations with \(\geq 10\) each of male or female participants, were 0.36 (England, Female, n = 49), 0.24 (Germany, Female, n = 20), -0.17 (Czechia, Male, n = 10), 0.38 (England, Male, n = 51), and 0.39 (Germany, Male, n = 12). There’s no power for any of these, to be clear, but it’s still interesting to see them. The correlations in eras treated likewise were 0.39 (Bronze Age, Male, n = 41), 0.38 (Medieval, Male, n = 59), -0.27 (Neolithic, Male, n = 19), 0.32 (Bronze Age, Female, n = 31), 0.34 (Medieval, Female, n = 52), 0.09 (Neolithic, Female, n = 12). There were not enough Czechian-located (Bell Beaker-associated) samples from after the Bronze Age to produce any useful information.
And, PGS by year:
summary(lm(PGSImputed ~ Year, data))
##
## Call:
## lm(formula = PGSImputed ~ Year, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.5063 -0.7161 0.0109 0.6671 3.1708
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.124e-02 6.619e-02 0.925 0.35579
## Year 4.139e-05 1.442e-05 2.871 0.00446 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9697 on 238 degrees of freedom
## Multiple R-squared: 0.03347, Adjusted R-squared: 0.02941
## F-statistic: 8.241 on 1 and 238 DF, p-value: 0.004465
summary(lm(scale(PGSImputed) ~ scale(Year), data))
##
## Call:
## lm(formula = scale(PGSImputed) ~ scale(Year), data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.5462 -0.7276 0.0111 0.6777 3.2213
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.649e-17 6.359e-02 0.000 1.00000
## scale(Year) 1.829e-01 6.373e-02 2.871 0.00446 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9852 on 238 degrees of freedom
## Multiple R-squared: 0.03347, Adjusted R-squared: 0.02941
## F-statistic: 8.241 on 1 and 238 DF, p-value: 0.004465
summary(lm(PGSImputed ~ Year + Location, data))
##
## Call:
## lm(formula = PGSImputed ~ Year + Location, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.4672 -0.6093 0.0205 0.6470 3.2099
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.278e-02 6.851e-01 0.092 0.927
## Year 2.122e-05 1.847e-05 1.149 0.252
## LocationCzechia 5.122e-02 7.368e-01 0.070 0.945
## LocationEngland -1.756e-02 6.946e-01 -0.025 0.980
## LocationEstonia 1.065e+00 7.576e-01 1.405 0.161
## LocationGermany -7.686e-02 7.004e-01 -0.110 0.913
## LocationHungary -7.268e-01 8.311e-01 -0.875 0.383
## LocationIran -1.247e-01 8.751e-01 -0.142 0.887
## LocationItaly -1.029e-01 7.495e-01 -0.137 0.891
## LocationLithuania -4.210e-01 8.788e-01 -0.479 0.632
## LocationLuxembourg -1.283e+00 1.173e+00 -1.093 0.276
## LocationNetherlands 2.380e-01 8.047e-01 0.296 0.768
## LocationNorway 4.883e-01 8.111e-01 0.602 0.548
## LocationPakistan 5.957e-01 8.068e-01 0.738 0.461
## LocationPoland -6.447e-01 7.595e-01 -0.849 0.397
## LocationPortugal -6.841e-01 9.598e-01 -0.713 0.477
## LocationRomania -5.976e-01 7.825e-01 -0.764 0.446
## LocationRussia -8.861e-02 7.490e-01 -0.118 0.906
## LocationScotland 2.909e-01 9.629e-01 0.302 0.763
## LocationSerbia -6.069e-01 8.016e-01 -0.757 0.450
## LocationSpain -7.151e-01 1.173e+00 -0.609 0.543
## LocationSweden 2.657e-01 7.622e-01 0.349 0.728
## LocationSwitzerland 1.499e-03 8.018e-01 0.002 0.999
## LocationTurkey -9.277e-01 1.173e+00 -0.791 0.430
## LocationUkraine -1.260e-01 8.296e-01 -0.152 0.879
##
## Residual standard error: 0.9579 on 215 degrees of freedom
## Multiple R-squared: 0.1481, Adjusted R-squared: 0.05296
## F-statistic: 1.557 on 24 and 215 DF, p-value: 0.0528
summary(lm(scale(PGSImputed) ~ scale(Year) + Location, data))
##
## Call:
## lm(formula = scale(PGSImputed) ~ scale(Year) + Location, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.5065 -0.6190 0.0209 0.6573 3.2611
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.032128 0.692392 0.046 0.963
## scale(Year) 0.093800 0.081644 1.149 0.252
## LocationCzechia 0.052036 0.748516 0.070 0.945
## LocationEngland -0.017840 0.705690 -0.025 0.980
## LocationEstonia 1.081505 0.769701 1.405 0.161
## LocationGermany -0.078085 0.711518 -0.110 0.913
## LocationHungary -0.738393 0.844355 -0.875 0.383
## LocationIran -0.126655 0.889028 -0.142 0.887
## LocationItaly -0.104551 0.761424 -0.137 0.891
## LocationLithuania -0.427680 0.892786 -0.479 0.632
## LocationLuxembourg -1.303067 1.191904 -1.093 0.276
## LocationNetherlands 0.241762 0.817518 0.296 0.768
## LocationNorway 0.496056 0.824002 0.602 0.548
## LocationPakistan 0.605203 0.819617 0.738 0.461
## LocationPoland -0.655019 0.771620 -0.849 0.397
## LocationPortugal -0.694976 0.975048 -0.713 0.477
## LocationRomania -0.607088 0.794925 -0.764 0.446
## LocationRussia -0.090018 0.760949 -0.118 0.906
## LocationScotland 0.295537 0.978265 0.302 0.763
## LocationSerbia -0.616561 0.814397 -0.757 0.450
## LocationSpain -0.726454 1.192165 -0.609 0.543
## LocationSweden 0.269913 0.774373 0.349 0.728
## LocationSwitzerland 0.001523 0.814582 0.002 0.999
## LocationTurkey -0.942468 1.191885 -0.791 0.430
## LocationUkraine -0.128011 0.842789 -0.152 0.879
##
## Residual standard error: 0.9732 on 215 degrees of freedom
## Multiple R-squared: 0.1481, Adjusted R-squared: 0.05296
## F-statistic: 1.557 on 24 and 215 DF, p-value: 0.0528
Here are regressions, with and without controls for comparison.
summary(lm(Stature ~ PGSImputed, data))
##
## Call:
## lm(formula = Stature ~ PGSImputed, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16.7625 -5.5992 0.0063 5.0533 22.4634
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 165.7447 0.4815 344.217 < 2e-16 ***
## PGSImputed 2.7706 0.4902 5.652 4.52e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.46 on 238 degrees of freedom
## Multiple R-squared: 0.1183, Adjusted R-squared: 0.1146
## F-statistic: 31.94 on 1 and 238 DF, p-value: 4.522e-08
summary(lm(Stature ~ PGSImputed + Location + Sex + Year, data))
##
## Call:
## lm(formula = Stature ~ PGSImputed + Location + Sex + Year, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -20.4960 -3.3137 0.1011 3.8378 13.2230
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.580e+02 3.986e+00 39.629 < 2e-16 ***
## PGSImputed 2.241e+00 3.906e-01 5.737 3.27e-08 ***
## LocationCzechia -1.278e+00 4.209e+00 -0.304 0.76173
## LocationEngland 4.670e+00 3.984e+00 1.172 0.24247
## LocationEstonia 6.850e+00 4.349e+00 1.575 0.11671
## LocationGermany -5.843e-01 4.028e+00 -0.145 0.88481
## LocationHungary 5.110e+00 4.759e+00 1.074 0.28409
## LocationIran -1.786e+00 5.005e+00 -0.357 0.72155
## LocationItaly -1.456e+00 4.294e+00 -0.339 0.73484
## LocationLithuania 8.475e+00 5.028e+00 1.686 0.09334 .
## LocationLuxembourg 9.508e-03 6.720e+00 0.001 0.99887
## LocationNetherlands 6.986e+00 4.608e+00 1.516 0.13095
## LocationNorway 7.079e+00 4.678e+00 1.513 0.13168
## LocationPakistan 2.486e+00 4.625e+00 0.537 0.59150
## LocationPoland -1.738e+00 4.369e+00 -0.398 0.69121
## LocationPortugal -5.082e+00 5.500e+00 -0.924 0.35660
## LocationRomania 1.041e+01 4.482e+00 2.323 0.02115 *
## LocationRussia -4.613e+00 4.286e+00 -1.076 0.28304
## LocationScotland -3.896e+00 5.501e+00 -0.708 0.47959
## LocationSerbia 1.402e+00 4.594e+00 0.305 0.76048
## LocationSpain -4.170e+00 6.750e+00 -0.618 0.53737
## LocationSweden 2.265e+00 4.356e+00 0.520 0.60369
## LocationSwitzerland -3.872e+00 4.582e+00 -0.845 0.39908
## LocationTurkey -3.399e-01 6.711e+00 -0.051 0.95966
## LocationUkraine 2.246e+00 4.742e+00 0.474 0.63621
## SexMale 8.419e+00 7.673e-01 10.971 < 2e-16 ***
## Year -3.032e-04 1.058e-04 -2.865 0.00459 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.471 on 213 degrees of freedom
## Multiple R-squared: 0.5755, Adjusted R-squared: 0.5237
## F-statistic: 11.11 on 26 and 213 DF, p-value: < 2.2e-16
summary(lm(Stature ~ PGSImputed + Location + Sex + Age, data))
##
## Call:
## lm(formula = Stature ~ PGSImputed + Location + Sex + Age, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -20.3085 -3.1683 0.0553 3.7356 13.1038
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 173.76311 5.15841 33.685 < 2e-16 ***
## PGSImputed 2.07720 0.39495 5.259 3.58e-07 ***
## LocationCzechia -6.44187 4.57805 -1.407 0.160885
## LocationEngland -2.23865 4.77129 -0.469 0.639424
## LocationEstonia 0.15010 5.06813 0.030 0.976402
## LocationGermany -4.78018 4.30828 -1.110 0.268481
## LocationHungary 0.45062 5.06544 0.089 0.929199
## LocationIran -4.84528 5.09937 -0.950 0.343128
## LocationItaly -8.57433 4.99389 -1.717 0.087474 .
## LocationLithuania 1.31065 5.50936 0.238 0.812196
## LocationLuxembourg -0.06595 6.63224 -0.010 0.992076
## LocationNetherlands 2.11978 4.92007 0.431 0.667029
## LocationNorway 0.14350 5.37223 0.027 0.978715
## LocationPakistan -6.21099 5.62800 -1.104 0.271048
## LocationPoland -6.07593 4.61976 -1.315 0.189890
## LocationPortugal -9.90140 5.74963 -1.722 0.086539 .
## LocationRomania 10.65530 4.42153 2.410 0.016829 *
## LocationRussia -7.58305 4.36546 -1.737 0.083858 .
## LocationScotland -9.75226 5.78837 -1.685 0.093526 .
## LocationSerbia 1.55105 4.53306 0.342 0.732573
## LocationSpain -4.79386 6.65944 -0.720 0.472419
## LocationSweden -4.60543 4.86734 -0.946 0.345149
## LocationSwitzerland -8.94843 4.97315 -1.799 0.073413 .
## LocationTurkey -0.41116 6.62284 -0.062 0.950557
## LocationUkraine 2.14992 4.67977 0.459 0.646421
## SexMale 8.33271 0.76022 10.961 < 2e-16 ***
## AgeMesolithic -5.49731 5.02675 -1.094 0.275391
## AgeNeolithic -14.03026 3.37014 -4.163 4.60e-05 ***
## AgeBronze Age -10.33397 3.00054 -3.444 0.000693 ***
## AgeIron Age -6.35156 4.27622 -1.485 0.138973
## AgeAntiquity -8.45617 3.63398 -2.327 0.020929 *
## AgeMedieval -9.10742 3.46492 -2.628 0.009217 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.399 on 208 degrees of freedom
## Multiple R-squared: 0.5963, Adjusted R-squared: 0.5362
## F-statistic: 9.912 on 31 and 208 DF, p-value: < 2.2e-16
summary(lm(scale(Stature) ~ scale(PGSImputed), data))
##
## Call:
## lm(formula = scale(Stature) ~ scale(PGSImputed), data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.11440 -0.70628 0.00079 0.63742 2.83352
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.123e-16 6.074e-02 0.000 1
## scale(PGSImputed) 3.440e-01 6.086e-02 5.652 4.52e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9409 on 238 degrees of freedom
## Multiple R-squared: 0.1183, Adjusted R-squared: 0.1146
## F-statistic: 31.94 on 1 and 238 DF, p-value: 4.522e-08
summary(lm(scale(Stature) ~ scale(PGSImputed) + Location + Sex + Year, data))
##
## Call:
## lm(formula = scale(Stature) ~ scale(PGSImputed) + Location +
## Sex + Year, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.58535 -0.41798 0.01275 0.48410 1.66794
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.814e-01 5.028e-01 -1.952 0.05226 .
## scale(PGSImputed) 2.782e-01 4.850e-02 5.737 3.27e-08 ***
## LocationCzechia -1.612e-01 5.309e-01 -0.304 0.76173
## LocationEngland 5.891e-01 5.026e-01 1.172 0.24247
## LocationEstonia 8.640e-01 5.485e-01 1.575 0.11671
## LocationGermany -7.370e-02 5.081e-01 -0.145 0.88481
## LocationHungary 6.446e-01 6.002e-01 1.074 0.28409
## LocationIran -2.253e-01 6.313e-01 -0.357 0.72155
## LocationItaly -1.837e-01 5.417e-01 -0.339 0.73484
## LocationLithuania 1.069e+00 6.342e-01 1.686 0.09334 .
## LocationLuxembourg 1.199e-03 8.476e-01 0.001 0.99887
## LocationNetherlands 8.812e-01 5.812e-01 1.516 0.13095
## LocationNorway 8.929e-01 5.900e-01 1.513 0.13168
## LocationPakistan 3.136e-01 5.834e-01 0.537 0.59150
## LocationPoland -2.192e-01 5.512e-01 -0.398 0.69121
## LocationPortugal -6.410e-01 6.938e-01 -0.924 0.35660
## LocationRomania 1.313e+00 5.653e-01 2.323 0.02115 *
## LocationRussia -5.818e-01 5.406e-01 -1.076 0.28304
## LocationScotland -4.914e-01 6.939e-01 -0.708 0.47959
## LocationSerbia 1.769e-01 5.795e-01 0.305 0.76048
## LocationSpain -5.260e-01 8.514e-01 -0.618 0.53737
## LocationSweden 2.857e-01 5.495e-01 0.520 0.60369
## LocationSwitzerland -4.884e-01 5.780e-01 -0.845 0.39908
## LocationTurkey -4.287e-02 8.465e-01 -0.051 0.95966
## LocationUkraine 2.834e-01 5.982e-01 0.474 0.63621
## SexMale 1.062e+00 9.679e-02 10.971 < 2e-16 ***
## Year -3.825e-05 1.335e-05 -2.865 0.00459 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6902 on 213 degrees of freedom
## Multiple R-squared: 0.5755, Adjusted R-squared: 0.5237
## F-statistic: 11.11 on 26 and 213 DF, p-value: < 2.2e-16
summary(lm(scale(Stature) ~ scale(PGSImputed) + Location + Sex + Age, data))
##
## Call:
## lm(formula = scale(Stature) ~ scale(PGSImputed) + Location +
## Sex + Age, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.56170 -0.39964 0.00697 0.47120 1.65290
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.011485 0.650678 1.555 0.121583
## scale(PGSImputed) 0.257905 0.049037 5.259 3.58e-07 ***
## LocationCzechia -0.812572 0.577472 -1.407 0.160885
## LocationEngland -0.282381 0.601846 -0.469 0.639424
## LocationEstonia 0.018933 0.639290 0.030 0.976402
## LocationGermany -0.602969 0.543443 -1.110 0.268481
## LocationHungary 0.056841 0.638951 0.089 0.929199
## LocationIran -0.611180 0.643231 -0.950 0.343128
## LocationItaly -1.081559 0.629925 -1.717 0.087474 .
## LocationLithuania 0.165325 0.694946 0.238 0.812196
## LocationLuxembourg -0.008318 0.836586 -0.010 0.992076
## LocationNetherlands 0.267387 0.620614 0.431 0.667029
## LocationNorway 0.018101 0.677648 0.027 0.978715
## LocationPakistan -0.783449 0.709912 -1.104 0.271048
## LocationPoland -0.766413 0.582733 -1.315 0.189890
## LocationPortugal -1.248955 0.725253 -1.722 0.086539 .
## LocationRomania 1.344051 0.557728 2.410 0.016829 *
## LocationRussia -0.956520 0.550656 -1.737 0.083858 .
## LocationScotland -1.230143 0.730140 -1.685 0.093526 .
## LocationSerbia 0.195648 0.571797 0.342 0.732573
## LocationSpain -0.604694 0.840017 -0.720 0.472419
## LocationSweden -0.580925 0.613962 -0.946 0.345149
## LocationSwitzerland -1.128747 0.627309 -1.799 0.073413 .
## LocationTurkey -0.051864 0.835400 -0.062 0.950557
## LocationUkraine 0.271189 0.590302 0.459 0.646421
## SexMale 1.051081 0.095894 10.961 < 2e-16 ***
## AgeMesolithic -0.693426 0.634071 -1.094 0.275391
## AgeNeolithic -1.769766 0.425106 -4.163 4.60e-05 ***
## AgeBronze Age -1.303519 0.378485 -3.444 0.000693 ***
## AgeIron Age -0.801180 0.539399 -1.485 0.138973
## AgeAntiquity -1.066654 0.458388 -2.327 0.020929 *
## AgeMedieval -1.148803 0.437062 -2.628 0.009217 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.681 on 208 degrees of freedom
## Multiple R-squared: 0.5963, Adjusted R-squared: 0.5362
## F-statistic: 9.912 on 31 and 208 DF, p-value: < 2.2e-16
Robust regressions, with and without controls for comparison. HC1 is the only Huber-White standard error available with data like this, but MM-type estimators still work, for what that’s worth.
Uncontrolled <- lm(Stature ~ PGSImputed, data)
ControlledI <- lm(Stature ~ PGSImputed + Location + Sex + Year, data)
ControlledII <- lm(Stature ~ PGSImputed + Location + Sex + Age, data)
VCU <- vcovHC(Uncontrolled, type = "HC1")
VCC1 <- vcovHC(ControlledI, type = "HC1")
VCC2 <- vcovHC(ControlledII, type = "HC1")
coeftest(Uncontrolled, vcov = VCU)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 165.74466 0.48149 344.236 < 2.2e-16 ***
## PGSImputed 2.77058 0.50002 5.541 7.953e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(ControlledI, vcov = VCC1)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.5796e+02 1.5858e+00 99.6095 < 2.2e-16 ***
## PGSImputed 2.2410e+00 4.2206e-01 5.3095 2.755e-07 ***
## LocationCzechia -1.2779e+00 1.9711e+00 -0.6483 0.517477
## LocationEngland 4.6702e+00 1.5903e+00 2.9366 0.003683 **
## LocationEstonia 6.8497e+00 2.1639e+00 3.1655 0.001775 **
## LocationGermany -5.8431e-01 1.8105e+00 -0.3227 0.747213
## LocationHungary 5.1102e+00 2.5213e+00 2.0268 0.043925 *
## LocationIran -1.7860e+00 4.3123e+00 -0.4142 0.679161
## LocationItaly -1.4564e+00 2.1835e+00 -0.6670 0.505497
## LocationLithuania 8.4746e+00 2.7665e+00 3.0633 0.002472 **
## LocationLuxembourg 9.5083e-03 1.4035e+00 0.0068 0.994601
## LocationNetherlands 6.9860e+00 2.2206e+00 3.1460 0.001892 **
## LocationNorway 7.0789e+00 2.9962e+00 2.3626 0.019046 *
## LocationPakistan 2.4858e+00 2.1981e+00 1.1309 0.259384
## LocationPoland -1.7379e+00 1.9062e+00 -0.9117 0.362940
## LocationPortugal -5.0816e+00 2.0579e+00 -2.4693 0.014325 *
## LocationRomania 1.0409e+01 4.8633e+00 2.1403 0.033465 *
## LocationRussia -4.6128e+00 1.7933e+00 -2.5723 0.010784 *
## LocationScotland -3.8960e+00 1.7833e+00 -2.1848 0.029997 *
## LocationSerbia 1.4023e+00 2.3385e+00 0.5997 0.549370
## LocationSpain -4.1699e+00 1.5185e+00 -2.7460 0.006548 **
## LocationSweden 2.2646e+00 2.7025e+00 0.8380 0.402986
## LocationSwitzerland -3.8719e+00 2.3390e+00 -1.6553 0.099327 .
## LocationTurkey -3.3988e-01 1.3527e+00 -0.2513 0.801854
## LocationUkraine 2.2464e+00 3.5806e+00 0.6274 0.531080
## SexMale 8.4187e+00 7.5381e-01 11.1682 < 2.2e-16 ***
## Year -3.0324e-04 1.0120e-04 -2.9965 0.003054 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(ControlledII, vcov = VCC2)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 173.763112 3.321659 52.3121 < 2.2e-16 ***
## PGSImputed 2.077199 0.423704 4.9025 1.903e-06 ***
## LocationCzechia -6.441865 2.593623 -2.4837 0.0137914 *
## LocationEngland -2.238646 2.654757 -0.8433 0.4000526
## LocationEstonia 0.150097 3.033310 0.0495 0.9605820
## LocationGermany -4.780185 2.197534 -2.1752 0.0307390 *
## LocationHungary 0.450624 3.009253 0.1497 0.8811100
## LocationIran -4.845280 3.484753 -1.3904 0.1658864
## LocationItaly -8.574331 3.035331 -2.8248 0.0051908 **
## LocationLithuania 1.310655 3.263791 0.4016 0.6884096
## LocationLuxembourg -0.065946 1.462398 -0.0451 0.9640754
## LocationNetherlands 2.119780 2.722807 0.7785 0.4371429
## LocationNorway 0.143501 3.754185 0.0382 0.9695455
## LocationPakistan -6.210989 3.472964 -1.7884 0.0751698 .
## LocationPoland -6.075927 2.395359 -2.5365 0.0119292 *
## LocationPortugal -9.901404 2.566098 -3.8585 0.0001522 ***
## LocationRomania 10.655299 4.889810 2.1791 0.0304490 *
## LocationRussia -7.583050 2.017064 -3.7594 0.0002213 ***
## LocationScotland -9.752262 2.106938 -4.6286 6.474e-06 ***
## LocationSerbia 1.551050 2.353794 0.6590 0.5106520
## LocationSpain -4.793864 1.561733 -3.0696 0.0024293 **
## LocationSweden -4.605428 3.544880 -1.2992 0.1953212
## LocationSwitzerland -8.948425 2.954722 -3.0285 0.0027687 **
## LocationTurkey -0.411165 1.412540 -0.2911 0.7712789
## LocationUkraine 2.149920 3.595820 0.5979 0.5505609
## SexMale 8.332708 0.746141 11.1677 < 2.2e-16 ***
## AgeMesolithic -5.497307 3.240177 -1.6966 0.0912669 .
## AgeNeolithic -14.030264 2.874733 -4.8805 2.104e-06 ***
## AgeBronze Age -10.333974 2.711770 -3.8108 0.0001824 ***
## AgeIron Age -6.351556 3.809529 -1.6673 0.0969634 .
## AgeAntiquity -8.456165 3.671131 -2.3034 0.0222432 *
## AgeMedieval -9.107420 3.325539 -2.7386 0.0067048 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(lmrob(Stature ~ PGSImputed, data))
##
## Call:
## lmrob(formula = Stature ~ PGSImputed, data = data)
## \--> method = "MM"
## Residuals:
## Min 1Q Median 3Q Max
## -16.684 -5.636 0.159 5.066 22.791
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 165.6780 0.5036 328.957 < 2e-16 ***
## PGSImputed 2.9478 0.5170 5.702 3.5e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Robust residual standard error: 7.904
## Multiple R-squared: 0.1258, Adjusted R-squared: 0.1221
## Convergence in 8 IRWLS iterations
##
## Robustness weights:
## 15 weights are ~= 1. The remaining 225 ones are summarized as
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3859 0.8833 0.9526 0.9187 0.9861 0.9990
## Algorithmic parameters:
## tuning.chi bb tuning.psi refine.tol
## 1.548e+00 5.000e-01 4.685e+00 1.000e-07
## rel.tol scale.tol solve.tol eps.outlier
## 1.000e-07 1.000e-10 1.000e-07 4.167e-04
## eps.x warn.limit.reject warn.limit.meanrw
## 5.965e-12 5.000e-01 5.000e-01
## nResample max.it best.r.s k.fast.s k.max
## 500 50 2 1 200
## maxit.scale trace.lev mts compute.rd fast.s.large.n
## 200 0 1000 0 2000
## psi subsampling cov
## "bisquare" "nonsingular" ".vcov.avar1"
## compute.outlier.stats
## "SM"
## seed : int(0)
summary(lmrob(Stature ~ PGSImputed + Location + Sex + Year, data))
##
## Call:
## lmrob(formula = Stature ~ PGSImputed + Location + Sex + Year, data = data)
## \--> method = "MM"
## Residuals:
## Min 1Q Median 3Q Max
## -24.46837 -3.46615 0.06296 3.62572 11.83631
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.578e+02 1.503e+00 104.961 < 2e-16 ***
## PGSImputed 2.360e+00 4.284e-01 5.508 1.04e-07 ***
## LocationCzechia -1.413e+00 1.951e+00 -0.724 0.469627
## LocationEngland 4.884e+00 1.525e+00 3.203 0.001570 **
## LocationEstonia 6.769e+00 2.150e+00 3.149 0.001875 **
## LocationGermany -4.975e-01 1.760e+00 -0.283 0.777686
## LocationHungary 5.261e+00 2.459e+00 2.139 0.033550 *
## LocationIran -1.478e+00 5.155e+00 -0.287 0.774638
## LocationItaly -1.290e+00 2.175e+00 -0.593 0.553835
## LocationLithuania 8.550e+00 2.654e+00 3.221 0.001476 **
## LocationLuxembourg 1.612e-01 1.328e+00 0.121 0.903510
## LocationNetherlands 7.060e+00 2.202e+00 3.206 0.001551 **
## LocationNorway 7.131e+00 3.180e+00 2.242 0.025983 *
## LocationPakistan 2.454e+00 2.138e+00 1.148 0.252318
## LocationPoland -1.460e+00 1.779e+00 -0.821 0.412706
## LocationPortugal -4.911e+00 2.056e+00 -2.388 0.017804 *
## LocationRomania 1.433e+01 3.815e+00 3.756 0.000222 ***
## LocationRussia -4.503e+00 1.698e+00 -2.653 0.008587 **
## LocationScotland -3.923e+00 1.745e+00 -2.249 0.025562 *
## LocationSerbia 1.313e+00 2.245e+00 0.585 0.559098
## LocationSpain -3.914e+00 1.418e+00 -2.760 0.006281 **
## LocationSweden 2.960e+00 2.706e+00 1.094 0.275349
## LocationSwitzerland -3.519e+00 2.208e+00 -1.593 0.112586
## LocationTurkey -2.301e-01 1.273e+00 -0.181 0.856756
## LocationUkraine 2.511e+00 3.876e+00 0.648 0.517686
## SexMale 8.588e+00 7.198e-01 11.932 < 2e-16 ***
## Year -3.071e-04 1.048e-04 -2.931 0.003748 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Robust residual standard error: 5.496
## Multiple R-squared: 0.5971, Adjusted R-squared: 0.548
## Convergence in 12 IRWLS iterations
##
## Robustness weights:
## 27 weights are ~= 1. The remaining 213 ones are summarized as
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.009413 0.886700 0.953100 0.916400 0.986900 0.998900
## Algorithmic parameters:
## tuning.chi bb tuning.psi refine.tol
## 1.548e+00 5.000e-01 4.685e+00 1.000e-07
## rel.tol scale.tol solve.tol eps.outlier
## 1.000e-07 1.000e-10 1.000e-07 4.167e-04
## eps.x warn.limit.reject warn.limit.meanrw
## 5.603e-08 5.000e-01 5.000e-01
## nResample max.it best.r.s k.fast.s k.max
## 500 50 2 1 200
## maxit.scale trace.lev mts compute.rd fast.s.large.n
## 200 0 1000 0 2000
## psi subsampling cov
## "bisquare" "nonsingular" ".vcov.avar1"
## compute.outlier.stats
## "SM"
## seed : int(0)
summary(lmrob(Stature ~ PGSImputed + Location + Sex + Age, data))
##
## Call:
## lmrob(formula = Stature ~ PGSImputed + Location + Sex + Age, data = data)
## \--> method = "MM"
## Residuals:
## Min 1Q Median 3Q Max
## -2.425e+01 -3.291e+00 2.398e-14 3.610e+00 1.193e+01
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 173.50387 3.23028 53.712 < 2e-16 ***
## PGSImputed 2.20083 0.42281 5.205 4.64e-07 ***
## LocationCzechia -6.54364 2.54731 -2.569 0.010904 *
## LocationEngland -1.74478 2.53808 -0.687 0.492570
## LocationEstonia 0.33623 2.96402 0.113 0.909793
## LocationGermany -4.63274 2.14004 -2.165 0.031543 *
## LocationHungary 0.67650 2.92509 0.231 0.817328
## LocationIran -4.82775 3.65428 -1.321 0.187912
## LocationItaly -8.10406 2.97888 -2.721 0.007070 **
## LocationLithuania 1.61182 3.16803 0.509 0.611447
## LocationLuxembourg 0.09381 1.36835 0.069 0.945410
## LocationNetherlands 2.26003 2.66997 0.846 0.398267
## LocationNorway 0.46317 3.87611 0.119 0.905000
## LocationPakistan -5.76267 3.59955 -1.601 0.110907
## LocationPoland -5.69052 2.25884 -2.519 0.012513 *
## LocationPortugal -9.66810 2.52045 -3.836 0.000166 ***
## LocationRomania 14.54920 3.69254 3.940 0.000111 ***
## LocationRussia -7.34057 1.87991 -3.905 0.000127 ***
## LocationScotland -9.59486 2.01025 -4.773 3.42e-06 ***
## LocationSerbia 1.45257 2.22482 0.653 0.514548
## LocationSpain -4.58671 1.44497 -3.174 0.001730 **
## LocationSweden -4.00407 3.91132 -1.024 0.307159
## LocationSwitzerland -8.54281 2.86623 -2.981 0.003221 **
## LocationTurkey -0.29577 1.31515 -0.225 0.822284
## LocationUkraine 2.40458 3.86736 0.622 0.534778
## SexMale 8.45514 0.71187 11.877 < 2e-16 ***
## AgeMesolithic -5.67422 3.27326 -1.734 0.084487 .
## AgeNeolithic -13.88658 2.80726 -4.947 1.55e-06 ***
## AgeBronze Age -10.28628 2.66386 -3.861 0.000150 ***
## AgeIron Age -6.82068 4.01712 -1.698 0.091022 .
## AgeAntiquity -8.52628 3.81777 -2.233 0.026593 *
## AgeMedieval -9.28239 3.35007 -2.771 0.006098 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Robust residual standard error: 5.348
## Multiple R-squared: 0.615, Adjusted R-squared: 0.5577
## Convergence in 12 IRWLS iterations
##
## Robustness weights:
## 24 weights are ~= 1. The remaining 216 ones are summarized as
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.003992 0.896300 0.956100 0.917400 0.987500 0.999000
## Algorithmic parameters:
## tuning.chi bb tuning.psi refine.tol
## 1.548e+00 5.000e-01 4.685e+00 1.000e-07
## rel.tol scale.tol solve.tol eps.outlier
## 1.000e-07 1.000e-10 1.000e-07 4.167e-04
## eps.x warn.limit.reject warn.limit.meanrw
## 5.965e-12 5.000e-01 5.000e-01
## nResample max.it best.r.s k.fast.s k.max
## 500 50 2 1 200
## maxit.scale trace.lev mts compute.rd fast.s.large.n
## 200 0 1000 0 2000
## psi subsampling cov
## "bisquare" "nonsingular" ".vcov.avar1"
## compute.outlier.stats
## "SM"
## seed : int(0)
An aggregate plot, with splits by sample location and era, with sex controlled in each.
ggplot(data, aes(x = PGSImputed, y = Stature, group = Sex)) +
geom_point(aes(color = Location)) +
geom_smooth(method = "lm", formula = "y ~ x", aes(fill = Sex)) +
theme(
legend.title = element_blank(),
legend.position = "bottom",
plot.title = element_text(hjust = .5),
plot.caption = element_text(hjust = .5)) +
labs(
x = "Height Polygenic Score",
y = "Height (Centimeters)",
title = "Height Polygenic Scores and Height in 32,000 years of Human Samples",
caption = "Samples from 30802 BC to 1349 AD")
ggplot(data, aes(x = PGSImputed, y = Stature, group = Sex)) +
geom_point(aes(color = Age)) +
geom_smooth(method = "lm", formula = "y ~ x", aes(fill = Sex)) +
theme(
legend.title = element_blank(),
legend.position = "bottom",
plot.title = element_text(hjust = .5),
plot.caption = element_text(hjust = .5)) +
labs(
x = "Height Polygenic Score",
y = "Height (Centimeters)",
title = "Height Polygenic Scores and Height in 32,000 years of Human Samples",
caption = "Samples from 30802 BC to 1349 AD")
ggplot(data, aes(x = PGSImputed, y = Stature)) +
geom_point() +
geom_smooth(method = "lm", formula = "y ~ x", aes(fill = Sex)) +
theme(
legend.title = element_blank(),
legend.position = "bottom",
plot.title = element_text(hjust = .5),
plot.caption = element_text(hjust = .5)) +
labs(
x = "Height Polygenic Score",
y = "Height (Centimeters)",
title = "Height Polygenic Scores and Height in 32,000 years of Human Samples",
caption = "Samples from 30802 BC to 1349 AD") +
facet_wrap("Location")
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
ggplot(data, aes(x = PGSImputed, y = Stature)) +
geom_point() +
geom_smooth(method = "lm", formula = "y ~ x", aes(fill = Sex)) +
theme(
legend.title = element_blank(),
legend.position = "bottom",
plot.title = element_text(hjust = .5),
plot.caption = element_text(hjust = .5)) +
labs(
x = "Height Polygenic Score",
y = "Height (Centimeters)",
title = "Height Polygenic Scores and Height in 32,000 years of Human Samples",
caption = "Samples from 30802 BC to 1349 AD") +
facet_wrap("Age")
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in qt((1 - level)/2, df): NaNs produced
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
We’re quite underpowered for this, but let’s go ahead and check whether men are more variable.
ddply(data, ~Sex, summarise, mean = mean(Stature), sd = sd(Stature))
var.test(Stature ~ Sex, data)
##
## F test to compare two variances
##
## data: Stature by Sex
## F = 0.89787, num df = 102, denom df = 136, p-value = 0.5688
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.626386 1.299466
## sample estimates:
## ratio of variances
## 0.8978699
1/var.test(Stature ~ Sex, data)$estimate
## ratio of variances
## 1.113747
Correct direction, but not significant.
Because they work, at least past the Neolithic, changes in modern height polygenic scores likely represent changes in trait values, at least in European populations. This is probably true for many traits, or at least for those that seem highly heritable and basically only negatively malleable (i.e., you can reduce but not increase the trait with plausible interventions). Notably, in the Cambridgeshire data, various social groups did not significantly differ in height, so there’s no good reason as of yet to think the results represent confounding with socioeconomic status.
Intelligence is a good comparison trait since it’s one where the positive effects on it are largely genetic and, until late adolescence, shared environmental, while the nonshared environmental effects are mostly deleterious. Moreover, stability is largely genetic and change largely environmental (Lyons et al., 2009; Franic et al., 2014) Moreover, like height, intelligence maintains considerable heritability even in environmentally extreme circumstances (Hur & Bates, 2019). Given that there was considerable differential fertility favoring higher socioeconomic status - something robustly caused by higher intelligence - then it seems remarkably plausible that the changes in the frequencies of known causal variants over time in Europe, for example, were attributable to selection for intelligence via something like creating a niche that reduced child mortality (see Clark, 2009; Boberg-Fazlic, Sharp & Weisdorf, 2011; de la Croix, Schneider & Weisdorf, 2019).
The result that there’s solid height prediction with modern PGS in data from the Malthusian era is important. It suggests truly awful conditions can’t suppress genetic variance entirely, and even in a trait so clearly environmentally contingent as height, which has increased substantially in the past century (NCD Risk, 2016).
Hui, R., Scheib, C. L., D’Atanasio, E., Inskip, S. A., Cessford, C., Biagini, S. A., Wohns, A. W., Ali, M. Q. A., Griffith, S. J., Solnik, A., Niinemäe, H., Ge, X. J., Rose, A. K., Beneker, O., O’Connell, T. C., Robb, J. E., & Kivisild, T. (2023). Medieval social landscape through the genetic history of Cambridgeshire before and after the Black Death (p. 2023.03.03.531048). bioRxiv. https://doi.org/10.1101/2023.03.03.531048. Archive: https://web.archive.org/web/20230309180346/https://www.biorxiv.org/content/10.1101/2023.03.03.531048v1.full.pdf
Cox, S. L., Moots, H. M., Stock, J. T., Shbat, A., Bitarello, B. D., Nicklisch, N., Alt, K. W., Haak, W., Rosenstock, E., Ruff, C. B., & Mathieson, I. (2022). Predicting skeletal stature using ancient DNA. American Journal of Biological Anthropology, 177(1), 162–174. https://doi.org/10.1002/ajpa.24426
Cox, S. L., Ruff, C. B., Maier, R. M., & Mathieson, I. (2019). Genetic contributions to variation in human stature in prehistoric Europe. Proceedings of the National Academy of Sciences, 116(43), 21484–21492. https://doi.org/10.1073/pnas.1910606116
Mathieson, I., Lazaridis, I., Rohland, N., Mallick, S., Patterson, N., Roodenberg, S. A., Harney, E., Stewardson, K., Fernandes, D., Novak, M., Sirak, K., Gamba, C., Jones, E. R., Llamas, B., Dryomov, S., Pickrell, J., Arsuaga, J. L., de Castro, J. M. B., Carbonell, E., … Reich, D. (2015). Genome-wide patterns of selection in 230 ancient Eurasians. Nature, 528(7583), Article 7583. https://doi.org/10.1038/nature16152
Lyons, M. J., York, T. P., Franz, C. E., Grant, M. D., Eaves, L. J., Jacobson, K. C., Schaie, K. W., Panizzon, M. S., Boake, C., Xian, H., Toomey, R., Eisen, S. A., & Kremen, W. S. (2009). Genes Determine Stability and the Environment Determines Change in Cognitive Ability During 35 Years of Adulthood. Psychological Science, 20(9), 1146–1152. https://doi.org/10.1111/j.1467-9280.2009.02425.x
Franic, S., Dolan, C. V., Beijsterveldt, C. E. M. van, Pol, H. E. H., Bartels, M., & Boomsma, D. I. (2014). Genetic and Environmental Stability of Intelligence in Childhood and Adolescence. Twin Research and Human Genetics, 17(3), 151–163. https://doi.org/10.1017/thg.2014.26
Hur, Y.-M., & Bates, T. (2019). Genetic and Environmental Influences on Cognitive Abilities in Extreme Poverty. Twin Research and Human Genetics, 22(5), 297–301. https://doi.org/10.1017/thg.2019.92
Clark, G. (2009). A Farewell to Alms: A Brief Economic History of the World. Princeton University Press.
Boberg-Fazlic, N., Sharp, P., & Weisdorf, J. (2011). Survival of the richest? Social status, fertility and social mobility in England 1541-1824. European Review of Economic History, 15(3), 365–392.
de la Croix, D., Schneider, E. B., & Weisdorf, J. (2019). Childlessness, celibacy and net fertility in pre-industrial England: The middle-class evolutionary advantage. Journal of Economic Growth, 24(3), 223–256. https://doi.org/10.1007/s10887-019-09170-6
Also worth reading: https://web.archive.org/web/20160630041954/https://pseudoerasmus.com/2014/06/02/clark_and_england/comment-page-1/
NCD Risk Factor Collaboration (NCD-RisC). (2016). A century of trends in adult human height. ELife, 5, e13410. https://doi.org/10.7554/eLife.13410
Since posting this, I discovered that controlling for “Farming vs. Hunter-Gatherer” drastically affects the Neolithic’s negative relationship. By the later eras, either nutritional status had caught up in comparing the two groups, or most people had joined or latched onto farming societies. The early transition to farming has been previously noted to have a quite negative effect on people’s stature and markers of health because it meant less meat and much lower nutritional quality, so this makes total sense. The genetically predicted-to-be-shorter hunter-gatherers, for a time, were taller due to more favorable environments.
Adjusted for year, the correlation between PGS and height among Neolithic farming women was .15 (n = 5), whereas for herder women it was 0.67 (n = 3), for hunter-gatherer women .10 (n = 4), for farmer men .16 (n = 9), and for hunter-gatherer men .50 (n = 9). These compared to unadjusted correlations of -.22 and -.28, and only year-adjusted correlations of -.13 and -.19. There was only one male herder in the dataset.
sessionInfo()
## R version 4.2.2 (2022-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
##
## 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] plyr_1.8.8 robustbase_0.95-0 lmtest_0.9-40 zoo_1.8-11
## [5] sandwich_3.0-2 DT_0.27 ggthemr_1.1.0 ggplot2_3.4.1
## [9] pacman_0.5.1
##
## loaded via a namespace (and not attached):
## [1] tidyselect_1.2.0 xfun_0.37 bslib_0.4.2 splines_4.2.2
## [5] lattice_0.20-45 colorspace_2.1-0 vctrs_0.5.2 generics_0.1.3
## [9] htmltools_0.5.4 yaml_2.3.7 mgcv_1.8-41 utf8_1.2.3
## [13] rlang_1.0.6 jquerylib_0.1.4 pillar_1.8.1 glue_1.6.2
## [17] withr_2.5.0 lifecycle_1.0.3 munsell_0.5.0 gtable_0.3.1
## [21] htmlwidgets_1.6.1 evaluate_0.20 labeling_0.4.2 knitr_1.42
## [25] fastmap_1.1.0 crosstalk_1.2.0 fansi_1.0.4 DEoptimR_1.0-11
## [29] highr_0.10 Rcpp_1.0.10 scales_1.2.1 cachem_1.0.6
## [33] jsonlite_1.8.4 farver_2.1.1 digest_0.6.31 dplyr_1.1.0
## [37] grid_4.2.2 cli_3.6.0 tools_4.2.2 magrittr_2.0.3
## [41] sass_0.4.5 tibble_3.1.8 pkgconfig_2.0.3 ellipsis_0.3.2
## [45] Matrix_1.5-1 rmarkdown_2.20 rstudioapi_0.14 R6_2.5.1
## [49] nlme_3.1-160 compiler_4.2.2