From b0c502ea0d40918d669e36023b445d0bd09524f0 Mon Sep 17 00:00:00 2001 From: Andrew Gene Brown Date: Fri, 17 Jan 2025 16:58:10 -0800 Subject: [PATCH] bump book --- Part1/packages.bib | 68 + .../figure-html/unnamed-chunk-107-1.png | Bin 30100 -> 0 bytes .../figure-html/unnamed-chunk-108-1.png | Bin 42815 -> 0 bytes .../figure-html/unnamed-chunk-109-1.png | Bin 34740 -> 30100 bytes ...hunk-107-2.png => unnamed-chunk-109-2.png} | Bin .../figure-html/unnamed-chunk-110-1.png | Bin 54508 -> 42815 bytes .../figure-html/unnamed-chunk-111-1.png | Bin 39598 -> 34740 bytes .../figure-html/unnamed-chunk-112-1.png | Bin 72162 -> 54508 bytes .../figure-html/unnamed-chunk-113-1.png | Bin 44752 -> 39598 bytes ...hunk-111-2.png => unnamed-chunk-113-2.png} | Bin .../figure-html/unnamed-chunk-114-1.png | Bin 54382 -> 72162 bytes .../figure-html/unnamed-chunk-115-1.png | Bin 0 -> 44752 bytes .../figure-html/unnamed-chunk-116-1.png | Bin 0 -> 54382 bytes ...hunk-117-1.png => unnamed-chunk-119-1.png} | Bin ...hunk-141-1.png => unnamed-chunk-143-1.png} | Bin ...hunk-157-1.png => unnamed-chunk-159-1.png} | Bin .../figure-html/unnamed-chunk-163-1.png | Bin 29583 -> 0 bytes .../figure-html/unnamed-chunk-164-1.png | Bin 31631 -> 0 bytes .../figure-html/unnamed-chunk-165-1.png | Bin 29717 -> 29583 bytes .../figure-html/unnamed-chunk-166-1.png | Bin 28436 -> 31631 bytes .../figure-html/unnamed-chunk-167-1.png | Bin 26715 -> 29717 bytes .../figure-html/unnamed-chunk-168-1.png | Bin 0 -> 28436 bytes .../figure-html/unnamed-chunk-169-1.png | Bin 0 -> 26715 bytes .../figure-html/unnamed-chunk-174-1.png | Bin 224962 -> 0 bytes .../figure-html/unnamed-chunk-176-1.png | Bin 0 -> 225159 bytes ...hunk-177-1.png => unnamed-chunk-179-1.png} | Bin ...hunk-177-2.png => unnamed-chunk-179-2.png} | Bin .../figure-html/unnamed-chunk-186-1.png | Bin 131061 -> 0 bytes .../figure-html/unnamed-chunk-188-1.png | Bin 20451 -> 131187 bytes .../figure-html/unnamed-chunk-190-1.png | Bin 0 -> 20442 bytes ...hunk-196-1.png => unnamed-chunk-199-1.png} | Bin .../figure-html/unnamed-chunk-201-1.png | Bin 42672 -> 32578 bytes ...hunk-197-1.png => unnamed-chunk-202-1.png} | Bin ...hunk-200-1.png => unnamed-chunk-205-1.png} | Bin .../figure-html/unnamed-chunk-206-1.png | Bin 0 -> 42672 bytes .../figure-html/unnamed-chunk-60-1.png | Bin 42872 -> 42861 bytes .../figure-html/unnamed-chunk-64-1.png | Bin 0 -> 30396 bytes .../figure-html/unnamed-chunk-67-1.png | Bin 0 -> 30186 bytes ...-chunk-77-1.png => unnamed-chunk-79-1.png} | Bin ...-chunk-77-2.png => unnamed-chunk-79-2.png} | Bin ...-chunk-78-1.png => unnamed-chunk-80-1.png} | Bin book/404.html | 4 +- book/data.html | 840 ++++----- book/eda.html | 878 +++++----- book/index.html | 6 +- book/intro.html | 4 +- book/reference-keys.txt | 6 +- book/references.html | 4 +- .../figure-html/unnamed-chunk-107-1.png | Bin 30100 -> 0 bytes .../figure-html/unnamed-chunk-108-1.png | Bin 42815 -> 0 bytes .../figure-html/unnamed-chunk-109-1.png | Bin 34740 -> 30100 bytes ...hunk-107-2.png => unnamed-chunk-109-2.png} | Bin .../figure-html/unnamed-chunk-110-1.png | Bin 54508 -> 42815 bytes .../figure-html/unnamed-chunk-111-1.png | Bin 39598 -> 34740 bytes .../figure-html/unnamed-chunk-112-1.png | Bin 72162 -> 54508 bytes .../figure-html/unnamed-chunk-113-1.png | Bin 44752 -> 39598 bytes ...hunk-111-2.png => unnamed-chunk-113-2.png} | Bin .../figure-html/unnamed-chunk-114-1.png | Bin 54382 -> 72162 bytes .../figure-html/unnamed-chunk-115-1.png | Bin 0 -> 44752 bytes .../figure-html/unnamed-chunk-116-1.png | Bin 0 -> 54382 bytes ...hunk-117-1.png => unnamed-chunk-119-1.png} | Bin ...hunk-141-1.png => unnamed-chunk-143-1.png} | Bin ...hunk-157-1.png => unnamed-chunk-159-1.png} | Bin .../figure-html/unnamed-chunk-163-1.png | Bin 29583 -> 0 bytes .../figure-html/unnamed-chunk-164-1.png | Bin 31631 -> 0 bytes .../figure-html/unnamed-chunk-165-1.png | Bin 29717 -> 29583 bytes .../figure-html/unnamed-chunk-166-1.png | Bin 28436 -> 31631 bytes .../figure-html/unnamed-chunk-167-1.png | Bin 26715 -> 29717 bytes .../figure-html/unnamed-chunk-168-1.png | Bin 0 -> 28436 bytes .../figure-html/unnamed-chunk-169-1.png | Bin 0 -> 26715 bytes .../figure-html/unnamed-chunk-174-1.png | Bin 224962 -> 0 bytes .../figure-html/unnamed-chunk-176-1.png | Bin 0 -> 225159 bytes ...hunk-177-1.png => unnamed-chunk-179-1.png} | Bin ...hunk-177-2.png => unnamed-chunk-179-2.png} | Bin .../figure-html/unnamed-chunk-186-1.png | Bin 131061 -> 0 bytes .../figure-html/unnamed-chunk-188-1.png | Bin 20451 -> 131187 bytes .../figure-html/unnamed-chunk-190-1.png | Bin 0 -> 20442 bytes ...hunk-196-1.png => unnamed-chunk-199-1.png} | Bin .../figure-html/unnamed-chunk-201-1.png | Bin 42672 -> 32578 bytes ...hunk-197-1.png => unnamed-chunk-202-1.png} | Bin ...hunk-200-1.png => unnamed-chunk-205-1.png} | Bin .../figure-html/unnamed-chunk-206-1.png | Bin 0 -> 42672 bytes .../figure-html/unnamed-chunk-60-1.png | Bin 42872 -> 42861 bytes .../figure-html/unnamed-chunk-64-1.png | Bin 0 -> 30396 bytes .../figure-html/unnamed-chunk-67-1.png | Bin 0 -> 30186 bytes ...-chunk-77-1.png => unnamed-chunk-79-1.png} | Bin ...-chunk-77-2.png => unnamed-chunk-79-2.png} | Bin ...-chunk-78-1.png => unnamed-chunk-80-1.png} | Bin book/sampling.html | 380 ++--- book/search_index.json | 2 +- book/spatial.html | 1507 +++++++++-------- 91 files changed, 1957 insertions(+), 1742 deletions(-) delete mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-107-1.png delete mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-108-1.png rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-107-2.png => unnamed-chunk-109-2.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-111-2.png => unnamed-chunk-113-2.png} (100%) create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-115-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-116-1.png rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-117-1.png => unnamed-chunk-119-1.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-141-1.png => unnamed-chunk-143-1.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-157-1.png => unnamed-chunk-159-1.png} (100%) delete mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-163-1.png delete mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-164-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-168-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-169-1.png delete mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-174-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-176-1.png rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-177-1.png => unnamed-chunk-179-1.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-177-2.png => unnamed-chunk-179-2.png} (100%) delete mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-186-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-190-1.png rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-196-1.png => unnamed-chunk-199-1.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-197-1.png => unnamed-chunk-202-1.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-200-1.png => unnamed-chunk-205-1.png} (100%) create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-206-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-64-1.png create mode 100644 Part1/s4ssbook_files/figure-html/unnamed-chunk-67-1.png rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-77-1.png => unnamed-chunk-79-1.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-77-2.png => unnamed-chunk-79-2.png} (100%) rename Part1/s4ssbook_files/figure-html/{unnamed-chunk-78-1.png => unnamed-chunk-80-1.png} (100%) delete mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-107-1.png delete mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-108-1.png rename book/s4ssbook_files/figure-html/{unnamed-chunk-107-2.png => unnamed-chunk-109-2.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-111-2.png => unnamed-chunk-113-2.png} (100%) create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-115-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-116-1.png rename book/s4ssbook_files/figure-html/{unnamed-chunk-117-1.png => unnamed-chunk-119-1.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-141-1.png => unnamed-chunk-143-1.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-157-1.png => unnamed-chunk-159-1.png} (100%) delete mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-163-1.png delete mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-164-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-168-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-169-1.png delete mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-174-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-176-1.png rename book/s4ssbook_files/figure-html/{unnamed-chunk-177-1.png => unnamed-chunk-179-1.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-177-2.png => unnamed-chunk-179-2.png} (100%) delete mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-186-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-190-1.png rename book/s4ssbook_files/figure-html/{unnamed-chunk-196-1.png => unnamed-chunk-199-1.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-197-1.png => unnamed-chunk-202-1.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-200-1.png => unnamed-chunk-205-1.png} (100%) create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-206-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-64-1.png create mode 100644 book/s4ssbook_files/figure-html/unnamed-chunk-67-1.png rename book/s4ssbook_files/figure-html/{unnamed-chunk-77-1.png => unnamed-chunk-79-1.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-77-2.png => unnamed-chunk-79-2.png} (100%) rename book/s4ssbook_files/figure-html/{unnamed-chunk-78-1.png => unnamed-chunk-80-1.png} (100%) diff --git a/Part1/packages.bib b/Part1/packages.bib index 2049097c..35534194 100644 --- a/Part1/packages.bib +++ b/Part1/packages.bib @@ -1,3 +1,11 @@ +@Manual{R-aqp, + title = {aqp: Algorithms for Quantitative Pedology}, + author = {Dylan Beaudette and Pierre Roudier and Andrew Brown}, + note = {R package version 2.1.0}, + url = {https://github.com/ncss-tech/aqp}, + year = {2025}, +} + @Manual{R-base, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, @@ -15,6 +23,31 @@ @Manual{R-bookdown url = {https://github.com/rstudio/bookdown}, } +@Manual{R-diagram, + title = {diagram: Functions for Visualising Simple Graphs (Networks), Plotting +Flow Diagrams}, + author = {Karline Soetaert}, + year = {2020}, + note = {R package version 1.6.5}, + url = {https://CRAN.R-project.org/package=diagram}, +} + +@Manual{R-dplyr, + title = {dplyr: A Grammar of Data Manipulation}, + author = {Hadley Wickham and Romain François and Lionel Henry and Kirill Müller and Davis Vaughan}, + year = {2023}, + note = {R package version 1.1.4}, + url = {https://dplyr.tidyverse.org}, +} + +@Manual{R-ggplot2, + title = {ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics}, + author = {Hadley Wickham and Winston Chang and Lionel Henry and Thomas Lin Pedersen and Kohske Takahashi and Claus Wilke and Kara Woo and Hiroaki Yutani and Dewey Dunnington and Teun {van den Brand}}, + year = {2024}, + note = {R package version 3.5.1}, + url = {https://ggplot2.tidyverse.org}, +} + @Manual{R-knitr, title = {knitr: A General-Purpose Package for Dynamic Report Generation in R}, author = {Yihui Xie}, @@ -31,6 +64,32 @@ @Manual{R-rmarkdown url = {https://github.com/rstudio/rmarkdown}, } +@Manual{R-shape, + title = {shape: Functions for Plotting Graphical Shapes, Colors}, + author = {Karline Soetaert}, + year = {2024}, + note = {R package version 1.4.6.1}, + url = {https://CRAN.R-project.org/package=shape}, +} + +@Manual{R-soilDB, + title = {soilDB: Soil Database Interface}, + author = {Dylan Beaudette and Jay Skovlin and Stephen Roecker and Andrew Brown}, + note = {R package version 2.8.7}, + url = {https://github.com/ncss-tech/soilDB/}, + year = {2025}, +} + +@Article{aqp2013, + title = {Algorithms for quantitative pedology: A toolkit for soil scientists}, + author = {{Beaudette} and {D.E.} and {Roudier} and {P.} and {O'Geen} and {A.T.}}, + journal = {Computers \& Geosciences}, + year = {2013}, + volume = {52}, + pages = {258-268}, + url = {http://dx.doi.org/10.1016/j.cageo.2012.10.020}, +} + @Book{bookdown2016, title = {bookdown: Authoring Books and Technical Documents with {R} Markdown}, author = {Yihui Xie}, @@ -41,6 +100,15 @@ @Book{bookdown2016 url = {https://bookdown.org/yihui/bookdown}, } +@Book{ggplot22016, + author = {Hadley Wickham}, + title = {ggplot2: Elegant Graphics for Data Analysis}, + publisher = {Springer-Verlag New York}, + year = {2016}, + isbn = {978-3-319-24277-4}, + url = {https://ggplot2.tidyverse.org}, +} + @Book{knitr2015, title = {Dynamic Documents with {R} and knitr}, author = {Yihui Xie}, diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-107-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-107-1.png deleted file mode 100644 index 4be06374adf85516313338a2f9bf20c70533a872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30100 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 diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-108-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-108-1.png deleted file mode 100644 index 3bb377d133e0b61105fbb37143ccc54bb4a3ed5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42815 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 diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-109-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-109-1.png index 7f939be41f55d20957a4bd16328a93260e9c6e08..4be06374adf85516313338a2f9bf20c70533a872 100644 GIT binary patch literal 30100 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 literal 34740 zcmeHw30M=!x;6s>$|5dL`wiC@OIUH;9Um03mH;lu;CL&z(zbc^)d&)m87ee_vH| zX8k%BL%j)l8X6jgtA1R*K|@2Ar=g+!+i)!n4UMgTB*tiHe6xT3Pn%YNUo|xBG&H<4 z?Cdn`z|SZRuhjYT=Yu9?gYx5L=LN1PJFir`s3^NA@Uwia^5eU9ZNyq%-?hHrCv9y+ z9u9}|>K(|-PQwe_=B1&$Px*=RiUL=vS5&!ID!5Q^C%8>{tMU`!8$t7p$n&MuMSu}~ z!Q~qPKD4}uyt;@yG|EmR$_rd}QD7kDNU2e&;3|(Q2Nz27T}zAbrRCMp>d;g#jZ`nY z)F^OyrGkFSj^IXiU;rwS4I&;*GXSl)9JT|C{)N z_QO%Xou9zkyX;8j(r>iqXnLM75uSd(^TFYF_xBuj@TfbXb@JKSAAXCz)(l~HaD`co z>1l#lZthe&YNI^7{#x8ML2;Pqr_$r@*o-UFR@FNMHM#$Aaat^u5n zOWkLUuRo)AF5u8YBQ5$_4+E0rW8C7_*1%!93c)O?tchkYH?vavbaKVUolHZQQ++1O6Ezv-9r&l`PT@ddsFF(t(sia zdG>gO=u5~s^gSHPq#6{?9k1LCeUSpiRphM)d6YIannxoMM%@R{2znYE5Ox-To z{MJxrjeokhs$9N&qnigOUUbEx6`lNN%!&9L)y-mz<2=~vPd2XbM_w8_BLf~Q(brWt zA{*U}tWkeIH$4%A@4mD6Rc$JU$*S`%q9vZBK$33iJx|%CJ-GQlfnRWoIMX}Yg|E5e z;>f7Lk}8Cp#y(^?l`2td&7CsDn)S`N|K);+Jw|#yU5;$ZL)5K z0hY{e;qHxgz`eS_c6H@9*-t6UJfxWAbU%~4rN_i2aexU&qW^3o$$;$t({UY?#7PXb6pg{ z+R>eChRJ`*ZE`ksTITwaDoYWq3}nb-c6k>C=s#4@yb1g4aT^0l;o_i8;h*+hH5O%#zP;+Blh~H5NW0 zYl9YSowNG=qsmerUr(+{5G%;`Z!`;jH^&2&XR~QZ2PwkJ(>e5OdL%SDsSV%KlHl|Z z-M_obEXn3IBw!)dq25zX?b-1ZZl<11C$3~$1|!D)8AZstmBWUTP-zD z4Odg@ON=VyFE>)K9lgldd)_P#*tzx8Zw-&o(d6uzcy4%bs&u{%71QC_=)-6!@>L{7 zqJPY{x*NBff<6nU<(de|Jnxt?zEk(#hRg04aI$0~2CDdw7F_D%{-C7zIaaQa=(NR6 zt4ohY>jhn9q;I7zs3@LK%?NoLREJrWtA$o6Qkts@3U&o6Qc4bWAD1THgHCI4p%uE{ zIAj)Li4UYR;wB(>@2<_7>ZR@Ea9>u{KmgBrK#)BpR2J#QKGDjz8bQNz zTpK=++$59s#9({)CFlpw-y#p=$dFqAi~H8^!Z}^0G!hPT_ZPX|XEkN57aG}}o5s8~ z7iN?Oio~b+oV9V~?cNV#Zj`;X-|flcni;edxa2?qC(?xP?a410zUxk{`#>==M?TE; znDZ*ljxkn&3dW}UF7lQM*SRn7m~ds&x^y<{wRA;1dOr*0`U$6AF3+C7kyXN&Z7nqP zeX%W4$EL%p(basskxb(KbSf2Z=qbw*l)F%b%v+OBgmDkdzgAe_X@R^{qI8E}wXl^d zfUP&Pa(GnpnsP#?IjgRp({AY%dB2@CQr7C`v0r z%IHOGu@l8nmIv>NK^C@_8|^a^AFO%#;;IfAX=(wMrw!C5 zYN5zuplPUv+&?lkw^y3br##Erggat|_$QA1Lytec%e9Qp+jT6cWJdDy3v5Ei`kw|z~Of3EfMnvvfhjbmdl z`{p2Tr9S>)s3N2wo3jpbo;oZNY;+HBrvEa6-iQv+72uOrVjbMbi5 z!oD@_20Zcl2D?@_IyCZTZ7wqwvt$o1$GJ0%j)o{w;I^BikSc4t;X7Gl!=?sr;6?VT z0{)y#f#rCC#pXCY**W!xEI~G+J@g=4@&l=JX$I8M_n_~!Flbr`a^7MQET@-Y91O)z z*+$o2LyzUZvm;&k6Dc^fw7NLC)^hrIAL zo$Gk*fzBhhhPzG=z)~9Np)6^8j^8o*@i=D-O-$T{&MHl4Z!dp^Rr_0Pslp~X7$c@a z#K1U17X7kdeElm)aC+x25Nyii&;xt9$rLf52+18sgaz*%g%yP^D=&J^hGTWFijAz( z#t|iRq`$B+=KBz)=Am{`i!SuxNlVdb+d?+&7Hzn!sd(FQYE9R5Ev}r@QytT;fZ9B{ z@K^nXbtqOL=R$2~b`+q^NCP!DF|=TRUTy-k1)TSTKRA4>Z^eT+%XcB;bJ*x4`Mu+AJz6l$sr|M|`dUVKZS1AWXN1Si*koWf zMZ?Hac1MdzvG>;Pi{Z)#+mn{fZ4}RWC5YbdYZ&M2CFOgacAXkr(l>uQO|DIkXQSDU z%D8ceDQ5+QQZRw@YqY8>%b(1F+i7ujoE6-V*s2?&mEWS(TC9+rJ&rO4XN4wq(basn znVH+X(Xlew&)v*1_3))I!h1n_lP;E2AJ3ly;IY$W^^7MVlVv;?S3Q#0`gLvO_Gxg8 zRtENlT=!`(BncZqBAVNC*CvasrSw0WxoZUm6fUq@4SBfg*`tsL54I;S%VE_PIa_XI z9WR`@hi8k<1c1?Wb-*!~*w>QXqm2r`c$FAs(k4@OiC3nrf@<4Pb zLWeB<)`G!BoTd+@ADkh%Dw}rQPwKzQQFi7H!0{ z7L%-ZU!w;5bR{}gGJUg*k`ztJ_py!c3qVA0Wj#x(kVICn;BNXl8}9k8W>;*07-w@{ zF}ZT`y0t#@;4Ic{gCcGgGWi$jNZH#hv$x(XkP2$C+Z|1xdSkj!-u&~&q{$?oE^HDN z&LH2ebc^Wrgj~Nnb!dc)xj_p!S~b70g{a`jYbm?&Pl`)rv@kO< zjE=1;hkj297F;OEw?OR>^tIH-&PM8q8WF4Sxr9y-qES^REbjy)vxOF^AD|4} z$X}~Gtze9)wWyohXg|^<2pieeN^pQt0)d=m!gu_+IX|tEEk>ghCvp?O1M%pF+{mH| z0?+cru_8UgZf3Fg(fMOfqB&Wqs8x7&V@a022XSBs(lJ+E9jUnZ50%K+ge<6>x4Gx}4@}FMP?!L~G!2BeB;WN+-#?BD*b= z2)B+Pv1Ycelm8(uPS90!cN4J4qmoD`^vqp+2J_fEHdg$Gg>rKqi4C~tAO$V@U6|}P zr;A%ro)E)vCN_(Zv!{WM>IsqC#I-_)`N6^RcX(zk$p+5C?nSPjU&}vC!8q-y+NXuJ zySm1`skxzxsJO&!Mv-(76$H5^vqsDOFldDl!^Tl|DBDN8RH7H3mB!t;y85~%#GqI1 z5GbNq!A+$rg7)JJf_De4TAT5Zy~d8{CvY!Vbr9qQl1qwN3*d_@O^MAO^6uw>u9K$S zU8Uohu^C?|E1ZAv`d;4c*2j{kxm&qro*QBeGLOfC*grlJvFW>KbqKl-OO9Sp_-{%x z{1b_bnGg?U{alPK|2}L?x>erI<;i--W=<+eKH_9ZS~7C_F}En^Guw^p*8h;Wqnb1U zIW}>1UE-v^t|vAzp7tz&>la_nb6eWi^_#l^r$h&M`A277pq=dNs=0x$*I3Msu3bOH zU3*DySMA@+j0+PeHo1LIQ+Cz+F~$0Zs}?Sz?`g`e-$osDUrg0uP8^!p$RWi37xS3N zQxh#LpfcBB6>X(BR(g6*hqx+Mc9YVa)^tq7n4m6YRW3XTwbNCE(kl;VN-mwjOt?-C zpKZ&cRjY|mqvJ4z5iTp6O(&CDT@?p9!%lu-$T%#FNxHR`0+IYgck!9Q(zaXz7HuxV z=-uJo$}bQeRF~nvZZ_J|Wj0bK6q0MUwW5-O9q-V9y0BYcdcYDGLlP$oaL?E*KV*_z zpe43lNuK$oi3e)2BvG=4^W613s=PoD-_@1dN;5fu(JaOn)i)3ps%e>3PQg5!d_=Cq z29bEzfpxzH_Hw=?kPzSLQY*bxm#V%@Zb zVVJU>+R$L4_U&|wRU(JZ#MRl;wIF2KlY)e|*+%^F#M|)eqSp%pn|!Y5%pQjjb{ABK z1sG(`BX%}HmmB87t8>|F;tetz9>K3>9N^jC!P0ogs5wW#LXNj2CTXI-C*u?yH*ujP za!>x)gok>vbnzl1y55g&lOm43fkK6U`$*wi8{MC?ZFAXEKYq!%^~EpSpKEgE77qyv zagH=Y*{Cm#0lJ}Kbc?u>2Kc9doIx0asf|Y(#uMw@zPYRSY%X&PFJ!i4&C!`fcWJwM zF?)Cy+_itV8kLLereH{|Ph2Bq>lX~5o{)T&f{&oMcp66~{&0hnuTAcXZD6KLdve5~ znE#^VQb~b(RaQuMZH(Nd6?V?<+;%*@XNO_fnAi*}9p(}pi$J#@5;c!H2_4}`G0MR( zgC0GSR@fmocS>euRLGJ~JD*v%!&r+uQ7bajYLXjeG1bIC#@EG_zmSzs+sNa{`}cpT zV>Iaa2nWfN>v0mV#`a)jkQCbayBU!D3>-QVPi)ezAvK`g!w1+=6{gQ#Bsc&_V79kkKKn^fycy_?ynem$k;(1>9*I)pk-zi=-y~iZ zGAO#3Dex72VXs>2hw*m+<1958R{AAs?a8jP<1 zj5E|=ybS2PR*lZzDb1N0oi{4Q<)xaqBmp{KRHO4>W`euiCNwEU!wU9S6^&m2WFTdt zqU1*?mAo2cW0j(z2AQQ2vP)`^Z2>f$p+?jDfTnBJXu1o~G)9f4PXSFAnG%!lKKb$E zUVuLLq+gEz6DRv`n_#~C?NdrIsn*1$s))%|I)M4ID$GM|&S(BP3^+1Mv<2G=W?dfV zp{=+{a4$P*I(;Y4Ur&qvQ-@7$=bkaq!Ncl6Otil}aY6g=ETf`Ox7*l1={Az_S-mcC zzsY^Bv>*Fa&G1m$`deQEgWI$>E4hXa$bE{9hl*dkMj1clt19-Pwwuep1_t`>w=XF5 z*G(?{ZVay8TWuX;3-fYxnR~0V`eNhWC~%h2>z|`)lZV>E z#(WhFJg#_2KnQQDiF=?b70S5cnwnG$wVfIF6)?D(wAx-NDHAC+TU70bGB7AmvmZlk z%h!Ab4D>hOz6tEdk*n-d>&(HPmbNk+@ly4)zJ8mif&z87(zz8Cq@G~mNT|lvHUysp zb+%XQI(4PV?ANhYM8|MTj?64NsSK&+e+;Pt8`uz>;**S%zvOw(fjNp7Y-%h}{>s=X z=A-y?L^>duUn!QjD(<2i!G^v=aEFd!`^43ccY-jfd>~AUvxOstcJlKCJXMa&eowUs zxm%LUk8x>&K$4z%T34hykka3u4T7oEfdJXz5KkDC)ssi+YL~osscU8F9DbyTxy#Z$ zy!J~Ie+RPpOy3IdZDum})Z>t7!wX>8_-l74E(r6%Sxhcl`pi*1gJw{BrqEdby z(O>z+kqg<}+rj7)l9(kOY4qAPbA9eV7+HwJk_56Q-NrB|flG?0WGPz0ZEdNN@M`xG z^Pj#n`9d}Ua}{GKt1WCSsg$2|C*T%y(KH0>w7AxKrg@5<%;vVyK4T=TYHxD|1xs2d z%k%zF8SFt z$VTobjAelB&VOV(MoWR7RUZ@5%;hKi63xnm_t6n!hY;XS{rl9~SK1 zDGx)^Kcu9J0m6ZiGeVAAZxEO zi5nb|lW9)N-DYNofd2@?eXR>uk8KtxCL9s9v|MXbRCg5_@eE}fMow3qmlMYfDH;35 zhaXhgBe>tbrqKcucb42Keep?7RR9wOHY9A6?GzVOdsc>^r7ziBg}eZ+5BZ4QP$t0{>7ONCtcjTm*@aO9)yRuP9wu!Wvn^eNu0ua{PXmR?hz`c>~P!p(!|BFa?TxsYHSha9>RRUHo5ST?%Fx7(! zYy00NjwhNTqX*YOhr0dy04Yp-T&gq(rpPi?gW&CEkQp~#75D}aQIw9=!ag0mBjE;c z3WIj@T!@1;*CU|0Tn%Ky2k$8G0})>988z}20`fY}g{P{B7^sQSEp^Dh3=Ywj0Qa=( z89NdlY_QDw)E168(2)wdmL13L%*-MAcfD{BLOY~x7M1r2;aWBC1|DbvO`{(k|>U=kFb06t4SE{(V=1PNWK9Fnc_3nn+!p3|J4A##_O1TWN81%xnIRS2(p z0=he@(tRz+&y~h~%o_J?I=lmF-iJ7V?y%j)v+pEAR$Q@mk}xYgofMC;|XjN?#k zWw|$&Y2BR=hV7A-;uW2h+BU3(13SG{Q4lp*evo(WiA;6sh~0CZwFW6jdxv(#6k;C< zWiytOB=u>Z$`8i?myaCa@rPKj<-Q_vUWt=-BotTdYdN z#*k|jQf}2k1$f24zRug5sVl_y_z*YbM<=2KQ~JoylkENXk%{PNqlcm&sC=h$5V?(7 zi^3&2wcw>PaiXd1-h?kqa;6ROR*dpBBBe+q6z0hj(=kpaPUK9cWFiBSmzdyvow`i0 z*F>N)vwY-quxF0#($8)oO>AzUBvhVIk?mgSkMWAkW=cPRl0%o`#e-RL<9;>pt8o9O(}U#>Q|GA%T7+ zl?o~{t6D)dqOs*cpcZ|YL8c()RB6uNvI1gVA8f-eLKSJHr_k2I@SmVz+;(YcDRmxJ zSfB9e%a?2Jctox;4K}1@?%TS zVdq!As_hDE9ekI{4A=4hWY-d|_3*>xP$-q;+aoYKd`RF|#MKWQV@ll1o7%5M))~n} z)J97xg!-Xfjak%Yi10)qK3z#}kO}JFVKQ8^WS`1pYeCAyJ?x{d;lxu=>I`N`#p@O+ zLs7JmCcL$MQ!^B`XU&v~Zw;ruI;g z4!LWh|2BpzH8>Mx%iF8(HW4uQa`JUQ30(@%oaO_XlOr2;7SqPWRnW@uBg#j}_*||5 zG{)2E(+QKiKn=DGsKG#i_m92Wu3oZ+TLG;kS;A@HI8ZoExLA~RH`?fvv>gO0!EQh$ zG@#=?9kBrHHh2zwNkp*Anm$rZd#fPYZvY2#TL0$vjX-;s>{8X*jRDiHV zFdZ(%sTlaN$^q22_nlF$TWzoGGob$c)eQV@u+EHub@rw3AAt4k7{Iu1eV~X+pRKk& zki>CU+bcCgxjwZ`ZGYkEk=#54N&`O@q1mYH187&mua;9$hV)$n*0--*MFQ{#slm?# z@T;AJnE(o+bhYy`=YfCau6C~G1#k{%YR6k@mE56r4CXI9y$q|h%JVM4da@J~l{8nA z5`H!AR|c*UHTc2NF3%8E?w4&s`6x5h_>RD%7*^^hXMRLYVa#Vd@VKjLGgtCjT-zwxt5+#h5rRmK8Ms? z<2?ZWg=((x0|5Vo0h`dLT;BukFjN!HzsU5qUU{K}KTBJYp$h+AHv^e7OQ%O|*+b3$ z!I=E&e!EM#^9-V}T2yjlHGrvgoK(4bG%yjiuv!2~1VTqKQkA-AKuQcrs$wz)#PoQc zT146o#6%0D$}qnIt!IX)$z7(EP8C}%#Qonl#cNpjjpJ5rMf96f;B543dwS}VBL}Zi zN~fC=cX%jH#gKohITm?hJ2(+sowxw)E3uprwu+fGxlMz2HCOk-rfPhK_rj)jg71kE zwvVA&e}VdGFJ)DIxzWJ-*bYP={V$|AqNHr3DrJA^rL5`!sVN|y#}7ma{YBWn`V?=u zDGMzX-aNYM!M^=U(9{_9mJ)FbH7*Cn#f+#XBEaj%^VH;PXu#fx;lGXH7Gq$YUS{bi zf>f;2@Ls%ktAs^UKoo-Kol&*=VAp9T#ZuK{IH@FHoGJl_2JCye&ELbYCh@)4QYWqg z&!elJ=Tn}w2VbZnITI)!Xtz2YhPr-D1d`5%;O4?bj=BmD6|tEKf^zW1$GlX(Wl$bg zHP*tY8la)BUlW1TwB6iN1JZFWh4n_oahm|72{&JzVxT(@bXPUpw}6pG7OK;6KX4kz z1?pbI(6HdGVE;M@_pQ1^a@a0n3#9dXl?;#a$b#W#qyVSK$)LNcHJSiqk~>G8!a9J$ zwx3b>Ul^9-r>potXOaE zbesl!)xat?mf6~A+xrq7#!kpiQBmNo;Fgzrqp-vYWkK==*Y<2##FuCFNJo)eS{_*d zjdhxW3%Rc-$O+GS5d5H;tM%y>QlBja+!X6f#|S4d{YpFJx~-7}8*w3gn>~j-GHl@tEEwVC)7A~MEf6EZ4VgY|Efh%v+o>HrF@b^?a58x9t=A#giJmAC_Y!5w083BoCj^&ymDWa-Eh# zGe%BV8xI^GaWs*~vM{8SVDY{e)RcgMTAc)lY1$_-b?LES#ZC-V1A3*QiTs9pmOh!9Cz3Qq9gsFJbL86jQ9owT+GtsR! zA%3W7XE~eTlqw84fo2m}Pb3lZxn`(&!pE1jeKt)IRQ%=D_hnJl5bxiypaA-Imb$+E zZ1~>LLmkwAG;9^{e9g5mJ0`)Us>ds{0592p;-$Vl50y;)GNXPWOM{;Ob@G{MR83cd#=S-m~(lmy`daB|~wE$;|`L#df~>6d3Ck3P|i;4B_- zXK~Jqo7?BQ1q`P_m;x#O4$H#OI4~8;;`o&%Z7NKprD5Of57;}iyDa(+t{uNRWxFv2I|fd2S;-jAu4(+xVb6ZZ8S2LLLcUI%eD zB1a8wdnBD@Q-_nL!xv~{9$T$1OkhXunOU+MENr>@!p4DxS$?*#Ens1z)fe_0EbPo@ z3;Vw_Rl9p%@=zBJ&Y;1 zQR*}(1~fRSPJ>uL0~2+2X?bj=$(p3jE`QCb9(C&sS;eE-YmK5Y= z>{PfUOOy3bMeUgbKIVKTGP{7~Ap*@`k?D?T?%LtX!85GY7&3Z4v?IBKzOsaPu?pn&y1({sS{Hc@vYQnngX zY}9>&gO98Rv<)@FJF}dohcED4$ZdmH$^J+VV3OL_&fI zNY}T6m0ruwyw3uppl^}SA|VTHr_Vwj7s_X0*wAqQJ?yMPK)joQ=echjtkA3|pj9;r z2H~^16pcYX3&4jtsr%tWL-oe`e+R2h$1zAtAqBUlddHv?#{XXgNzH7QqTUE&VZju) zH`+4WTcr3M=&u4>R>_>psw_aNWk);-Y<8Xt|Na zNQI2+OROysa~X=!m3T63*G!Ni8Ki=H9#YWG>gq~Nhysy#yFOREGsI^~6v3s~Thapj zLWA3?2;vsNI3^0iwR}30XeD-y3jt$epL}8LTNKD&Vkc`pB*HjI!DOK$UzqH4EmT4s ziHpLsrlI*9YM^q^jK4c*yzC+cvNv8L)D{zR`9ay}JAEB;wd9eWKs@m@AoZ)n<)=4n zy^^>70Mp>|c`t9Hy+T#_cxb1+P_ zr?!>q_=`mkol4SLDOdmcpnHGrRE2bXSxY66m3WVNTy~`|ZQ6U!N6Pgj zES2QGt$f6=djZq?GNvjt>Px~Z@A-ts(6olo`k&&hHVi@+=ekyPQYmittt#>okI;bjPZ2FZ}3dxA2|LPKW^QDgj%yl-|+`eK8J4-bcSgc%tbaixgJR<3*V zk-HI;{(jUN=MEaAC@l6QiCs3IYLqoJx-vQhTzP9vnw{{KhZb5AW@LZm+RG>n4eh6^ zmM`5T4C%gu&g|@}m*%s#O*mPKKE{QI5g-!cNL$t!E*6Kk6LJ}Eg4{Px01E90V&4Nd zqTr4>$5Xam+Q^$_n0;61+I=d`YB}!4=K3RBf`qSDYoX1>-k{7aYwzO3-I3h0m51HD zOLrn}(W!bf%HiJg95LGZT_+YoiMQ_Qy`0e?43Qy74Ap7Y3!?y5X|VgdUYkftmUo(# zFtC9+(1f5e$LrvaM%|wLzM?HMfK_og&uAp;zSXz%2ytCW^`-0v#=}B3%Pu6jv$=i# zcUzDaDz!xsyFxiVlW^mn|-YB*`8n6)0w5A!zb{Bd>*y^34GhI1GTyffB?sg*rgb#1y zhPZDwMV?!3@TM-!&W?r{Juh0Oz*kQl?)r6KO`CLqNumnP&-o$HH@GH+L3x9N5-PdxIxyV)_!B%`@^wzLN4 z+u_Rfl=>*LD*~*O^xWG#+Zuuy(f3-J)|#B1nw)!!jP47rJ_k3NK<(m~(l}hMWoYj= z=NE-=u{&NR!sqy{?|iy%Nt2W2!IdoGQWK^w$A>9_J2%v9KIP5Fy-EgOErjn;(|2b;&_SELe3Hz>4aEei{6KwVx?PapDc70oMF-qYihYcu^? zYY{2zUFdUHxLNE>Jg~dRz3|N_$5}5Jm>r4;x0^_Zyg0fk3}?%|;t&3g>E*vw;$B|G zhDOi6N=aKVEym{w@!(~*$xE^}J?&l+P>x&F*Dd``LyT8BbpE~I(u}gj!LR>(vz|{i z3@J>EI_&vOkQGT?jfRUO7Yehitqo-j`1-2$??xVJ{vIri$eZitAT&I2gOV##Ab>L z?OCWz7}|q{{l6=S4QEV;S9&y4QmWW?WhlChz8&&to zIvyqFFy?nO2YoL)CM}UsvzoD^j$C1DrF|fCLoRi#XrZJIvv^WO7aRQNbkV3!t`XqI_Fo^%2{q&#G773)H%F}T5t;nL)Irtb+pxTgXm#S239E<^C} z62bJgRGZ_qft{~o!5Zu`f2m|iqv89S;Q0;6e6Lg%Jjro^CCv6&hkFtnWw9AdGDa5E zJ|=)ljIt;jOXQ6!hbD_%njwu@BLE~Kn=*)R+-A*dW zkyCOoV@T>yx^l{8_CzQ#TP`!0%Wusz_O=`6`+T0~_vi2DnUCjlTGm>x_v?LIYwh=5 zb7F(LtG31@4IB=qy=L`_O*otygu@Z8sH@^|IImlGF5z%0T^roCtOWmw!&%{QvvIgZ zINUlM&JBkHe;tUMWrdsNhMN_Pv!0E!-h{Ib!`WNm?APJ!f59zUgj*DdTXY7u<~Yv% zEY9l}oL2%a@SzP3XEO_YtZZhv*{lh+S##Vb=*AozZjLqhY?|X9Hpl(!oRF|NA-N7y za1K*uIygAY!{O%PtmfI{=GlYa>*jg=GS4evUd&YhMK;Nzz(s-Jb7oQC!$oJnr+&Tc zCuIHlqEfr?Dfe{H{x&`XMvB^#x=N&YpgZ~1#b*GzA@;=Mh5t>x8ZQxtifmY zwve;il5)2tRr}y@KK9^a<>Q6(@v`!X`NbzD!6)XbPbT;j2g-y86XOEG^k>clo_QGf zus-mi6wC^yluax9Ne)TQ4oQ9*lHGD(7Vf|rs{=u92ZD|tV1Un!1DWhdYh0xJ?8v0t z$XnG3_P7Kus|2rg2{GW4kdO&JR})yp$v}({@Ciu=tQGkW~)DEr$`DlX*NR z^F~f4JEwsCFcA0fOyEP=PyNGs@R2^0N*{&Hew4K7QBv5WTW25Ls($pi`f2j|r^z8t zv%v@8ZF$-veJYhcW4Jxb41Sh*{8{FWX9dTf6@cID7co{ZGS|Jx{N)8J;RWmJ3s&)q z#;Y$Hi))iM)!quLy>+(sR&MR%v$c=G@9O$9i|QW+);~NWn_2cFt(Qt$vO`*)Cd(j$ zd0M0`QfWs=2S0NipY;o$mB43RBB(j(`0G=8EO4PDd^miEp2%!1${cJ zr7}4HM%j2$sq~HJrNzMBiThW3h2e14Yi0i%6Mp2^^*EdvZq16NTOu;PmhAp3XXm!d z4>TsNy?ZqtE{`RerMj4;;qc7*f-ASiTzk~9+&X4~-I&L(6IDq^p|BzSiSw3B z439bfhmM-XQP08sJ}SD=Aza3_vBy8&(~(c}eMUx2=gtjpaT^=@rpO1BkG%vgjL|$f z$?Rm2i+sQ(^0C!j3PP7|R9$hPE>S+9d~6)2t>0$Gk0Sj4VBK*4KePD%Z<)a?O-V@& zz4zOM9N4#i4&bT~);_mTVQ8NKRc;r)gnb z_sU&}8~Ja2u6`f6QU>&Y;UF3zv`nngcvKW2Po*;eU%i#`^W#Ra#mj}Gvk4-z8 zB8%cJcP)iQ%sJ(!zCMu$!%uSzQr-{R&ebb7Vn+1g55_A_g`QalV&$&D}mk<(d0y)qZRf(8lIldD*b)VW`Yl9lFz??K!Sqd8XdB??lh}u>vK>CfE>y8_1NO@v{N@@W zmJDWvP#BQfN|1{JlRmxR=an)^qReK?xuPVsRzpBaJVE+J<~D2jl-|~oH{(TDfGgBQ z=QVs0Unxn^6`gKw+xfB0$*z(EFjx!YR}U&u+s#v-p73i5hh}iNGie>E+XDVp4V&gR zG9@~ASy$%pT{UUT$~_MIBqtC@X2zQ*KYe`KCywCMWC?GNt0n^0(F|GRmSwOqv|L~p1h^WJ!zFncpJa`RJh4u7BxcT(80)qHu{FoTH)2RN%mPDSvuRa2 zjp6}2L{DiFmu6^^EJh^zw913`xHS_+c&=>_&F2M{+q?b?o9mnPHJZ3^tyk{#o6DU{)3ktrqsyjByHqW9 zkb2V_I6=(k zuw%|jb!J;?G*!df)GWqh#yoKH(~($@`vpmJl)E14Ve_$6i3j@rsc_*gV@e3K@_QlU**I-R-m*1NHsQb`qE&f5D`ykql zSZbW}yf40N6G1M&WRmtPRs!?XU)fojO;2D`H48F!s^inS`~gPzoZ^bu@ue8|(a&oc z+HDqb&apUeft?C=z$yB%Ts?*$qTD!9^*YvJwfxq^9J}N+kx^h*%!xgV9kb7WeDoMe zyc^u7O_i4Zgi$MVFmJW!-uUA3i@Xl9p*DuD%`W<<_wIT+^L*8pd!*t zhdSs+tijlgSO=-_e z&`BDHp={>lQ(rV;+w%-tNr3RR+A4L7XKhJd*&hA}6l~1;7P}GTj}h@G-v3n$z_J65 z*QN?fS7WrtEX$iAo~;-C*|yxk#cmT8Oo;U+b})hZ9zLX#q>sg7eCiv(@|IyM3J~5` zTcw4?a(d+;L16_Sm!K z7$N5QkEf53RA?}A2Lpt^tF6+(^gN%mk}uH1Q{TeVb*eQm&frnu*+M-^&-)Fsn#B4T z>!pejzJH&2;22w-ra9UX)8I~9ij_W^Cw{GnVot_U-$q|4UM-A z_u2M?%~jn0jk}!`y|8?{lU?u+7U$>nd5riDBR4?krxrL5t4UAmU>mrD$oil`{aSi= zEJn(=Cj;iOb7u(s5^@ju)M6vl+KT%hR0l5*sL$X(##Nuh5_{XTb|+LfF*-+&^)}WE z8=-DbtU5`fZiWBQqJA#DOT z)%@95dMs17idpv|&BZrz!+dJvF)sPfyF zTHrn`J!`G4hGGtJE_(5@P0}7<0Zq-j+bQTHP%Ge-jVP&G=})Q`*Ar>`%Twq+ z53xD#NlL&u0?nLb;K{3`*wte#xxDiJX>P#;kuZTQDcy_5s8Wlp$snKN=~S=65L45h zx3@*`98W3cxl-(QVh#0J<^76+QtB~Cbu7j1l2Y3RZUITuoQpCSF}}>Jo+-@RK1$2eyuIy$ z^#saaJXaUHo!DTiT6zEZrI%a=K<{FANvZ9V3OfgKoi8d?3*3xRc~FDr{5~f}ilLx% zFLr5{WL#CvApZ+Do2KoQinfpV9pw%G0x)P8DlW=1=Z_1{~TSg(~NYj;jUYu_HeA z9P0^)%q%Y`u}oRmOe-ni-oSh+m&%!FBH z!U@=a-H?~mEQrNZ(s+rB>{PL?wY-7>MVSe)$+2d2o>q(CES{3eb6sR-j_sjZVgK~f z+a|kINX=ffL@jUzR?I7&t9C$%6GR)VMrq9OO!zkB$sj+2n@!U4u$nsHw-lbEPKyA; zku*(lA@2voVY+`hh-#%|6+@FQ_0lvm;c~Nxqd`VrlUHBfrT+b7^!j7_TGhcxTEIt4dpM!N5nUUxse36LqZ^GA+`_Ig_Zn6`rIB~QmnQwM zB2?J_#jVsArT(uX1m-1m3OEGz)&Et5OenE`sGY%m0V_$j)%ut%tnR{4W}Eqnz)n}1 zA?Uj2Dgnq(kTTmr5uDHfC6eA-r1E6p{gE=;MpW3?NQtERCjz2DR#G2@Z4Gsrae3H} z8r9F62#<~^ivc;#aaK~0?mEJMOt4m+rl~x^VBY!vnjiskv{RbkuIW1M(I)V6O4Y z>kibX45i(FX5oLKoFZgsMtgCpl#Tgp<)*M$+gU=rQ7Bmo>lq0DW^7mXoa@Pdw5x!f z>Yy^hUWRR9seyiRgcAMa1J+v&g!dU2*;Jb!!_ZR#H7qvQCgKleGazt6bBgn4SVwd! z+rbCVe_XEST1E6JH~qpfh*?J60l!v;cq8xaZb(zpTiJh8JYfLw17o|gvuQnAI5=Dj za6Rb{ScU2Ze^4I#FNSSVsewW9er54}tuGh|Uo$Q$k8Q3O-AG{l4INU}>Tv@5!Iu{| z|AH>?w^#k>)rcR(n#^%~a zyi=z0j^{~R_#Gj4l<_QuuQiKfp_R(x9rwGyjPiwbST&s9>=Itc3|^~qS})? zS448Mo4zLen2G1+ou@Agof;9VEY@`4M~`+JysejV(}ZURsR^FX({}>a;LcrTXyLsb#GjgiYPEmC)(D|2xcD%e)< zXN}K|$T$8m(LYP6_(&`{3!T$eiqsk$W9O>{kK!Wy<<7>vTMZgIH^-(2`r z8R32ZIbP6iJd>@&g$E0=(T_0aSSm+?b0(*%R6@;#y~^XgCV(etPDGb*C5f30o_qBp z$ebYdd+i@1!5+<~J+Y3Y=xa)9w4}m2HEq-^Ia$gcbZ*kA8q$%`5n4xFwCwd})a+6o z(Lw(@p=k|VsBF66us=`+}@*Z_VO#h@=SWO9H@C@PQO>Z*K`) z$?c5!7EbR|v$du4W=XSzl#9bp_@`+!{TwSGMb|3knqe)prMG-bsH61to@0xjbXrP( z-7a;SHe6hD8%XPaB8}+6AC~qILHbUI+SHxN?iZe;7E2pGg|AFN#@|!n*B{rk37)CQ zd9pfyix zeY4D^A9|2OZ#Veh!3twPV!x^9hn_(ss`&V@w4UfPykG$jm7R2=hU!xadIdCzyQFBh zBu~so{`>~9DL6KKV)P3I0pLOY;za&7VZUbQ_Ih#Shh)fA_8|VCU*1kgjAst7XYPO_ z?*_GLtRa(>c1Kt62lw%z4@-AyxCAK78$9i9`mJeiPfFy_XDhf1nXiRN3y%Ht(NcJW zf4*71LI8g$@gMMn=|kozRDZ$u!hwg)gG6zg&)$2?SD`UmaKBE|l=wQ(zs)KNX7#RW zI~}6y{OEuJ86V_BjHCZu5_${Yi_rvNmJb1cqxg1XLXx~R*53eEs zWgNjZO4mTi4Mlxd&;jeqn#H#vlER%p*#>3s=YyT~uV|op;{r`uXM@1PbDUzmgX;Hv z{kp`L!#=|ADH8lHz3RwkKW149x3h<`DUXIWI*|EvaZDm2Pad?G`O-;~_I}vvN0uq1 zR`?Z_4r$OnE61O8gwVfBcWTmJDL0++>)s8WCa~dv!%92p4e&k9;v%TVQ7H^s>x*jt zp5SXEoUR;ntxr@4i6!~a#T=ytO}-oa(4+l1f$gK5O$d1lY~fl4wb$P1$MoqnErLsE zqQY&;=MVZCwBW7J>CW1~trSAKD-f)>kM3b!dMAnYFW+#rI^VHPQ6qM89< z#~XG8>WaKZL85m`N*W~M>8({?f6SI`Zk!^@Rpv@KOZkNB#fbn0fi{lA%vYWdqzNh% zq$`T7Y5(!us%;l1)W&jNzPehb0*9%*+^g|o2h zG+y+16!FZ3M1A2xJpIKe;{bGI2`6|;D9%T^}_BWIjv5ayG@}Q?r{&8KEVOV9YDcZuIJX7+mu=`Nkcbuch zH$|9}`IiRZvqgD@=YA^ScgtP}qU5hp+Vn)zJlfmFi*DQIe@}a8`2+KuUwTk1(+##% zHbM7^qVG6=R(ABwe(68OGFQWvF4vU~Y~J80&s8XwpcLhhlQBz}v+pnc%|yxhQE(m) zxcQ$lOb|H(4g@ z!il1@$`(VyQ{IpUKjZ1W%AvUOiT!&ON;>4>sXSo>$Kye1jiu0klnAmC-nsLq^%f*i z_b5s-_fPL6iqA7B|0r9`Ur^hTWt6K>it?hm?UCorolq7@^lB8+tc1_>g+>H=!zeO< z6D!r6s$UtDe&vJ`w#B+<@m1y)*j3qLk|&DxdbDRv6m1-3LQ++nrYMd*mlAEa-9D@&@Af82y79}jq9+51LA;-ws7HZqueqWA`b;-@@en}7Pj zSmq|!b(H9u1X=Eag7ic^qsU+>%z2*gvROltHcDQ}&#NAYqxo?t{z_+B3zxwTE?1e` z;2Px(Q_n8zbF<-d8j|D6E^*mFbY4?b%%F!T%ixb^KREQzXA_4aRnE4N7O7s$mmW64 zW6I_mM4+^h22T*A)yk?*^iMw=`yV(nAj{oQkiLjFD$d#`?-PC|NE=28zCPAHK=@s- zn(`TEjXJH?vUjtl1R4d4UwT9=(-W>4CH8v4Z)U?`nv$2w-PHWjBV(CfaN;NlSB*g7 zt58ay<;v#bz~FwEcWF)mq@z3?snWiWGMDbTf$|z24EzDV;KN(0j z3QS+?FpzM)VcsYb;3++%!Dj?IG`tu^YcDKM27Du!a$J@3t);%`t)??0MR`-ZaGEg3 zCV%=lO&8@9XL&rJ-?CTTMLE}k*w+A@*&te|Y+eh^ggJWoGu2%pRw*5Zh&^x8m!&}0 zgL;2li;{@6Z==tZWvn?mbRwQIqyh$0b~le1;Jo+#oKYc^ct!vO)D_AkW!VZpGhdnu z4LHiQXL@=Ki9Vh#d-RKW zx*9n(;_^#S9upcVQiie!EKg@HKRSBj2cR{&8iU$qin)MGU3MHrAw4oydG9SJZ>yR{z=)- z-k*vm&~)%@H3l79OY$?mMuo1!;QEhdCKE)pvy8^#*_CP(;UorqESAmVK;uJZ!kEJh zc0{y~5B5p#djnChy2KREu2G{#X>-V+j>awz8uP^0Qdl#l_g^BdLsbLT%Gh|+#X#M3 z*1W2$1*0$v<2SR|eYPk10JRMs(U3mJF3a7wKm~c^`?5}O! zaPAZ#c%EHeHKZI+!bnxmL3AMh$FzkcKo4sS$FaD0l;z)27`#biDif%xNIAUJ9FkR6 zfT|YWC$X~I6za)FCdfvnE1OS|XP15iUW#LcMnozf;ntjnK*eUte`8*U=N^TOy_=Me zc*FFn2n@Og7`IT6MC&kj!j|BN*$C@&MgB6fN`iWKlHbq4R30$1*BxM&nhVwBf1sz_ zKVQa|gea4_NrT;Yb}|WLi-qGw>+n)_JQqF~8qXbknvAW`_)59z3hT)9=zRSLD}FCa z2r@0{FoNRw*h+~Z5cughz~r9zAA3=u@gh}#X1bNg0Tb?OB*R+21jJbGG<9TYL{(TU z1Ux2T8*C_SZzygZM53pXl&SZ<`QPwV4f;8tNb%a9^rl)?=xT ztc&{cmjXR_-v-nRtBq{?xXVl^Bg+%uz|_B;>S-q~mdpGXpo5O7H2JX07N#zR7XuZs zpaJ(nOyN#&SP4+yY{1A_$cx9sl!MK$14#G`$aoT`C*<(tk+n`2TU9ufK(s7IC2TX2 zkab}_ai*N`rLZ;#uNqQ}TV5y}FkL7sRdM`_(PkvZR0D2rZH;P?)xB_Ej(1K7#Soc( z$+1vgfKpBZBvUX2z`nC}MN@!e=CT${sP+xvR*aL?xoCR;BwS2M&g}5ea6E%6^$u_M4EmD_}LgcK%4M2RbMBK)Qka$d=xcC=y7}s zkB_18e4=cj1g7ehX$FJv_pdhJQ78jMn(%-PHl|K#eLo0EWDr;WX0!zyjvDDsv!8*W zVv6VLYMPdFF-A3Q$fJFHG>Buz0T*18g|>E<;MRW>+>VRAMs0*-C_2^t_9> z4;&LGqwunx1e3v$ru`e>yD-(KEDk+STa7k=ZBrjAJ8p=+&hcPrs%YM`Sy?gY9{*LtNGGnpi+PGH82)N6t) zzRP^0Qk~YNN9!k&7|1*JdSxSFQU>BqEJa?Q*Wf9L14kD};+fH9k5OBR->=|Do#P>~ zFM4L_riC!H^0;hE1I%y#U8rrIsDadqL)2?9g{Dy90R}TNo*7kUf}V0sGLcm(1OHyI z3J%MKH+!TlM`t{ys<2L14cbRN+81INN=@*79|fEl91pR5(QV6W5ZDzr2F&JM9rhGk zp_ewLCvKrSf_3_WUXXKSdh!Q*aSd#v-hxL81I~bgym^+F?GjOTRMZT9Lb&yGq^@xTM>4~Bf zm|lhTxG&p~C7@ zp)7mRucTH`fv@l-Q>5n$UC|z^9~x8rhaLYul(mx=bji;37&7diCPNBO126N|X;A9p z7EVH9o9m}`MI3rVpww4=wE&3FuD48N3r$%-xd~a?i}sLOBTz&at}A4DF+sG&>W9Yj z&BKTiAj_S+w%_e6k^4miS4^Y|L_OdHU4v2=w{Q%CsInzafk+0o>g&zl?Xu9WX&HZ( z*6E2VXEzCgUPw~t%_-iyq8sVIwud`g3fU3|Zge02mOw0~-y7nE4me6*OI#^Ko5_zJ z2?zQ6DE+zAUD48?=^fe&cfxNBX?KWW8b}04c}A2~tp#Zx&H!=iWnmA~syqw6~pxqlC4)3~P$=-t1hNE3!8 zgn&Xw@<9B#gZ)+@dEI5zO^y%_HS)gYu?2EmA&{EnF^r{)#~# z`o&4AC|F6P3*OZ1mOPannm$O4xqh9FXV351#eSnNWH6*(+0vF%T+93wa2@q$X+kSK zhCY-%xrk0^a6U%gKTz34uBVDgf4o(pv!E<5UR%1IrF|M?JDb(7BQ0pIk&Kl!hMjpwP}X3b5Z7yq3SaVGC8 zvE($wZhe-}@U_n|)f?2(G)Z)%4~DYD;nMxWPbDQZscrYAf+#V!CyZGiF1$vT1r!8vcdbD<1@NAj~4VzKiucNCw!e~ zYSAU~=YAV$t?fK=W69$XeqxceaDHKjo-y>?spioj>N9R(H^m_Lear+#& zze;-`zV{Zo;3O;5rrSK|1+dn+zz_V(GB{^!?+1UCJdg^XXMbV$QyZnCIn-lZ@!a44 z<*U;cw?3j}(NZ$5Lu7AFsSQN}y~vCfPzxn_0StPtxgVeVtV=>3Uq|i|KYCQewD0*m zRB`q3&JQ-aqG??jizzIDgYN`_bYG{GHGg2|>DTmTo-xljgnQ$#;4|>)Q#Fz;(s1p{O`IWP z+DT&AI8_ZvK^J>X7jJPeJxEX?WamB*upp<=^SRal!riwyvz|2I;`crVF%mD9DqSm1fsw_d6u5_26YR6yS4(Z)#dgq-aOJQgx=+#f*1QyS97=}B;=AcX z>}Sok9RhYWy{#u@@qq7re-ORH?!ueh(!vba!aAXTf|h`uBJzr!a7nn1bO?%iMeVk_ z*e!TsE_{&A8_ev9YuXHNXG$NFLs?J7!to{G^-AimeAXYGjUMTd!dGxO^&B}Pp275q zXZn_9RIFyOhkib2Kpo1uT^2;I(S|wGg z6QVzmxrt1%T?R;POE#ZXI|EZStsMY6k zsO-3|RXh*6si-fpEIi8<&UWDRIe|h)eNl2j2-{E6Uf=SOX&B}zoLbb#*6wHab5DrV zTzdsI&BmPV5f>T{a*B*;3}Tq+b)rNdwGulrrJ3}BToJ!BsEIW&btsBi9DTo(-^A|n z0+x7 z%RB&N{}~*qrW!4}fpl1({i*BI;ZQDZjwG`x0gB>HmsOnF$w3Q9B6DezxVJy0lP=ux zq)kIISoyl~l89H&Yx?CEZ@TDJv)F?x)oUG`B${X?!joE^SAi;!sAX+7b!u*zl##-#`;j7l+0RVz}kp=7+Cy`QqdM){`gK zO9%qy6OX=GgEO~9NQq$<$i+WgaPg1Wsy&pzE~qybPJ!99w#8Qg%;(`8ZgKf@dLLNz z(GN6Mc2Ptp_=OFZRlNJY6ee{|Bag5)W_W4(*uRNNZO4XxF4bt?A{1CTtici z$Jzjn?FzXKTzgc>t0pvgz)_(pQF*rCI)YjS`@b644*ytaq4s7R#Iy;x{Zj> zSL_tdOo`y@HAR6pS{D2^re5S!}YT2depp$TnkQE!TjFSu;C4ms+HQcqQ!1MN|7ii!`v zYMZ1FmhhLBa(NnjS(rXGZEwX!oo{$2KP%uav02&_ec-gKBoe-C* zIQ_+|wQfn;9>FE%qvv&MKJUNtwtT;jdqqUNAk$70RY#OQc#a`EQwCl4L~oC%C+1H? zwqFH7io+*a*C*le1(|m1M(_Hou4pe}>m>`nI0hbh*AUO4w<{Xwixg*b9B?bvo1osyBnxy8S}@%g1;i^X+v%RB zg;;D;>hJ~?3>@F45xUUV9@Wccd&QXpKx>+6Rooo6W(?vd>z^sk+0@5XM|$3alSvi? zgn7s5{^+C($PyLBW=-Vxvpb-Z7mvG*N_cV4&_Vz2R_$lVQG0cv;XRl}vLK>UPLq{0 zfP+{-e4F2+vZ3{9(@;6jWGFV`Ku&E2b1c%W!2B~xo-sS9_b|x^)@8x*1;5*+qb99=LJ_(+v0e%9G(zY3+M_;3vPV5Bz%vJS zCt2tr!3)d|A;fAPII=2quJ1u~P|Zz<6Xok>1@*2XSr{OLj_kT_ z&JNyb3pX?Yg)Zqr8Jc)quPLZ(8tT|%TNDo=fCZiE_Tt4@xY;8N<$8QW8EVcit9MJ= zi!kKPY(W`P;}oG|4o*`X^y9$|YV&K__gT21i7eN>ABAIbDX4cg$zn1h$#%;jgq}5} z0rBDKcArt&=YK|Mmo+-3+YOA`_^fo#4~_Q2xrP%fYZRo}p~=QOU4#g71IjClax+A; zRIZyMg8|pw1bgxpTO^?>t6K>pA*$sll!>Zq_weHg^>J?F^lRE}ERs}EAy?*oKa~Ta z*2MbqDu8XfcUJby{ClMEGQ10qC9Oh_XsxaxF~)6@dXqkibcNzU6c}>u7s~Zqith@P z@u|O~yls>k#fXXKXw2)=MO`oQJe61FVW@{1R^srJ6`+snA`L37>=qg)=50aMd}C09 z8dLW4e{8hbgYG=^qgDM9n@Q4nKTZOvToT!L?3P^Dc5aXe1Aoyobb0I z!Q<5|E_|?x?j)Myk%VyJB`W3Zx8A&94@2}ZUhXl)vmW4Eh3CC_>pTpnqZIs~jf{hc z5j@-C&9m|_1T}h!dzf?o*T(l|5fs#2RX-zscWyl|s5jm+2~~96l0n3h_iPp##qfyN z35b+>FOda@MdsgD(TzlNbnW18lpWg;e@#mG%_{mCF@G#FY_J!)NSU_S@g?voq`@ZOG-8jd zR#XJ_>RDFL`X5_!_FO;)y(POYF2k+^i5~^OZAE4;Ty z2{C^HB8jFKx(u=Zk^}cyRIf!L?a4$YZC?ViEez`YWKq52e{8k!&p`%N zzx}Xm`z5<<)JBpXAd;Bh0C&ypE4w=uS#i$VwsW|4A?Y_itLQvpKDwO9_S}a!-rAEn zaD_$n5d@NrUkNhl>ZPzg(vai#VDyHOJ${-QAlyL;T#0z3ek|k&%5v~(t27zm$g|uK zZL7h_^5?2h>G9ipgqui#>ya+CN1=l6U9=dEXcuBI(&g67J;Jr5z^zD^)T5A^e5r70>Rw5I1Z87N7kOdz~1GN1rE8OGs=s`g&vd3MD7z z1?J11<1Riy4|1gARL7g7>D~I4#Hx<-x}>;Ask(y=zN_Nd|vUB5^U{#Yt@i=wpUj)ww#4!dSWPyfpDtbRFpM{xP_xO|I?0c~2apV~P3Nh?52}AXgPR_<6d~=!0nYJ;vbh zNmlY=lGbO~1UGx6okp^)(|9~(qI`GJ5esD_=``Hb7+lDt(8yD8Ngl0iFZxV3(oC55 z9o%?472TM=`S%|L-1@POqIOcC17fA_;HIXra^`+F6M~Q8OAj(DWLNEdU$tc0Kjf(~ z?dlOX57$?xfvpEn{Wb#UBASz@J?ueLfAOj|r9bXHy0bpF1TK$-jKO9Bl;5Fy0n5Bh zuA-o+8Yqr|A}CKlb(ek?T+?S+or<=qGRQh|>MksW3CQx#Dc%NLNhGUu0%jTLQ=a1N zJ0H!a6Lm#LzbhPgB>Gg^Xzv$9;ftCl(I8^J4XV7OkSkuUyhFOtXz7Bx&rVc%MzwIW zd)jFf#TYzg+IQt0gV5+GI5@w5n4kAY!Hs!eK8;}9B78@_^JBW?UJivz6!?x zU7)T^f)Kv-R436M6CLmf-?l0o9WA*%ZUcAuA^I+fn<5%k?0kRca-9XfPf$;uZYDen zDjzwq@3rt$bhm9_mw?#TVXYuxw?(xXIwIHz&y_0)72ZeuxA0=)>Fk8rh|Ea*=@jPC@|0%q|xW`|{p@ zJQK)!%aYKv-v)w)JmCax){Q12%5yn)0O8?bz>M;gdA?&&W*vZ*KqV*8l8rh`1>uxg zxdgExV~5{(iND*KBhD-UQKS1id4_l@y2YyTn}(=12V69V8l9J!Q02SPJzruaT1^T> z3rAcMucGkAa#GN=2acGmK>5K$&U|ABn0 zUFD-&o?`Etpo-+I&EOiq;n2}R1sV9=!hOGz~H|-}> zfgm)Gm0Qpp!!p?4Eo}@6V(wUwxWA`PBUL;FJq}=wW#p>LEyyg%M>xfz`Zx+=f;qAT z(NbZM4N->VPAAKmAnrXvJ7_FNIwY0htVB3cAbR@ZLcmjra(Ek;z|BbB5fGC;Bl2j~ z8`Fk}4l_^%;uy9BIXpWvp)V>=#8_mhW0d$@n>`R`gr3KwsB!APXGIfT(Jd6--0KKD zt;e+q+#_XLXk`~D&N(GdA`ZIhv<)b!slG_qU*+dt9_sA-1P%M(n#6Z4G_LRlcF z$qhX>AURZ%NCYbHGS-HHed@&ts`6n`JY?DGD73xfk!5P1~e-ZKP>q(I#{ z$URR~I4Nkwp6i_Zh}rq<{aI*ZS^W|f7^HbKxfLCYh1Aew>Tmb~F}u0<@azjb#|%4v z6d4e7obipLMY7u4D!lZ9wicTccN;DAOI!kj1qsMRz|tw>5OT>^&`k8_-B4klr5gx0iV8Is;6B=N z_xTgJ4>G^g&Ep77kM4#D-&wlpA$`UbE`c9>pXg#Hw0)lF1L-DOl9{*#Nk>L$54H;* zSh^V@U6W@tBd%<3WlZ}-+^mKu)Lb_jtaE?`uL98<6>H2PB&;U{?k>-D^3_0MT{wXM zeeDg5dI|!+$YTm(8hKvt;B5CabZgoOod0`v13LnBL?4ZR{Dz1O-ThfO&(dusg1d_W zX@7TP6FddgyV}MuB|CbaQOBAuW@*8C{9*)IcKaTO22J4d$*TZF;5CMXnxwlj1S% zPTgW1xf87PEQhn*(oUjZr34=EUj#RiEeBuabM@M=-hf?;65fLECZa?~R)$M<2*LZC z;LDamX0er)k2l;_UzUAt*J97^@3wOcmD^fg)LYDpVQxbUY&HctNMO<6aP0rhl6 zhtKPYz_$Vwi=K5*W4iz8Wy8IWqJCpgo&>%=hrjV_<>RLBZ!AHj=a+^?h~s9i_2RI5 z{w$z&exnQu-%ur*+Yd{@RnFjxdjz)>wW46#WnXOJSWGLM_{SZHJ2U{^&^r=O|JvP1 zqYqrq^!PeO@l8oO6OlA_Tb02*39bPeF6BzK;;<#RFAoTYZ%9(pEjEzT6~DpQ+r{_J zrmgVyv21#$NHU);_)PD7zP<4sO-J!sAS>$*BIOia(JF8;5Ua?EK_9#nGLWn`K|23W z8&DDXhci>P{eIswH=iJ3P9^@QHTt4*!IM7kfbgM9x*~i8SVS%_t+jL*gXep+N{?}u z!u!=2YQYa((v5r~qI8{S*nwb>cr?c&aBQw`MEELQk?HWANkggkZS$H}9v<(My-yr& zcpNHyyKHcgQ)k>vH=e=!DMI_>A6ZxbL@>@dpK#GV?H^zPUb)w}%M}(9x&)@lT>!V&#dQJo@F4Kx~{TYcR2ivu5GwdGRo+WgptiLy;${R15ar~oX z*?Tf6N=^PE6GL@#awaq{p>BQJM_@QzZ51VvS=|zFdP&i^_K3Y9203WzJCg(dP28M; z{aPmQ(2F*4#es{+ImXQ6|G@W&n=}8GDc%-T3=}rjr^F>gYD*_NGQz<-jCi%1X6m$n zFB+0};A_S@1a*`{Ltq0xDiyy_NknBg(E_@^r%=g7Z3amm4k z`AFjba#B+w1ROn^wX7a)RED<>V@|W3&T9PrRMt(@>7O7ioq8Kak zKom08Tg&J0h-rR4zz6um^2Ne!j}IMRSD?ba{x}~!lO5w_HIk!k4Iv0eDSo!OQoY(_qpQn_JAa_&4VWgve%iWP!79JQvU`Cwr8_CuAM`Ba(6ir>Wh%?mL zWcvEl*dySrW%(NE#^ZhM!%5zM*%OTsmVRb@!S&$)m840;Fm=4Xd(2{mTOF9f!+>1Y zkcxnuZ%rMk=G4kgWV6#;?pHnnh;?#(4>Dx;7*4igx%20Okj=x!YiOQ2X#`n5KR4V% zW?EJJ@a0H8)-|t!&&fA5&3HzgV#Vs?+wc(SvCZ0Hgi=cHKMDs;o8?{nEAA)uj!<;f z$Nt^O0lR^^_ppJkJYbAOp|rfmnE5}>r!7f=z^V@{`Kmp?of!#yO~VVs>koi+k-|}Z zmNwKP@D68SyuPRTAv)gI1=5j}mku0=LLTQl0U<hxXSr=W`05Jf1K))z4Yp54oS(d-p#p5~Qoq0&7TUzYmGloz~AsQ0IF!vqeVU;&NM zr6+y;6B?6t0hc{M(wgT7-ud?RDziH_{+DBStT)$LEE~6D_q^uInNALZ7rU%_GO8aO zln&7>W;gD95Zd+WP%Z!RxpYgX{egv1;xqqFR`Fg{8gxG4^Q&|sf9}hA*V6i~df!*$ zGQ7IFJRo8OVGMKQq?@imtQRkSzEY5Kw4kw|{MzINxeekrr!l!^ki**YUq2Veg->el zG>7&HI{*Ah?ZvEcsX;q2LR;R|BWU*xOzTX+FGoocD&9-w)4uUwo`c<0OJeZFovg|F zouvyunNHyj&%3#87q;^ZfjT<$_MnV1C+*(;@$kc;!=8VsR#h!t#UjBPDlXUOx)r2a z7Qa~%N*)th6q>lw>CfVZ<-4v}Li6y^tA0)kv0<+sDXsNvf!Tn2sg=4g>9w7BM+OGb z>w`K6V=o`A(}j)x@Llws z@T9+ntih0^`Oo6lgd-~6%jNVpGEVi5WM6bJrDt5>(W4i~%Y;2r0F@m4q4@$IU(7gK zGei4L$$-J<%&|v?)FbL+oUA{@zW-#}p|W^P?i86(^oI7&9Lc|3LBn+fla@~i22)to z;(rlLMx_l{Ow|WmPi-SzXSU$DM=5s# zJV|DV)iVOIHtc>esyf;d(v#bZZ-z_!Nbhh@jjBecO+JV9$ytJ1h($Cnh&MP@ylu{vUe9YPU>i6w{~nlC(n9e77qY)|IV?Q-)^IOvRF z`1&VP0iyGyPwg0jAQU0vwPLMA=7FmOJ)k75v@o6!dS%lgE~xP zQnOBs$C+KcgpfOaCdNXKdUo+f=w-??j7nF3Y9$JHD!kF?H<934fBvgu4+=)>_l!!u>8D*_7Ew&2Nt&rqasl;F`m29s>$vR^VStiEJm@zZ& z8RyI$&hxzQ^<3BUzJERaRsGI)|9qF<_neC}A&cyI44ladmB!7d*{j9idet=$at#vr zA-ODZA>8-Y9W2k`@$~gvWFy{hT7V$|Wqq7h@uE_HzP?eGypw06)0E!AD)oGm{%m;+ zBr>|ldLdwy0gn@{D(dHp^*6OeWLo;OXkO8LesCd`i_?WE79XUG3-idr`mdb$AQZU= z;`p|^bdiCnb&U!GLXc-7YJVedS%3_Z=f^++_TOw}1ki)qe)aBW(_t3nlPX{|sJ>(I4R$hhUjjo)e^vczrQ2}Mc6Di16lFq^4(|>|>diqd6R}ZqC=|=Gcgm_sh+$$u zB{XkZozw_itmFL|fPoYw>C_ehwgJy0ItT9?oZ3r=<{9rcs_zo!N)rHYf)6P?rf^(* zSf4FkGq+87bN9W=My8j1w*~>-YQqD-@EFx(Dl`sx#yF zYbU?=ODRvbM`$(IXCK?blHZ)ECvoje)p=3dd-v@BysF)d9|K0X9d5SKz=Ih=Gf)YU z7pjeHkI#_VR$vKPeuRBG#bM&}-G`<;H!0uKsT%uT5sJ;Lz&IF(l{rnHASgX#sc0nQ z7shq(=AB4{K!W*`RNssP}ICvV)J0+>gvtD5czMjPhjNRTvtm*LqR{BkP9O( z%x*pekxP%q!pZ%WBqKrc@k7`gIJx>~9f(|lbrwcm=%OZh4YJ+9PXp%pKlGBKcY&_8 zR5ZGCy4ZSQ8lS0p;_vw_RvkX*oH<+s}1#m-}=XN`u zmrnajrNS843FaXn25n>2s!JKfb$=Wc1`{Z6JICevQi!|me8qsmctX?Q7|aLX67rQG z{cUbKKbNU@T37%#$bJa*+Ya5sj-Lofe77{kFQz)hLj^K^wUP=91t+uZTR;?^_%lm% z?@|}b7w~`80yFfh$IsrCF!4T-ub~Wmy|Z7y9!B4`>FWlN-fk#OMFr-bX~lC;SNP%g z^&*^q*q!Y$V0@47oO~F&)P4T(r@pR+_z!fUf?b!U!AZ}I?NAoZ7%+q23|?RVDgiO* zpL?`!se%owJWi-U4!SA6A_^A&wzcOpmBBPq)!He2y4ZGY?qoTm7LT|%IjhZTX%}T; z=K8#5ULcW79I*$@u{FI+lQ(78`?#aRp4WxCPtVl&7zff)rfZn=BKy1)54Ik!djJqW zC-sH_wbbP)PIWg1P0?xSNpZYTSZ`M>L5GAOya-!{vr%D}E0T#J7g$6ZTX`0bwac?@ z2%|5k z9PyWotR2bBk7f)Ol65+GXba(~W~pRL)u>6KFzIUGte^^XXvDOr)-6+~1} z?^S5rmEIsbw0o_ZG03T2_Xo{kVz%a4s0fa5oPF=0JhJ0GyM~RGCx_@~I(DKk%juNO zRTEEl2gP^y2bLQ+8PPunem+jih`_v}6p1eYwDnBjy$ldbS@JtVG-zYyJFc*eUT`i@ zJfgHQb30qYQQDVNh&X!Tco@}rZ;x>b;Rc#PbSqGV)+*en6*~m-TGMU~N0a0b>beKz z*TOu4S9X=9WN#auaU2XBDLG-niN_iW0c3L{FYr^*ugwh5Zf^$+Ay$;@|%uI#|a-PZIn zqjt^N#Cx&7Sbf-y;wiWOJl;4tWQbqk4wZb&0F%X1Xu^21Javw)Kt5o#Soeq$m_@zz zv5nVfy-MnP#xKR-DOw>Rv`o~cyB*tqc}-r{iKm?S^KzS2^(NEd-5G}8v)`2k`bL-1 zhTd4o35CW|4(^G;kL260_|DOOPoPxF-NBK~LQk{r>HFN>LY=fJ_z=S0;*Z|I8_IzJ zEj~l51snn>j0Ocj*RQ<{gHXLZ-&`Zpb~ck(TV6t2!MHhLfk01{r3BEbu>`|XrV$b! zV%$D0iscO4?F4=^N9hyvbZA8ywp5jO&8Usk{d^c|oRkj55~Jjh|7tEtxcKw+aHq#- z9H&mph(^@aCLRySn5(7Y=De@uiuTDa>$JVs9;VR~=h(6G7pPN5)cVBc*Gj=|O6hCs zP5NC-?o77lwc}>%CZaC5^W)0;CuBKKgyv}P0{gr#95G_uAvZiI!V+(3n~yD+cXeC$ z@l<*miuR8mG!1+97jE`zk97tCH6GO%^;2UnB8|0~L7u)Fh~EHe@z6 zG~1FxUQo`G83xzE@oIS0m6=N#v|97+T{oz}uTDWND?oK-xY~}KQy>Q-d%ukQMQ!n@ znk3TQ&CA7`)S8O)^U^Qd8!d>gqsbl!dIdH4f4Xv8$hsKY(2mi5pa3W|H}xnvXA<;C zf#tNc&=p!4l|H6!?lfn5qyLoE0yoM3Q0|4?q?ypISRdB6OHy~P;Xw{|c#<>1*n_^& z+HFXAp{;}yrnG69j%tUw_wL4>*1lW|ku>~W&qFx5zChqpOY&ns5%(WP+l)a9K zEf1XQCb9;4($Anw-!{ij$k+} zg3O{_+>I!gle#4C9hf1lovTXp=j$m+X9q2xC`>4?ZbX*8sBdR>Y7?fTzNqpOoJU%G zY_z{{b_biCqRIAzT~<8I<#mK`j93h+dKasUH9ggM(2GW!s*1z$wjTg&`t#mH zuz7;Z+kRf72p!jhlOq=uO_nlpM?!Fn!8x=6;(&f?nSQqm^(8PV@T1bu*MrzJDzSi8 zIcbBW_vA<+hghUqs#G>nB!lxI4QI)_fCK!`Uw(bv6S|B!|Ml$|Y>w^Po&v${vR|WJ zJZw%Bj<O+Abd=;ILeEOXxoKm_>|ZD`RGp&*4qPF>^K;I&2e4|$0rRp!s%P~ z^FY-4bg%1&rDJ+=#_@amO60+AE15J}2j|dg$>VUKI03GJljh$FB#wQ6liOi<d@d0Fi+5~NN#zMvAiB_f_1LfQHxdSc0f1DGE7OPbq3_r#m6 z%~xQttIKu$q_lp1h8`C78YzKE7tZ(k{mo8LL`Hr_0$hZhiC`dfPw;q}+X=fyCEB%o zasux`!+(s9zJiGu{IWerEa(UD>Z0W2Wm{3$bvxJ0sX7H5Tda@E0h`|&zxsXlitPto zK<%`S9`*Nz6I+-ZO$CX?pN)DxJFxVclp5T+^#)kG4INcARbkhZqjwG0LsQdqYqQM_ znEpw*E*rrrbtz%F;RyVm`el=8D%2g0{8TgCwDh8LAimDV19I^pOsOn+^REV#YM7+h z45Hs8JL(csn_OQg50nOklt^HB%sYlW_rq( zK^PkJ`n@93z<4O+XD<=la%;;$e^BsWuOCcEEw;z;FWnZi2dT90CedpmJH$QWhtI-xPPfD-I&{m z?!#P{>~MJZoim&XH+sT_f-+@t^+Ubg71L`9+eNhS_uu0BEsRaLOdro*14~rHQ>pW7 z(k5o0NepuX3_`Z&cV7kEN}Iy8guJzdX+Rm8^5tHY%f=?L(i3-K7&a-<*ucFZHnH;_ zoe7a%x@*X`|DMBLrA+>T@qXfqgRMG7I{tWJ2CR#i1E}A%y3}FXmlPS8a@iwhhk7~s z=8jiuQiXY}GSfe#te zXB0!L<_%kV7LNRJoFX>w9sV4@BJ9hLXXS<6Za3@PuoGlg+rN}(nsoE0JaE*S|6Iam z@B)H+xV&!tqf@`-i_BRSj8C|!bl2K&hLY!F9DcO8(~2wh8kdtr9)DBWuw&n`3F_h1 zze_%P$knRZt70A8N;4AmL1BC)y@t=IRT4P#ZV_ z!4VHw|K!=7B<+Fu(32LK&aFIfYoOJw;9~EBt#o{`L!m9P(SO(i#pypz_>U97PqqGE zkf7^Z(eH&GvKgrfkN%|N5E-4z$B*2+0;#dP+GXXMYyqLUCkAuRmq|ugoK0OWO@7oz zu3oPvvHH(bn|D=UZ&XX&{J$dNlAtavGoX-{EM?Ni@ zOeiDH(eM#JC!J57?|*`K{=3neOwWFn68Yl#=2%2HqV>`dDuaPV^sJ2{9H%xvbUzyL ztf?9ultRHc(VHIzG$aR0lOswLz7U>Y;cw_nOX-cJ1+aeZm|l|uXlPa;HClG&NRH@+ z=N`e9m#6n^&cAjyRdYs}RB0CL3aAz6WXjs+D^r-IA)qv(>fl0*DHwC!n3T~dsIKc+ zx1OXc>7C&arDh_gLV6)on5842gdE7%FzAaJ*(YD{vRa@axoTOZbT*rhPY}OvkJ&ML z??E50Q|{(7O8nSq9moADBrAQVJ^gMvpH`9$qzbbP1kk=Mx*sj{6wNC7H5!tqmeDVc zO-Pp+jb_`f?3I6~Yb=WO*Ky>c!h9Kh#O98+pG2R$vjujWj-wawpZz){&ZK11?cPNE zzH|{|{gO(FhUCrCWWf+0#wYazGeuhSIlQ%LSM3TgK-eEXK0&6daxQ8IYrH?7E5wg{ zh9|y2(t<}suZj%d)N0bLE-o+3S`FYc8%rG;Jd%1UxVSa=ecomk^<;MEhgCp zBD(dRKh%%mLZ_o;gVNre&lTlIKA~OMT8dg#;(5AdW9s$xBT@qB1Nfqbi_(3MM>13^ zZxT1N4jnRbx3*YD*H!&~MlsT0q&AQc(58w)r`vz(|BZX{zhdxTfa|~W(T7Y9=GBRO z^qkKQ&MXH#IDy1G9S{`Ik>i&l#d79wo{tGh?@hw*14)xGn}R=pVs%V3A*nTP2&wRU zfK@e-Hz~-U1ucl`_Bju6q!QmY?vu-#@EEG+>KVRKs|rDb3DKWb#&W|~v!%&=HbGm` ziv6!DofQWJMEc%le}B76>Qz*@sBhh++vxX31L1GDPX(V_OD5PcF7l;ffukdD_cm#c zh0oKA=a6xltc`pcy8zCftPRGKw*^n^2LA3A7L_5_EO>Aoi9b#H!YLXOo#fFA%5)%B zX>|=pw>1kkDwFsXi;APV31pj~hpIxx;g8JcRjlk?>xWcjiH4VO4g6@^fvH$Ka@8GB_7d|td$s;6!4qcxQ;qp|1`U{V h|MemVDDVj*m`MLAn<**1kq`K@&%$QUU%Oqd{Wq=*webJ| literal 54508 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%0DiD}klIY8_9emll05pV!EaI@XiaMleyDv^>LA*8 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%0D$;vX0WCRAKot*Lfx~uV3 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 E4~Am(5&!@I diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-112-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-112-1.png index 0efa6f26dce8967a6b67a4a449ea41f5f8b10cdc..b53f200dddb9fbd9d249b7693b62146f298cb676 100644 GIT binary patch literal 54508 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 diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-113-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-113-1.png index 6f7211a6818aa5549d650bd69b68a7a1c6e94735..b36a0c5d547fcd3e884ea07c35bace9b2933d1c0 100644 GIT binary patch literal 39598 zcmeFac{r49*f1_e4T>R4O7?ijQXv^z*{3W$b`nJhMMBn0O{B=4%KlU$jU{_Urb(g& zAxnvw3X`%-*(S!!ca3#s>ir$>?~m`l&*O0%-S>5!*LGg#exCQ$!{)}DIJa`Lu&``G zm>5{Hux!Ayu(1CJWn*Dsak&2=lZ9oS>tR!CL-0=)7B~xw2MZj|0tbJSSUkXQwTg-g zcnTiT9@Bn2;2z*N3GPu1PXfPvX0#t)GqVIUUtcp{@E2{C(Co1Y$OF#e0XoonfS)Ar zpGOk-TkVn5=TV*HQ4Ri5K~K<))|K{?;G2NFl$cmZAOD%0DiD}klIY8_9emll05pV!EaI@XiaMleyDv^>LA*8 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%0D$;vX0WCRAKot*Lfx~uV3 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 E4~Am(5&!@I literal 44752 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

?Sb$d6MBG@ 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 MUcZv3efP=#0d(Elp#T5? literal 42672 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 Z*O8g#S}u0b3Yd%-JYD@<);T3K0RS2DTxI|O diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-197-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-202-1.png similarity index 100% rename from Part1/s4ssbook_files/figure-html/unnamed-chunk-197-1.png rename to Part1/s4ssbook_files/figure-html/unnamed-chunk-202-1.png diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-200-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-205-1.png similarity index 100% rename from Part1/s4ssbook_files/figure-html/unnamed-chunk-200-1.png rename to Part1/s4ssbook_files/figure-html/unnamed-chunk-205-1.png diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-206-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-206-1.png new file mode 100644 index 0000000000000000000000000000000000000000..533948cfd692c01314809e21159dbeb198b736f5 GIT binary patch literal 42672 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 Z*O8g#S}u0b3Yd%-JYD@<);T3K0RS2DTxI|O literal 0 HcmV?d00001 diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-60-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-60-1.png index c56050fb620b716ce3f6b75a582e920cc1cd1746..7644aa68d0737378c0a4be12f6fe46e1d82b38a1 100644 GIT binary patch delta 8724 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 F@qd`zsG$G= delta 8762 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 K(+^&_^?v{u?7%7j literal 0 HcmV?d00001 diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-77-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-79-1.png similarity index 100% rename from Part1/s4ssbook_files/figure-html/unnamed-chunk-77-1.png rename to Part1/s4ssbook_files/figure-html/unnamed-chunk-79-1.png diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-77-2.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-79-2.png similarity index 100% rename from Part1/s4ssbook_files/figure-html/unnamed-chunk-77-2.png rename to Part1/s4ssbook_files/figure-html/unnamed-chunk-79-2.png diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-78-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-80-1.png similarity index 100% rename from Part1/s4ssbook_files/figure-html/unnamed-chunk-78-1.png rename to Part1/s4ssbook_files/figure-html/unnamed-chunk-80-1.png diff --git a/book/404.html b/book/404.html index 45c5b6ef..cb2b5c2a 100644 --- a/book/404.html +++ b/book/404.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@

  • 4.17.1 Raster Summary By Point: NASIS Pedon Locations
  • 4.17.2 Raster Summary By Polygon: Series Extent
  • 4.17.3 Raster Summary By Polygon: MLRA
  • -
  • 4.17.4 Example: Faster with exactextractr
  • +
  • 4.17.4 Zonal Statistics with exactextractr
  • 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
  • 4.18 Additional Reading (Spatial)
  • diff --git a/book/data.html b/book/data.html index 4b3e4788..a51b3660 100644 --- a/book/data.html +++ b/book/data.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@
  • 4.17.1 Raster Summary By Point: NASIS Pedon Locations
  • 4.17.2 Raster Summary By Polygon: Series Extent
  • 4.17.3 Raster Summary By Polygon: MLRA
  • -
  • 4.17.4 Example: Faster with exactextractr
  • +
  • 4.17.4 Zonal Statistics with exactextractr
  • 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
  • 4.18 Additional Reading (Spatial)
  • @@ -1043,75 +1043,105 @@

    2.6.4 The gopheridge

    With siteNames() and horizonNames() we can view the names for eachslot respectively in the gopheridge object.

    # the fields at the site and horizon levels within the SPC
     siteNames(gopheridge)
    -
    ##   [1] "peiid"                                    "siteiid"                                  "ecositeid"                               
    -##   [4] "ecositenm"                                "ecositecorrdate"                          "es_classifier"                           
    -##   [7] "siteecositehistory.classifier"            "es_selection_method"                      "upedonid"                                
    -##  [10] "siteobsiid"                               "usiteid"                                  "obsdate"                                 
    -##  [13] "utmzone"                                  "utmeasting"                               "utmnorthing"                             
    -##  [16] "horizdatnm"                               "longstddecimaldegrees"                    "latstddecimaldegrees"                    
    -##  [19] "gpspositionalerror"                       "describer"                                "descname"                                
    -##  [22] "pedonpurpose"                             "pedontype"                                "pedlabsampnum"                           
    -##  [25] "labdatadescflag"                          "tsectstopnum"                             "tsectinterval"                           
    -##  [28] "utransectid"                              "tsectkind"                                "tsectselmeth"                            
    -##  [31] "erocl"                                    "elev_field"                               "slope_field"                             
    -##  [34] "aspect_field"                             "elev"                                     "slope"                                   
    -##  [37] "aspect"                                   "ecostatename"                             "ecostateid"                              
    -##  [40] "commphasename"                            "commphaseid"                              "plantassocnm"                            
    -##  [43] "earthcovkind1"                            "earthcovkind2"                            "bedrckdepth"                             
    -##  [46] "bedrckkind"                               "bedrckhardness"                           "pmgroupname"                             
    -##  [49] "hillslopeprof"                            "geomslopeseg"                             "shapeacross"                             
    -##  [52] "shapedown"                                "slopecomplex"                             "drainagecl"                              
    -##  [55] "geomposhill"                              "geomposmntn"                              "geompostrce"                             
    -##  [58] "geomposflats"                             "swaterdepth"                              "flodfreqcl"                              
    -##  [61] "floddurcl"                                "flodmonthbeg"                             "pondfreqcl"                              
    -##  [64] "ponddurcl"                                "pondmonthbeg"                             "climstaid"                               
    -##  [67] "climstanm"                                "climstatype"                              "ffd"                                     
    -##  [70] "map"                                      "reannualprecip"                           "airtempa"                                
    -##  [73] "soiltempa"                                "airtemps"                                 "soiltemps"                               
    -##  [76] "airtempw"                                 "soiltempw"                                "surface_fine_gravel"                     
    -##  [79] "surface_gravel"                           "surface_cobbles"                          "surface_stones"                          
    -##  [82] "surface_boulders"                         "surface_channers"                         "surface_flagstones"                      
    -##  [85] "surface_parafine_gravel"                  "surface_paragravel"                       "surface_paracobbles"                     
    -##  [88] "surface_parastones"                       "surface_paraboulders"                     "surface_parachanners"                    
    -##  [91] "surface_paraflagstones"                   "surface_unspecified"                      "surface_total_frags_pct_nopf"            
    -##  [94] "surface_total_frags_pct"                  "othervegid"                               "othervegclass"                           
    -##  [97] "site_state"                               "site_county"                              "site_mlra"                               
    -## [100] "slope_shape"                              "surface_fgravel"                          "classdate"                               
    -## [103] "classifier"                               "classtype"                                "taxonname"                               
    -## [106] "localphase"                               "taxonkind"                                "seriesstatus"                            
    -## [109] "taxclname"                                "taxpartsize"                              "taxorder"                                
    -## [112] "taxsuborder"                              "taxgrtgroup"                              "taxsubgrp"                               
    -## [115] "soiltaxedition"                           "osdtypelocflag"                           "taxmoistcl"                              
    -## [118] "taxtempregime"                            "taxfamother"                              "taxreaction"                             
    -## [121] "taxfamhahatmatcl"                         "psctopdepth"                              "pscbotdepth"                             
    -## [124] "selection_method"                         "ochric.epipedon"                          "argillic.horizon"                        
    -## [127] "paralithic.contact"                       "lithic.contact"                           "umbric.epipedon"                         
    -## [130] "cambic.horizon"                           "mollic.epipedon"                          "densic.materials"                        
    -## [133] "paralithic.materials"                     "lithologic.discontinuity"                 "andic.soil.properties"                   
    -## [136] "densic.contact"                           "abrupt.textural.change"                   "aquic.conditions"                        
    -## [139] "duripan"                                  "slickensides"                             "redox.depletions.with.chroma.2.or.less"  
    -## [142] "redox.concentrations"                     "reduced.matrix"                           "histic.epipedon"                         
    -## [145] "albic.horizon"                            "spodic.horizon"                           "fibric.soil.materials"                   
    -## [148] "hemic.soil.materials"                     "sapric.soil.materials"                    "volcanic.glass"                          
    -## [151] "folistic.epipedon"                        "strongly.contrasting.particle.size.class" "calcic.horizon"                          
    -## [154] "human.transported.material"               "albic.materials"                          "secondary.carbonates"                    
    -## [157] "anthropic.epipedon"                       "landform_string"                          "landscape_string"                        
    -## [160] "microfeature_string"                      "geomicrorelief_string"                    "pmkind"                                  
    +
    ##   [1] "peiid"                                    "siteiid"                                 
    +##   [3] "ecositeid"                                "ecositenm"                               
    +##   [5] "ecositecorrdate"                          "es_classifier"                           
    +##   [7] "siteecositehistory.classifier"            "es_selection_method"                     
    +##   [9] "upedonid"                                 "siteobsiid"                              
    +##  [11] "usiteid"                                  "obsdate"                                 
    +##  [13] "utmzone"                                  "utmeasting"                              
    +##  [15] "utmnorthing"                              "horizdatnm"                              
    +##  [17] "longstddecimaldegrees"                    "latstddecimaldegrees"                    
    +##  [19] "gpspositionalerror"                       "describer"                               
    +##  [21] "descname"                                 "pedonpurpose"                            
    +##  [23] "pedontype"                                "pedlabsampnum"                           
    +##  [25] "labdatadescflag"                          "tsectstopnum"                            
    +##  [27] "tsectinterval"                            "utransectid"                             
    +##  [29] "tsectkind"                                "tsectselmeth"                            
    +##  [31] "erocl"                                    "elev_field"                              
    +##  [33] "slope_field"                              "aspect_field"                            
    +##  [35] "elev"                                     "slope"                                   
    +##  [37] "aspect"                                   "ecostatename"                            
    +##  [39] "ecostateid"                               "commphasename"                           
    +##  [41] "commphaseid"                              "plantassocnm"                            
    +##  [43] "earthcovkind1"                            "earthcovkind2"                           
    +##  [45] "bedrckdepth"                              "bedrckkind"                              
    +##  [47] "bedrckhardness"                           "pmgroupname"                             
    +##  [49] "hillslopeprof"                            "geomslopeseg"                            
    +##  [51] "shapeacross"                              "shapedown"                               
    +##  [53] "slopecomplex"                             "drainagecl"                              
    +##  [55] "geomposhill"                              "geomposmntn"                             
    +##  [57] "geompostrce"                              "geomposflats"                            
    +##  [59] "swaterdepth"                              "flodfreqcl"                              
    +##  [61] "floddurcl"                                "flodmonthbeg"                            
    +##  [63] "pondfreqcl"                               "ponddurcl"                               
    +##  [65] "pondmonthbeg"                             "climstaid"                               
    +##  [67] "climstanm"                                "climstatype"                             
    +##  [69] "ffd"                                      "map"                                     
    +##  [71] "reannualprecip"                           "airtempa"                                
    +##  [73] "soiltempa"                                "airtemps"                                
    +##  [75] "soiltemps"                                "airtempw"                                
    +##  [77] "soiltempw"                                "surface_fine_gravel"                     
    +##  [79] "surface_gravel"                           "surface_cobbles"                         
    +##  [81] "surface_stones"                           "surface_boulders"                        
    +##  [83] "surface_channers"                         "surface_flagstones"                      
    +##  [85] "surface_parafine_gravel"                  "surface_paragravel"                      
    +##  [87] "surface_paracobbles"                      "surface_parastones"                      
    +##  [89] "surface_paraboulders"                     "surface_parachanners"                    
    +##  [91] "surface_paraflagstones"                   "surface_unspecified"                     
    +##  [93] "surface_total_frags_pct_nopf"             "surface_total_frags_pct"                 
    +##  [95] "othervegid"                               "othervegclass"                           
    +##  [97] "site_state"                               "site_county"                             
    +##  [99] "site_mlra"                                "slope_shape"                             
    +## [101] "surface_fgravel"                          "classdate"                               
    +## [103] "classifier"                               "classtype"                               
    +## [105] "taxonname"                                "localphase"                              
    +## [107] "taxonkind"                                "seriesstatus"                            
    +## [109] "taxclname"                                "taxpartsize"                             
    +## [111] "taxorder"                                 "taxsuborder"                             
    +## [113] "taxgrtgroup"                              "taxsubgrp"                               
    +## [115] "soiltaxedition"                           "osdtypelocflag"                          
    +## [117] "taxmoistcl"                               "taxtempregime"                           
    +## [119] "taxfamother"                              "taxreaction"                             
    +## [121] "taxfamhahatmatcl"                         "psctopdepth"                             
    +## [123] "pscbotdepth"                              "selection_method"                        
    +## [125] "ochric.epipedon"                          "argillic.horizon"                        
    +## [127] "paralithic.contact"                       "lithic.contact"                          
    +## [129] "umbric.epipedon"                          "cambic.horizon"                          
    +## [131] "mollic.epipedon"                          "densic.materials"                        
    +## [133] "paralithic.materials"                     "lithologic.discontinuity"                
    +## [135] "andic.soil.properties"                    "densic.contact"                          
    +## [137] "abrupt.textural.change"                   "aquic.conditions"                        
    +## [139] "duripan"                                  "slickensides"                            
    +## [141] "redox.depletions.with.chroma.2.or.less"   "redox.concentrations"                    
    +## [143] "reduced.matrix"                           "histic.epipedon"                         
    +## [145] "albic.horizon"                            "spodic.horizon"                          
    +## [147] "fibric.soil.materials"                    "hemic.soil.materials"                    
    +## [149] "sapric.soil.materials"                    "volcanic.glass"                          
    +## [151] "folistic.epipedon"                        "strongly.contrasting.particle.size.class"
    +## [153] "calcic.horizon"                           "human.transported.material"              
    +## [155] "albic.materials"                          "secondary.carbonates"                    
    +## [157] "anthropic.epipedon"                       "landform_string"                         
    +## [159] "landscape_string"                         "microfeature_string"                     
    +## [161] "geomicrorelief_string"                    "pmkind"                                  
     ## [163] "pmorigin"                                 "site_id"
    horizonNames(gopheridge)
    -
    ##  [1] "phiid"                "peiid"                "pedon_id"             "hzname"               "dspcomplayerid"       "hzdept"              
    -##  [7] "hzdepb"               "bounddistinct"        "boundtopo"            "claytotest"           "silttotest"           "sandtotest"          
    -## [13] "clay"                 "silt"                 "sand"                 "fragvoltot"           "texture"              "texcl"               
    -## [19] "lieutex"              "phfield"              "effclass"             "labsampnum"           "rupresblkdry"         "rupresblkmst"        
    -## [25] "rupresblkcem"         "stickiness"           "plasticity"           "ksatpedon"            "texture_class"        "hzID"                
    -## [31] "d_hue"                "d_value"              "d_chroma"             "dry_soil_color"       "d_r"                  "d_g"                 
    -## [37] "d_b"                  "d_sigma"              "m_hue"                "m_value"              "m_chroma"             "moist_soil_color"    
    -## [43] "m_r"                  "m_g"                  "m_b"                  "m_sigma"              "soil_color"           "fine_gravel"         
    -## [49] "gravel"               "cobbles"              "stones"               "boulders"             "channers"             "flagstones"          
    -## [55] "parafine_gravel"      "paragravel"           "paracobbles"          "parastones"           "paraboulders"         "parachanners"        
    -## [61] "paraflagstones"       "unspecified"          "total_frags_pct_nopf" "total_frags_pct"      "art_fgr"              "art_gr"              
    -## [67] "art_cb"               "art_st"               "art_by"               "art_ch"               "art_fl"               "art_unspecified"     
    -## [73] "total_art_pct"        "huartvol_cohesive"    "huartvol_penetrable"  "huartvol_innocuous"   "huartvol_persistent"
    +
    ##  [1] "phiid"                "peiid"                "pedon_id"             "hzname"               "dspcomplayerid"      
    +##  [6] "hzdept"               "hzdepb"               "bounddistinct"        "boundtopo"            "claytotest"          
    +## [11] "silttotest"           "sandtotest"           "clay"                 "silt"                 "sand"                
    +## [16] "fragvoltot"           "texture"              "texcl"                "lieutex"              "phfield"             
    +## [21] "effclass"             "labsampnum"           "rupresblkdry"         "rupresblkmst"         "rupresblkcem"        
    +## [26] "stickiness"           "plasticity"           "ksatpedon"            "texture_class"        "hzID"                
    +## [31] "d_hue"                "d_value"              "d_chroma"             "dry_soil_color"       "d_r"                 
    +## [36] "d_g"                  "d_b"                  "d_sigma"              "m_hue"                "m_value"             
    +## [41] "m_chroma"             "moist_soil_color"     "m_r"                  "m_g"                  "m_b"                 
    +## [46] "m_sigma"              "soil_color"           "fine_gravel"          "gravel"               "cobbles"             
    +## [51] "stones"               "boulders"             "channers"             "flagstones"           "parafine_gravel"     
    +## [56] "paragravel"           "paracobbles"          "parastones"           "paraboulders"         "parachanners"        
    +## [61] "paraflagstones"       "unspecified"          "total_frags_pct_nopf" "total_frags_pct"      "art_fgr"             
    +## [66] "art_gr"               "art_cb"               "art_st"               "art_by"               "art_ch"              
    +## [71] "art_fl"               "art_unspecified"      "total_art_pct"        "huartvol_cohesive"    "huartvol_penetrable" 
    +## [76] "huartvol_innocuous"   "huartvol_persistent"

    2.6.4.1 Make profile sketches

    The plotSPC() or plot() function applied to a SoilProfileCollection object generates sketches based on horizon depths, designations, and colors. The SoilProfileCollection Reference vignette contains many examples demonstrating way in which these sketches can be customized. The Soil Profile Sketches tutorial contains additional examples that demonstrate various ways to customize soil profile sketches.

    @@ -1325,7 +1355,8 @@

    2.6.5.2 The dplyr pa

    2.6.6 Missing Values

    -

    “Missing” values are encoded in R as NA. table() has a useNA argument that affects whether NA values are counted. Use is.na() to return a logical value that identifies missing data.

    +

    “Missing” values are encoded in R as NA. table() has a useNA argument that affects whether NA values are counted.

    +

    Use is.na() to return a logical value that identifies missing data.

    table(pedons$taxsubgrp, useNA = "ifany")
    ## 
     ## mollic haploxeralfs  typic haploxerepts  ultic haploxeralfs  ultic haploxerolls 
    @@ -1343,14 +1374,16 @@ 

    2.6.6 Missing Values
    # it can also be applied to horizon level columns in the SPC
     sort(table(pedons$texture), decreasing=TRUE)

    ## 
    -##        BR         L      GR-L     GRV-L     CBV-L       SPM     GRX-L       SIL    GRV-CL    CBV-CL    GR-SIL     CBX-L    GRX-CL    CBX-CL   GRV-SIL 
    -##        58        36        33        24        18        14        12        12         9         8         7         6         5         4         4 
    -##        CL   GRV-SCL     GRX-C       MPM        SL      CB-L     GR-CL   GRX-SCL     PGR-C    PGRX-L      SICL    STV-CL     STV-L     STX-C     STX-L 
    -##         3         3         3         3         3         2         2         2         2         2         2         2         2         2         2 
    -##         C      CB-C     CB-CL    CB-SCL    CB-SIL   CBV-SIL   CBX-SCL      CN-L   CN-SICL     CNX-L  CNX-SICL     FLV-L      GR-C    GR-SIC  GRV-SICL 
    -##         1         1         1         1         1         1         1         1         1         1         1         1         1         1         1 
    -##   GRX-SIC   GRX-SIL  PCB-SICL PCBV-SICL     PCN-C   PCNX-CL    PGRV-C   PGRV-CL  PGRX-SCL  PGRX-SIL      ST-L     STV-C    STX-CL  STX-SICL 
    -##         1         1         1         1         1         1         1         1         1         1         1         1         1         1
    +## BR L GR-L GRV-L CBV-L SPM GRX-L SIL GRV-CL CBV-CL GR-SIL CBX-L GRX-CL +## 58 36 33 24 18 14 12 12 9 8 7 6 5 +## CBX-CL GRV-SIL CL GRV-SCL GRX-C MPM SL CB-L GR-CL GRX-SCL PGR-C PGRX-L SICL +## 4 4 3 3 3 3 3 2 2 2 2 2 2 +## STV-CL STV-L STX-C STX-L C CB-C CB-CL CB-SCL CB-SIL CBV-SIL CBX-SCL CN-L CN-SICL +## 2 2 2 2 1 1 1 1 1 1 1 1 1 +## CNX-L CNX-SICL FLV-L GR-C GR-SIC GRV-SICL GRX-SIC GRX-SIL PCB-SICL PCBV-SICL PCN-C PCNX-CL PGRV-C +## 1 1 1 1 1 1 1 1 1 1 1 1 1 +## PGRV-CL PGRX-SCL PGRX-SIL ST-L STV-C STX-CL STX-SICL +## 1 1 1 1 1 1 1

    2.6.7 Logical Operators

    @@ -1537,7 +1570,38 @@

    2.6.10 Dates and Times

    2.7 Exercise 2: O Horizon Thickness

    -

    This exercise will use a synthetic dataset of O horizon thicknesses modeled after https://acsess.onlinelibrary.wiley.com/doi/epdf/10.2136/sh1993.1.0022

    +

    This exercise uses a synthetic transect generated with R code. The 10 hypothetical pedons along the transect have all been described using the a standardized set of horizon designations: Oi, Oe, A, C, Cg. The thicknesses of layers, the depth to gleyed matrix, and soil organic carbon content vary between pedons.

    +

    We will start to examine this dataset graphically, and then will utilize some functions defined for the SoilProfileCollection to extract information from the data.

    +

    +

    The function thicknessOf() can be used to calculate the thickness of horizons matching a regular expression pattern. For example, to calculate the O horizon thickness we can match the pattern "O":

    +
    ohz_thickness <- thicknessOf(ohz, pattern = "O", prefix = "O_")
    +ohz_thickness
    +
    ##      id O_thickness
    +## 1  P-01          23
    +## 2  P-02          40
    +## 3  P-03          37
    +## 4  P-04          42
    +## 5  P-05          24
    +## 6  P-06          45
    +## 7  P-07          43
    +## 8  P-08          33
    +## 9  P-09          47
    +## 10 P-10          42
    +

    We will use the site() LEFT JOIN method to merge the data into the SoilProfileCollection.

    +
    site(ohz) <- ohz_thickness
    +

    Now, let’s plot the profiles in order of cumulative O horizon thickness. We draw lines at 20 and 40cm to indicate the thresholds for histic epipedon and Histosols soil order:

    +
    plotSPC(ohz, plot.order = order(ohz$O_thickness))
    +abline(h = c(20, 40), lty = 2)
    +

    +

    Using the object ohz object we just inspected, answer the following questions using techniques from the previous sections. Check your logic by comparing to the plot above.

    +
      +
    1. Check if any soil organic carbon values are NA. Make a profile sketch (plotSPC()) using organic carbon percentage ("soc") to color the profiles. Then calculate a new column using the function is.na() and use that to color the profiles. Which profiles have missing data? In which horizons?

    2. +
    3. Tabulate unique horizon designations (ohz$name). How many of each horizon designation are present?

    4. +
    5. Use regular expressions to count the number of Cg horizons in the collection.

    6. +
    7. Filter the ohz object using aqp::subset() to select pedons where O_thickness is greater than 20 and less than 40. This is the histic epipedon thickness requirement. How many pedons have a histic epipedon?

    8. +
    9. Filter the ohz object using aqp::subset() to select pedons where O_thickness is greater than 40. This is the Histosols order thickness requirement. How many pedons are Histosols?

    10. +
    +

    Submit an .R script containing code used to answer 1 through 5 to your mentor.

    2.8 fetchNASIS() data checks

    @@ -1555,31 +1619,20 @@

    2.8 fetchNASIS() dat NOTE: some records are missing rock fragment volume

    2.8.1 Inspecting Results

    -

    Here we inspect occurrence of andic soil properties in MT647.

    -

    We will download this “selected set” from the course website as an .rda file to save you the effort of crafting your selected set just for this example.

    -
    example.data.dir <- "C:/workspace2"
    -example.data.path <- file.path(example.data.dir, "mt647.rda")
    -
    -if (!dir.exists(example.data.dir))
    -  dir.create(example.data.dir, recursive = TRUE)
    -
    -download.file("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt647.rda", 
    -              destfile = example.data.path)
    -

    Downloading and installing the above .rda is equivalent to doing NASIS query “_PedonPC_Plus_DataDump_select” (MLRA04 Bozeman) for to fill your selected set for User Site ID: %MT647%, NASIS Site: SSRO_Northwest, NASIS Group: NW-MIS Point Data, followed by mt647 <- fetchNASIS().

    +

    We will analyze occurrence of andic soil properties in pedons from MT647. We will download this “selected set” from the course website from an .rda file to save you the effort of crafting your selected set just for this example.

    +

    Downloading and installing the .rda is equivalent to NASIS query SSRO_Northwest: _PedonPC_Plus_DataDump_select for User Site ID: %MT647%, NASIS Site: SSRO_Northwest, and NASIS Group: NW-MIS Point Data. After populating your NASIS selected set mt647 is created in R with mt647 <- fetchNASIS().

    2.8.1.1 Load Example Data

    -

    To load the sample object data into R, just use load() and the path to the .rda file (example.data.path or "C:/workspace2/mt647.rda")

    -
    # load the sample data
    -example.data.dir <- "C:/workspace2"
    -load(file.path(example.data.dir, "mt647.rda"))
    -
    length(mt647)
    +

    To load the sample object data into R, just use load() and the path to the .rda file. In this case we are using a remote path, so we use url() to open the connection:

    +
    load(url("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt647.rda"))
    +
    length(mt647)
    ## [1] 481
    -
    table(site(mt647)$andic.soil.properties, useNA = "ifany")
    +
    table(site(mt647)$andic.soil.properties, useNA = "ifany")
    ## 
     ## FALSE  TRUE  <NA> 
     ##     2    83   396
    -
    # get just the profiles with andic.soil.properties == TRUE
    -subset(mt647, andic.soil.properties)
    +
    # get just the profiles with andic.soil.properties == TRUE
    +subset(mt647, andic.soil.properties)
    ## SoilProfileCollection with 83 profiles and 446 horizons
     ## profile ID: peiid  |  horizon ID: phiid 
     ## Depth range: 20 - 305 cm
    @@ -1595,13 +1648,20 @@ 

    2.8.1.1 Load Example Data2.8.1.1 Load Example DataWe can compare this to what we see in the NASIS Pedon Diagnostic Features table:

    Any profiles that have have logic errors detected are stored in soilDB.env bad.pedon.ids variable after you run fetchNASIS. If this variable does not exist either you have not run fetchNASIS() in the current session or there are no errors

    -
    # these are the troublesome user pedon IDs
    -get('bad.pedon.ids', envir = soilDB.env)
    -
    ##  [1] "P93-037" "P90-008" "P90-004" "P90-009" "P93-058" "P93-059" "P90-025" "P90-002" "P90-012" "P92-001" "P92-085" "P90-019" "P90-010" "P90-015"
    -## [15] "P91-094" "P92-029" "P92-076" "P93-026" "P93-035" "P93-063" "P93-064" "P93-041" "P93-043" "P93-044" "P93-083" "P93-112" "P93-113" "P93-124"
    -## [29] "P93-001" "P96-007" "P91-025" "P93-078" "P92-044" "P91-112" "P92-038" "P90-018" "P93-057" "P93-084" "P90-016" "P92-063" "P92-048" "P93-052"
    -## [43] "F01-230" "F95-420" "F95-114" "F96-205" "P75-006" "P91-105" "P91-059"
    -
    # by default, rmHzErrors removes the "bad" illogical pedons
    -any(mt647$upedonid %in% get('bad.pedon.ids', envir=soilDB.env))
    +
    # these are the troublesome user pedon IDs
    +get('bad.pedon.ids', envir = soilDB.env)
    +
    ##  [1] "P93-037" "P90-008" "P90-004" "P90-009" "P93-058" "P93-059" "P90-025" "P90-002" "P90-012" "P92-001" "P92-085" "P90-019"
    +## [13] "P90-010" "P90-015" "P91-094" "P92-029" "P92-076" "P93-026" "P93-035" "P93-063" "P93-064" "P93-041" "P93-043" "P93-044"
    +## [25] "P93-083" "P93-112" "P93-113" "P93-124" "P93-001" "P96-007" "P91-025" "P93-078" "P92-044" "P91-112" "P92-038" "P90-018"
    +## [37] "P93-057" "P93-084" "P90-016" "P92-063" "P92-048" "P93-052" "F01-230" "F95-420" "F95-114" "F96-205" "P75-006" "P91-105"
    +## [49] "P91-059"
    +
    # rmHzErrors=TRUE removes the "bad" illogical pedons
    +any(mt647$upedonid %in% get('bad.pedon.ids', envir=soilDB.env))
    ## [1] FALSE

    When fetchNASIS(..., rmHzErrors = TRUE) (the default), any horizons that were omitted from the SoilProfileCollection will be stored in the bad.horizons variable in the soilDB.env environment.

    -
    head(get('bad.horizons', envir=soilDB.env))
    +
    head(get('bad.horizons', envir=soilDB.env))
    ##      peiid   phiid upedonid hzname hzdept hzdepb
     ## 67  868038 4270406  F01-230      E     NA     NA
     ## 68  868038 4270407  F01-230     Bw     NA     NA
    @@ -1639,10 +1700,10 @@ 

    2.8.1.2 Logic Checks for the

    overlaps and gaps ("overlapOrGap")

  • missing depths ("missingDepth")

  • -
    logic_tests <- checkHzDepthLogic(mt647err)
    -
    -# look at first few (look OK; valid == TRUE)
    -head(logic_tests)
    +
    logic_tests <- checkHzDepthLogic(mt647err)
    +
    +# look at first few (look OK; valid == TRUE)
    +head(logic_tests)
    ##    peiid valid depthLogic sameDepth missingDepth overlapOrGap
     ## 1 828138  TRUE      FALSE     FALSE        FALSE        FALSE
     ## 2 828139  TRUE      FALSE     FALSE        FALSE        FALSE
    @@ -1650,8 +1711,8 @@ 

    2.8.1.2 Logic Checks for the

    -
    # these all have overlapOrGap errors
    -head(logic_tests[!logic_tests$valid, ])
    +
    # these all have overlapOrGap errors
    +head(logic_tests[!logic_tests$valid, ])
    ##     peiid valid depthLogic sameDepth missingDepth overlapOrGap
     ## 11 828148 FALSE      FALSE     FALSE        FALSE         TRUE
     ## 23 828160 FALSE      FALSE     FALSE        FALSE         TRUE
    @@ -1659,11 +1720,11 @@ 

    2.8.1.2 Logic Checks for the

    -
    # join the logic test data into the site table
    -site(mt647err) <- logic_tests
    +
    # join the logic test data into the site table
    +site(mt647err) <- logic_tests

    Use the $valid vector in result to filter out profiles with missing depths (logic_tests$valid == FALSE)

    -
    bad.profiles <- subset(mt647err, !valid)
    -bad.profiles
    +
    bad.profiles <- subset(mt647err, !valid)
    +bad.profiles
    ## SoilProfileCollection with 49 profiles and 338 horizons
     ## profile ID: peiid  |  horizon ID: phiid 
     ## Depth range: 15 - 152 cm
    @@ -1679,20 +1740,27 @@ 

    2.8.1.2 Logic Checks for the

    And also filter out the valid ones (logic_tests$valid == TRUE)

    -
    good.profiles <- subset(mt647err, logic_tests$valid)
    -good.profiles
    +
    good.profiles <- subset(mt647err, logic_tests$valid)
    +good.profiles
    ## SoilProfileCollection with 481 profiles and 2536 horizons
     ## profile ID: peiid  |  horizon ID: phiid 
     ## Depth range: 14 - 1552 cm
    @@ -1708,13 +1776,20 @@ 

    2.8.1.2 Logic Checks for the 2.9.1 Elements of get_exten

    2.9.2 Load Example Data

    Below is a summary of additional information that can be readily brought into R from your NASIS selected set via the get_extended_data_from_NASIS() function.

    -

    To download the sample 2015MT663% data from the course page with R:

    -
    example.data.dir <- "C:/workspace2"
    -example.data.path <- file.path(example.data.dir, "mt663.rda")
    -
    -if (!dir.exists(example.data.dir))
    -  dir.create(example.data.dir, recursive = TRUE)
    -
    -download.file("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt663.rda", 
    -              destfile = example.data.path)

    Before continuing, imagine opening the NASIS client, populating your selected set with 2015MT663% using a query like “NSSC Pangaea – POINT-Pedon/Site by User Pedon ID

    Load the data like we did above.

    -
    # load the sample data
    -example.data.dir <- "C:/workspace2"
    -load(file.path(example.data.dir, "mt663.rda"))
    -
    ## fetch extended site and horizon data from local NASIS
    -# mt663ext <- get_extended_data_from_NASIS_db()
    +
    load(url("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt663.rda"))
    +
    ## fetch extended site and horizon data from local NASIS
    +# mt663ext <- get_extended_data_from_NASIS_db()

    We could use the get_extended_data_from_NASIS_db() function if 2015MT663% or other data were in the selected set, but we will use the mt663ext data we loaded from the .rda file.

    The column names are the names of variables that you could join to your site or horizon data by various means. Generally these variable names, with a few exceptions, mirror the NASIS 7 data model names.

    -
    # site and pedon related extended data
    -
    -# list all dataframes in the extended data
    -str(mt663ext, 1)
    +
    # site and pedon related extended data
    +
    +# list all dataframes in the extended data
    +str(mt663ext, 1)
    ## List of 14
     ##  $ ecositehistory:'data.frame':  0 obs. of  7 variables:
     ##  $ siteaoverlap  :'data.frame':  127 obs. of  5 variables:
    @@ -1788,62 +1852,63 @@ 

    2.9.2 Load Example Data
    # vegetation data summary
    -colnames(mt663ext$ecositehistory) 

    +
    # vegetation data summary
    +colnames(mt663ext$ecositehistory) 
    ## [1] "siteiid"                       "ecositeid"                     "ecositenm"                     "ecositecorrdate"              
     ## [5] "es_classifier"                 "siteecositehistory.classifier" "es_selection_method"
    -
    # diagnostic features
    -colnames(mt663ext$diagnostic) 
    +
    # diagnostic features
    +colnames(mt663ext$diagnostic) 
    ## [1] "peiid"    "featkind" "featdept" "featdepb"
    -
    # surface rock fragments
    -colnames(mt663ext$surf_frag_summary)
    +
    # surface rock fragments
    +colnames(mt663ext$surf_frag_summary)
    ## NULL
    -
    # geomorphic description
    -colnames(mt663ext$geomorph)
    -
    ## [1] "peiid"          "geomicrorelief" "geommicelev"    "geomfmod"       "geomfname"      "geomfeatid"     "existsonfeat"   "geomfiidref"   
    -## [9] "geomftname"
    -
    # taxonomic history data
    -colnames(mt663ext$taxhistory)
    -
    ##  [1] "peiid"            "classdate"        "classifier"       "classtype"        "taxonname"        "localphase"       "taxonkind"       
    -##  [8] "seriesstatus"     "taxclname"        "taxpartsize"      "taxorder"         "taxsuborder"      "taxgrtgroup"      "taxsubgrp"       
    -## [15] "soiltaxedition"   "osdtypelocflag"   "taxmoistcl"       "taxtempregime"    "taxfamother"      "taxreaction"      "taxfamhahatmatcl"
    -## [22] "psctopdepth"      "pscbotdepth"
    -
    # linked photo stored in site textnotes
    -colnames(mt663ext$photo) 
    +
    # geomorphic description
    +colnames(mt663ext$geomorph)
    +
    ## [1] "peiid"          "geomicrorelief" "geommicelev"    "geomfmod"       "geomfname"      "geomfeatid"     "existsonfeat"  
    +## [8] "geomfiidref"    "geomftname"
    +
    # taxonomic history data
    +colnames(mt663ext$taxhistory)
    +
    ##  [1] "peiid"            "classdate"        "classifier"       "classtype"        "taxonname"        "localphase"      
    +##  [7] "taxonkind"        "seriesstatus"     "taxclname"        "taxpartsize"      "taxorder"         "taxsuborder"     
    +## [13] "taxgrtgroup"      "taxsubgrp"        "soiltaxedition"   "osdtypelocflag"   "taxmoistcl"       "taxtempregime"   
    +## [19] "taxfamother"      "taxreaction"      "taxfamhahatmatcl" "psctopdepth"      "pscbotdepth"
    +
    # linked photo stored in site textnotes
    +colnames(mt663ext$photo) 
    ## [1] "siteiid"   "recdate"   "textcat"   "imagepath"
    -
    # site parent materials
    -colnames(mt663ext$pm)
    +
    # site parent materials
    +colnames(mt663ext$pm)
    ## [1] "siteiid"    "seqnum"     "pmorder"    "pmdept"     "pmdepb"     "pmmodifier" "pmgenmod"   "pmkind"     "pmorigin"
    -
    ###
    -### horizon related extended data
    -### 
    -
    -# rock fragments 
    -colnames(mt663ext$frag_summary) 
    -
    ##  [1] "phiid"                "fine_gravel"          "gravel"               "cobbles"              "stones"               "boulders"            
    -##  [7] "channers"             "flagstones"           "parafine_gravel"      "paragravel"           "paracobbles"          "parastones"          
    -## [13] "paraboulders"         "parachanners"         "paraflagstones"       "unspecified"          "total_frags_pct_nopf" "total_frags_pct"
    -
    # soil texture modifers
    -colnames(mt663ext$texmodifier)
    +
    ###
    +### horizon related extended data
    +### 
    +
    +# rock fragments 
    +colnames(mt663ext$frag_summary) 
    +
    ##  [1] "phiid"                "fine_gravel"          "gravel"               "cobbles"              "stones"              
    +##  [6] "boulders"             "channers"             "flagstones"           "parafine_gravel"      "paragravel"          
    +## [11] "paracobbles"          "parastones"           "paraboulders"         "parachanners"         "paraflagstones"      
    +## [16] "unspecified"          "total_frags_pct_nopf" "total_frags_pct"
    +
    # soil texture modifers
    +colnames(mt663ext$texmodifier)
    ## [1] "peiid"  "phiid"  "phtiid" "seqnum" "texmod"
    -
    # soil structure data
    -colnames(mt663ext$struct) 
    +
    # soil structure data
    +colnames(mt663ext$struct) 
    ## [1] "phiid"         "structgrade"   "structsize"    "structtype"    "structid"      "structpartsto"

    2.9.3 Visualizing Common Landforms

    The following code generates a simple graphical summary of the 10 most commonly occurring "landform_string" (a calculated field in fetchNASIS()) to inspect which are the most common.

    -
    # load data from a NASIS selected set (or sample object)
    -pedons <- mt663
    -
    -# create 'lf' object of landform factors sorted in descending order
    -lf <- sort(table(pedons$landform_string), decreasing = TRUE)
    -
    -# plot top 10 or length, whichever is shorter
    -Hmisc::dotchart2(lf[1:pmin(10, length(lf))],
    -                 col = 'black',
    -                 xlim = c(0, max(lf)),
    -                 cex.labels = 0.75)
    +
    # load data from a NASIS selected set (or sample object)
    +pedons <- mt663
    +
    +# create 'lf' object of landform factors sorted in descending order
    +lf <- sort(table(pedons$landform_string), decreasing = TRUE)
    +
    +# plot top 10 or length, whichever is shorter
    +Hmisc::dotchart2(lf[1:pmin(10, length(lf))],
    +                 col = 'black',
    +                 xlim = c(0, max(lf)),
    +                 cex.labels = 0.75)

    For a challenge and to further inspect your own data try the above code with some other summaries of geomorphic data produced by fetchNASIS().

    You can swap landform_string for: landscape_string (landscape), hillslopeprof (2D), geomposmntn, geomposhill, geompostrce, geomposflats (3D), slope_shape, shapeacross, shapedown (slope shape across/down), microfeature_string (microfeature), or geomicrorelief_string (site observation microrelief).

    @@ -1858,41 +1923,42 @@

    2.9.4.1 Boolean Diagnostic Featur

    2.9.4.2 Thickness from Diagnostic Features Table

    The following is an example of how you could use the diagnostic features (if populated!) from the extended data to determine the thickness of a diagnostic feature of interest.

    -
    # get diagnostic features associated with pedons loaded from selected set
    -d <- diagnostic_hz(mt663)
    -
    -# summary of the diagnostic features in your data!
    -unique(d$featkind)
    -
    ##  [1] "ochric epipedon"          "cambic horizon"           "lithic contact"           "mollic epipedon"          "argillic horizon"        
    -##  [6] "redox concentrations"     "andic soil properties"    "secondary carbonates"     "sapric soil materials"    "aquic conditions"        
    -## [11] "reduced matrix"           "albic horizon"            "spodic horizon"           "glossic horizon"          "spodic materials"        
    -## [16] "lithologic discontinuity" "densic materials"         "umbric epipedon"          "albic materials"          NA
    -
    # tabulate
    -sort(table(droplevels(factor(d$featkind))), decreasing = TRUE)
    +
    # get diagnostic features associated with pedons loaded from selected set
    +d <- diagnostic_hz(mt663)
    +
    +# summary of the diagnostic features in your data!
    +unique(d$featkind)
    +
    ##  [1] "ochric epipedon"          "cambic horizon"           "lithic contact"           "mollic epipedon"         
    +##  [5] "argillic horizon"         "redox concentrations"     "andic soil properties"    "secondary carbonates"    
    +##  [9] "sapric soil materials"    "aquic conditions"         "reduced matrix"           "albic horizon"           
    +## [13] "spodic horizon"           "glossic horizon"          "spodic materials"         "lithologic discontinuity"
    +## [17] "densic materials"         "umbric epipedon"          "albic materials"          NA
    +
    # tabulate
    +sort(table(droplevels(factor(d$featkind))), decreasing = TRUE)
    ## 
    -##          ochric epipedon           cambic horizon         argillic horizon          mollic epipedon    andic soil properties           lithic contact 
    -##                       61                       54                       43                       42                       30                       20 
    -##     secondary carbonates          umbric epipedon            albic horizon           spodic horizon          glossic horizon           reduced matrix 
    -##                        7                        7                        6                        4                        3                        3 
    -##    sapric soil materials lithologic discontinuity          albic materials         aquic conditions         densic materials     redox concentrations 
    -##                        3                        2                        1                        1                        1                        1 
    -##         spodic materials 
    -##                        1
    -
    # subset argillic horizons
    -d <- d[d$featkind == 'argillic horizon', ]
    -
    -# create a new column and subtract the upper from the lower depth
    -d$argillic_thickness_cm <- d$featdepb - d$featdept
    -
    -# create another new column with the upper depth to the diagnostic feature
    -d$depth_to_argillic_cm <- d$featdept
    -
    -# omit NA values
    -d <- na.omit(d)
    -
    -# subset to pedon records IDs and calculated thickness
    -d <- d[, c('peiid', 'argillic_thickness_cm', 'depth_to_argillic_cm')]
    -head(d)
    +## ochric epipedon cambic horizon argillic horizon mollic epipedon andic soil properties +## 61 54 43 42 30 +## lithic contact secondary carbonates umbric epipedon albic horizon spodic horizon +## 20 7 7 6 4 +## glossic horizon reduced matrix sapric soil materials lithologic discontinuity albic materials +## 3 3 3 2 1 +## aquic conditions densic materials redox concentrations spodic materials +## 1 1 1 1
    +
    # subset argillic horizons
    +d <- d[d$featkind == 'argillic horizon', ]
    +
    +# create a new column and subtract the upper from the lower depth
    +d$argillic_thickness_cm <- d$featdepb - d$featdept
    +
    +# create another new column with the upper depth to the diagnostic feature
    +d$depth_to_argillic_cm <- d$featdept
    +
    +# omit NA values
    +d <- na.omit(d)
    +
    +# subset to pedon records IDs and calculated thickness
    +d <- d[, c('peiid', 'argillic_thickness_cm', 'depth_to_argillic_cm')]
    +head(d)
    ##      peiid argillic_thickness_cm depth_to_argillic_cm
     ## 7  1092610                    56                   30
     ## 24 1092617                    38                   34
    @@ -1900,58 +1966,58 @@ 

    2.9.4.2 Thickness from Diagnostic ## 28 1092619 38 32 ## 30 1092620 29 24 ## 33 1092621 23 19

    -
    # left-join with existing site data
    -site(mt663) <- d
    -
    -# plot as histogram
    -par(mar = c(4.5, 4.5, 1, 1))
    -
    -# note additional arguments to adjust figure labels
    -hist(
    -  mt663$argillic_thickness_cm, 
    -  xlab = 'Thickness of argillic (cm)', 
    -  main = '',
    -  las = 1
    -)
    -

    -
    hist(
    -  mt663$depth_to_argillic_cm, 
    -  xlab = 'Depth to argillic top depth (cm)', 
    -  main = '',
    -  las = 1
    -)
    -

    +
    # left-join with existing site data
    +site(mt663) <- d
    +
    +# plot as histogram
    +par(mar = c(4.5, 4.5, 1, 1))
    +
    +# note additional arguments to adjust figure labels
    +hist(
    +  mt663$argillic_thickness_cm, 
    +  xlab = 'Thickness of argillic (cm)', 
    +  main = '',
    +  las = 1
    +)
    +

    +
    hist(
    +  mt663$depth_to_argillic_cm, 
    +  xlab = 'Depth to argillic top depth (cm)', 
    +  main = '',
    +  las = 1
    +)
    +

    Quick check: What can you do with the boolean diagnostic feature data stored in the site table of a fetchNASIS() SoilProfileCollection?

    2.9.4.3 Diagnostic Feature Diagrams

    -
    # work up diagnostic plot based on the mt663 dataset loaded above
    -library(aqp)
    -library(soilDB)
    -library(sharpshootR)
    -
    -# can limit which diagnostic features to show by setting 'v' manually
    -v <- c('ochric.epipedon', 'mollic.epipedon', 'andic.soil.properties', 
    -       'argillic.horizon', 'cambic.horizon', 
    -       'lithic.contact')
    -
    -# the default concatenated landform_string may have multiple levels
    -#  depending on how the geomorphic tables were populated
    -#  these are concatenated using the ampersand (&) character
    -#  so take the first string split using ampersand as a delimiter
    -mt663$first_landform <- sapply(strsplit(mt663$landform_string, "&"), 
    -                                  function(x) x[[1]])
    -
    -# plot with diagnostic features ordered according to co-occurrence
    -# v: site-level attributes to consider
    -# k: number of clusters to identify
    -diagnosticPropertyPlot(
    -  mt663[1:30, ], v = v, k = 5,
    -  grid.label = 'usiteid', 
    -  dend.label = 'first_landform', 
    -  sort.vars = TRUE
    -)
    -

    +
    # work up diagnostic plot based on the mt663 dataset loaded above
    +library(aqp)
    +library(soilDB)
    +library(sharpshootR)
    +
    +# can limit which diagnostic features to show by setting 'v' manually
    +v <- c('ochric.epipedon', 'mollic.epipedon', 'andic.soil.properties', 
    +       'argillic.horizon', 'cambic.horizon', 
    +       'lithic.contact')
    +
    +# the default concatenated landform_string may have multiple levels
    +#  depending on how the geomorphic tables were populated
    +#  these are concatenated using the ampersand (&) character
    +#  so take the first string split using ampersand as a delimiter
    +mt663$first_landform <- sapply(strsplit(mt663$landform_string, "&"), 
    +                                  function(x) x[[1]])
    +
    +# plot with diagnostic features ordered according to co-occurrence
    +# v: site-level attributes to consider
    +# k: number of clusters to identify
    +diagnosticPropertyPlot(
    +  mt663[1:30, ], v = v, k = 5,
    +  grid.label = 'usiteid', 
    +  dend.label = 'first_landform', 
    +  sort.vars = TRUE
    +)
    +

    @@ -1959,35 +2025,35 @@

    2.9.4.3 Diagnostic Feature Diagra

    2.10 Exercise 3: Diagnostic Horizons in Your Own Data

    Use the following script to generate a diagnostic-feature diagram for the pedon data you’ve loaded from your NASIS selected set. Alternately, you may use the MT663 data from the example above, just substitute the object mt663 for f.

    You can select a subset of desired diagnostic properties or use all diagnostic feature columns.

    -
    library(aqp)
    -library(soilDB)
    -library(sharpshootR)
    -
    -# Load data
    -f <- fetchNASIS(from = 'pedons')
    -
    -# ... May need to use subset() to reduce the number of pedons!
    -
    -# get all diagnostic feature columns from site data 
    -# by pattern matching on '[.]' in the site attribute names
    -# this is not a generic rule, but works here
    -idx <- grep('[.]', siteNames(f))
    -v <- siteNames(f)[idx]
    -
    -# inspect v
    -v
    -
    -# insert diagnostics of interest from the possible list in 'v'
    -v <- c('ochric.epipedon', 'cambic.horizon', 
    -       'argillic.horizon', 'paralithic.contact',
    -       'lithic.contact')
    -
    -# generate diagnostic property diagram
    -diagnosticPropertyPlot(
    -  f, v = v, k = 5, 
    -  grid.label = 'usiteid', 
    -  dend.label = 'taxonname'
    -)
    +
    library(aqp)
    +library(soilDB)
    +library(sharpshootR)
    +
    +# Load data
    +f <- fetchNASIS(from = 'pedons')
    +
    +# ... May need to use subset() to reduce the number of pedons!
    +
    +# get all diagnostic feature columns from site data 
    +# by pattern matching on '[.]' in the site attribute names
    +# this is not a generic rule, but works here
    +idx <- grep('[.]', siteNames(f))
    +v <- siteNames(f)[idx]
    +
    +# inspect v
    +v
    +
    +# insert diagnostics of interest from the possible list in 'v'
    +v <- c('ochric.epipedon', 'cambic.horizon', 
    +       'argillic.horizon', 'paralithic.contact',
    +       'lithic.contact')
    +
    +# generate diagnostic property diagram
    +diagnosticPropertyPlot(
    +  f, v = v, k = 5, 
    +  grid.label = 'usiteid', 
    +  dend.label = 'taxonname'
    +)

    For more information on generating diagnostic feature diagrams, see the following tutorial:

    • Diagnostic Feature Property Plots.
    • @@ -2012,81 +2078,81 @@

      2.11 Custom Queries to Local NASI

      2.11.1 Example: Site Soil Temperature Data from CA792 (Sequoia-Kings Canyon National Park)

      The following example will return all records in your selected set sitesoiltemp table, along with a couple of fields from the site, siteobs, and pedon tables. This is a convenient way to collect all of the field-based soil temperature data associated with the pedons in your selected set for further analysis.

      You can use the CA792 (Sequoia-Kings Canyon National Park) pedons as an example. Use a query that searches user pedon ID for the following pattern %CA792% to download and populate a selected set in the NASIS client.

      -
      library(soilDB)
      -
      -# write query as a character string
      -q <- "SELECT siteiid as siteiid, peiid, usiteid, obsdate, soitemp, soitempdep 
      -       FROM site_View_1
      -       INNER JOIN siteobs_View_1 ON site_View_1.siteiid = siteobs_View_1.siteiidref
      -       LEFT OUTER JOIN sitesoiltemp_View_1 ON siteobs_View_1.siteobsiid = sitesoiltemp_View_1.siteobsiidref
      -       LEFT OUTER JOIN pedon_View_1 ON siteobs_View_1.siteobsiid = pedon_View_1.siteobsiidref
      -      ORDER BY obsdate, siteiid;"
      -
      -# setup connection to local NASIS
      -channel <- NASIS()
      -
      -# exec query
      -d <- dbQueryNASIS(channel, q)
      +
      library(soilDB)
      +
      +# write query as a character string
      +q <- "SELECT siteiid as siteiid, peiid, usiteid, obsdate, soitemp, soitempdep 
      +       FROM site_View_1
      +       INNER JOIN siteobs_View_1 ON site_View_1.siteiid = siteobs_View_1.siteiidref
      +       LEFT OUTER JOIN sitesoiltemp_View_1 ON siteobs_View_1.siteobsiid = sitesoiltemp_View_1.siteobsiidref
      +       LEFT OUTER JOIN pedon_View_1 ON siteobs_View_1.siteobsiid = pedon_View_1.siteobsiidref
      +      ORDER BY obsdate, siteiid;"
      +
      +# setup connection to local NASIS
      +channel <- NASIS()
      +
      +# exec query
      +d <- dbQueryNASIS(channel, q)

      The functions dbConnectNASIS() (alias NASIS()) and dbQueryNASIS() allow you to create a connection to the NASIS local database and send queries to that connection, respectively. By default, dbQueryNASIS() will close your connection after completing the query; you can change this by setting close=FALSE.

      -
      # check results
      -str(d)
      -
      -# remove records missing values
      -d <- na.omit(d)
      -
      -# tabulate unique soil depths
      -table(d$soitempdep)
      -
      -# extract doy of year
      -d$doy <- as.integer(format(d$obsdate, "%j"))
      -
      -# when where measurements collected?
      -hist(
      -  d$doy,
      -  xlim = c(1, 366),
      -  las = 1,
      -  main = 'Soil Temperature Measurements',
      -  xlab = 'Day of Year'
      -)
      -
      -# soil temperature by day of year
      -plot(
      -  soitemp ~ doy,
      -  data = d,
      -  main = 'Soil Temperature Measurements (CA792)\nNASIS "Site Soil Temperature" table',
      -  type = 'p',
      -  pch = 21, 
      -  bg = 'royalblue',
      -  xlim = c(1, 366),
      -  ylim = c(-1, 26),
      -  xlab = 'Day of Year',
      -  ylab = 'Soil Temperature at 50cm (deg C)',
      -  las = 1
      -)
      -
      -# vernal equinox, summer solstice, autumnal equinox, winter solstice
      -x <- as.Date(c('2022-03-20', '2022-06-21', '2022-09-23', '2022-12-21'))
      -
      -# convert dates -> Julian date, or day-of-year
      -doy <- as.integer(format(x, "%j"))
      -
      -# add vertical lines
      -abline(v = doy, lty = 3, col = grey(0.45))
      -
      -# annotate
      -# pos argument: left-center offset
      -text(
      -  x = doy, 
      -  y = -1, 
      -  labels = c('vernal equinox', 'summer solstice', 'autumnal equinox', 'winter solstice'), 
      -  pos = 2,
      -  cex = 0.75,
      -  font = 3
      -)
      -
      -# box/whisker plot showing distribution of day-of-year 
      -# when measurements (pedon descriptions) were collected
      -boxplot(d$doy, at = 26, horizontal = TRUE, add = TRUE, lty = 1, width = 1, col = 'white', axes = FALSE)
      +
      # check results
      +str(d)
      +
      +# remove records missing values
      +d <- na.omit(d)
      +
      +# tabulate unique soil depths
      +table(d$soitempdep)
      +
      +# extract doy of year
      +d$doy <- as.integer(format(d$obsdate, "%j"))
      +
      +# when where measurements collected?
      +hist(
      +  d$doy,
      +  xlim = c(1, 366),
      +  las = 1,
      +  main = 'Soil Temperature Measurements',
      +  xlab = 'Day of Year'
      +)
      +
      +# soil temperature by day of year
      +plot(
      +  soitemp ~ doy,
      +  data = d,
      +  main = 'Soil Temperature Measurements (CA792)\nNASIS "Site Soil Temperature" table',
      +  type = 'p',
      +  pch = 21, 
      +  bg = 'royalblue',
      +  xlim = c(1, 366),
      +  ylim = c(-1, 26),
      +  xlab = 'Day of Year',
      +  ylab = 'Soil Temperature at 50cm (deg C)',
      +  las = 1
      +)
      +
      +# vernal equinox, summer solstice, autumnal equinox, winter solstice
      +x <- as.Date(c('2022-03-20', '2022-06-21', '2022-09-23', '2022-12-21'))
      +
      +# convert dates -> Julian date, or day-of-year
      +doy <- as.integer(format(x, "%j"))
      +
      +# add vertical lines
      +abline(v = doy, lty = 3, col = grey(0.45))
      +
      +# annotate
      +# pos argument: left-center offset
      +text(
      +  x = doy, 
      +  y = -1, 
      +  labels = c('vernal equinox', 'summer solstice', 'autumnal equinox', 'winter solstice'), 
      +  pos = 2,
      +  cex = 0.75,
      +  font = 3
      +)
      +
      +# box/whisker plot showing distribution of day-of-year 
      +# when measurements (pedon descriptions) were collected
      +boxplot(d$doy, at = 26, horizontal = TRUE, add = TRUE, lty = 1, width = 1, col = 'white', axes = FALSE)

      +

    diff --git a/book/eda.html b/book/eda.html index 0ddc8b9a..2c98fbe6 100644 --- a/book/eda.html +++ b/book/eda.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@
  • 4.17.1 Raster Summary By Point: NASIS Pedon Locations
  • 4.17.2 Raster Summary By Polygon: Series Extent
  • 4.17.3 Raster Summary By Polygon: MLRA
  • -
  • 4.17.4 Example: Faster with exactextractr
  • +
  • 4.17.4 Zonal Statistics with exactextractr
  • 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
  • 4.18 Additional Reading (Spatial)
  • @@ -513,54 +513,54 @@

    3.2 Statistics

    3.3 Data Inspection

    Before you start an EDA, you should inspect your data and correct all typos and blatant errors. EDA can then be used to identify additional errors such as outliers and help you determine the appropriate statistical analyses. For this chapter we’ll use the loafercreek dataset from the CA630 Soil Survey Area.

    -
    library(dplyr)
    -
    -# Load from the the loakercreek dataset
    -data("loafercreek", package = "soilDB") 
    -
    -# Extract the horizon table
    -h <- aqp::horizons(loafercreek)
    -
    -# Construct generalized horizon designations
    -n <- c("A",
    -       "BAt",
    -       "Bt1",
    -       "Bt2",
    -       "Cr",
    -       "R")
    -# REGEX rules
    -p <- c("A",
    -       "BA|AB",
    -       "Bt|Bw",
    -       "Bt3|Bt4|2B|C",
    -       "Cr",
    -       "R")
    -
    -# Compute genhz labels and add to loafercreek dataset
    -h$genhz <- aqp::generalize.hz(h$hzname, n, p)
    -
    -# Examine genhz vs hznames (wide format)
    -table(h$genhz, h$hzname)
    +
    library(dplyr)
    +
    +# Load from the the loakercreek dataset
    +data("loafercreek", package = "soilDB") 
    +
    +# Extract the horizon table
    +h <- aqp::horizons(loafercreek)
    +
    +# Construct generalized horizon designations
    +n <- c("A",
    +       "BAt",
    +       "Bt1",
    +       "Bt2",
    +       "Cr",
    +       "R")
    +# REGEX rules
    +p <- c("A",
    +       "BA|AB",
    +       "Bt|Bw",
    +       "Bt3|Bt4|2B|C",
    +       "Cr",
    +       "R")
    +
    +# Compute genhz labels and add to loafercreek dataset
    +h$genhz <- aqp::generalize.hz(h$hzname, n, p)
    +
    +# Examine genhz vs hznames (wide format)
    +table(h$genhz, h$hzname)
    ##           
    -##            2BC 2BCt 2Bt1 2Bt2 2Bt3 2Bt4 2Bt5 2CB 2CBt 2Cr 2Crt 2R  A A1 A2 AB ABt Ad Ap  B BA BAt BC BCt Bt Bt1 Bt2 Bt3 Bt4 Bw Bw1 Bw2 Bw3  C CBt Cd Cr
    -##   A          0    0    0    0    0    0    0   0    0   0    0  0 97  7  7  0   0  1  1  0  0   0  0   0  0   0   0   0   0  0   0   0   0  0   0  0  0
    -##   BAt        0    0    0    0    0    0    0   0    0   0    0  0  0  0  0  1   0  0  0  0 31   8  0   0  0   0   0   0   0  0   0   0   0  0   0  0  0
    -##   Bt1        0    0    0    0    0    0    0   0    0   0    0  0  0  0  0  0   2  0  0  0  0   0  0   0  8  93  88   0   0 10   2   2   1  0   0  0  0
    -##   Bt2        1    1    3    8    8    6    1   1    1   0    0  0  0  0  0  0   0  0  0  0  0   0  4  16  0   0   0  47   8  0   0   0   0  6   6  1  0
    -##   Cr         0    0    0    0    0    0    0   0    0   4    2  0  0  0  0  0   0  0  0  0  0   0  0   0  0   0   0   0   0  0   0   0   0  0   0  0 49
    -##   R          0    0    0    0    0    0    0   0    0   0    0  6  0  0  0  0   0  0  0  0  0   0  0   0  0   0   0   0   0  0   0   0   0  0   0  0  0
    -##   not-used   0    0    0    0    0    0    0   0    0   0    0  0  0  0  0  0   0  0  0  1  0   0  0   0  0   0   0   0   0  0   0   0   0  0   0  0  0
    +##            2BC 2BCt 2Bt1 2Bt2 2Bt3 2Bt4 2Bt5 2CB 2CBt 2Cr 2Crt 2R  A A1 A2 AB ABt Ad Ap  B BA BAt BC BCt Bt Bt1 Bt2 Bt3 Bt4 Bw Bw1
    +##   A          0    0    0    0    0    0    0   0    0   0    0  0 97  7  7  0   0  1  1  0  0   0  0   0  0   0   0   0   0  0   0
    +##   BAt        0    0    0    0    0    0    0   0    0   0    0  0  0  0  0  1   0  0  0  0 31   8  0   0  0   0   0   0   0  0   0
    +##   Bt1        0    0    0    0    0    0    0   0    0   0    0  0  0  0  0  0   2  0  0  0  0   0  0   0  8  93  88   0   0 10   2
    +##   Bt2        1    1    3    8    8    6    1   1    1   0    0  0  0  0  0  0   0  0  0  0  0   0  4  16  0   0   0  47   8  0   0
    +##   Cr         0    0    0    0    0    0    0   0    0   4    2  0  0  0  0  0   0  0  0  0  0   0  0   0  0   0   0   0   0  0   0
    +##   R          0    0    0    0    0    0    0   0    0   0    0  6  0  0  0  0   0  0  0  0  0   0  0   0  0   0   0   0   0  0   0
    +##   not-used   0    0    0    0    0    0    0   0    0   0    0  0  0  0  0  0   0  0  0  1  0   0  0   0  0   0   0   0   0  0   0
     ##           
    -##            Cr/R Crt H1 Oi  R Rt
    -##   A           0   0  0  0  0  0
    -##   BAt         0   0  0  0  0  0
    -##   Bt1         0   0  0  0  0  0
    -##   Bt2         0   0  0  0  0  0
    -##   Cr          0  20  0  0  0  0
    -##   R           1   0  0  0 40  1
    -##   not-used    0   0  1 24  0  0
    -
    # Examine matching pairs (long format)
    -h %>% group_by(genhz, hzname) %>% count()
    +## Bw2 Bw3 C CBt Cd Cr Cr/R Crt H1 Oi R Rt +## A 0 0 0 0 0 0 0 0 0 0 0 0 +## BAt 0 0 0 0 0 0 0 0 0 0 0 0 +## Bt1 2 1 0 0 0 0 0 0 0 0 0 0 +## Bt2 0 0 6 6 1 0 0 0 0 0 0 0 +## Cr 0 0 0 0 0 49 0 20 0 0 0 0 +## R 0 0 0 0 0 0 1 0 0 0 40 1 +## not-used 0 0 0 0 0 0 0 0 1 24 0 0
    +
    # Examine matching pairs (long format)
    +h %>% group_by(genhz, hzname) %>% count()
    ## # A tibble: 43 × 3
     ## # Groups:   genhz, hzname [43]
     ##    genhz hzname     n
    @@ -577,11 +577,11 @@ 

    3.3 Data Inspection
    View(h) 
    +
    View(h) 

    This view is fine for a small dataset, but can be cumbersome for larger ones. The summary() function can be used to quickly summarize a dataset however, even for our small example dataset, the output can be voluminous. Therefore in the interest of saving space we’ll only look at a sample of columns.

    -
    h %>%
    -  select(genhz, claytotest, total_frags_pct, phfield, effclass) %>%
    -  summary()
    +
    h %>%
    +  select(genhz, claytotest, total_frags_pct, phfield, effclass) %>%
    +  summary()
    ##       genhz       claytotest    total_frags_pct    phfield       effclass        
     ##  A       :113   Min.   :10.00   Min.   : 0.00   Min.   :4.90   Length:626        
     ##  BAt     : 40   1st Qu.:18.00   1st Qu.: 0.00   1st Qu.:6.00   Class :character  
    @@ -598,16 +598,16 @@ 

    3.3 Data Inspection
    # just for factors
    -levels(h$genhz)
    +
    # just for factors
    +levels(h$genhz)
    ## [1] "A"        "BAt"      "Bt1"      "Bt2"      "Cr"       "R"        "not-used"
    -
    # for characters and factors
    -sort(unique(h$hzname)) 
    -
    ##  [1] "2BC"  "2BCt" "2Bt1" "2Bt2" "2Bt3" "2Bt4" "2Bt5" "2CB"  "2CBt" "2Cr"  "2Crt" "2R"   "A"    "A1"   "A2"   "AB"   "ABt"  "Ad"   "Ap"   "B"    "BA"  
    -## [22] "BAt"  "BC"   "BCt"  "Bt"   "Bt1"  "Bt2"  "Bt3"  "Bt4"  "Bw"   "Bw1"  "Bw2"  "Bw3"  "C"    "CBt"  "Cd"   "Cr"   "Cr/R" "Crt"  "H1"   "Oi"   "R"   
    -## [43] "Rt"
    +
    # for characters and factors
    +sort(unique(h$hzname)) 
    +
    ##  [1] "2BC"  "2BCt" "2Bt1" "2Bt2" "2Bt3" "2Bt4" "2Bt5" "2CB"  "2CBt" "2Cr"  "2Crt" "2R"   "A"    "A1"   "A2"   "AB"   "ABt"  "Ad"  
    +## [19] "Ap"   "B"    "BA"   "BAt"  "BC"   "BCt"  "Bt"   "Bt1"  "Bt2"  "Bt3"  "Bt4"  "Bw"   "Bw1"  "Bw2"  "Bw3"  "C"    "CBt"  "Cd"  
    +## [37] "Cr"   "Cr/R" "Crt"  "H1"   "Oi"   "R"    "Rt"

    If the unique() function returned typos such as “BT” or “B t”, you could either fix your original dataset or you could make an adjustment in R, such as:

    -
    h$hzname <- ifelse(h$hzname == "BT", "Bt", h$hzname)
    +
    h$hzname <- ifelse(h$hzname == "BT", "Bt", h$hzname)

    Typo errors such as these are a common problem with old pedon data in NASIS.

    @@ -619,14 +619,14 @@

    3.4 Exercise 1: Fetch and Inspect
  • Summarize the hzdept, genhz, texture_class, sandtotest, and fine gravel.
  • Save your R script, and forward to your instructor.
  • -
    # gopheridge rules
    -n <- c('A', 'Bt1', 'Bt2', 'Bt3','Cr','R')
    -p <- c('^A|BA$', 'Bt1|Bw','Bt$|Bt2', 'Bt3|CBt$|BCt','Cr','R')
    +
    # gopheridge rules
    +n <- c('A', 'Bt1', 'Bt2', 'Bt3','Cr','R')
    +p <- c('^A|BA$', 'Bt1|Bw','Bt$|Bt2', 'Bt3|CBt$|BCt','Cr','R')

    3.5 Descriptive Statistics

    - +@@ -685,30 +685,30 @@

    3.5.1 Measures of Central Tendenc

    These measures are used to determine the mid-point of the range of observed values. In NASIS speak this should ideally be equivalent to the representative value (RV) for numeric and integer data. The mean and median are the most commonly used measures for our purposes.

    Mean - is the arithmetic average all are familiar with, formally expressed as: \(\bar{x} =\frac{\sum_{i=1}^{n}x_i}{n}\) which sums ( \(\sum\) ) all the X values in the sample and divides by the number (n) of samples. It is assumed that all references in this document refer to samples rather than a population.

    The mean clay content from the loafercreek dataset may be determined:

    -
    mean(h$claytotest, na.rm = TRUE)
    +
    mean(h$claytotest, na.rm = TRUE)
    ## [1] 23.62767

    Median is the middle measurement of a sample set, and as such is a more robust estimate of central tendency than the mean. This is known as the middle or 50th quantile, meaning there are an equal number of samples with values less than and greater than the median. For example, assuming there are 21 samples, sorted in ascending order, the median would be the 11th sample.

    The median from the sample dataset may be determined:

    -
    median(h$claytotest, na.rm = TRUE)
    +
    median(h$claytotest, na.rm = TRUE)
    ## [1] 22

    Mode - is the most frequent measurement in the sample. The use of mode is typically reserved for factors, which we will discuss shortly. One issue with using the mode for numeric data is that the data need to be rounded to the level of desired precision. R does not include a function for calculating the mode, but we can calculate it using the following example.

    -
    # sort and select the 1st value, which will be the mode
    -sort(table(round(h$claytotest)), decreasing = TRUE)[1] 
    +
    # sort and select the 1st value, which will be the mode
    +sort(table(round(h$claytotest)), decreasing = TRUE)[1] 
    ## 25 
     ## 42

    Frequencies

    To summarize factors and characters we can examine their frequency or number of observations. This is accomplished using the table() or summary() functions.

    -
    table(h$genhz)
    +
    table(h$genhz)
    ## 
     ##        A      BAt      Bt1      Bt2       Cr        R not-used 
     ##      113       40      206      118       75       48       26
    -
    # or
    -
    -summary(h$genhz)
    +
    # or
    +
    +summary(h$genhz)
    ##        A      BAt      Bt1      Bt2       Cr        R not-used 
     ##      113       40      206      118       75       48       26

    This gives us a count of the number of observations for each horizon. If we want to see the comparison between two different factors or characters, we can include two variables.

    -
    table(h$genhz, h$texcl)
    +
    table(h$genhz, h$texcl)
    ##           
     ##              c  cl   l scl sic sicl sil  sl
     ##   A          0   0  78   0   0    0  27   6
    @@ -718,10 +718,10 @@ 

    3.5.1 Measures of Central Tendenc ## Cr 1 0 0 0 0 0 0 0 ## R 0 0 0 0 0 0 0 0 ## not-used 0 1 0 0 0 0 0 0

    -
    # or
    -
    -h %>% 
    -  count(genhz, texcl)
    +
    # or
    +
    +h %>% 
    +  count(genhz, texcl)
    ##       genhz texcl   n
     ## 1         A     l  78
     ## 2         A   sil  27
    @@ -756,8 +756,8 @@ 

    3.5.1 Measures of Central Tendenc ## 31 not-used cl 1 ## 32 not-used <NA> 25

    We can also add margin totals to the table or convert the table frequencies to proportions.

    -
    # append the table with row and column sums
    -addmargins(table(h$genhz, h$texcl))
    +
    # append the table with row and column sums
    +addmargins(table(h$genhz, h$texcl))
    ##           
     ##              c  cl   l scl sic sicl sil  sl Sum
     ##   A          0   0  78   0   0    0  27   6 111
    @@ -768,10 +768,10 @@ 

    3.5.1 Measures of Central Tendenc ## R 0 0 0 0 0 0 0 0 0 ## not-used 0 1 0 0 0 0 0 0 1 ## Sum 19 101 265 9 2 9 56 8 469

    -
    # calculate the proportions relative to the rows, margin = 1 calculates for rows, margin = 2 calculates for columns, margin = NULL calculates for total observations
    -table(h$genhz, h$texture_class) %>%
    -  prop.table(margin = 1) %>%
    -  round(2) * 100
    +
    # calculate the proportions relative to the rows, margin = 1 calculates for rows, margin = 2 calculates for columns, margin = NULL calculates for total observations
    +table(h$genhz, h$texture_class) %>%
    +  prop.table(margin = 1) %>%
    +  round(2) * 100
    ##           
     ##             br   c  cb  cl  gr   l  pg scl sic sicl sil  sl spm
     ##   A          0   0   0   0   0  70   0   0   0    0  24   5   0
    @@ -782,10 +782,10 @@ 

    3.5.1 Measures of Central Tendenc ## R 100 0 0 0 0 0 0 0 0 0 0 0 0 ## not-used 0 0 0 4 0 0 0 0 0 0 0 0 96

    To determine the mean by a group or category, use the group_by and summarize functions:

    -
    h %>%
    -  group_by(genhz) %>%
    -  summarize(clay_avg = mean(claytotest, na.rm = TRUE),
    -            clay_med = median(claytotest, na.rm = TRUE))
    +
    h %>%
    +  group_by(genhz) %>%
    +  summarize(clay_avg = mean(claytotest, na.rm = TRUE),
    +            clay_med = median(claytotest, na.rm = TRUE))
    ## # A tibble: 7 × 3
     ##   genhz    clay_avg clay_med
     ##   <fct>       <dbl>    <dbl>
    @@ -803,95 +803,98 @@ 

    3.5.2 Measures of DispersionVariance is a positive value indicating deviation from the mean:

    \(s^2 = \frac{\sum_{i=1}^{n}(x_i - \bar{x})^2} {n - 1}\)

    This is the square of the sum of the deviations from the mean, divided by the number of samples minus 1. It is commonly referred to as the sum of squares. As the deviation increases, the variance increases. Conversely, if there is no deviation, the variance will equal 0. As a squared value, variance is always positive. Variance is an important component for many statistical analyses including the most commonly referred to measure of dispersion, the standard deviation. Variance for the sample dataset is:

    -
    var(h$claytotest, na.rm=TRUE)
    +
    var(h$claytotest, na.rm=TRUE)
    ## [1] 64.27607

    Standard Deviation is the square root of the variance:

    \(s = \sqrt\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2} {n - 1}\)

    The units of the standard deviation are the same as the units measured. From the formula you can see that the standard deviation is simply the square root of the variance. Standard deviation for the sample dataset is:

    -
    sd(h$claytotest, na.rm = TRUE)
    +
    sd(h$claytotest, na.rm = TRUE)
    ## [1] 8.017236
    -
    # or
    -
    -sqrt(var(h$claytotest, na.rm = TRUE))
    +
    # or
    +
    +sqrt(var(h$claytotest, na.rm = TRUE))
    ## [1] 8.017236

    Coefficient of Variation (CV) is a relative (i.e., unitless) measure of standard deviation:

    \(CV = \frac{s}{\bar{x}} \times 100\)

    CV is calculated by dividing the standard deviation by the mean and multiplying by 100. Since standard deviation varies in magnitude with the value of the mean, the CV is useful for comparing relative variation amongst different datasets. However Webster (2001) discourages using CV to compare different variables. Webster (2001) also stresses that CV is reserved for variables that have an absolute 0, like clay content. CV may be calculated for the sample dataset as:

    -
    # remove NA values and create a new variable
    -clay <- na.exclude(h$claytotest)
    -
    -sd(clay) / mean(clay) * 100
    +
    # remove NA values and create a new variable
    +clay <- na.exclude(h$claytotest)
    +
    +sd(clay) / mean(clay) * 100
    ## [1] 33.93156

    Quantiles (a.k.a. Percentiles) - the percentile is the value that cuts off the first nth percent of the data values when sorted in ascending order.

    The default for the quantile() function returns the min, 25th percentile, median or 50th percentile, 75th percentile, and max, known as the five number summary originally proposed by Tukey. Other probabilities however can be used. At present the 5th, 50th, and 95th are being proposed for determining the range in characteristics (RIC) for a given soil property.

    -
    quantile(h$claytotest, na.rm = TRUE)
    +
    quantile(h$claytotest, na.rm = TRUE)
    ##   0%  25%  50%  75% 100% 
     ##   10   18   22   28   60
    -
    # or
    -
    -quantile(h$claytotest, probs = c(0.05, 0.5, 0.95), na.rm = TRUE)
    +
    # or
    +
    +quantile(h$claytotest, probs = c(0.05, 0.5, 0.95), na.rm = TRUE)
    ##   5%  50%  95% 
     ## 13.0 22.0 38.1

    Thus, for the five number summary 25% of the observations fall between each of the intervals. Quantiles are a useful metric because they are largely unaffected by the distribution of the data, and have a simple interpretation.

    Range is the difference between the highest and lowest measurement of a group. Using the sample data it may be determined as:

    -
    range(clay)
    +
    range(clay)
    ## [1] 10 60

    which returns the minimum and maximum values observed, or:

    -
    diff(range(clay))
    +
    diff(range(clay))
    ## [1] 50
    -
    # or
    -
    -max(clay) - min(clay)
    +
    # or
    +
    +max(clay) - min(clay)
    ## [1] 50

    Interquartile Range (IQR) is the range from the upper (75%) quartile to the lower (25%) quartile. This represents 50% of the observations occurring in the mid-range of a sample. IQR is a robust measure of dispersion, unaffected by the distribution of data. In soil survey lingo you could consider the IQR to estimate the central concept of a soil property. IQR may be calculated for the sample dataset as:

    -
    IQR(clay)
    +
    IQR(clay)
    ## [1] 10
    -
    # or
    -
    -diff(quantile(clay, p = c(0.25, 0.75)))
    +
    # or
    +
    +diff(quantile(clay, p = c(0.25, 0.75)))
    ## 75% 
     ##  10

    3.5.3 Weighted Summaries

    -

    Weighted Mean - is the weighted arithmetic average. In the ordinary arithmetic average, each data point is assigned the same weight, whereas in a weighted mean the contribution of each data point to the final average can vary.

    +

    Weighted Mean - is the weighted arithmetic average. In the ordinary arithmetic average, each data point is assigned the same weight, whereas in a weighted average the contribution of each data point to the mean can vary.

    The function weighted.mean() takes two major inputs: x, a vector of data values, and w, a vector of weights. Like other statistics, you can remove missing values with na.rm=TRUE.

    -
    # calculate horizon thickness
    -h$hzthk <- h$hzdepb - h$hzdept
    -
    -# weighted mean (across all horizons and profiles)
    -weighted.mean(h$claytotest, h$hzthk, na.rm = TRUE)
    +
    # calculate horizon thickness
    +h$hzthk <- h$hzdepb - h$hzdept
    +
    +# weighted mean (across all horizons and profiles)
    +weighted.mean(h$claytotest, h$hzthk, na.rm = TRUE)
    ## [1] 25.24812
    -

    The above example is a little contrived since it is applied to all profiles and all horizons: so we only get one value out across 106 profiles and 626 horizons.

    -

    More commonly use the weighted mean to depth-weighted averages for individual pedons or components and mapunit averages. Depth-weighted averages commonly use horizon thicknesses as weights. Mapunit averages commonly use component percentages as weights. In other cases the weights may be derived from expert knowledge or some other source when we want to scale the contribution of particular observations or variables to a final result.

    +

    The above example is a little contrived since it is applied to all profiles and all horizons. We only get one value out across 106 profiles and 626 horizons.

    +

    More commonly we use the weighted mean for depth-weighted averages in individual pedons or components and, also, for mapunit averages.

    +

    Depth-weighted averages commonly use horizon thicknesses as weights. Mapunit averages commonly use component percentages as weights.

    +

    When we want to scale the contribution of particular observations or variables to a final result, weights may be derived from expert knowledge or some other data source.

    3.5.3.1 Profile-specific Weighted Calculations

    -

    A more practical application of weighted.mean() is Particle Size Control Section weighted average properties. For this we need to use the horizon thickness within the control section as weights.

    +

    A more practical application of weighted.mean() is Particle Size Control Section (PSCS) weighted average properties. For this we need to use the horizon thickness within the control section as weights.

    The aqp function trunc() allows you to remove portions of profiles that are outside specified depth intervals (such as the PSCS boundaries). profileApply() allows for iterating over all profiles in a SoilProfileCollection to call some function on each one.

    Here we calculate the PSCS weighted mean clay content for each profile in loafercreek:

    -
    # calculate a "truncated" SPC with just the PSCS; drop = FALSE retains empty profiles for missing PSCS
    -loafercreek_pscs <- trunc(loafercreek, loafercreek$psctopdepth, loafercreek$pscbotdepth, drop = FALSE)
    -
    -# calculate weighted mean for each profile, using the truncated horizon thicknesses as weights
    -loafercreek$pscs_clay <- profileApply(loafercreek_pscs, function(p) {
    -  weighted.mean(p$claytotest, w = p$hzdepb - p$hzdept, na.rm = TRUE)
    -})
    -
    -# inspect
    -loafercreek$pscs_clay
    -
    ##   [1] 28.76471 28.76471 25.88000      NaN 16.00000 37.32000 32.63415      NaN 33.78571 29.57576 29.00000 23.02632 25.28000 23.36364 26.25000 34.12000
    -##  [17] 47.69565 30.73171 28.32609 32.00000 27.12500 27.76316 25.00000 28.60870 23.39535 22.32000 24.10000 20.91600 22.52000 20.48780 44.38000 37.88000
    -##  [33] 28.70000 28.80000 36.46000 23.78000 30.72000 24.33333 23.76000 21.78000 28.72727 20.83871 19.56000 25.48000 28.92000 33.95122 20.18000 18.86486
    -##  [49] 18.12500 25.56000 17.34000 25.84000 19.00000 28.37500 27.10870 24.72000 26.20370 25.13514 26.00000 24.38000 24.20000 26.24000 27.44444 29.90000
    -##  [65] 24.00000 42.08000 28.34000 29.36842 23.10000 24.56818 29.10000 24.16000 28.82000      NaN 18.77500      NaN 45.82917 25.25161      NaN 20.50000
    -##  [81] 21.28889 24.86000 32.34000 33.36585 31.04000 23.05405 17.22000 26.52000 29.22000 20.00000 24.60000 19.74000 18.25000 20.70000 31.84000 21.97959
    -##  [97] 32.44737 29.56000      NaN 22.09412 21.34000 27.46154 26.68000 20.10526 31.00000 22.65000
    -

    Note that several of these pedons have NaN values in the result. This can happen even with na.rm=TRUE because pedons either do not have both psctopdepth and pscbotdepth populated in NASIS or all horizons in the PSCS have NA clay content.

    -
    # inspect new site-level column pscs_clay
    -head(site(loafercreek)[, c("peiid", "upedonid", "psctopdepth", "pscbotdepth", "pscs_clay")])
    +
    # calculate a "truncated" SPC with just the PSCS; drop = FALSE retains empty profiles for missing PSCS
    +loafercreek_pscs <- trunc(loafercreek, loafercreek$psctopdepth, loafercreek$pscbotdepth, drop = FALSE)
     
    -# plot just the pedons with missing pscs_clay
    -plot(subset(loafercreek, is.na(pscs_clay)), color = "claytotest")
    +# calculate weighted mean for each profile, using the truncated horizon thicknesses as weights +loafercreek$pscs_clay <- profileApply(loafercreek_pscs, function(p) { + weighted.mean(p$claytotest, w = p$hzdepb - p$hzdept, na.rm = TRUE) +}) + +# inspect +loafercreek$pscs_clay
    +
    ##   [1] 28.76471 28.76471 25.88000      NaN 16.00000 37.32000 32.63415      NaN 33.78571 29.57576 29.00000 23.02632 25.28000 23.36364
    +##  [15] 26.25000 34.12000 47.69565 30.73171 28.32609 32.00000 27.12500 27.76316 25.00000 28.60870 23.39535 22.32000 24.10000 20.91600
    +##  [29] 22.52000 20.48780 44.38000 37.88000 28.70000 28.80000 36.46000 23.78000 30.72000 24.33333 23.76000 21.78000 28.72727 20.83871
    +##  [43] 19.56000 25.48000 28.92000 33.95122 20.18000 18.86486 18.12500 25.56000 17.34000 25.84000 19.00000 28.37500 27.10870 24.72000
    +##  [57] 26.20370 25.13514 26.00000 24.38000 24.20000 26.24000 27.44444 29.90000 24.00000 42.08000 28.34000 29.36842 23.10000 24.56818
    +##  [71] 29.10000 24.16000 28.82000      NaN 18.77500      NaN 45.82917 25.25161      NaN 20.50000 21.28889 24.86000 32.34000 33.36585
    +##  [85] 31.04000 23.05405 17.22000 26.52000 29.22000 20.00000 24.60000 19.74000 18.25000 20.70000 31.84000 21.97959 32.44737 29.56000
    +##  [99]      NaN 22.09412 21.34000 27.46154 26.68000 20.10526 31.00000 22.65000
    +

    Note that several of these pedons have NaN values in the result. This can happen even with na.rm=TRUE because pedons either do not have both psctopdepth and pscbotdepth populated in NASIS or all horizons in the PSCS have NA clay content.

    +
    # inspect new site-level column pscs_clay
    +head(site(loafercreek)[, c("peiid", "upedonid", "psctopdepth", "pscbotdepth", "pscs_clay")])
    +
    +# plot just the pedons with missing pscs_clay
    +plot(subset(loafercreek, is.na(pscs_clay)), color = "claytotest")

    You always need to pay attention to the possibility of missing data or weights because missing values can dramatically the final result–sometimes in unexpected ways!

    @@ -903,12 +906,12 @@

    3.5.3.2 Other Weighted Statistics

    3.5.4 Correlation

    A correlation matrix is a table of the calculated correlation coefficients of all variables. This provides a quantitative measure to guide the decision making process. The following will produce a correlation matrix for the sp4 dataset:

    -
    h$hzdepm <- (h$hzdepb + h$hzdept) / 2 # Compute the middle horizon depth
    -
    -h %>%
    -  select(hzdepm, claytotest, sandtotest, total_frags_pct, phfield) %>%
    -  cor(use = "complete.obs") %>%
    -  round(2)
    +
    h$hzdepm <- (h$hzdepb + h$hzdept) / 2 # Compute the middle horizon depth
    +
    +h %>%
    +  select(hzdepm, claytotest, sandtotest, total_frags_pct, phfield) %>%
    +  cor(use = "complete.obs") %>%
    +  round(2)
    ##                 hzdepm claytotest sandtotest total_frags_pct phfield
     ## hzdepm            1.00       0.59      -0.08            0.50   -0.03
     ## claytotest        0.59       1.00      -0.17            0.28    0.13
    @@ -1026,25 +1029,25 @@ 

    3.7.1 Distributions

    3.7.2 Bar Plot

    A bar plot is a graphical display of the frequency (i.e. number of observations (count or n)), such as soil texture, that fall within a given class. It is a graphical alternative to to the table() function.

    -
    library(ggplot2)
    -
    -# bar plot
    -ggplot(h, aes(x = texcl)) +
    -  geom_bar()
    +
    library(ggplot2)
    +
    +# bar plot
    +ggplot(h, aes(x = texcl)) +
    +  geom_bar()

    3.7.3 Histogram

    A histogram is similar to a bar plot, except that instead of summarizing categorical data, it categorizes a continuous variable like clay content into non-overlappying intervals for the sake of display. The number of intervals can be specified by the user, or can be automatically determined using an algorithm, such as nclass.Sturges(). Since histograms are dependent on the number of bins, for small datasets they’re not the best method of determining the shape of a distribution.

    -
    ggplot(h, aes(x = claytotest)) +
    -  geom_histogram(bins = nclass.Sturges(h$claytotest))
    +
    ggplot(h, aes(x = claytotest)) +
    +  geom_histogram(bins = nclass.Sturges(h$claytotest))

    3.7.4 Density Curve

    A density estimation, also known as a Kernel density plot, generally provides a better visualization of the shape of the distribution in comparison to the histogram. Compared to the histogram where the y-axis represents the number or percent (i.e., frequency) of observations, the y-axis for the density plot represents the probability of observing any given value, such that the area under the curve equals one. One curious feature of the density curve is the hint of two peaks (i.e. bimodal distribution?). Given that our sample includes a mixture of surface and subsurface horizons, we may have two different populations. However, considering how much the two distributions overlap, it seems impractical to separate them in this instance.

    -
    ggplot(h, aes(x = claytotest)) +
    -  geom_density()
    +
    ggplot(h, aes(x = claytotest)) +
    +  geom_density()

    @@ -1053,24 +1056,24 @@

    3.7.5 Box plots

    -
    ggplot(h, aes(x = genhz, y = claytotest)) +
    -  geom_boxplot()
    +
    ggplot(h, aes(x = genhz, y = claytotest)) +
    +  geom_boxplot()

    The above box plot shows a steady increase in clay content with depth. Notice the outliers in the box plots, identified by the individual circles.

    3.7.6 Quantile comparison plots (QQplot)

    A QQ plot is a plot of the actual data values against a normal distribution (which has a mean of 0 and standard deviation of 1).

    -
    # QQ Plot for Clay
    -ggplot(h, aes(sample = claytotest)) + 
    -  geom_qq() +
    -  geom_qq_line()
    -

    -
    # QQ Plot for Frags
    -ggplot(h, aes(sample = total_frags_pct)) + 
    -  geom_qq() +
    -  geom_qq_line()
    -

    +
    # QQ Plot for Clay
    +ggplot(h, aes(sample = claytotest)) + 
    +  geom_qq() +
    +  geom_qq_line()
    +

    +
    # QQ Plot for Frags
    +ggplot(h, aes(sample = total_frags_pct)) + 
    +  geom_qq() +
    +  geom_qq_line()
    +

    If the data set is perfectly symmetric (i.e. normal), the data points will form a straight line. Overall this plot shows that our clay example is more or less symmetric. However the second plot shows that our rock fragments are far from evenly distributed.

    A more detailed explanation of QQ plots may be found on Wikipedia:
    https://en.wikipedia.org/wiki/QQ_plot

    @@ -1088,14 +1091,14 @@

    3.7.7 The ‘Normal’ distributi
  • 68% of the area under the curve is within one standard deviation of the mean
  • Approximately 95% of the area of a Gaussian distribution is within two standard deviations of the mean
  • -

    +

    Viewing a histogram or density plot of your data provides a quick visual reference for determining normality. Distributions are typically normal, Bimodal or Skewed:

    Examples of different types of distributions
    Examples of different types of distributions

    Occasionally distributions are Uniform, or nearly so:

    -

    +

    With the loafercreek dataset the mean and median for clay were only slightly different, so we can safely assume that we have a normal distribution. However many soil variables often have a non-normal distribution. For example, let’s look at graphical examination of the mean vs. median for clay and rock fragments:

    The solid lines represent the breakpoint for the mean and standard deviations. The dashed lines represents the median and quantiles. The median is a more robust measure of central tendency compared to the mean. In order for the mean to be a useful measure, the data distribution must be approximately normal. The further the data departs from normality, the less meaningful the mean becomes.

    @@ -1104,94 +1107,94 @@

    3.7.7 The ‘Normal’ distributi

    3.7.8 Scatterplots and Line Plots

    -

    +

    Plotting points of one ratio or interval variable against another is a scatter plot. Plots can be produced for a single or multiple pairs of variables. Many independent variables are often under consideration in soil survey work. This is especially common when GIS is used, which offers the potential to correlate soil attributes with a large variety of raster datasets.

    The purpose of a scatterplot is to see how one variable relates to another. With modeling in general the goal is parsimony (i.e., simple). The goal is to determine the fewest number of variables required to explain or describe a relationship. If two variables explain the same thing, i.e., they are highly correlated, only one variable is needed. The scatterplot provides a perfect visual reference for this.

    Create a basic scatter plot using the loafercreek dataset.

    -
    # scatter plot
    -ggplot(h, aes(x = claytotest, y = hzdepm)) +
    -  geom_point() +
    -  ylim(100, 0)
    -

    -
    # line plot
    -ggplot(h, aes(y = claytotest, x = hzdepm, group = peiid)) +
    -  geom_line() +
    -  coord_flip() +
    -  xlim(100, 0)
    -

    +
    # scatter plot
    +ggplot(h, aes(x = claytotest, y = hzdepm)) +
    +  geom_point() +
    +  ylim(100, 0)
    +

    +
    # line plot
    +ggplot(h, aes(y = claytotest, x = hzdepm, group = peiid)) +
    +  geom_line() +
    +  coord_flip() +
    +  xlim(100, 0)
    +

    This plots clay on the X axis and depth on the X axis. As shown in the scatterplot above, there is a moderate correlation between these variables.

    The function below produces a scatterplot matrix for all the numeric variables in the dataset. This is a good command to use for determining rough linear correlations for continuous variables.

    -
    library(GGally)
    -  
    -h %>%
    -  select(hzdepm, claytotest, phfield, total_frags_pct) %>%
    -  ggpairs()
    -

    +
    library(GGally)
    +  
    +h %>%
    +  select(hzdepm, claytotest, phfield, total_frags_pct) %>%
    +  ggpairs()
    +

    3.7.9 3rd Dimension - Color, Shape, Size, Layers, etc…

    -

    +

    3.7.9.1 Color and Groups

    -
    # scatter plot
    -ggplot(h, aes(x = claytotest, y = hzdepm, color = genhz)) +
    -  geom_point(size = 3) +
    -  ylim(100, 0)
    +
    # scatter plot
    +ggplot(h, aes(x = claytotest, y = hzdepm, color = genhz)) +
    +  geom_point(size = 3) +
    +  ylim(100, 0)

    -
    # density plot
    -ggplot(h, aes(x = claytotest, color = genhz)) +
    -  geom_density(size = 2)
    +
    # density plot
    +ggplot(h, aes(x = claytotest, color = genhz)) +
    +  geom_density(size = 2)

    -
    # bar plot
    -ggplot(h, aes(x = genhz, fill = texture_class)) +
    -  geom_bar()
    +
    # bar plot
    +ggplot(h, aes(x = genhz, fill = texture_class)) +
    +  geom_bar()

    -
    # box plot
    -ggplot(h, aes(x = genhz, y = claytotest)) + 
    -  geom_boxplot()
    +
    # box plot
    +ggplot(h, aes(x = genhz, y = claytotest)) + 
    +  geom_boxplot()

    -
    # heat map (pseudo bar plot)
    -s <- aqp::site(loafercreek)
    -
    -ggplot(s, aes(x = landform_string, y = pmkind)) + 
    -  geom_tile(alpha = 0.2) 
    +
    # heat map (pseudo bar plot)
    +s <- aqp::site(loafercreek)
    +
    +ggplot(s, aes(x = landform_string, y = pmkind)) + 
    +  geom_tile(alpha = 0.2) 

    3.7.9.2 Facets - box plots

    -
    library(tidyr)
    -
    -# convert to long format
    -df <- h %>% 
    -  select(peiid, genhz, hzdepm, claytotest, phfield, total_frags_pct) %>% 
    -  pivot_longer(cols = c("claytotest", "phfield", "total_frags_pct"))
    -
    -ggplot(df, aes(x = genhz, y = value)) +
    -  geom_boxplot() +
    -  xlab("genhz") +
    -  facet_wrap(~ name, scales = "free_y")
    +
    library(tidyr)
    +
    +# convert to long format
    +df <- h %>% 
    +  select(peiid, genhz, hzdepm, claytotest, phfield, total_frags_pct) %>% 
    +  pivot_longer(cols = c("claytotest", "phfield", "total_frags_pct"))
    +
    +ggplot(df, aes(x = genhz, y = value)) +
    +  geom_boxplot() +
    +  xlab("genhz") +
    +  facet_wrap(~ name, scales = "free_y")

    3.7.9.3 Facets - depth plots

    -
    data(loafercreek, package = "soilDB")
    -
    -s <- aqp::slab(loafercreek, 
    -               fm = ~ claytotest + phfield + total_frags_pct,
    -               slab.structure = 0:100,
    -               slab.fun = function(x) quantile(x, c(0.1, 0.5, 0.9), na.rm = TRUE))
    -
    -ggplot(s, aes(x = top, y = X50.)) +
    -  # plot median
    -  geom_line() +
    -  # plot 10th & 90th quantiles
    -  geom_ribbon(aes(ymin = X10., ymax = X90., x = top), alpha = 0.2) +
    -  # invert depths
    -  xlim(c(100, 0)) +
    -  # flip axis
    -  coord_flip() +
    -  facet_wrap(~ variable, scales = "free_x")
    -

    +
    data(loafercreek, package = "soilDB")
    +
    +s <- aqp::slab(loafercreek, 
    +               fm = ~ claytotest + phfield + total_frags_pct,
    +               slab.structure = 0:100,
    +               slab.fun = function(x) quantile(x, c(0.1, 0.5, 0.9), na.rm = TRUE))
    +
    +ggplot(s, aes(x = top, y = X50.)) +
    +  # plot median
    +  geom_line() +
    +  # plot 10th & 90th quantiles
    +  geom_ribbon(aes(ymin = X10., ymax = X90., x = top), alpha = 0.2) +
    +  # invert depths
    +  xlim(c(100, 0)) +
    +  # flip axis
    +  coord_flip() +
    +  facet_wrap(~ variable, scales = "free_x")
    +

    @@ -1211,90 +1214,90 @@

    3.9 Transformations3.9.1 pH

    There is a recurring debate as to the best way to average pH since is it a log transformed variable. Remember, pHs of 6 and 5 correspond to hydrogen ion concentrations of 0.000001 and 0.00001 respectively. The actual average is 5.26; -log10((0.000001 + 0.00001) / 2). If no conversions are made for pH, the mean and sd in the summary are considered the geometric mean and sd, not the arithmetic. The wider the pH range, the greater the difference between the geometric and arithmetic mean. The difference between the arithmetic average of 5.26 and the geometric average of 5.5 is small. Boyd, Tucker, and Viriyatum (2011) examined the issue in detail, and suggests that regardless of the method is used it should be documented.

    If you have a table with pH values and wish to calculate the arithmetic mean using R, this example will work:

    -
    # arithmetic mean
    -log10(mean(1/10^-h$phfield, na.rm = TRUE)) 
    +
    # arithmetic mean
    +log10(mean(1/10^-h$phfield, na.rm = TRUE)) 
    ## [1] 6.371026
    -
    # geometric mean
    -mean(h$phfield, na.rm = TRUE) 
    +
    # geometric mean
    +mean(h$phfield, na.rm = TRUE) 
    ## [1] 6.18

    3.9.2 Circular data

    Slope aspect - requires the use of circular statistics for numerical summaries, or graphical interpretation using circular plots. For example, if soil map units being summarized have a uniform distribution of slope aspects ranging from 335 degrees to 25 degrees, the Zonal Statistics tool in ArcGIS would return a mean of 180.

    The most intuitive means available for evaluating and describing slope aspect are circular plots available with the circular package in R and the radial plot option in the TEUI Toolkit. The circular package in R will also calculate circular statistics like mean, median, quartiles etc.

    -
    library(circular)
    -
    -# Extract the site table
    -s <- aqp::site(loafercreek) 
    -
    -aspect <- s$aspect_field
    -aspect <- circular(aspect, template="geographic", units="degrees", modulo="2pi")
    -
    -summary(aspect)
    +
    library(circular)
    +
    +# Extract the site table
    +s <- aqp::site(loafercreek) 
    +
    +aspect <- s$aspect_field
    +aspect <- circular(aspect, template="geographic", units="degrees", modulo="2pi")
    +
    +summary(aspect)
    ##        n     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      Rho     NA's 
     ## 101.0000  12.0000 255.0000 195.0000 199.5000 115.0000  20.0000   0.1772   5.0000

    The numeric output is fine, but a following graphic is more revealing, which shows the dominant Southwest slope aspect.

    -
    rose.diag(aspect, bins = 8, col="grey")
    -

    +
    rose.diag(aspect, bins = 8, col="grey")
    +

    3.9.3 Texture Class and Fine-earth Separates

    Many pedon descriptions include soil texture class and modifiers, but lack numeric estimates such as clay content and rock fragments percentage. This lack of “continuous” numeric data makes it difficult to analyze and estimate certain properties precisely.

    While numeric data on textural separates may be missing, it can still be estimated by the class ranges and averages. NASIS has many calculations used to estimate missing values. To facilitate this process in R, several new functions have recently been added to the aqp package. These new aqp functions are intended to impute missing values or check existing values. The ssc_to_texcl() function uses the same logic as the particle size estimator calculation in NASIS to classify sand and clay into texture class. The results are stored in data(soiltexture) and used by texcl_to_ssc() as a lookup table to convert texture class to sand, silt and clay. The function texcl_to_ssc() replicates the functionality described by Levi (2017). Unlike the other functions, texture_to_taxpartsize() is intended to be computed on weighted averages within the family particle size control section. Below is a demonstration of these new aqp R functions.

    -
    library(aqp)
    -library(soiltexture)
    -
    -# example of texcl_to_ssc(texcl)
    -texcl <- c("s", "ls", "l", "cl", "c")
    -test <- texcl_to_ssc(texcl)
    -head(cbind(texcl, test))
    -
    -# example of ssc_to_texcl()
    -ssc <- data.frame(
    -  CLAY = c(55, 33, 18, 6, 3),
    -  SAND = c(20, 33, 42, 82, 93),
    -  SILT = c(25, 34, 40, 12, 4)
    -)
    -
    -texcl <- ssc_to_texcl(sand = ssc$SAND, clay = ssc$CLAY)
    -ssc_texcl <- cbind(ssc, texcl)
    -head(ssc_texcl)
    -
    -# plot on a textural triangle
    -TT.plot(
    -  class.sys = "USDA-NCSS.TT",
    -  tri.data = ssc_texcl,
    -  pch = 16,
    -  col = "blue"
    -)
    -
    -# example of texmod_to_fragvoltol()
    -frags <- c("gr", "grv", "grx", "pgr", "pgrv", "pgrx")
    -test <- texmod_to_fragvoltot(frags)[1:4]
    -head(test)
    -
    -# example of texture_to_taxpartsize()
    -tex <- data.frame(
    -  texcl = c("c", "cl", "l", "ls", "s"),
    -  clay  = c(55, 33, 18, 6, 3),
    -  sand  = c(20, 33, 42, 82, 93),
    -  fragvoltot = c(35, 15, 34, 60, 91)
    -)
    -
    -tex$fpsc <- texture_to_taxpartsize(
    -  texcl = tex$texcl,
    -  clay = tex$clay,
    -  sand = tex$sand,
    -  fragvoltot = tex$fragvoltot
    -)
    -
    -head(tex)
    +
    library(aqp)
    +library(soiltexture)
    +
    +# example of texcl_to_ssc(texcl)
    +texcl <- c("s", "ls", "l", "cl", "c")
    +test <- texcl_to_ssc(texcl)
    +head(cbind(texcl, test))
    +
    +# example of ssc_to_texcl()
    +ssc <- data.frame(
    +  CLAY = c(55, 33, 18, 6, 3),
    +  SAND = c(20, 33, 42, 82, 93),
    +  SILT = c(25, 34, 40, 12, 4)
    +)
    +
    +texcl <- ssc_to_texcl(sand = ssc$SAND, clay = ssc$CLAY)
    +ssc_texcl <- cbind(ssc, texcl)
    +head(ssc_texcl)
    +
    +# plot on a textural triangle
    +TT.plot(
    +  class.sys = "USDA-NCSS.TT",
    +  tri.data = ssc_texcl,
    +  pch = 16,
    +  col = "blue"
    +)
    +
    +# example of texmod_to_fragvoltol()
    +frags <- c("gr", "grv", "grx", "pgr", "pgrv", "pgrx")
    +test <- texmod_to_fragvoltot(frags)[1:4]
    +head(test)
    +
    +# example of texture_to_taxpartsize()
    +tex <- data.frame(
    +  texcl = c("c", "cl", "l", "ls", "s"),
    +  clay  = c(55, 33, 18, 6, 3),
    +  sand  = c(20, 33, 42, 82, 93),
    +  fragvoltot = c(35, 15, 34, 60, 91)
    +)
    +
    +tex$fpsc <- texture_to_taxpartsize(
    +  texcl = tex$texcl,
    +  clay = tex$clay,
    +  sand = tex$sand,
    +  fragvoltot = tex$fragvoltot
    +)
    +
    +head(tex)

    3.10 The Shiny Package

    Shiny is an R package which combines R programming with the interactivity of the web.

    -
    install.packages("shiny")
    +
    install.packages("shiny")

    Methods for Use

    • Online
    • @@ -1357,48 +1360,48 @@

      3.10.5 Shiny App EmbeddingShiny apps are extremely versatile, they can be embedded into presentations, Markdown, or HTML Those same formats can also be embedded in to a shiny app. This is a very simple example of a shiny app which consists of an interactive dropdown menu which controls what region is displayed in the bar chart. Let’s take a look at the code.

      3.10.5.1 Shiny App Code

      -
      shinyApp(
      -  
      -  # Use a fluid Bootstrap layout
      -  ui = fluidPage(    
      -    
      -    # Give the page a title
      -    titlePanel("Telephones by region"),
      -    
      -    # Generate a row with a sidebar
      -    sidebarLayout(      
      -      
      -      # Define the sidebar with one input
      -      sidebarPanel(
      -        selectInput("region", "Region:", 
      -                    choices = colnames(datasets::WorldPhones)), 
      -        hr(),
      -        helpText("Data from AT&T (1961) The World's Telephones.")
      -      ),
      -      
      -      # Create a spot for the barplot
      -      mainPanel(
      -        plotOutput("phonePlot")  
      -      )
      -      
      -    )
      -  ),
      -  # Define a server function for the Shiny app
      -  server = function(input, output) {
      -    
      -    # Fill in the spot we created for a plot
      -    output$phonePlot <- renderPlot({
      -      
      -      # Render a barplot
      -      barplot(
      -        datasets::WorldPhones[, input$region] * 1000,
      -        main = input$region,
      -        ylab = "Number of Telephones",
      -        xlab = "Year"
      -      )
      -    })
      -  }
      -)
      +
      shinyApp(
      +  
      +  # Use a fluid Bootstrap layout
      +  ui = fluidPage(    
      +    
      +    # Give the page a title
      +    titlePanel("Telephones by region"),
      +    
      +    # Generate a row with a sidebar
      +    sidebarLayout(      
      +      
      +      # Define the sidebar with one input
      +      sidebarPanel(
      +        selectInput("region", "Region:", 
      +                    choices = colnames(datasets::WorldPhones)), 
      +        hr(),
      +        helpText("Data from AT&T (1961) The World's Telephones.")
      +      ),
      +      
      +      # Create a spot for the barplot
      +      mainPanel(
      +        plotOutput("phonePlot")  
      +      )
      +      
      +    )
      +  ),
      +  # Define a server function for the Shiny app
      +  server = function(input, output) {
      +    
      +    # Fill in the spot we created for a plot
      +    output$phonePlot <- renderPlot({
      +      
      +      # Render a barplot
      +      barplot(
      +        datasets::WorldPhones[, input$region] * 1000,
      +        main = input$region,
      +        ylab = "Number of Telephones",
      +        xlab = "Year"
      +      )
      +    })
      +  }
      +)

      Shiny apps consist of a ui and a server. The ui is the part of the shiny app the user sees, the user interface. In the ui, a user can choose or enter inputs for processing and viewing the results. The server takes the inputs, performs some data processing and rendering of those inputs and generates the outputs for the ui to display.

    @@ -1476,35 +1479,56 @@

    3.12 soilReportshttps://github.com/ncss-tech/soilReports#choose-an-available-report

    Install the soilReports package. This package is updated regularly and should be installed from GitHub.

    -
    # Install the soilReports package from GitHub
    -remotes::install_github("ncss-tech/soilReports", dependencies = FALSE, build = FALSE)
    +
    # Install the soilReports package from GitHub
    +remotes::install_github("ncss-tech/soilReports", dependencies = FALSE, build = FALSE)

    To view the list of available reports first load the package then use the listReports() function.

    -
    # Load the soilReports package
    -library(soilReports)
    -
    -# List reports
    -listReports()
    -
    ##                                     name version                                                                                           description
    -## 1                     national/DT-report     1.0                                                         Create interactive data tables from CSV files
    -## 2             national/NASIS-site-export     1.0                                                                   Export NASIS Sites to Spatial Layer
    -## 3  region11/component_summary_by_project     0.1                                                          summarize component data for an MLRA project
    -## 4      region11/lab_summary_by_taxonname     1.0                                                         summarize lab data from NASIS Lab Layer table
    -## 5  region11/mupolygon_summary_by_project     0.1                                                          summarize mupolygon layer from a geodatabase
    -## 6    region11/pedon_summary_by_taxonname     1.1                                                         summarize field pedons from NASIS pedon table
    -## 7                       region2/dmu-diff     0.7                                                                        Differences between select DMU
    -## 8                    region2/dmu-summary     0.4                                                                                    DMU Summary Report
    -## 9             region2/edit-soil-features   0.2.1                                Generate summaries of NASIS components for EDIT Soil Features sections
    -## 10                   region2/gdb-acreage     1.0                                                            Geodatabase Mapunit Acreage Summary Report
    -## 11       region2/mlra-comparison-dynamic     0.1                                    compare MLRA/LRU-scale delineations, based on mu-comparison report
    -## 12               region2/mlra-comparison     2.0                                                  compare MLRA using pre-made, raster sample databases
    -## 13       region2/mu-comparison-dashboard   0.0.0            interactively subset and summarize SSURGO data for input to `region2/mu-comparison` report
    -## 14                 region2/mu-comparison   4.0.3                     compare stack of raster data, sampled from polygons associated with 1-8 map units
    -## 15                    region2/mu-summary       1                                     summarize raster data for a large collection of map unit polygons
    -## 16                 region2/pedon-summary     1.0                                      Generate summaries from NASIS pedons and associated spatial data
    -## 17                    region2/QA-summary     0.6                                                                                     QA Summary Report
    -## 18           region2/shiny-pedon-summary     1.1                        Interactively subset and summarize NASIS pedon data from one or more map units
    -## 19                region2/spatial-pedons     1.0 Visualize NASIS pedons in interactive HTML report with overlays of SSURGO, STATSGO or custom polygons
    -## 20                     templates/minimal     1.0                                                                        A minimal soilReports template
    +
    # Load the soilReports package
    +library(soilReports)
    +
    +# List reports
    +listReports()
    +
    ##                                     name version
    +## 1                     national/DT-report     1.0
    +## 2             national/NASIS-site-export     1.0
    +## 3  region11/component_summary_by_project     0.1
    +## 4      region11/lab_summary_by_taxonname     1.0
    +## 5  region11/mupolygon_summary_by_project     0.1
    +## 6    region11/pedon_summary_by_taxonname     1.1
    +## 7                       region2/dmu-diff     0.7
    +## 8                    region2/dmu-summary     0.4
    +## 9             region2/edit-soil-features   0.2.1
    +## 10                   region2/gdb-acreage     1.0
    +## 11       region2/mlra-comparison-dynamic     0.1
    +## 12               region2/mlra-comparison     2.0
    +## 13       region2/mu-comparison-dashboard   0.0.0
    +## 14                 region2/mu-comparison   4.0.3
    +## 15                    region2/mu-summary       1
    +## 16                 region2/pedon-summary     1.0
    +## 17                    region2/QA-summary     0.6
    +## 18           region2/shiny-pedon-summary     1.1
    +## 19                region2/spatial-pedons     1.0
    +## 20                     templates/minimal     1.0
    +##                                                                                              description
    +## 1                                                          Create interactive data tables from CSV files
    +## 2                                                                    Export NASIS Sites to Spatial Layer
    +## 3                                                           summarize component data for an MLRA project
    +## 4                                                          summarize lab data from NASIS Lab Layer table
    +## 5                                                           summarize mupolygon layer from a geodatabase
    +## 6                                                          summarize field pedons from NASIS pedon table
    +## 7                                                                         Differences between select DMU
    +## 8                                                                                     DMU Summary Report
    +## 9                                 Generate summaries of NASIS components for EDIT Soil Features sections
    +## 10                                                            Geodatabase Mapunit Acreage Summary Report
    +## 11                                    compare MLRA/LRU-scale delineations, based on mu-comparison report
    +## 12                                                  compare MLRA using pre-made, raster sample databases
    +## 13            interactively subset and summarize SSURGO data for input to `region2/mu-comparison` report
    +## 14                     compare stack of raster data, sampled from polygons associated with 1-8 map units
    +## 15                                     summarize raster data for a large collection of map unit polygons
    +## 16                                      Generate summaries from NASIS pedons and associated spatial data
    +## 17                                                                                     QA Summary Report
    +## 18                        Interactively subset and summarize NASIS pedon data from one or more map units
    +## 19 Visualize NASIS pedons in interactive HTML report with overlays of SSURGO, STATSGO or custom polygons
    +## 20                                                                        A minimal soilReports template

    3.12.1 Extending soilReports

    Each report in soilReports has a “manifest” that describes any dependencies, configuration files or inputs for your R Markdown report document. If you can identify these things it is easy to convert your own R-based analyses to the soilReports format.

    @@ -1532,7 +1556,7 @@

    3.13.2 Instructions
    copyReport(reportName = "region11/lab_summary_by_taxonname", outputDir = "C:/workspace2/lab_sum")

    +
    copyReport(reportName = "region11/lab_summary_by_taxonname", outputDir = "C:/workspace2/lab_sum")
    1. Examine the report folder contents.
    @@ -1553,22 +1577,22 @@

    3.13.2 Instructions
    # Set report parameters
    -series <- "Miami"
    -genhz_rules <- "C:/workspace2/lab_sum/Miami_rules.R"
    -
    -# report file path
    -report_path <- "C:/workspace2/lab_sum/report.Rmd"
    -
    -# Run the report
    -render(input = report_path, 
    -       output_dir = "C:/workspace2", 
    -       output_file = "C:/workspace2/lab_sum.html", 
    -       envir = new.env(), 
    -       params = list(series = series,
    -                     genhz_rules = genhz_rules
    -                     )
    -       )
    +
    # Set report parameters
    +series <- "Miami"
    +genhz_rules <- "C:/workspace2/lab_sum/Miami_rules.R"
    +
    +# report file path
    +report_path <- "C:/workspace2/lab_sum/report.Rmd"
    +
    +# Run the report
    +render(input = report_path, 
    +       output_dir = "C:/workspace2", 
    +       output_file = "C:/workspace2/lab_sum.html", 
    +       envir = new.env(), 
    +       params = list(series = series,
    +                     genhz_rules = genhz_rules
    +                     )
    +       )

    Manual approach

    Open the report.Rmd, hit the Knit drop down arrow, and select Knit with Parameters.

    @@ -1601,21 +1625,21 @@

    3.14 Exercise 6: Run Shiny Pedon
    1. Create an instance of the region2/shiny-pedon-summary report with soilReports:
    -
    # create new instance of reports 
    -library(soilReports)
    -
    -# set path for shiny-pedon-summary report instance
    -shinyped.path <- "C:/workspace2/chapter3/shiny-pedon"
    -
    -# create directories (if needed)
    -if(!dir.exists(shinyped.path))
    -  dir.create(shinyped.path, recursive = TRUE)
    -
    -# get report dependencies
    -reportSetup('region2/shiny-pedon-summary')
    -
    -# copy report contents to target path
    -copyReport('region2/shiny-pedon-summary', outputDir = shinyped.path, overwrite = TRUE)
    +
    # create new instance of reports 
    +library(soilReports)
    +
    +# set path for shiny-pedon-summary report instance
    +shinyped.path <- "C:/workspace2/chapter3/shiny-pedon"
    +
    +# create directories (if needed)
    +if(!dir.exists(shinyped.path))
    +  dir.create(shinyped.path, recursive = TRUE)
    +
    +# get report dependencies
    +reportSetup('region2/shiny-pedon-summary')
    +
    +# copy report contents to target path
    +copyReport('region2/shiny-pedon-summary', outputDir = shinyped.path, overwrite = TRUE)
    1. Update the config.R file
    @@ -1641,39 +1665,39 @@

    3.15 Exercise 7: Run Mapunit Comp
    1. Download the demo data:
    -
    # set up ch4 path and path for report
    -mucomp.path <- "C:/workspace2/chapter3/mucomp"
    -
    -# create any directories that may be missing
    -if(!dir.exists(mucomp.path)) {
    -  dir.create(mucomp.path, recursive = TRUE)
    -}
    -
    -mucomp.zip <- file.path(mucomp.path, 'mucomp-data.zip')
    -
    -# download raster data, SSURGO clip from CA630, and sample script for clipping your own raster data 
    -download.file('https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_3-mucomp-data/mucomp-data.zip', mucomp.zip)
    -
    -unzip(mucomp.zip, exdir = mucomp.path, overwrite = TRUE)
    +
    # set up ch4 path and path for report
    +mucomp.path <- "C:/workspace2/chapter3/mucomp"
    +
    +# create any directories that may be missing
    +if(!dir.exists(mucomp.path)) {
    +  dir.create(mucomp.path, recursive = TRUE)
    +}
    +
    +mucomp.zip <- file.path(mucomp.path, 'mucomp-data.zip')
    +
    +# download raster data, SSURGO clip from CA630, and sample script for clipping your own raster data 
    +download.file('https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_3-mucomp-data/mucomp-data.zip', mucomp.zip)
    +
    +unzip(mucomp.zip, exdir = mucomp.path, overwrite = TRUE)
    1. Create an instance of the region2/mu-comparison report with soilReports:
    -
    # create new instance of reports 
    -library(soilReports)
    -
    -# get report dependencies
    -reportSetup('region2/mu-comparison')
    -
    -# create report instance
    -copyReport('region2/mu-comparison', outputDir = mucomp.path, overwrite = TRUE)
    +
    # create new instance of reports 
    +library(soilReports)
    +
    +# get report dependencies
    +reportSetup('region2/mu-comparison')
    +
    +# create report instance
    +copyReport('region2/mu-comparison', outputDir = mucomp.path, overwrite = TRUE)

    If you want, you can now set up the default config.R that is created by copyReport() to work with your own data. OR you can use the “sample” config.R file (called new_config.R) in the ZIP file downloaded above.

    1. Run this code to replace the default config.R with the sample data config.R:
    -
    # copy config file containing relative paths to rasters downloaded above
    -file.copy(from = file.path(mucomp.path, "new_config.R"), 
    -          to = file.path(mucomp.path, "config.R"), 
    -          overwrite = TRUE)
    +
    # copy config file containing relative paths to rasters downloaded above
    +file.copy(from = file.path(mucomp.path, "new_config.R"), 
    +          to = file.path(mucomp.path, "config.R"), 
    +          overwrite = TRUE)
    1. Open report.Rmd in the C:/workspace2/chapter3/mucomp folder and click the “Knit” button at the top of the RStudio source pane to run the report.

    2. Inspect the report output HTML file, as well as the spatial and tabular data output in the output folder.

    3. diff --git a/book/index.html b/book/index.html index 305863f4..3a0423b2 100644 --- a/book/index.html +++ b/book/index.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@
    4. 4.17.1 Raster Summary By Point: NASIS Pedon Locations
    5. 4.17.2 Raster Summary By Polygon: Series Extent
    6. 4.17.3 Raster Summary By Polygon: MLRA
    7. -
    8. 4.17.4 Example: Faster with exactextractr
    9. +
    10. 4.17.4 Zonal Statistics with exactextractr
    11. 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
    12. 4.18 Additional Reading (Spatial)
    13. @@ -468,7 +468,7 @@

      Pre-course Assignment

      diff --git a/book/intro.html b/book/intro.html index f043f411..ae0dfb9b 100644 --- a/book/intro.html +++ b/book/intro.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@
    14. 4.17.1 Raster Summary By Point: NASIS Pedon Locations
    15. 4.17.2 Raster Summary By Polygon: Series Extent
    16. 4.17.3 Raster Summary By Polygon: MLRA
    17. -
    18. 4.17.4 Example: Faster with exactextractr
    19. +
    20. 4.17.4 Zonal Statistics with exactextractr
    21. 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
    22. 4.18 Additional Reading (Spatial)
    23. diff --git a/book/reference-keys.txt b/book/reference-keys.txt index 403f02a5..a6b6ba3d 100644 --- a/book/reference-keys.txt +++ b/book/reference-keys.txt @@ -1,4 +1,4 @@ -tab:unnamed-chunk-88 +tab:unnamed-chunk-90 tab:graphical-descriptions tab:graphical-functions create-workspace @@ -234,7 +234,9 @@ exercise-4-extracting-raster-data raster-summary-by-point-nasis-pedon-locations raster-summary-by-polygon-series-extent raster-summary-by-polygon-mlra -example-faster-with-exactextractr +zonal-statistics-with-exactextractr +directly-returning-extracted-values +predefined-summary-operations example-summarizing-mlra-raster-data-with-lattice-graphics interactive-summaries additional-reading-spatial diff --git a/book/references.html b/book/references.html index 5984fbda..fc85b332 100644 --- a/book/references.html +++ b/book/references.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@
    24. 4.17.1 Raster Summary By Point: NASIS Pedon Locations
    25. 4.17.2 Raster Summary By Polygon: Series Extent
    26. 4.17.3 Raster Summary By Polygon: MLRA
    27. -
    28. 4.17.4 Example: Faster with exactextractr
    29. +
    30. 4.17.4 Zonal Statistics with exactextractr
    31. 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
    32. 4.18 Additional Reading (Spatial)
    33. diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-107-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-107-1.png deleted file mode 100644 index 4be06374adf85516313338a2f9bf20c70533a872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30100 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 diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-108-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-108-1.png deleted file mode 100644 index 3bb377d133e0b61105fbb37143ccc54bb4a3ed5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42815 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 diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-109-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-109-1.png index 7f939be41f55d20957a4bd16328a93260e9c6e08..4be06374adf85516313338a2f9bf20c70533a872 100644 GIT binary patch literal 30100 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 literal 34740 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 literal 54508 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%0DiD}klIY8_9emll05pV!EaI@XiaMleyDv^>LA*8 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%0D$;vX0WCRAKot*Lfx~uV3 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 E4~Am(5&!@I diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-112-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-112-1.png index 0efa6f26dce8967a6b67a4a449ea41f5f8b10cdc..b53f200dddb9fbd9d249b7693b62146f298cb676 100644 GIT binary patch literal 54508 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 diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-113-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-113-1.png index 6f7211a6818aa5549d650bd69b68a7a1c6e94735..b36a0c5d547fcd3e884ea07c35bace9b2933d1c0 100644 GIT binary patch literal 39598 zcmeFac{r49*f1_e4T>R4O7?ijQXv^z*{3W$b`nJhMMBn0O{B=4%KlU$jU{_Urb(g& zAxnvw3X`%-*(S!!ca3#s>ir$>?~m`l&*O0%-S>5!*LGg#exCQ$!{)}DIJa`Lu&``G zm>5{Hux!Ayu(1CJWn*Dsak&2=lZ9oS>tR!CL-0=)7B~xw2MZj|0tbJSSUkXQwTg-g zcnTiT9@Bn2;2z*N3GPu1PXfPvX0#t)GqVIUUtcp{@E2{C(Co1Y$OF#e0XoonfS)Ar zpGOk-TkVn5=TV*HQ4Ri5K~K<))|K{?;G2NFl$cmZAOD%0DiD}klIY8_9emll05pV!EaI@XiaMleyDv^>LA*8 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%0D$;vX0WCRAKot*Lfx~uV3 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 E4~Am(5&!@I literal 44752 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

      ?Sb$d6MBG@ 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 MUcZv3efP=#0d(Elp#T5? literal 42672 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 Z*O8g#S}u0b3Yd%-JYD@<);T3K0RS2DTxI|O diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-197-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-202-1.png similarity index 100% rename from book/s4ssbook_files/figure-html/unnamed-chunk-197-1.png rename to book/s4ssbook_files/figure-html/unnamed-chunk-202-1.png diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-200-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-205-1.png similarity index 100% rename from book/s4ssbook_files/figure-html/unnamed-chunk-200-1.png rename to book/s4ssbook_files/figure-html/unnamed-chunk-205-1.png diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-206-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-206-1.png new file mode 100644 index 0000000000000000000000000000000000000000..533948cfd692c01314809e21159dbeb198b736f5 GIT binary patch literal 42672 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 Z*O8g#S}u0b3Yd%-JYD@<);T3K0RS2DTxI|O literal 0 HcmV?d00001 diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-60-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-60-1.png index c56050fb620b716ce3f6b75a582e920cc1cd1746..7644aa68d0737378c0a4be12f6fe46e1d82b38a1 100644 GIT binary patch delta 8724 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 F@qd`zsG$G= delta 8762 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 K(+^&_^?v{u?7%7j literal 0 HcmV?d00001 diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-77-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-79-1.png similarity index 100% rename from book/s4ssbook_files/figure-html/unnamed-chunk-77-1.png rename to book/s4ssbook_files/figure-html/unnamed-chunk-79-1.png diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-77-2.png b/book/s4ssbook_files/figure-html/unnamed-chunk-79-2.png similarity index 100% rename from book/s4ssbook_files/figure-html/unnamed-chunk-77-2.png rename to book/s4ssbook_files/figure-html/unnamed-chunk-79-2.png diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-78-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-80-1.png similarity index 100% rename from book/s4ssbook_files/figure-html/unnamed-chunk-78-1.png rename to book/s4ssbook_files/figure-html/unnamed-chunk-80-1.png diff --git a/book/sampling.html b/book/sampling.html index a6d381b6..40331339 100644 --- a/book/sampling.html +++ b/book/sampling.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@

    34. 4.17.1 Raster Summary By Point: NASIS Pedon Locations
    35. 4.17.2 Raster Summary By Polygon: Series Extent
    36. 4.17.3 Raster Summary By Polygon: MLRA
    37. -
    38. 4.17.4 Example: Faster with exactextractr
    39. +
    40. 4.17.4 Zonal Statistics with exactextractr
    41. 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
    42. 4.18 Additional Reading (Spatial)
    43. @@ -487,18 +487,18 @@

      5.1 Introduction

      5.1.1 DSM classes

      A variation of the 2nd method is described by Congalton and Green (2019) for use with categorical data, which is applicable to digital soil mapping.

      -
      nMultinomial <- function(k = NULL, p = 0.5, error = 0.1, alpha = 0.05) {
      -  # k     = number of classes
      -  # p     = proportion of the largest class
      -  # error = margin of error
      -  # alpha = confidence level probability
      -  ceiling(qchisq(1 - alpha / k, 1) * p * (1 - p) / error^2)
      -}
      -nMultinomial(k = c(10, 20, 30))
      +
      nMultinomial <- function(k = NULL, p = 0.5, error = 0.1, alpha = 0.05) {
      +  # k     = number of classes
      +  # p     = proportion of the largest class
      +  # error = margin of error
      +  # alpha = confidence level probability
      +  ceiling(qchisq(1 - alpha / k, 1) * p * (1 - p) / error^2)
      +}
      +nMultinomial(k = c(10, 20, 30))
      ## [1] 197 229 248
      -
      nMultinomial(k = 10, error = c(0.05, 0.1, 0.2))
      +
      nMultinomial(k = 10, error = c(0.05, 0.1, 0.2))
      ## [1] 788 197  50
      -
      nMultinomial(k = 10, alpha = c(0.05, 0.1, 0.2))
      +
      nMultinomial(k = 10, alpha = c(0.05, 0.1, 0.2))
      ## [1] 197 166 136
      @@ -538,31 +538,31 @@

      5.1.2 Rules of thumb

      5.1.3 NSSH 627.8

      Documentation requirement for the following data elements are specified in the section 627.8 of the National Soil Survey Handbook (NSSH).

      -
      # NSSH 627.8 Documentation
      -
      -# soil series
      -data.frame(
      -  level = "soil series", 
      -  n     = c(5, 10),
      -  acres = c(2000, 20000)
      -  )
      +
      # NSSH 627.8 Documentation
      +
      +# soil series
      +data.frame(
      +  level = "soil series", 
      +  n     = c(5, 10),
      +  acres = c(2000, 20000)
      +  )
      ##         level  n acres
       ## 1 soil series  5  2000
       ## 2 soil series 10 20000
      -
      # components
      -data.frame(
      -  level = "components",
      -  n     = 1,
      -  acres = 3000
      -  )
      +
      # components
      +data.frame(
      +  level = "components",
      +  n     = 1,
      +  acres = 3000
      +  )
      ##        level n acres
       ## 1 components 1  3000
      -
      # map units
      -data.frame(
      -  level = "map unit",
      -  n     = cumsum(c(30, rep(10, 3))),
      -  acres = c(2000, seq(from = 4000, by = 4000, length.out = 3))
      -  )
      +
      # map units
      +data.frame(
      +  level = "map unit",
      +  n     = cumsum(c(30, rep(10, 3))),
      +  acres = c(2000, seq(from = 4000, by = 4000, length.out = 3))
      +  )
      ##      level  n acres
       ## 1 map unit 30  2000
       ## 2 map unit 40  4000
      @@ -572,16 +572,16 @@ 

      5.1.3 NSSH 627.8

      5.2 Sampling Strategies

      -
      library(sf)
      -library(ggplot2)
      -
      -# set the seed for the random number generator
      -set.seed(4)
      -
      -# Create a sixteen square polygon
      -bb <- st_make_grid(st_bbox(c(xmin = 0, xmax = 6, ymin = 0, ymax = 6)), n = 6)
      -grd <- st_as_sf(bb)
      -grd$ID <- 1:length(bb)
      +
      library(sf)
      +library(ggplot2)
      +
      +# set the seed for the random number generator
      +set.seed(4)
      +
      +# Create a sixteen square polygon
      +bb <- st_make_grid(st_bbox(c(xmin = 0, xmax = 6, ymin = 0, ymax = 6)), n = 6)
      +grd <- st_as_sf(bb)
      +grd$ID <- 1:length(bb)

      5.2.1 Simple Random

      In simple random sampling, all samples within the region have an equal chance of being selected. A simple random selection of points can be made using either the st_sample() function within the sf R package or the Create Random Points tool in ArcGIS.

      @@ -600,13 +600,13 @@

      5.2.1 Simple Random
      # Generate simple random sample
      -test <- st_sample(grd, size = 16, type = "random")
      -
      -ggplot() + 
      -  geom_sf(data = grd) + 
      -  geom_sf(data = test) + 
      -  ggtitle("Simple")

      +
      # Generate simple random sample
      +test <- st_sample(grd, size = 16, type = "random")
      +
      +ggplot() + 
      +  geom_sf(data = grd) + 
      +  geom_sf(data = test) + 
      +  ggtitle("Simple")

      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 diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-111-2.png b/book/s4ssbook_files/figure-html/unnamed-chunk-113-2.png similarity index 100% rename from book/s4ssbook_files/figure-html/unnamed-chunk-111-2.png rename to book/s4ssbook_files/figure-html/unnamed-chunk-113-2.png diff --git a/book/s4ssbook_files/figure-html/unnamed-chunk-114-1.png b/book/s4ssbook_files/figure-html/unnamed-chunk-114-1.png index e7e0acb0188d8804729545553300267f40bd1c66..0efa6f26dce8967a6b67a4a449ea41f5f8b10cdc 100644 GIT binary patch literal 72162 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 literal 54382 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

      @@ -627,13 +627,13 @@

      5.2.2 Systematic
      # Generate systematic random sample
      -test <- st_sample(grd, size = 16, type = "regular")
      -
      -ggplot() + 
      -  geom_sf(data = grd) + 
      -  geom_sf(data = test) + 
      -  ggtitle("Systematic")

      +
      # Generate systematic random sample
      +test <- st_sample(grd, size = 16, type = "regular")
      +
      +ggplot() + 
      +  geom_sf(data = grd) + 
      +  geom_sf(data = test) + 
      +  ggtitle("Systematic")

      @@ -652,15 +652,15 @@

      5.2.3 Stratified Random
      grd2 <- st_cast(grd, "MULTIPOLYGON")
      -st_crs(grd2) <- 5070
      -
      -test <- st_sample(grd2, size = 16, type = "random", by_polygon = TRUE)
      -
      -ggplot() + 
      -  geom_sf(data = grd2) + 
      -  geom_sf(data = test) + 
      -  ggtitle("Stratified")

      +
      grd2 <- st_cast(grd, "MULTIPOLYGON")
      +st_crs(grd2) <- 5070
      +
      +test <- st_sample(grd2, size = 16, type = "random", by_polygon = TRUE)
      +
      +ggplot() + 
      +  geom_sf(data = grd2) + 
      +  geom_sf(data = test) + 
      +  ggtitle("Stratified")

      Note that the spsample() function only stratifies the points spatially. Other more sophisticated designs can be implemented using the spsurvey, sharpshootR, or clhs packages.

      @@ -681,33 +681,33 @@

      5.2.4 Multistage Stratified Rando
    44. If sampling is uneven, weights need to be known
    45. May need to construct the strata manually
    46. -
      # Select 8 samples from each square
      -idx <- sample(1:nrow(grd), size = 2, replace = FALSE)
      -grd_sub <- grd[idx, ]
      -test <- sapply(1:2, function(i) {
      -  st_coordinates(st_sample(grd_sub[i, ], size = 8, type = "random"))
      -})
      -test <- st_as_sf(as.data.frame(test), coords = 1:2)
      -
      -ggplot() + 
      -  geom_sf(data = grd) + 
      -  geom_sf(data = test) + 
      -  ggtitle("Two-stage")
      +
      # Select 8 samples from each square
      +idx <- sample(1:nrow(grd), size = 2, replace = FALSE)
      +grd_sub <- grd[idx, ]
      +test <- sapply(1:2, function(i) {
      +  st_coordinates(st_sample(grd_sub[i, ], size = 8, type = "random"))
      +})
      +test <- st_as_sf(as.data.frame(test), coords = 1:2)
      +
      +ggplot() + 
      +  geom_sf(data = grd) + 
      +  geom_sf(data = test) + 
      +  ggtitle("Two-stage")

      5.2.5 Spatial Coverage Sampling (e.g. k-means clustering)

      -
      # spcosa ----
      -library(spcosa)
      -
      -grd2 <- st_crs(grd, NA)
      -grd_sp <- as(grd, "Spatial")
      -
      -strata <- stratify(grd_sp, nStrata = 16) 
      -
      -pts    <- spsample(strata)
      -plot(strata, pts) + 
      -  ggtitle("Spatial Coverage")
      +
      # spcosa ----
      +library(spcosa)
      +
      +grd2 <- st_crs(grd, NA)
      +grd_sp <- as(grd, "Spatial")
      +
      +strata <- stratify(grd_sp, nStrata = 16) 
      +
      +pts    <- spsample(strata)
      +plot(strata, pts) + 
      +  ggtitle("Spatial Coverage")

      @@ -740,40 +740,40 @@

      5.2.6 Covariate space coverage sa
    47. Not ideal for map validation (non – probability sample)
    48. Inefficient with large GIS layers
    49. -
      library(sf)
      -library(terra)
      -source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R")
      -
      -# import volcano DEM, details at http://geomorphometry.org/content/volcano-maungawhau
      -data("volcano")
      -volcano_r <- rast(
      -  volcano[87:1, 61:1],
      -  crs = crs("+init=epsg:27200"),
      -  extent = c(
      -    xmin = 2667405,
      -    xmax = 2667405 + 61 * 10,
      -    ymin = 6478705,
      -    ymax = 6478705 + 87 * 10
      -  )
      -)
      -names(volcano_r) <- "elev"
      -
      -# calculate slope from the DEM
      -slope_r <- terrain(volcano_r, v = "slope", unit = "degrees")
      -
      -# Stack Elevation and Slope
      -rs  <- c(volcano_r, slope_r)
      -
      -# Covariate Space Coverage Sampling
      -source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R")
      -fs <- cscs(rs, vars = c("elev", "slope"), n = 20)
      -
      -fs_sf <- st_as_sf(fs, coords = c("x", "y"), crs = crs(rs))
      -
      -# Plot CSCS Samples
      -plot(volcano_r, axes=FALSE)
      -points(fs_sf)
      -

      +
      library(sf)
      +library(terra)
      +source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R")
      +
      +# import volcano DEM, details at http://geomorphometry.org/content/volcano-maungawhau
      +data("volcano")
      +volcano_r <- rast(
      +  volcano[87:1, 61:1],
      +  crs = crs("+init=epsg:27200"),
      +  extent = c(
      +    xmin = 2667405,
      +    xmax = 2667405 + 61 * 10,
      +    ymin = 6478705,
      +    ymax = 6478705 + 87 * 10
      +  )
      +)
      +names(volcano_r) <- "elev"
      +
      +# calculate slope from the DEM
      +slope_r <- terrain(volcano_r, v = "slope", unit = "degrees")
      +
      +# Stack Elevation and Slope
      +rs  <- c(volcano_r, slope_r)
      +
      +# Covariate Space Coverage Sampling
      +source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R")
      +fs <- cscs(rs, vars = c("elev", "slope"), n = 20)
      +
      +fs_sf <- st_as_sf(fs, coords = c("x", "y"), crs = crs(rs))
      +
      +# Plot CSCS Samples
      +plot(volcano_r, axes=FALSE)
      +points(fs_sf)
      +

      5.2.7 Conditioned Latin Hypercube (cLHS)

      @@ -804,20 +804,20 @@

      5.2.7 Conditioned Latin Hypercube

      The cLHS procedure iteratively selects samples from the strata variables such that they replicate the range of values from each stratum. Without a technique such as cLHS, obtaining a sample that is representative of the feature space becomes increasingly difficult as the number of variables (strata) increases.

      To perform cLHS using R, you can use the clhs package (Roudier 2011).

      -
      rs2 <- raster::stack(rs)
      -
      -library(clhs)
      -
      -# generate cLHS design
      -cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE)
      -
      -# Plot cLHS Samples
      -par(mar=c(1,1,1,4))
      -plot(volcano_r, axes=FALSE)
      -points(cs$sampled_data)
      +
      rs2 <- raster::stack(rs)
      +
      +library(clhs)
      +
      +# generate cLHS design
      +cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE)
      +
      +# Plot cLHS Samples
      +par(mar=c(1,1,1,4))
      +plot(volcano_r, axes=FALSE)
      +points(cs$sampled_data)

      -
      # Summary of clhs object
      -summary(cs$sampled_data)$data
      +
      # Summary of clhs object
      +summary(cs$sampled_data)$data
      ##       elev           slope       
       ##  Min.   : 95.0   Min.   : 0.000  
       ##  1st Qu.:108.8   1st Qu.: 6.701  
      @@ -826,8 +826,8 @@ 

      5.2.7 Conditioned Latin Hypercube ## 3rd Qu.:150.2 3rd Qu.:20.459 ## Max. :184.0 Max. :33.197 ## NA's :1

      -
      # Summary of raster objects
      -cbind(summary(volcano_r), summary(slope_r)[1:6])
      +
      # Summary of raster objects
      +cbind(summary(volcano_r), summary(slope_r)[1:6])
      ##       elev                           
       ##  "Min.   : 94.0  " "Min.   : 0.000  "
       ##  "1st Qu.:108.0  " "1st Qu.: 7.054  "
      @@ -836,72 +836,72 @@ 

      5.2.7 Conditioned Latin Hypercube ## "3rd Qu.:150.0 " "3rd Qu.:21.666 " ## "Max. :195.0 " "Max. :43.032 "

      Although the above example works well on our small volcano dataset, the clhs package is inefficient if you are working with large raster datasets. To overcome this limitation, you can first take a large random sample and then subsample it using cLHS.

      -
      sub_s <- spatSample(rs, size = 200, as.points = TRUE) |>
      -  st_as_sf() # random sample function from the raster package
      -
      -s <- clhs(sub_s, size = 20, progress = FALSE, simple = FALSE)
      +
      sub_s <- spatSample(rs, size = 200, as.points = TRUE) |>
      +  st_as_sf() # random sample function from the raster package
      +
      +s <- clhs(sub_s, size = 20, progress = FALSE, simple = FALSE)

      5.3 Evaluating a Sampling Strategy

      To gauge the representativeness of a sampling strategy, you can compare the results it produces to the results for other variables you think might coincide with the soil properties or classes of interest (Hengl 2009). Examples include slope gradient, slope aspect, and vegetative cover. These other variables may be used to stratify the sampling design or to assess the representativeness of our existing samples (e.g., NASIS pedons).

      The simple example below demonstrates how to compare several sampling strategies by evaluating how well they replicate the distribution of elevation.

      -
      # set seed
      -set.seed(1234)
      -
      -# create a polygon from the spatial extent of the volcano dataset
      -test <- st_make_grid(ext(volcano_r), n = 1)
      -
      -# take a large random sample
      -sr400 <- spatSample(rs, size = 1000, method = "random", as.points = TRUE)
      -
      -# take a small random sample
      -sr <- spatSample(rs, size = 20, method = "random", as.points = TRUE)
      -
      -# take a small systematic random sample
      -sys <- spatSample(rs, size = 20, method = "regular", as.points = TRUE)
      -
      -# take a cLHS sample
      -cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE)
      -
      -# take a CSCS sample
      -fs <- cscs(rs, vars = c("elev", "slope"), n = 20)
      -
      -# Combind and Extract Samples
      -s <- rbind(
      -  data.frame(method = "Simple Random 400", as.data.frame(sr400)),
      -  data.frame(method = "Simple Random",     as.data.frame(sr)),
      -  data.frame(method = "Systematic Random", as.data.frame(sys)),
      -  data.frame(method = "cLHS",              slot(cs$sampled_data, 'data')),
      -  data.frame(method = "CSCS",              fs[c("elev", "slope")])
      -)
      -
      -# Summarize the sample values
      -aggregate(slope ~ method, data = s, function(x) round(summary(x)))
      +
      # set seed
      +set.seed(1234)
      +
      +# create a polygon from the spatial extent of the volcano dataset
      +test <- st_make_grid(ext(volcano_r), n = 1)
      +
      +# take a large random sample
      +sr400 <- spatSample(rs, size = 1000, method = "random", as.points = TRUE)
      +
      +# take a small random sample
      +sr <- spatSample(rs, size = 20, method = "random", as.points = TRUE)
      +
      +# take a small systematic random sample
      +sys <- spatSample(rs, size = 20, method = "regular", as.points = TRUE)
      +
      +# take a cLHS sample
      +cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE)
      +
      +# take a CSCS sample
      +fs <- cscs(rs, vars = c("elev", "slope"), n = 20)
      +
      +# Combind and Extract Samples
      +s <- rbind(
      +  data.frame(method = "Simple Random 400", as.data.frame(sr400)),
      +  data.frame(method = "Simple Random",     as.data.frame(sr)),
      +  data.frame(method = "Systematic Random", as.data.frame(sys)),
      +  data.frame(method = "cLHS",              slot(cs$sampled_data, 'data')),
      +  data.frame(method = "CSCS",              fs[c("elev", "slope")])
      +)
      +
      +# Summarize the sample values
      +aggregate(slope ~ method, data = s, function(x) round(summary(x)))
      ##              method slope.Min. slope.1st Qu. slope.Median slope.Mean slope.3rd Qu. slope.Max.
       ## 1              cLHS          3             8           15         16            21         32
       ## 2              CSCS          1             7           15         16            24         36
       ## 3     Simple Random          0            14           17         18            22         34
       ## 4 Simple Random 400          0             6           14         15            22         43
       ## 5 Systematic Random          1             8           11         14            20         32
      -
      # Plot overlapping density plots to compare the distributions between the large and small samples
      -ggplot(s, aes(x = slope, col = method)) + 
      -        geom_density(cex = 2)
      +
      # Plot overlapping density plots to compare the distributions between the large and small samples
      +ggplot(s, aes(x = slope, col = method)) + 
      +        geom_density(cex = 2)

      -
      # plot the spatial locations            
      -par(mfrow = c(2, 2), mar = c(1,2,4,5))
      -plot(volcano_r, main = "Simple random", cex.main = 2, axes=FALSE)
      -points(sr, pch = 3, cex = 1.2)
      -
      -plot(volcano_r, main = "Systematic random", cex.main = 2, axes=FALSE)
      -points(sys, pch = 3, cex = 1.2)
      -
      -plot(volcano_r, main = "cLHS", cex.main = 2, axes=FALSE)
      -points(cs$sampled_data, pch = 3, cex = 1.2)
      -
      -plot(volcano_r, main = "CSCS", cex.main = 2, axes=FALSE)
      -points(fs_sf, pch = 3, cex = 1.2)
      -

      +
      # plot the spatial locations            
      +par(mfrow = c(2, 2), mar = c(1,2,4,5))
      +plot(volcano_r, main = "Simple random", cex.main = 2, axes=FALSE)
      +points(sr, pch = 3, cex = 1.2)
      +
      +plot(volcano_r, main = "Systematic random", cex.main = 2, axes=FALSE)
      +points(sys, pch = 3, cex = 1.2)
      +
      +plot(volcano_r, main = "cLHS", cex.main = 2, axes=FALSE)
      +points(cs$sampled_data, pch = 3, cex = 1.2)
      +
      +plot(volcano_r, main = "CSCS", cex.main = 2, axes=FALSE)
      +points(fs_sf, pch = 3, cex = 1.2)
      +

      The overlapping density plots above illustrate the differences between large and small sets of samples using several sampling designs.

      The cLHS approach best duplicates the distribution of elevation (because elevation is explicitly used in the stratification process). The contrast is less severe in the summary metrics, but again cLHS more closely resembles the larger sample. Other comparisons are possible using the approaches in the following chapters.

      diff --git a/book/search_index.json b/book/search_index.json index 43303196..aef6d5af 100644 --- a/book/search_index.json +++ b/book/search_index.json @@ -1 +1 @@ -[["index.html", "Statistics for Soil Survey - Part 1 Pre-course Assignment 0.1 Create Workspace 0.2 Configure RStudio 0.3 Essentials 0.4 Personalization 0.5 Install Required Packages 0.6 Dealing With Errors 0.7 Packages not on CRAN 0.8 Connect Local NASIS 0.9 Proof 0.10 Additional Soil Data and R References", " Statistics for Soil Survey - Part 1 Soil Survey Staff 2025-01-16 Pre-course Assignment 0.1 Create Workspace Make a local folder C:\\workspace2 to use as a working directory for this course. Use all lower case letters please. 0.2 Configure RStudio Open RStudio, and edit the “Global Options” (Main menu: Tools → Global Options). 0.3 Essentials These options are important for pleasant, reproducible and efficient use of the RStudio environment: Change the default working directory to C:\\workspace2 (R General Tab) Uncheck “Restore .Rdata into workspace at startup” (R General Tab) VERY IMPORTANT Figure 1: Example of RStudio General settings. RStudio detects the available R installations on your computer. Individual versions are certified for the Software Center as they become available, and sometimes there is a more recent version available for download. It is worth taking the time before installing packages to get the latest version of R available to you. This is to minimize compatibility issues which arise over time. 0.4 Personalization Figure 2: Example of RStudio Code/Editing settings. Optional: Check “Soft-wrap R source files” (Code/Editing Tab) Optional: Show help tooltips, control auto-completion and diagnostics (Code/Completion and Diagnostics Tabs) Optional: Update code font size, colors and theme (Appearance) Optional: Use RStudio Projects (top-right corner) to manage working directories 0.5 Install Required Packages Packages can be installed by name from the Comprehensive R Archive Network (CRAN) using the base R function install.packages(). There are a lot of packages out there–many more than you will download here, and many of which are useful for Soil Survey work. The first time you install packages, R may ask you if you want to create a local package library. You need to do this because we cannot write to system folders as non-administrator users on CCE machines. The default location for R package library on Windows is: C:\\Users\\<User.Name>\\AppData\\Local\\R\\win-library\\<X.X> where <User.Name> is the current Windows user name and <X.X> is the version of R packages are being installed for. If you have an existing R package library (for same minor version of R), you can copy that library into the AppData\\Local\\R folder as needed. For example, to download and install the remotes package from CRAN: install.packages("remotes") To install the R packages used in this class copy all of the code from the box below and paste into the R console window. Paste after the command prompt (>) and press enter. Downloading and configuring the packages will take a while if you are installing or upgrading all of the packages in the list below. On particularly slow network connections, i.e. over VPN or USDA network in general, it may be necessary to increase the “timeout” option to ensure the downloads have sufficient time to complete. # increase default timeout from 1 minute to 5 minutes (for current session only) options(timeout = 300) ## character vector of package names packages <- c( # soil "aqp", "soilDB", "sharpshootR", "soiltexture", # gis "raster", "sp", "sf", "terra", "gdalUtilities", "rgrass", "RSAGA", "exactextractr", "fasterize", # data management "dplyr", "tidyr", "devtools", "roxygen2", "Hmisc", "circular", "DT", "remotes", # databases "DBI", "odbc", "RSQLite", # graphics "ggplot2", "latticeExtra", "maps", "spData", "tmap", "kableExtra", "corrplot", "farver", "mapview", "ggmap", "plotrix", "rpart.plot", "visreg", "diagram", "GGally", "wesanderson", "viridisLite", "prettymapr", # modeling "car", "rms", "randomForest", "ranger", "party", "caret", "vegan", "ape", "shape", "modEvA", "gower", "MBESS", "yardstick", # sampling "clhs", "spcosa" ) # ipkCRAN: a helper fuction for installing required packages from CRAN source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/ipkCRAN.R") ## - p: vector of package names ## - up: logical - upgrade installed packages? Default: TRUE ## up = TRUE to download all packages ## up = FALSE to download only packages you don't already have installed ipkCRAN(p = packages, up = TRUE) The ipkCRAN function will let you know if any of the above packages fail to install. Whenever you run some code always check the console output for warnings and errors before continuing. It may be easiest to send commands individually to learn about and inspect their output, rather than running the entire file and wondering where an error occurred. 0.6 Dealing With Errors If a lot of output is produced by a command you should scroll up and sift through it as best you can. Copy and paste parts of the error message to use in internet searches, and try to find cases where folks have encountered problems. 0.6.1 No output is produced after pasting into console If you do not have a new command prompt (>) and a blinking cursor on the left hand side of your console, but instead see a + after you run a command, R may think you are still in the middle of submitting input to the “read-eval-print-loop” (REPL). If this is not expected you are possibly missing closing quotes, braces, brackets or parentheses. R needs to know you were done with your expression, so you may need to supply some input to get the command to be complete. Pasting code line-by-line is useful but prone to input errors with multi-line expressions. Alternately, you can run commands or an entire file using the GUI or keyboard shortcuts such as Ctrl+Enter. You have a chance to try this in the example at the end. 0.6.2 ‘SOMEPACKAGE’ is not available (for R version X.Y.Z) This means either: A package named ‘SOMEPACKAGE’ exists but it is not available for your version of R CRAN does not have a package with that name You can try again, but first check for spelling and case-sensitivity. When in doubt search the package name on Google or CRAN to make sure you have it right. Note that not all R packages are available on CRAN: there are many other ways that you can deliver packages (including GitHub described below). 0.7 Packages not on CRAN Some R packages rely on compiled code. Windows users are limited to installing “binary” versions of such packages from CRAN unless they have “Rtools” installed. The Rtools software is available from the Software Center, and is specific to the version of R you have. One way to get the latest binary builds of R packages that use compiled code is by using https://r-universe.dev. This website provides custom repositories that can be used in addition to the defaults in install.packages() For example, you can install raster-related “rspatial” packages from r-universe.dev. This may not be “required” but it is good to know how to specify an alternate package repository source using the repos= argument. Check with your mentor to see if there are known issues with current CRAN packages. install.packages(c('terra', 'raster'), repos='https://rspatial.r-universe.dev') To install the latest version of packages from the Algorithms for Quantitative Pedology (AQP) suite off GitHub we use the remotes package. The AQP packages are updated much more frequently on GitHub than they are on CRAN. Generally, the CRAN versions (installed above) are the “stable” releases whereas the GitHub repositories have new features and bug fixes. remotes::install_github("ncss-tech/aqp", dependencies=FALSE, upgrade=FALSE, build=FALSE) remotes::install_github("ncss-tech/soilDB", dependencies=FALSE, upgrade=FALSE, build=FALSE) remotes::install_github("ncss-tech/sharpshootR", dependencies=FALSE, upgrade=FALSE, build=FALSE) remotes::install_github("ncss-tech/soilReports", dependencies=FALSE, upgrade=FALSE, build=FALSE) 0.8 Connect Local NASIS Establish an ODBC connection to NASIS by following the directions at the following hyperlink (ODBC Connection to NASIS). Once you’ve successfully established a ODBC connection, prove it by loading your NASIS selected set with the site and pedon tables for any pedons from your local area. You only need a few pedons at a minimum for this demo – too many (say, >20) will make the example profile plot cluttered. Paste the below code at the command prompt (>) and press enter, as you did above. Or create a new R script (Main menu: File → New File → R Script) and paste code into the “Source” pane (script editor window). Then, click the Run button in the top-right corner of the Script Editor or use Ctrl+Enter to run code at the cursor location / any selected code. This will execute the code in the Console. Submit the resulting plot to your mentor (from “Plot” pane (bottom-right): Export → Save as PDF…) # load packages into the current session library(aqp) # provides "SoilProfileCollection" object & more library(soilDB) # provides database access methods # get pedons from NASIS selected set test <- fetchNASIS(from = 'pedons') # inspect the result str(test, max.level = 2) # make a profile plot # set margins smaller than default par(mar=c(1,1,1,1)) # make profile plot of selected set, with userpedonid as label plot(test, label='pedon_id') 0.9 Proof Follow the one line example below, copy the output, and submit the results to your mentor. This will help us to verify that all of the required packages have been installed. # dump list of packages that are loaded into the current session sessionInfo() 0.10 Additional Soil Data and R References 0.10.1 Soil Data Videos Paul Finnel’s NASIS webinar Stats for Soil Survey Webinar Soil Data Aggregation using R Webinar 0.10.2 R Books and Manuals R-Intro R for Beginners Spatial Data Analysis and Modeling with R (highly recommended) Geographic Data Science with R book The R Inferno AQP Website and Tutorials "],["intro.html", "Chapter 1 Introduction to R 1.1 Outline 1.2 Course Overview 1.3 What is R? 1.4 RStudio: An Integrated Development Environment (IDE) for R 1.5 R basics 1.6 Managing Packages 1.7 Getting Help 1.8 Documenting your work 1.9 Organizing your work 1.10 Saving your work 1.11 Exercise 1: R packages and Functions 1.12 Loading Data 1.13 Data manipulation 1.14 Exercise 2: Data Manipulation 1.15 Review 1.16 Additional Reading (Introduction)", " Chapter 1 Introduction to R 1.1 Outline Course Overview Review Course Objectives Why is this training needed? Why is course organized this way? What is R? Why should I use R? What can R do? How do I get started? RStudio interface What are packages? How to navigate the Help tab How to save files Manipulating data Loading & viewing data Filtering, transforming, merging, aggregating and reshaping data Exporting data 1.2 Course Overview 1.2.1 Course Objectives Develop solutions to investigate soil survey correlation problems and update activities. Evaluate investigations for interpretive results and determine how to proceed. Summarize data for population in NASIS. Analyze spatial data to investigate soil-landscape relationships Help to pursue the question “why” 1.2.2 Why is this training needed? Long standing goal of the Soil Science Division to have a course in statistics (Mausbach 2003) Opportunities to learn these techniques are limited, especially at the undergraduate level (Hennemann and Rossiter 2004) Consistent methodology (data analysis, data population, sampling design, etc.) There is continually a greater need to use these techniques: Mapping of lands at high production rates ((MacMillan, Moon, and Coupé 2007); (Kempen et al. 2012); (Brevik et al. 2016)) Ecological Sites (Maynard et al. 2019) Soil survey refinement (disaggregation) ((Chaney et al. 2016);(Ramcharan et al. 2018)) 1.2.3 Why is course organized this way? The web content is a long-term investment and serves as a reference Our best judgment for assembling into 24 hours what could be 6 University level courses Mixture of slides and script-enabled web pages is “new” for NRCS Feel free to provide feedback for improving the class for future offerings. 1.3 What is R? R is a free, open-source software and programming language developed in 1995 at the University of Auckland as an environment for statistical computing and graphics (Ihaka and Gentleman 1996). Since then R has become one of the dominant software environments for data analysis and is used by a variety of scientific disiplines, including soil science, ecology, and geoinformatics (Envirometrics CRAN Task View; Spatial CRAN Task View). R is particularly popular for its graphical capabilities, but it is also prized for it’s GIS capabilities which make it relatively easy to generate raster-based models. More recently, R has also gained several packages designed specifically for analyzing soil data. A software environment: statistics graphics programming calculator GIS A language to explore, summarize, and model data functions = verbs objects = nouns 1.3.1 Why Should I Learn R? While the vast majority of people use Microsoft Excel for data analysis, R offers numerous advantages, such as: Cost. R is free! (“Free as in free speech, not free beer.”) Reproducible Research (self-documenting, repeatable) repeatable: code + output in a single document (‘I want the right answer, not a quick answer’ - Paul Finnell) easier the next time (humorous example) numerous Excel horror stories of scientific studies gone wrong exist (TED Talk) scalable: applicable to small or large problems R in a Community Numerous Discipline Specific R Groups Numerous Local R User Groups (including R-Ladies Groups) Stack Overflow Learning Resources (quantity and quality) R books (Free Online) R Books “If we don’t accept these challenges, others who are less qualified will; and soil scientists will be displaced by apathy.” (Arnold and Wilding 1991) While some people find the use of a command line environment daunting, it is becoming a necessary skill for scientists as the volume and variety of data has grown. Thus scripting or programming has become a third language for many scientists, in addition to their native language and discipline specific terminology. Other popular programming languages include: SQL (i.e. NASIS), Python (i.e. ArcGIS), and JavaScript. ODBC and GDAL link R to nearly all possible formats/interfaces 1.3.2 What can R do? 1.3.3 Packages Base R (functionality is extended through packages) basic summaries of quantitative or qualitative data data exploration via graphics GIS data processing and analysis Soil Science R Packages aqp - visualization, aggregation, classification soilDB - access to commonly used soil databases soilReports - handful of report templates soiltexture - textural triangles Ecology R packages vegan - ordination, diversity analysis, etc. dismo - species distribution modeling 1.3.3.1 Soil Science Applications 1.3.3.1.1 Create Maps 1.3.3.1.2 Draw Soil Profiles 1.3.3.1.3 Draw Depth Plots 1.3.3.1.4 Estimate the Range in Characteristics (RIC) variable genhz pct10 median pct90 clay A 13 16 22 clay BAt 16 19 25 clay Bt1 18 24 32 clay Bt2 22 30 44 clay Cr 15 15 15 phfield A 6 6 7 phfield BAt 5 6 6 phfield Bt1 5 6 7 1.4 RStudio: An Integrated Development Environment (IDE) for R RStudio is an integrated development environment (IDE) that allows you to interact with R more readily. RStudio is similar to the standard RGui, but is considerably more user friendly. It has more drop-down menus, windows with multiple tabs, and many customization options. The first time you open RStudio, you will see three windows. A forth window is hidden by default, but can be opened by clicking the File drop-down menu, then New File, and then R Script. Detailed information on using RStudio can be found at at RStudio’s Website. RStudio Windows / Tabs Location Description Console Window lower-left location were commands are entered and the output is printed Source Tabs upper-left built-in text editor Environment Tab upper-right interactive list of loaded R objects History Tab upper-right list of key strokes entered into the Console Files Tab lower-right file explorer to navigate C drive folders Plots Tab lower-right output location for plots Packages Tab lower-right list of installed packages Help Tab lower-right output location for help commands and help search window Viewer Tab lower-right advanced tab for local web content 1.5 R basics R is command-line driven. It requires you to type or copy-and-paste commands after a command prompt (>) that appears when you open R. This is called the “Read-Eval-Print-Loop” or REPL. After typing a command in the R console and pressing Enter on your keyboard, the command will run. If your command is not complete, R issues a continuation prompt (signified by a plus sign: +). R is case sensitive. Make sure your spelling and capitalization are correct. Commands in R are also called functions. The basic format of a function in R is: object <- function.name(argument_1 = data, argument_2 = TRUE). The up arrow (^) on your keyboard can be used to bring up previous commands that you’ve typed in the R console. Comments in R code need to start with the # symbol (a.k.a. hash-tag, comment, pound, or number symbol). R ignores the remainder of the script line following #. # Math 1 + 1 10 * 10 log10(100) # combine values c(1, 2, 3) # Create sequence of values 1:10 # Implicit looping 1:10 * 5 1:10 * 1:10 # Assignment and data types ## numeric clay <- c(10, 12, 15, 26, 30) ## character subgroup <- c("typic haplocryepts","andic haplocryepts","typic dystrocryepts") ## logical andic <- c(FALSE, TRUE ,FALSE) # Print print(clay) subgroup 1.6 Managing Packages Packages are collections of additional functions that can be loaded on demand. They commonly include example data that can be used to demonstrate those functions. Although R comes with many common statistical functions and models, most of our work requires additional packages. 1.6.1 Installing Packages To use a package, you must first install it and then load it. These steps can be done at the command line or using the Packages Tab. Examples of both approaches are provided below. R packages only need to be installed once (until R is upgraded or re-installed). Every time you start a new R session, however, you need to load every package that you intend to use in that session. Within the Packages tab you will see a list of all the packages currently installed on your computer, and 2 buttons labeled either “Install” or “Update”. To install a new package simply select the Install button. You can enter install one or more than one packages at a time by simply separating them with a comma. To find out what packages are installed on your computer, use the following commands: library() # or installed.packages() One useful package for soil scientists is the soiltexture package. It allows you to plot soil textural triangles. The following command shows how to install this package if you do not currently have it downloaded: # CRAN (static version) install.packages(c("soiltexture")) # GitHub (development version) remotes::install_github("julienmoeys/soiltexture/pkg/soiltexture", dependencies = FALSE, upgrade = FALSE, build = FALSE) 1.6.2 Loading Packages Once a package is installed, it must be loaded into the R session to be used. This can be done by using library(). The package name does not need to be quoted. library(soilDB) You can also load packages using the Packages Tab, by checking the box next to the package name. For example, documentation for the soilDB package is available from the help() function. help(package = "soilDB") 1.7 Getting Help R has extensive documentation, numerous mailing lists, and countless books (many of which are free and listed at end of each chapter for this course). To learn more about the function you are using and the options and arguments available, learn to help yourself by taking advantage of some of the following help functions in RStudio: Use the Help tab in the lower-right Window to search commands (such as hist) or topics (such as histogram). Type help(read.csv) or ?read.csv in the Console window to bring up a help page. Results will appear in the Help tab in the lower right-hand window. Certain functions may require quotations, such as help(\"+\"). # Help file for a function help(read.csv) # or ?read.csv # Help files for a package help(package = "soiltexture") 1.8 Documenting your work RStudio’s Source Tabs serve as a built-in text editor. Prior to executing R functions at the Console, commands are typically written down (or scripted). Scripting is essentially showing your work. The sequence of functions necessary to complete a task are scripted in order to document or automate a task. While scripting may seems cumbersome at first, it ultimately saves time in the long run, particularly for repetitive tasks (humorous YouTube Video on Scripting). Benefits include: allows others to reproduce your work, which is the foundation of science serves as instruction/reminder on how to perform a task allows rapid iteration, which saves time and allows the evaluation of incremental changes reduces the chance of human error 1.8.1 Basic Tips for Scripting To write a script, simply open a new R script file by clicking File>New File>R Script. Within the text editor type out a sequence of functions. Place each function (e.g. read.csv()) on a separate line. If a function has a long list of arguments, place each argument on a separate line. A command can be excuted from the text editor by placing the cursor on a line and typing Crtl + Enter, or by clicking the Run button. An entire R script file can be excuted by clicking the Source button. 1.8.2 Comments It is a good idea to include comments in your code, so that in the future both yourself and others can understand what you were doing. Each line with a comment starts with #. In RStudio, you can use # comments to create an “outline” for your source documents. Multiple # signs increase the depth of the hierarchy. Ending a comment line with four hyphens (----) indicates that text should be included in the outline. The source file outline using comments in regular .R source files is analogous to the Markdown syntax used in R Markdown and Quarto for headers. For example, the following code block creates two outline sections, each with a nested subsection. To show the outline view, click the “outline” button in the top-right hand corner of the source window. Paste it in a fresh R document to try it out. # one ---- print("Section 1") ## one two ---- # this is an ordinary comment (does not show in outline) print("Subsection 1.2") # two ---- print("Section 2") ## two one ---- print("Subsection 2.1) 1.9 Organizing your work When you first begin a project you should create a new folder and place within it all the data and code associated with the project. This simplifies the process of accessing your files from R. Using a project folder is also a good habit because it makes it easier to pickup where you left off and find your data if you need to come back to it later. Within R, your project folder is also known as your working directory. This directory will be the default location your plots and other R output are saved. You want to have inputs for your code in the working directory so that you can refer to them using relative file paths. Relative file paths make it easier if you move the folder containing your script(s) around. Or, if you share it with someone else, they will have little issue getting your code to work on their own file system. 1.9.1 Setting the Working Directory Before you begin working in R, you should set your working directory to your project folder; for example, setwd(\"C:\\\\workspace2\\\\projectx...\"). You can use RStudio to manage your projects and folders. NOTE: Beware when specifying any file paths that R uses forward slashes / instead of back slashes \\. Back slashes are reserved for use as an escape character, so you must use two of them to get one in result character string. To change the working directory in RStudio, select main menu Session >> Set Working Directory >> …. Or, from the “Files” tab click More >> Set As Working Directory to use the current location of the “Files” tab as your working directory. Setting the working directory can also be done via the Console with the setwd() command: setwd("C:/workspace2") To check the file path of the current working directory (which should now be \"C:\\\\workspace2\"), type: getwd() 1.9.2 RStudio Projects (.Rproj files) You can also manage your working directory using RStudio Projects. An RStudio Project file (.Rproj) is analogous to, for example, a .mxd file for ArcMap. It contains information about the specific settings you may have set for a “project”. You open or create projects using the drop down menu in the top right-hand corner of the RStudio window (shown below) RStudio Project Menu Here is what a typical Project drop-down menu looks like: RStudio Project Menu (expanded) You can create new projects from existing or new directories with “New Project…”. When you click “Open Project…”, your working directory is automatically set to the .Rproj file’s location – this is extremely handy Any projects you have created/used recently will show up in the “Project List” 1.10 Saving your work In R, you can save several types of files to keep track of the work you do. The file types include: workspace, script, history, and graphics. It is important to save often because R, like any other software, may crash periodically. Such problems are especially likely when working with large files. You can save your workspace in R via the command line or the File menu. 1.10.0.1 R script (.R) An R script is simply a text file of R commands that you’ve typed. You may want to save your scripts (whether they were written in R Editor or another program such as Notepad) so that you can reference them in the future, edit them as needed, and keep track of what you’ve done. To save R scripts in RStudio, simply click the save button from your R script tab. Save scripts with the .R extension. R assumes that script files are saved with only that extension. If you are using another text editor, you won’t need to worry about saving your scripts in R. You can open text files in the RStudio text editor, but beware copying and pasting from Word files as discussed below. To open an R script, click the file icon. 1.10.0.2 Microsoft Word Files Using Microsoft Word to write or save R scripts is generally a bad idea. Certain keyboard characters, such as quotations ““, are not stored the same in Word (e.g. they are”left” and “right” handed). The difference is hard to distinguish, but will not run in R. Also, pasting your R code or output into Wword documents manually is not reproducible, so while it may work in a pinch, it ultimately costs you time. You can use the word_document Rmarkdown template to automatically “Knit” .docx files from R code using a template, which is very handy for quickly getting a nice looking document! 1.10.0.3 R Markdown (.Rmd) R Markdown (.Rmd) documents contain information for the reproducible combination of narrative text and code to produce elegantly formatted output. You can use multiple languages in .Rmd documents including R, Python, and SQL. You can easily “knit” visually appealing and high-quality documents into rich HTML, PDF or Word documents from the RStudio interface. This document is made in bookdown, a variant of rmarkdown used for book templates involving multiple chapters. You can make blogs and websites for your R packages with blogdown and pkgdown. These are all tools based off of the powerful “pandoc” engine and the tools in the R Markdown ecosystem. 1.10.0.4 R history (.Rhistory) An R history file is a copy of all your key strokes. You can think of it as brute force way of saving your work. It can be useful if you didn’t document all your steps in an R script file. Like an R file, an Rhistory file is simply a text file that lists all of the commands that you’ve executed. It does not keep a record of the results. To load or save your R history from the History Tab click the Open File or Save button. If you load an Rhistory file, your previous commands will again become available with the up-arrow and down-arrow keys. You can also use the command line to load or save your history. savehistory(file = "sand.Rhistory") loadhistory(file = "sand.Rhistory") history(max.show=Inf) #displays all previous commands 1.10.0.5 R Graphics Graphic outputs can be saved in various formats. Format Function pdf pdf(“graphic.pdf”) window metafile win.metafile(“graphic.wmf”) png png(“graph.png”) jpeg jpeg(“graph.jpg”) bmp bmp(“graph.bmp”) postscript postscript(“graph.ps”) To save a graphic: (1) Click the Plots Tab window, (2) click the Export button, (3) Choose your desired format, (3) Modify the export settings as you desire, and (4) click Save. The R command for saving a graphic is: png(file = "npk_yield.png") plot(npk$yield) dev.off() The first line of this command creates a blank file named sand with a JPEG extension. The second line plots the data object that you want to create a graphic of (here it is conveniently the same name as the JPEG file we are creating). The third line closes the graphics device. 1.11 Exercise 1: R packages and Functions Using the examples discussed thus far as a guide, demonstrate your mastery of the material by performing the following tasks. Create an R script file, demonstrate 3 basic R functions, and comment (#) your code. Install the FedData R package from CRAN and GitHub. Save the commands in your R script file. Load the FedData R package and read the help file for the get_ssurgo function within the FedData package. What is the 1st input/argument? Save the R command in your R script. Save your R script, and forward to your instructor. 1.12 Loading Data R can load a variety of data formats, however tabular data is by far the most common, and what we will spend of the majority of our time working with. Typically tabular data is stored in spreadsheets (e.g. .txt, .csv, .xlsx), databases (e.g. NASIS), or webpages (.html). Within R tabular data is stored as a data.frame. 1.12.0.1 Text files Text files are a preferable format for storing and transferring small datasets. One basic command for importing text files into R is read.csv(). The command is followed by the file name or URL and then some optional instructions for how to read the file. These files can either be imported into R by clicking the Import Dataset >> From Text buttons from the Environment tab, or by typing the following command into the R console: # from working directory sand <- read.csv("C:/workspace2/sand_example.csv") # from URL sand <- read.csv("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/data/sand_example.csv") 1.12.0.2 Excel files R can import Excel files, but generally speaking it is a bad idea to use Excel. Excel has a dangerous default which automatically converts data with common notations to their standard format without warning or notice. For example, the character “11-JUN” entered into a cell automatically becomes the date 6/11/2021, even though the data is still displayed as 11-JUN. The only way to avoid this default behavior is to manually import your data into Excel via the Data Tab>Get External Data Ribbon, and manually set the data type of all your columns to text. Failure to do so has resulted in numerous retracted research articles (Washington Post Article). Warnings aside, Excel files are a very common and are a format most people are familiar with. Therefore we will illustrate how to bring them into R. Download the sand Excel dataset from GitHub at https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/Pre-course/R_sand/sand_example.xlsx Excel datasets can either be imported into R by clicking the Import Dataset >> From Excel buttons from the Environment tab, or by typing the following command into the R console: library(readxl) sand_example <- read_excel("sand_example.xlsx") 1.12.0.3 NASIS (Web) Reports NASIS provides a plethora of reports, many of which can be read into R for analysis. The soilDB R package provides a series of functions to read data from NASIS either using a local database connection or via HTML web reports. Similar functions also exist for accessing tabular data from Soil Data Access. More details on soilDB will be provided in the next chapter, but now we’ll illustrate how to access some example datasets for manipulating tabular data. library(soilDB) # get projects prj <- get_project_from_NASISWebReport(mlrassoarea = "NE-IND", fiscalyear = 2020) l# get legends leg <- get_legend_from_NASISWebReport(mlraoffice = "Indi%", areasymbol = "%") # get map units mu <- get_mapunit_from_NASISWebReport(areasymbol = c("IN001", "IN11%")) 1.13 Data manipulation Before we can do any sort of analysis, our data often needs to be manipulated one way or another. Estimates vary, but an analyst typically spend 80% of their time manipulating data, and only 20% actually analyzing or modeling. Tasks generally involve filtering, transforming, merging, aggregating, and reshaping data. R has many functions and packages for manipulating data frames, but within the past several years a family of packages, known as the tidyverse, have been developed to simplify interacting with data frames (or tibbles). Within the tidyverse the most commonly used packages are dplyr and tidyr. Many of the tidyverse function names are patterned after SQL syntax. We will review the most common functions you need to know in order to accomplish the majority of data manipulation tasks. 1.13.1 Viewing and Removing Data Once a file is imported, it is imperative that you check to ensure that R correctly imported your data. Make sure numerical data are correctly imported as numerical, that your column headings are preserved, etc. To view the data simply click on the mu dataset listed in the Environment tab. This will open up a separate window that displays a spreadsheet like view. Additionally you can use the following functions to view your data in R. Function Description print() prints the entire object (avoid with large tables) head() prints the first 6 lines of your data str() shows the data structure of an R object names() lists the column names (i.e., headers) of your data ls() lists all the R objects in your workspace directory dput() print code to re-create an R object Try entering the following commands to view the mu dataset in R: str(mu) names(mu) head(mu) ls() dput(mu[1, ]) A data object is anything you’ve created or imported and assigned a name to in R. The Environment tab allows you to see what data objects are in your R session and expand their structure. Right now sand should be the only data object listed. If you wanted to delete all data objects from your R session, you could click the broom icon from the Environments tab. Otherwise you could type: # Remove all R objects rm(list = ls(all = TRUE)) # Remove individual objects rm(mu, leg, sand) 1.13.2 Filtering or Subsetting Data When analyzing data in NASIS, filtering is typically accomplished by loading your selected set with only the records you’re interested in. However, it is often useful or necessary to subset your data after it’s loaded. This can allow you to isolate interesting records within large datasets. For these reasons R has numerous options/functions for filtering data. Data frames can be filtered by both columns and rows, using either names, position (e.g. column 1, row 5), or logical indices (e.g. TRUE/FALSE). Another particularly useful feature is the use of pattern matching which uses regular expressions to select data, which is similar to the LIKE statement from SQL. **Filtering with names and numerical indices # Filtering with names (character values) mu$areasymbol # select column names using $ mu[, c("areasymbol", "musym")] # select column names using [] mu[c("1", "2"), ] # select row names using [] mu[c("1", "2"), c("areasymbol", "musym")] # select column and row names using [] # Filtering by position (integer values) mu[1, ] # select first row mu[, 1] # select first column mu[2, 2] # select second row and second column mu[c(1, 2, 3), ] # select multiple rows mu[c(-1, -2), ] # drop multiple rows Logical Operators == Equal To (NOTE: R uses a double equal sign) != Not Equal To <, >, <=, >= Less than, greater than, less than or equal to, and greater than or equal & Equivalent to AND must match both conditions | Equivalent to OR must match at least one condition %in% equivalent to IN () in SQL (e.g. mu$areasymbol %in% c(\"IN001\", \"IN111\") grepl() similar to LIKE in SQL (e.g. grepl(\"IN%\", mu$areasymbol)) Filtering with logicals # Standard evaluation with base R [] # Filtering with logicals mu[mu$areasymbol == "IN001", ] # select rows that equal IN001 mu[mu$areasymbol != "IN001", ] # select rows that do not equal IN001 mu[, names(mu) == "areasymbol"] # select columns that equal areasymbol mu[, names(mu) %in% c("areasymbol", "musym")] # select columns that match areasymbol and musym mu[grepl("Miami", mu$muname), ] # select rows that contain Miami # Non-standard evaluation with tidyverse library(dplyr) # Filtering rows filter(mu, areasymbol == "IN001") filter(mu, areasymbol != "IN001") filter(mu, areasymbol %in% c("IN001", "IN111")) filter(mu, grepl("Miami", muname)) filter(mu, muacres > 0) # Select columns select(mu, areasymbol, musym) # Slice rows slice(mu, 1:5) 1.13.3 Transforming Data This allows you to create new columns by convert, compute, or combine data within existing columns. mu <- mutate( mu, # convert to hectares muhectares = muacres * 0.4047, # convert muname to TRUE or FALSE if Miami is present using pattern matching miami = grepl("Miami", muname), # compute % minor component n_minor = n_component - n_majcompflag, # combine columns key = paste(areasymbol, musym) ) 1.13.4 Sorting Data Sorting allows you to rearrange your data. Beware R has several similar functions (e.g. sort and order) for sorting data only work with specific datatypes. The tidyverse function arrange is designed to work with data frames. # sort ascending arrange(mu, areasymbol, muname) # sort descending arrange(mu, desc(areasymbol), desc(muname)) 1.13.5 Piping Data Another particularly useful feature provided by the magrittr package and used in the tidyverse is the use of pipe (%>%). Base R also has a native pipe operator (|>). Using the RStudio keyboard shortcut Ctrl + Shift + M inserts the pipe you have selected as default in Global Options > Code. f(x,y) becomes x %>% f(y) The “pipe” is something that occurs in many programming languages and computing contexts. It allows output from one expression to be passed as input to the first argument of the next function. This allows sequences of commands to be read from right to left b(or top to bottom) rather than from the inside out. # non-piping example 1 mu_sub <- filter(mu, areasymbol == "IN001") mu_sub <- mutate(mu_sub, pct_100less = pct_component < 100) # non-piping example 2 mu_sub <- mutate(filter(mu, areasymbol == "IN001"), pct_100less = pct_component < 100) # piping mu_sub <- mu %>% filter(areasymbol == "IN001") %>% mutate(pct_100less = pct_component < 100) 1.13.6 Merging/Joining or Combining Data Joining When working with tabular data you often have 2 or more tables you need to join. There are several ways to join tables. Which direction to join and which columns to join will determine how you achieve the join. # inner join leg_mu <- inner_join(leg, mu, by = c("liid", "areasymbol")) # left join leg_mu <- left_join(leg, mu, by = c("liid")) # right_join leg_mu <- right_join(leg, mu, by = "liid") Combining If your tables have the same structure (e.g. columns), or length and order you may simply combine them. For example, if you have two different mapunit tables. # combine rows rbind(mu, mu) rbind(mu, leg) # won't work # combine columns cbind(mu, mu) # beware combine tables with duplicate column names cbind(mu, areasymbol_2 = mu$areasymbol) cbind(mu, leg) # won't work 1.13.7 Aggregating or Grouping Data Because soil data has multiple dimensions (e.g. properties and depths) and levels of organization (e.g. many to one relationships), it is often necessary to aggregate it. For example, when we wish to make a map we often need to aggregate over components and then map units. Depending on the data type this aggregation may involve taking a weighted average or selecting the dominant condition. The group_by function defines the groups over which we wish to summarize the data. mu_agg <- mu %>% group_by(grpname, areasymbol) %>% summarize(sum_muacres = sum(muacres), n_musym = length(musym)) 1.13.8 Reshaping Data Typically data is stored in what is known as a wide format, where each column contains a different variable (e.g. depth, clay, sand, rocks). However, sometimes it is necessary to reshape or pivot to a long format, where each variable/column is compressed into 2 new rows. One new column contains the old column names, while another new column contains the values from the old columns. This is particularly useful when combining multiple variables into a single plot. library(tidyr) # Simplify mu example dataset mu2 <- mu %>% select(grpname, areasymbol, musym, muacres, n_component, pct_hydric) %>% slice(1:5) print(mu2) # Pivot long mu2_long <- pivot_longer(mu2, cols = c(muacres, n_component, pct_hydric)) print(mu2_long) # Pivot wide mu2_wide <- pivot_wider(mu2_long, names_from = name) print(mu2_wide) 1.13.9 Exporting Data To export data from R, use the command write.csv() or write.dbf() functions. Since we have already set our working directory, R automatically saves our file into the working directory. write.csv(mu_agg, file = "mu_agg.csv") library(foreign) write.dbf(as.data.frame(mu_agg), file = "mu_agg.dbf") 1.14 Exercise 2: Data Manipulation Create a new R script file. To get information from the NASIS legend table for the state of Wisconsin use the soilDB function get_legend_from_NASISWebReport() for mlraoffice = \"%\" and areasymbol = \"WI%\" Filter the legend table for rows where areaacres is less than 200,000. Inspect the result to find the areasymbol values. Load the mapunit table, using soilDB get_mapunit_from_NASISWebReport() using the area symbols you identified in step 3. Calculate the acreage of hydric soils for each mapunit by multiplying muacres by pct_hydric. Note: pct_hydric is a percentage, not a proportion. Aggregate the total acreage of hydric soils each soil survey area using dplyr functions group_by() and summarize(). Join the aggregated mapunit table from Step 6 to the legend table from Step 3 using dplyr left_join(). Calculate the proportion of the total soil survey area acres (areaacres) that are hydric soils. Answer the following questions: What Wisconsin soil survey areas are less than 200,000 acres? What proportion of those soil survey areas are hydric soils? Bonus: How does your joined result in Step 7 differ if you replace dplyr left_join() with inner_join()? Why? Save your R script and forward to your instructor. 1.15 Review Given what you now know about R, try to answer the following questions: Can you think of a situation where an existing hypothesis or conventional wisdom was not repeatable? What are packages? What is GitHub? Where can you get help? What is a data frame? What are 3 ways you can manipulate a data frame? 1.16 Additional Reading (Introduction) Introductory R Books R for Data Science RStudio Cheatsheets Quick-R Advanced DSM R Books Predictive Soil Mapping with R Using R for Digital Soil Mapping (not free) Soil Spectral Inference with R (not free) GSP SOC Cookbook GSP SAS Manual Soil Science R Applications aqp and soilDB tutorials ISRIC World Soil Information Example Training Courses ISRIC World Soil Information YouTube Channel OpenGeoHub Trainings OpenGeoHub YouTube Channel David Rossiter’s Cornell Homepage Pierre Roudier Soil Sciences and Statistics Review Articles Arkely, R., 1976. Statistical Methods in Soil Classification Research. Advances in Agronomy 28:37-70. https://www.sciencedirect.com/science/article/pii/S0065211308605520 Mausbach, M., and L. Wilding, 1991. Spatial Variability of Soils and Landforms. Soil Science Society of America, Madison. https://dl.sciencesocieties.org/publications/books/tocs/sssaspecialpubl/spatialvariabil Wilding, L., Smeck, N., and G. Hall, 1983. Spatial Variability and Pedology. In : L. Widling, N. Smeck, and G. Hall (Eds). Pedogenesis and Soil Taxonomy I. Conceps and Interactions. Elseiver, Amsterdam, pp. 83-116. https://www.sciencedirect.com/science/article/pii/S0166248108705993 References Arnold, R. W., and L. P. Wilding. 1991. “The Need to Quantify Spatial Variability.” In SSSA Special Publications, edited by M. J. Mausbach and L. P. Wilding, 1–8. Madison, WI, USA: Soil Science Society of America. https://doi.org/10.2136/sssaspecpub28.c1. Brevik, Eric C., Jeffrey A. Homburg, Bradley A. Miller, Thomas E. Fenton, James A. Doolittle, and Samuel J. Indorante. 2016. “Selected Highlights in American Soil Science History from the 1980s to the Mid-2010s.” CATENA 146 (November): 128–46. https://doi.org/10.1016/j.catena.2016.06.021. Chaney, Nathaniel W., Eric F. Wood, Alexander B. McBratney, Jonathan W. Hempel, Travis W. Nauman, Colby W. Brungard, and Nathan P. Odgers. 2016. “POLARIS: A 30-Meter Probabilistic Soil Series Map of the Contiguous United States.” Geoderma 274: 54–67. https://doi.org/10.1016/j.geoderma.2016.03.025. Hennemann, G R, and D G Rossiter. 2004. “Training Needs for the Next Generation of Soil Surveyors.” In International Conference on Innovative Techniques in Soil Survey, Cha’am, Thailand, 21-26 March 2004, 22–26. Cha-Am, Thailand: Land Development Department. http://www.css.cornell.edu/faculty/dgr2/Docs/ChaAm/ChaAmKeynoteHennemann.pdf. Ihaka, Ross, and Robert Gentleman. 1996. “R: A Language for Data Analysis and Graphics.” Journal of Computational and Graphical Statistics 5 (3): 299–314. https://doi.org/10.1080/10618600.1996.10474713. Kempen, Bas, Dick J. Brus, Jetse J. Stoorvogel, Gerard B. M. Heuvelink, and Folkert de Vries. 2012. “Efficiency Comparison of Conventional and Digital Soil Mapping for Updating Soil Maps.” Soil Science Society of America Journal 76 (6): 2097–2115. https://doi.org/https://doi.org/10.2136/sssaj2011.0424. MacMillan, Robert A., David E. Moon, and Ray A. Coupé. 2007. “Automated Predictive Ecological Mapping in a Forest Region of b.c., Canada, 2001–2005.” Geoderma 140 (4): 353–73. https://doi.org/10.1016/j.geoderma.2007.04.027. Mausbach, M. J. 2003. “The Importance of Statistical Documentation - Keeping Soil Survey Information Relevant in the 21st Century.” In 2003 National Cooperative Soil Survey Conference, 3–6. Plymouth, Massachusetts: National Cooperative Soil Survey. https://web.archive.org/web/20220121020421/https://www.nrcs.usda.gov/Internet/FSE_DOCUMENTS/nrcs142p2_051833.pdf. Maynard, Jonathan J., Travis W. Nauman, Shawn W. Salley, Brandon T. Bestelmeyer, Michael C. Duniway, Curtis J. Talbot, and Joel R. Brown. 2019. “Digital Mapping of Ecological Land Units Using a Nationally Scalable Modeling Framework.” Soil Science Society of America Journal 83 (3): 666–66. https://doi.org/10.2136/sssaj2018.09.0346. Ramcharan, Amanda, Tomislav Hengl, Travis Nauman, Colby Brungard, Sharon Waltman, Skye Wills, and James Thompson. 2018. “Soil Property and Class Maps of the Conterminous United States at 100-Meter Spatial Resolution.” Soil Science Society of America Journal 82 (1): 186–201. https://doi.org/https://doi.org/10.2136/sssaj2017.04.0122. "],["data.html", "Chapter 2 The Data We Use 2.1 Objectives (The Data We Use) 2.2 The Structure of Soil Data 2.3 Challenges with Pedon Data 2.4 The SoilProfileCollection 2.5 Exercise 1: Assemble a SoilProfileCollection from several CSV files 2.6 Using the soilDB Package 2.7 Exercise 2: O Horizon Thickness 2.8 fetchNASIS() data checks 2.9 Extended Data Functions 2.10 Exercise 3: Diagnostic Horizons in Your Own Data 2.11 Custom Queries to Local NASIS Database 2.12 Exercise 4: Generalized Horizons with Loafercreek", " Chapter 2 The Data We Use 2.1 Objectives (The Data We Use) Expand on basic R skills from Chapter 1 Inspect and work with different data types Perform operations on data such as filtering and aggregation Begin to explore regular expression (regex) patterns for text data Learn how functions can be used to bundle operations Work with Soil Data Sources and Structures Use the soilDB package to load data into R Understand the SoilProfileCollection (SPC) object Learn about the data checks in the fetchNASIS() function 2.2 The Structure of Soil Data What if you could extract, organize, and visualize data from NASIS and many other commonly used soil database sources with a couple of lines of code? The aqp (Algorithms for Quantitative Pedology) and soilDB packages enable data to be fetched from various sources and cast into a SoilProfileCollection (SPC) object. Tabular and spatial data objects fetched via soilDB and processed using aqp methods can simplify the process of working with commonly used soil data. 2.2.1 Package References Package ‘aqp’ manual Package ‘soilDB’ manual Package ‘sharpshootR’ manual SoilProfileCollection Object Introduction Tutorials on the AQP website We load aqp and soilDB packages using the library() command. # load the libraries library(aqp) library(soilDB) The manual pages for soilDB and aqp are accessible online and from the Help tab in RStudio. 2.2.2 Importance of Pedon Data The importance of pedon data for present and future work cannot be overstated. These data represent decades of on-the-ground observations of the soil resource for a given area. As difficult as it may be to take the time to enter legacy pedon data, it is vitally important that we capture this resource and get these data into NASIS as an archive of point observations. 2.2.3 Some Issues With Pedon Data Making and documenting observations of soil requires hard work. Digging is difficult, and writing soil descriptions is time consuming! Our confidence in observations typically weakens with the depth of the material described. If we acknowledge this, which we must, then how do we deal with it in pedon data? Use a cutoff depth, for example 100 cm, can be used to truncate observations to a zone of greater confidence. Show the relative confidence of the data with depth. 2.3 Challenges with Pedon Data Consistency Missing data Confidence in the observations Uncertainty with depth Description style differences Depth described, horizonation usage styles Legacy data vintage Decadal span of data Taxonomy updates, horizon nomenclature changes Location confidence Origin of the location information Datum used for data collection Accuracy for GPS values at the time of data collection 2.4 The SoilProfileCollection The SoilProfileCollection class (SPC) provided by the aqp package is a specialized structure for soil data analysis. It simplifies the process of working with collections of data associated with soil profiles, e.g., site-level, horizon-level, spatial, diagnostic horizons, and other metadata. A SoilProfileCollection is similar to the NASIS Site/Pedon “object” in that it provides generalizations, specific routines and rules about data tables and their relationships. The SoilProfileCollection is an S4 R object. S4 objects have slots. Of primary importance, are the slots for site-level and horizon-level data. In many ways the SPC is more adaptable than the NASIS “Pedon” concept because it is more general. However, the SPC is not as expressive as the complex hierarchy of objects in NASIS, which are more aligned with data archival vs. analysis. 2.4.1 SoilProfileCollection methods Many “familiar” methods are defined for the SoilProfileCollection object. Some are unique, and others operate like more common functions of vector and data.frame objects, such as nrow() (“how many horizons?”) or length() (“how many sites/pedons?”). Perhaps most importantly, when you access the site data (with site(<object>)) or the horizon data (with horizons(<object>)) of a SoilProfileCollection, you get a data.frame object that you can use like any other you might use or make in R. 2.4.1.1 Promoting a data.frame to SoilProfileCollection The SoilProfileCollection object is a collection of 1-dimensional profile descriptions, of the type conventionally described on a Form 232, or of tabular data returned from laboratory. The object is “horizon data forward” in that you start with the layers, and can add or create site-level attributes by normalization, joins, and calculation. Most of the time if you are using your NASIS data, or an official database, there are defined ways of getting the data “into” an SPC. For example, fetchOSD returns a SoilProfileCollection that has been assembled from horizon and site level attributes gleaned from the OSDs text, Soil Classification database, and other sources. In the pre-course, we had you set up a process so you could connect to your local NASIS instance to “fetch” data and have methods like fetchNASIS put things together for you. This input to make a SoilProfileCollection can be represented most simply as a data.frame with unique site or profile ID and depth combinations for each horizon or layer–for example, a subset of the phorizon or chorizon table in NASIS. A simple demonstration of “tabular horizon data” is the sp4 data set bundled with aqp: some serpentine soil profiles stored in a data.frame in the aqp package (after McGahan et al., 2009). library(aqp) # Load sample serpentine soil data (McGahan et al., 2009) data(sp4, package = "aqp") # this is a data.frame # same as if loaded from CSV file etc. class(sp4) ## [1] "data.frame" # inspect the first couple of rows head(sp4) ## id name top bottom K Mg Ca CEC_7 ex_Ca_to_Mg sand silt clay CF ## 1 colusa A 0 3 0.3 25.7 9.0 23.0 0.35 46 33 21 0.12 ## 2 colusa ABt 3 8 0.2 23.7 5.6 21.4 0.23 42 31 27 0.27 ## 3 colusa Bt1 8 30 0.1 23.2 1.9 23.7 0.08 40 28 32 0.27 ## 4 colusa Bt2 30 42 0.1 44.3 0.3 43.0 0.01 27 18 55 0.16 ## 5 glenn A 0 9 0.2 21.9 4.4 18.8 0.20 54 20 25 0.55 ## 6 glenn Bt 9 34 0.3 18.9 4.5 27.5 0.20 49 18 34 0.84 To convert this horizon data into a SoilProfileCollection, we need to identify three parameters: idname, top, and bottom. These parameters refer to the columns of unique profile IDs, top depths and bottom depths, respectively. There are a couple of important constraints and considerations: records (rows) represent horizons profiles are uniquely identified by a column (user pedon ID, pedon record ID, etc.) profiles IDs cannot contain missing values (NA) horizon top and bottom depths are identified by column names ideally there are no gaps, overlap, or missing top/bottom depths (more on that later) Use a formula to specify column names in the data.frame, in this case \"id\", \"top\" and \"bottom\". # profile ID ~ top depth + bottom depth depths(sp4) <- id ~ top + bottom # note new class class(sp4) ## [1] "SoilProfileCollection" ## attr(,"package") ## [1] "aqp" # compact summary sp4 ## SoilProfileCollection with 10 profiles and 30 horizons ## profile ID: id | horizon ID: hzID ## Depth range: 16 - 49 cm ## ## ----- Horizons (6 / 30 rows | 10 / 14 columns) ----- ## id hzID top bottom name K Mg Ca CEC_7 ex_Ca_to_Mg ## colusa 1 0 3 A 0.3 25.7 9.0 23.0 0.35 ## colusa 2 3 8 ABt 0.2 23.7 5.6 21.4 0.23 ## colusa 3 8 30 Bt1 0.1 23.2 1.9 23.7 0.08 ## colusa 4 30 42 Bt2 0.1 44.3 0.3 43.0 0.01 ## glenn 5 0 9 A 0.2 21.9 4.4 18.8 0.20 ## glenn 6 9 34 Bt 0.3 18.9 4.5 27.5 0.20 ## [... more horizons ...] ## ## ----- Sites (6 / 10 rows | 1 / 1 columns) ----- ## id ## colusa ## glenn ## kings ## mariposa ## mendocino ## napa ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] The formula expresses the idea that a profile id defined by set of top and bottom depths. NOTE: A character vector with same names has the same effect, and can be easier to “program” with than the formula-based syntax. depths(sp4) <- c("id", "top", "bottom") 2.4.2 Promoting to “Spatial” SoilProfileCollection You can also use the SoilProfileCollection to manage the information about a profile’s position on the Earth. Chapter 4 will cover spatial data in greater detail, and the SoilProfileCollection Reference has a section on Spatial Data. For now know you can use the initSpatial<- method to define “X” and “Y” coordinate columns and the coordinate reference system in one line: sp4$x <- runif(10) sp4$y <- runif(10) # dummy XY coordinates initSpatial(sp4, crs = "OGC:CRS84") <- ~ x + y This is new syntax introduced in aqp 2.0, the older syntax uses the coordinates<- and proj4string<- methods. 2.4.2.1 Extracting Site and Horizon Data You can extract values from the collection’s @site and @horizon slots using the site() and horizons() functions. These create data.frame objects that are separate from the SoilProfileCollection. # extract site data from SPC into new data.frame 's' # note that it only contains profile IDs s <- site(sp4) str(s) ## 'data.frame': 10 obs. of 1 variable: ## $ id: chr "colusa" "glenn" "kings" "mariposa" ... # extract horizon data from SPC into new data.frame 'h' h <- horizons(sp4) str(h) ## 'data.frame': 30 obs. of 14 variables: ## $ id : chr "colusa" "colusa" "colusa" "colusa" ... ## $ name : chr "A" "ABt" "Bt1" "Bt2" ... ## $ top : int 0 3 8 30 0 9 0 4 13 0 ... ## $ bottom : int 3 8 30 42 9 34 4 13 40 3 ... ## $ K : num 0.3 0.2 0.1 0.1 0.2 0.3 0.2 0.6 0.8 0.6 ... ## $ Mg : num 25.7 23.7 23.2 44.3 21.9 18.9 12.1 12.1 17.7 28.3 ... ## $ Ca : num 9 5.6 1.9 0.3 4.4 4.5 1.4 7 4.4 5.8 ... ## $ CEC_7 : num 23 21.4 23.7 43 18.8 27.5 23.7 18 20 29.3 ... ## $ ex_Ca_to_Mg: num 0.35 0.23 0.08 0.01 0.2 0.2 0.58 0.51 0.25 0.2 ... ## $ sand : int 46 42 40 27 54 49 43 36 27 42 ... ## $ silt : int 33 31 28 18 20 18 55 49 45 26 ... ## $ clay : int 21 27 32 55 25 34 3 15 27 32 ... ## $ CF : num 0.12 0.27 0.27 0.16 0.55 0.84 0.5 0.75 0.67 0.25 ... ## $ hzID : chr "1" "2" "3" "4" ... 2.4.2.2 Methods like data.frame The base R functions for accessing and setting data.frame columns by name such as $ and [[ work for SoilProfileCollection objects, too. Review data.frame methods: [[ and $: single columns in data.frame, by name x[['variable']] x$variable [: combinations of rows and columns, by name or index x[i, ]: specified rows, all columns x[, j]: all rows, specified columns x[i, j]: specified rows, specified columns See Chapter 1 and the Chapter 2 Appendix for additional details and examples. 2.4.2.2.1 Column Access by Name: $ and [[ # sp4 is a SoilProfileCollection sp4$clay ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 sp4[['clay']] ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 # horizon data.frame h$clay ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 h[['clay']] ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 # use $<- or [[<- to set proportional clay content sp4$clay <- sp4[['clay']] / 100 # undo what we did above; back to percentage sp4[['clay']] <- sp4$clay * 100 # create new site variable ("numberone" recycled for all sites) site(sp4)$newvar1 <- "numberone" # create new horizon variable ("numbertwo" recycled for all horizons) horizons(sp4)$newvar2 <- "numbertwo" 2.4.2.2.2 Row Access: [ The SoilProfileCollection also has [ (“single bracket”), but with a different interpretation from the [i, j] indexing of data.frame objects. In a data.frame you have object[row, column, drop=TRUE]; the result is a data.frame (or a vector with default drop=TRUE). In a SoilProfileCollection you have object[site, horizon]; the result is a SoilProfileCollection. # i-index: first 2 profiles, all horizons sp4[1:2, ] ## SoilProfileCollection with 2 profiles and 6 horizons ## profile ID: id | horizon ID: hzID ## Depth range: 34 - 42 cm ## ## ----- Horizons (6 / 6 rows | 10 / 15 columns) ----- ## id hzID top bottom name K Mg Ca CEC_7 ex_Ca_to_Mg ## colusa 1 0 3 A 0.3 25.7 9.0 23.0 0.35 ## colusa 2 3 8 ABt 0.2 23.7 5.6 21.4 0.23 ## colusa 3 8 30 Bt1 0.1 23.2 1.9 23.7 0.08 ## colusa 4 30 42 Bt2 0.1 44.3 0.3 43.0 0.01 ## glenn 5 0 9 A 0.2 21.9 4.4 18.8 0.20 ## glenn 6 9 34 Bt 0.3 18.9 4.5 27.5 0.20 ## ## ----- Sites (2 / 2 rows | 2 / 2 columns) ----- ## id newvar1 ## colusa numberone ## glenn numberone ## ## Spatial Data: ## [EMPTY] # j-index: all profiles; first 2 horizons of each profile sp4[, 1:2] ## SoilProfileCollection with 10 profiles and 20 horizons ## profile ID: id | horizon ID: hzID ## Depth range: 5 - 40 cm ## ## ----- Horizons (6 / 20 rows | 10 / 15 columns) ----- ## id hzID top bottom name K Mg Ca CEC_7 ex_Ca_to_Mg ## colusa 1 0 3 A 0.3 25.7 9.0 23.0 0.35 ## colusa 2 3 8 ABt 0.2 23.7 5.6 21.4 0.23 ## glenn 5 0 9 A 0.2 21.9 4.4 18.8 0.20 ## glenn 6 9 34 Bt 0.3 18.9 4.5 27.5 0.20 ## kings 7 0 4 A 0.2 12.1 1.4 23.7 0.58 ## kings 8 4 13 Bt1 0.6 12.1 7.0 18.0 0.51 ## [... more horizons ...] ## ## ----- Sites (6 / 10 rows | 2 / 2 columns) ----- ## id newvar1 ## colusa numberone ## glenn numberone ## kings numberone ## mariposa numberone ## mendocino numberone ## napa numberone ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] When you use the [ function, everything in the SoilProfileCollection is subset simultaneously depending on the constraints specified by the indices. # First profile, first 2 horizons horizons(sp4[1, 1:2]) ## id name top bottom K Mg Ca CEC_7 ex_Ca_to_Mg sand silt clay CF hzID newvar2 ## 1 colusa A 0 3 0.3 25.7 9.0 23.0 0.35 46 33 21 0.12 1 numbertwo ## 2 colusa ABt 3 8 0.2 23.7 5.6 21.4 0.23 42 31 27 0.27 2 numbertwo All slots in the collection have a relationship to the site or i-index. When you remove sites (profiles), all associated records (e.g. spatial, diagnostics, horizons, etc.) in the object are removed. Similarly, when all horizons are removed (say, you request the 6th j-index from a profile that has only 5 layers), the site index and all associated data are removed from the collection. 2.5 Exercise 1: Assemble a SoilProfileCollection from several CSV files Link to exercise R code Questions: Run the code in the linked R file and answer these questions. How many profiles (sites) and horizons are in the granite SoilProfileCollection? How many in andesite? See length() and nrow() functions for SoilProfileCollection objects. Which profile (and which horizon in that profile) has the highest ratio of oxalate-extractable Fe to dithionite-citrate-extractable Fe (Fe_o_to_Fe_d)? Send the results of questions (and any code you used) to your mentor. 2.6 Using the soilDB Package The soilDB package for R provides functions for accessing data stored in NASIS, KSSL, SDA, SoilWeb, SoilGrids and other sources. These high-level ‘fetch’ functions bundle or wrap lower-level ‘get’ functions which access internal database interfaces to NASIS and other data sources. The ODBC connection to NASIS that you set up during the pre-course is an example of an internal database interface. Basic data checks are run within ‘fetch’ functions. These checks ensure the basic integrity of the data as it is queried and moved from its existing structure into an SPC. There are times when it is useful to use the lower-level get functions individually. They generally return single data.frame or list of data.frame. You can set up scripts to make custom queries against these or other sources on your own – there is an example at the end of this section. For now, we will start with the ‘fetch’ functions and others that will get you a large variety of data you can use for soil and ecological site analyses. 2.6.1 soilDB functions for tabular data soilDB functions are the quickest way to get up and running: fetchNASIS() Gets and re-packages data from a local NASIS database. soilDB Vignette Columns in fetchNASIS(from=\"pedons\") fetchVegdata() Gets Vegetation Plot and related/child tables into a list from a local NASIS database. fetchNASISLabData() Gets KSSL laboratory pedon/horizon layer data from a local NASIS database. fetchNASISWebReport() SDA_query() Can be used to access SSURGO, STATSGO (spatial and tabular), and Lab DataMart snapshots Submits queries to the Soil Data Access system. Soil Data Access Tutorial SDA and Spatial Data SDA and Interpretations fetchLDM() Gets KSSL data from the Lab Data Mart snapshot in Soil Data Access fetchSDA() Fetches legend/mapunit/component/horizon data from Soil Data Access. fetchKSSL() Gets KSSL data from the SoilWeb system via BBOX, MLRA, or series name query. KSSL Data Demo Water Retention Curve Development from KSSL Data fetchOSD() Fetches a limited subset of horizon- and site-level attributes for named soil series from the SoilWeb system. Querying Soil Series Data OSDquery() Full-text searching of OSD sections. Querying Soil Series Data fetchSCAN() Queries soil and climate data from USDA-NRCS SCAN Stations. A Unified Interface to SCAN/SNOTEL Data fetchHenry() Downloads data from the Henry Mount Soil Climate Database. Henry Mount Soil Climate Database Tutorial fetchPedonPC() Fetches commonly used site and horizon data from a PedonPC (MS Access) database. 2.6.2 Open Database Connectivity (ODBC) Connection to NASIS After setting up an ODBC connection, as you did as part of the pre-course, you can use R to access data from a selected set defined in your local NASIS database. How to Create an ODBC Connection to local NASIS database for R. Does NASIS need to be open and running to query data using soilDB? No, fetchNASIS() works whether the NASIS application is running or not. You just need to make sure that the data you want has been loaded into your selected set. 2.6.3 fetchNASIS() The fetchNASIS() convenience function extracts data from a NASIS selected set via Structured Query Language (SQL). Note that the import process in fetchNASIS(), and the other methods, is not comprehensive. It does not pull every column for every table related to pedon data out of NASIS. Instead, it pulls essential / commonly used pedon and horizon data. Higher level functions like fetchNASIS() bundle a series of lower-level queries to get specific parts of the Pedon or Component data structures. Much of the nested complexity of NASIS is simplified in the resulting object. Many-to-one relationships are “flattened” where possible by fetchNASIS(). This aggregates the data from various tables into one “site” record with related horizon records, per profile. You can see the child tables that are aggregated using the get_extended_data_from_NASIS() method, which returns a named list of child table sources that can be joined to the SoilProfileCollection made with fetchNASIS() using the internal record IDs. 2.6.3.1 fetchNASIS arguments fetchNASIS() has a number of different arguments: from = ‘pedons’ or ‘components’ or ‘pedon_report’ This option allows you to select which data you want to load from NASIS. Choosing either ‘pedons’ or ‘components’ will load data from your local database. If ‘pedon_report’ is specified then it will load data from the text file generated by the NASIS report ‘fetchNASIS’ (run offline). This is useful for loading more than 20,000 pedons at one time, such for an entire Soil Survey Region. url = string specifying the (temporary) URL for the NASIS pedon_report output generated by the fetchNASIS NASIS Report that can be run “Offline Against National Database” EXAMPLE OUTPUT (MT663) SS = TRUE/FALSE The Selected Set (SS) option allows you to choose whether you want the data to load from your current selected set in NASIS or from the local database tables. The default is set to TRUE so if unspecified fetchNASIS() will always load from the data in the selected set. stringAsFactors = NULL This option is no longer used. See soilDB::NASISDomainsAsFactor() rmHzErrors = TRUE/FALSE Setting this value to TRUE removes pedons that do not pass checks for horizon depth consistency. Default: FALSE nullFragsAreZero = TRUE/FALSE Setting this value to TRUE (the default) converts null entries for rock fragment volumes to 0. This is typically the right assumption because rock fragment data are typically populated only when observed. If you know that your data contain a combination of omitted information (e.g. no rock fragment volumes are populated) then consider setting this argument to FALSE. soilColorState = ‘moist’ or ‘dry’ Select dry or moist colors to be converted and placed into a horizon-level attribute called soil_color. The default is set to ‘moist’ unless specified. Moist and dry colors are also stored in moist_soil_color and dry_soil_color. lab = TRUE/FALSE This option allows for loading the data associated with horizons that may be in the phlabresults table. The default is set to FALSE, which will not load records from the phlabresults table. fill = TRUE/FALSE This option adds horizons to pedons or components that lack horizon data in the database, preserving their “position” within the output SoilProfileCollection object. Default is FALSE such that profiles without horizons are omitted from the result. dropAdditional = TRUE/FALSE Used only for from='components' with duplicates = TRUE. Prevent “duplication” of mustatus == \"additional\" mapunits? Default: TRUE dropNonRepresentative = TRUE/FALSE Used only for from='components' with duplicates = TRUE. Prevent “duplication” of non-representative data mapunits? Default: TRUE duplicates = FALSE Used only for from='components'. Duplicate components for all instances of use (i.e. one for each legend data mapunit is used on; optionally for additional mapunits, and/or non-representative data mapunits?). This will include columns from get_component_correlation_data_from_NASIS_db() that identify which legend(s) each component is used on. NOTE: This requires that parent tables above “component” (such as legend, mapunit, correlation and datamapunit) are loaded in your NASIS database/selected set. dsn = NULL Optional: custom path to an SQLite snapshot or DBIConnection object to database with NASIS schema. See soilDB::createStaticNASIS(). For more information on the data checks and adjusting the default options to fetchNASIS() function, see the following resource: Tips on Getting Data from NASIS into R. 2.6.4 The gopheridge Dataset The gopheridge sample data set is a sample R object returned from fetchNASIS() in a self-contained .rda file stored in soilDB. Open RStudio, and set up the environment by loading packages and the gopheridge sample dataset. library(aqp) library(soilDB) # load example dataset data(gopheridge, package = "soilDB") # what kind of object is this? class(gopheridge) ## [1] "SoilProfileCollection" ## attr(,"package") ## [1] "aqp" # what does the internal structure look like? str(gopheridge, 2) ## Formal class 'SoilProfileCollection' [package "aqp"] with 8 slots ## ..@ idcol : chr "peiid" ## ..@ hzidcol : chr "phiid" ## ..@ depthcols : chr [1:2] "hzdept" "hzdepb" ## ..@ metadata :List of 6 ## ..@ horizons :'data.frame': 317 obs. of 77 variables: ## ..@ site :'data.frame': 52 obs. of 164 variables: ## ..@ diagnostic :'data.frame': 164 obs. of 4 variables: ## ..@ restrictions:'data.frame': 56 obs. of 8 variables: There are many columns in the data.frame objects within a fetchNASIS() SoilProfileCollection. The following guide is part of the soilDB documentation and describes the columns that are returned from a fetchNASIS(from=\"pedons\") call. In the future this guide will be extended to describe component data. fetchNASIS(from=“pedons”) column description guide With siteNames() and horizonNames() we can view the names for eachslot respectively in the gopheridge object. # the fields at the site and horizon levels within the SPC siteNames(gopheridge) ## [1] "peiid" "siteiid" "ecositeid" ## [4] "ecositenm" "ecositecorrdate" "es_classifier" ## [7] "siteecositehistory.classifier" "es_selection_method" "upedonid" ## [10] "siteobsiid" "usiteid" "obsdate" ## [13] "utmzone" "utmeasting" "utmnorthing" ## [16] "horizdatnm" "longstddecimaldegrees" "latstddecimaldegrees" ## [19] "gpspositionalerror" "describer" "descname" ## [22] "pedonpurpose" "pedontype" "pedlabsampnum" ## [25] "labdatadescflag" "tsectstopnum" "tsectinterval" ## [28] "utransectid" "tsectkind" "tsectselmeth" ## [31] "erocl" "elev_field" "slope_field" ## [34] "aspect_field" "elev" "slope" ## [37] "aspect" "ecostatename" "ecostateid" ## [40] "commphasename" "commphaseid" "plantassocnm" ## [43] "earthcovkind1" "earthcovkind2" "bedrckdepth" ## [46] "bedrckkind" "bedrckhardness" "pmgroupname" ## [49] "hillslopeprof" "geomslopeseg" "shapeacross" ## [52] "shapedown" "slopecomplex" "drainagecl" ## [55] "geomposhill" "geomposmntn" "geompostrce" ## [58] "geomposflats" "swaterdepth" "flodfreqcl" ## [61] "floddurcl" "flodmonthbeg" "pondfreqcl" ## [64] "ponddurcl" "pondmonthbeg" "climstaid" ## [67] "climstanm" "climstatype" "ffd" ## [70] "map" "reannualprecip" "airtempa" ## [73] "soiltempa" "airtemps" "soiltemps" ## [76] "airtempw" "soiltempw" "surface_fine_gravel" ## [79] "surface_gravel" "surface_cobbles" "surface_stones" ## [82] "surface_boulders" "surface_channers" "surface_flagstones" ## [85] "surface_parafine_gravel" "surface_paragravel" "surface_paracobbles" ## [88] "surface_parastones" "surface_paraboulders" "surface_parachanners" ## [91] "surface_paraflagstones" "surface_unspecified" "surface_total_frags_pct_nopf" ## [94] "surface_total_frags_pct" "othervegid" "othervegclass" ## [97] "site_state" "site_county" "site_mlra" ## [100] "slope_shape" "surface_fgravel" "classdate" ## [103] "classifier" "classtype" "taxonname" ## [106] "localphase" "taxonkind" "seriesstatus" ## [109] "taxclname" "taxpartsize" "taxorder" ## [112] "taxsuborder" "taxgrtgroup" "taxsubgrp" ## [115] "soiltaxedition" "osdtypelocflag" "taxmoistcl" ## [118] "taxtempregime" "taxfamother" "taxreaction" ## [121] "taxfamhahatmatcl" "psctopdepth" "pscbotdepth" ## [124] "selection_method" "ochric.epipedon" "argillic.horizon" ## [127] "paralithic.contact" "lithic.contact" "umbric.epipedon" ## [130] "cambic.horizon" "mollic.epipedon" "densic.materials" ## [133] "paralithic.materials" "lithologic.discontinuity" "andic.soil.properties" ## [136] "densic.contact" "abrupt.textural.change" "aquic.conditions" ## [139] "duripan" "slickensides" "redox.depletions.with.chroma.2.or.less" ## [142] "redox.concentrations" "reduced.matrix" "histic.epipedon" ## [145] "albic.horizon" "spodic.horizon" "fibric.soil.materials" ## [148] "hemic.soil.materials" "sapric.soil.materials" "volcanic.glass" ## [151] "folistic.epipedon" "strongly.contrasting.particle.size.class" "calcic.horizon" ## [154] "human.transported.material" "albic.materials" "secondary.carbonates" ## [157] "anthropic.epipedon" "landform_string" "landscape_string" ## [160] "microfeature_string" "geomicrorelief_string" "pmkind" ## [163] "pmorigin" "site_id" horizonNames(gopheridge) ## [1] "phiid" "peiid" "pedon_id" "hzname" "dspcomplayerid" "hzdept" ## [7] "hzdepb" "bounddistinct" "boundtopo" "claytotest" "silttotest" "sandtotest" ## [13] "clay" "silt" "sand" "fragvoltot" "texture" "texcl" ## [19] "lieutex" "phfield" "effclass" "labsampnum" "rupresblkdry" "rupresblkmst" ## [25] "rupresblkcem" "stickiness" "plasticity" "ksatpedon" "texture_class" "hzID" ## [31] "d_hue" "d_value" "d_chroma" "dry_soil_color" "d_r" "d_g" ## [37] "d_b" "d_sigma" "m_hue" "m_value" "m_chroma" "moist_soil_color" ## [43] "m_r" "m_g" "m_b" "m_sigma" "soil_color" "fine_gravel" ## [49] "gravel" "cobbles" "stones" "boulders" "channers" "flagstones" ## [55] "parafine_gravel" "paragravel" "paracobbles" "parastones" "paraboulders" "parachanners" ## [61] "paraflagstones" "unspecified" "total_frags_pct_nopf" "total_frags_pct" "art_fgr" "art_gr" ## [67] "art_cb" "art_st" "art_by" "art_ch" "art_fl" "art_unspecified" ## [73] "total_art_pct" "huartvol_cohesive" "huartvol_penetrable" "huartvol_innocuous" "huartvol_persistent" 2.6.4.1 Make profile sketches The plotSPC() or plot() function applied to a SoilProfileCollection object generates sketches based on horizon depths, designations, and colors. The SoilProfileCollection Reference vignette contains many examples demonstrating way in which these sketches can be customized. The Soil Profile Sketches tutorial contains additional examples that demonstrate various ways to customize soil profile sketches. See ?plotSPC for a detailed list of arguments and examples. The fetchNASIS() function automatically converts moist Munsell colors into R-style colors, available in the soil_color horizon level attribute. This color is used by default in plotSPC() par(mar = c(1, 1, 1, 1)) # omitting pedon IDs and horizon designations plotSPC(gopheridge, print.id = FALSE, name = NA, width = 0.3) title('Pedons from the `gopheridge` sample dataset', line = -0.5) Additional examples / documentation related to soil profile sketches: SoilProfileCollection Reference OSD Dendrogram tutorial Visualization of Horizon Boundaries tutorial Competing Series tutorial 2.6.4.2 Pedon Data Checks When you load pedons using the fetchNASIS() function, the following data checks are performed: Presence of multiple map datums. Results reported to the user and the data are not modified. Inconsistent horizon boundaries. Pedons with inconsistent horizon boundaries are not loaded unless rmHzErrors = FALSE. In most cases, this occurs when the bottom depth of a horizon is not the same as the upper depth of the next lower horizon. ## hzname top bot ## 1 A 0 30 ## 2 Bt1 38 56 ## 3 Bt2 56 121 ## 4 Bk 121 135 ## 5 R 135 NA Note the issue above. The bottom depth of the A horizon and the upper depth of the Bt1 horizon should be the same: either 30 or 38 cm. The correct depth needs to be determined and fixed in the database. Missing lower horizon depths. Offending horizons are fixed by replacing the missing bottom depth with the top depth plus 2 cm. In the case of the profile shown above, a bottom depth of 137 cm would be inserted where the depth is missing. Sites missing pedon records. Data without corresponding horizons are not loaded. 2.6.4.3 Find Data with Errors If errors in the pedon data are detected when loading data using fetchNASIS(), the following “get” commands can trace them back to the corresponding records in NASIS. These access an option that is stored in a special object called an environment associated with the soilDB package – they generally contain vectors of IDs to help locating the problematic data. get('sites.missing.pedons', envir = soilDB.env) Returns user site ID for sites missing pedons get('dup.pedon.ids', envir = soilDB.env) Returns user pedon ID for sites with duplicate pedon ID get('bad.pedon.ids', envir = soilDB.env) Returns user pedon ID for pedons with inconsistent horizon depths get('bad.horizons', envir = soilDB.env) Returns a data.frame of horizon-level information for pedons with inconsistent horizon depths # fetchNASIS("pedons") get('sites.missing.pedons', envir = get_soilDB_env()) get('dup.pedon.ids', envir = get_soilDB_env()) get('bad.pedon.ids', envir = get_soilDB_env()) get('missing.bottom.depths', envir=get_soilDB_env()) get('top.bottom.equal', envir=get_soilDB_env()) get('bad.horizons', envir = get_soilDB_env()) get('rock.fragment.volume.gt100.phiid', envir=get_soilDB_env()) get('artifact.volume.gt100.phiid', envir=get_soilDB_env()) get('multisiteobs.surface', envir=get_soilDB_env()) get('surface.fragment.cover.gt100.siteobsiid', envir=get_soilDB_env()) get('multiple.labsampnum.per.phiid', envir=get_soilDB_env()) # fetchNASISLabData() get('bad.labpedon.ids', envir=get_soilDB_env()) # fetchNASIS("components"), fetchNASISWebReport() get('dupe.coiids', envir=get_soilDB_env()) get('dupe.muiids', envir=get_soilDB_env()) get('multiple.mu.per.dmu', envir=get_soilDB_env()) get("component.hz.problems", envir = get_soilDB_env()) get('multiple.ecosite.per.coiid', envir=get_soilDB_env()) get('multiple.otherveg.per.coiid', envir=get_soilDB_env()) # Soil Data Access get('dup.compmgrp.cokeyrvindictor', envir=get_soilDB_env()) get('component.hz.problems', envir=get_soilDB_env()) get('component.ecosite.problems', envir = get_soilDB_env()) These get() calls access variables stored in the package environment soilDB.env. The variables only exist if there are “problems” / values found by the data checks – and if you fix the errors in the NASIS database and the checks don’t find any errors then nothing will be returned by these functions. 2.6.5 Summaries Now that you’ve loaded some data, you can look at additional ways to summarize and interact with data elements. 2.6.5.1 table() and Cross Tabulation The base R table() function is very useful for quick summary operations. It returns a named vector with the amount of each unique level of the a given vector. The numeric vector of “counts” is commonly combined with other functions such as sort(), order(), prop.table(), is.na() to identify abundance, proportions, or missing data (NA). # load required packages library(aqp) library(soilDB) data("gopheridge", package = "soilDB") # for these examples, we use the gopheridge object as our "selected set" pedons <- gopheridge ## you can use fetchNASIS to load your own data, like this: # pedons <- fetchNASIS() # summarize which soil taxa we have loaded table(pedons$taxonname) ## ## Gopheridge ## 52 # sort taxonomic names in descending order sort(table(pedons$taxonname), decreasing = TRUE) ## Gopheridge ## 52 # could do the same thing for taxonomic subgroups table(pedons$taxsubgrp) ## ## mollic haploxeralfs typic haploxerepts ultic haploxeralfs ultic haploxerolls ## 1 6 44 1 sort(table(pedons$taxsubgrp), decreasing = TRUE) ## ## ultic haploxeralfs typic haploxerepts mollic haploxeralfs ultic haploxerolls ## 44 6 1 1 We can convert counts in the table() result into proportions with prop.table(): prop.table(table(pedons$taxsubgrp)) ## ## mollic haploxeralfs typic haploxerepts ultic haploxeralfs ultic haploxerolls ## 0.01923077 0.11538462 0.84615385 0.01923077 table() can be used to get counts over multiple dimensions of factor levels. This is called cross tabulation. For instance, let’s cross tabulate taxonomic subgroup (taxsubgrp) and the particle size family class (taxpartsize) for pedons table(pedons$taxsubgrp, pedons$taxpartsize) ## ## clayey-skeletal coarse-loamy fine fine-loamy loamy-skeletal ## mollic haploxeralfs 0 0 0 0 1 ## typic haploxerepts 1 0 0 0 5 ## ultic haploxeralfs 2 0 1 1 40 ## ultic haploxerolls 0 1 0 0 0 As expected with gopheridge the vast majority of pedons are Loamy-skeletal Ultic Haploxeralfs. Since pedons contains site and horizon level data, when cross-tabulating we need to be sure pair a column from the site data with other site-level columns, and the same for horizon-level. This is because all arguments to table() must have the same length. For example, let’s cross-tabulate horizon designation (hzname) with horizon texture class (texcl). We can use the addmargins() function to add the row and column sums to the margins of the table for easier interpretation when there are many rows/columns in the result. addmargins(table(pedons$hzname, pedons$texcl)) ## ## c cl l scl sic sicl sil sl Sum ## 2BCt5 0 1 0 0 0 0 0 0 1 ## 2Bt1 0 0 3 0 0 0 0 0 3 ## 2Bt2 1 2 1 1 0 0 0 0 5 ## 2Bt3 1 3 1 0 0 0 0 0 5 ## 2Bt4 2 0 0 0 0 0 0 0 2 ## 2CBt 0 0 0 1 0 0 0 0 1 ## 2Cr 0 0 0 0 0 0 0 0 0 ## 2Crt 0 0 0 0 0 0 0 0 0 ## 2R 0 0 0 0 0 0 0 0 0 ## A 0 0 33 0 0 0 12 3 48 ## A1 0 0 2 0 0 0 2 0 4 ## A2 0 0 2 0 0 0 2 0 4 ## A3 0 0 1 0 0 0 0 0 1 ## AB 0 0 2 0 0 0 2 0 4 ## BA 0 0 17 0 0 1 0 0 18 ## BC 0 0 4 0 0 0 0 0 4 ## BCt 0 2 2 1 0 0 1 0 6 ## Bt 0 0 1 1 1 0 0 0 3 ## Bt1 0 3 28 1 0 3 5 0 40 ## Bt2 3 15 14 1 1 3 1 0 38 ## Bt3 4 8 6 1 0 1 1 0 21 ## Bt4 1 2 2 0 0 0 0 0 5 ## Bw 0 0 6 0 0 0 1 0 7 ## Bw1 0 0 5 0 0 0 0 0 5 ## Bw2 0 0 5 0 0 0 0 0 5 ## Bw3 0 0 3 0 0 0 0 0 3 ## C 1 0 1 0 0 0 0 0 2 ## C/Brt 0 1 0 0 0 0 0 0 1 ## CBt 0 0 0 1 0 0 0 0 1 ## Cr 0 0 1 0 0 0 0 0 1 ## Crt 0 0 0 0 0 0 0 0 0 ## Ct 0 0 1 0 0 0 0 0 1 ## Oe 0 0 0 0 0 0 0 0 0 ## Oi 0 0 0 0 0 0 0 0 0 ## R 0 0 0 0 0 0 0 0 0 ## Sum 13 37 141 8 2 8 27 3 239 2.6.5.2 The dplyr package and “tidy” data principles Tidy Data Principles This is a stub to talk about dplyr some links to tidyverse-centric examples of working with data.frame/tibble and summarizing them. Talk about cool things like rowwise(), across() and translation to high-performance code (dtplyr) and SQL (dbplyr). 2.6.6 Missing Values “Missing” values are encoded in R as NA. table() has a useNA argument that affects whether NA values are counted. Use is.na() to return a logical value that identifies missing data. table(pedons$taxsubgrp, useNA = "ifany") ## ## mollic haploxeralfs typic haploxerepts ultic haploxeralfs ultic haploxerolls ## 1 6 44 1 # is.na(...) table(is.na(pedons$taxsubgrp)) ## ## FALSE ## 52 # is NOT NA !is.na(...) table(!is.na(pedons$taxsubgrp)) ## ## TRUE ## 52 # it can also be applied to horizon level columns in the SPC sort(table(pedons$texture), decreasing=TRUE) ## ## BR L GR-L GRV-L CBV-L SPM GRX-L SIL GRV-CL CBV-CL GR-SIL CBX-L GRX-CL CBX-CL GRV-SIL ## 58 36 33 24 18 14 12 12 9 8 7 6 5 4 4 ## CL GRV-SCL GRX-C MPM SL CB-L GR-CL GRX-SCL PGR-C PGRX-L SICL STV-CL STV-L STX-C STX-L ## 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 ## C CB-C CB-CL CB-SCL CB-SIL CBV-SIL CBX-SCL CN-L CN-SICL CNX-L CNX-SICL FLV-L GR-C GR-SIC GRV-SICL ## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ## GRX-SIC GRX-SIL PCB-SICL PCBV-SICL PCN-C PCNX-CL PGRV-C PGRV-CL PGRX-SCL PGRX-SIL ST-L STV-C STX-CL STX-SICL ## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2.6.7 Logical Operators Logical operators act on vectors for the purposes of comparison. == “EQUAL TO” != “NOT EQUAL TO” < LESS than LESS than or equal to <= > GREATER than GREATER than or equal to >= %in% Equivalent to IN () in SQL; same logic as match() but returns a logical, not integer Example: pedons$taxpartsize %in% c('loamy-skeletal', 'sandy-skeletal') Returns a vector of TRUE/FALSE equal in length to left-hand side & logical AND | logical OR Any logical operation on NA returns NA, so it is important to make sure your data are complete before relying on logical expressions to find conditions of interest. 2.6.8 Pattern Matching The following examples use the grep() function to pattern match within the data. We do this to create an index of the SoilProfileCollection for records that match the specified pattern, and then use that index to filter to specific sites and profiles. Patterns are specified using regular expression (REGEX) syntax. This process can be applied to many different columns in the SPC based on how you need to filter the data. This example pattern matches on the taxsubgrp column, but another useful application might be to pattern match on geomorphology or parent material. Say we want to see what the variation of particle size classes are within a specific subgroup. We can use grep() to create a row index, then apply that index to the SoilProfileCollection. # create a numeric index for pedons with taxsubgroup containing 'typic' idx <- grep('typic', pedons$taxsubgrp) idx ## [1] 11 12 13 14 26 50 # use square bracket notation to subset 'typic' soils in `subset1` object subset1 <- pedons[idx,] # or use the index directly to summarize taxpartsize for 'typic' soils sort(table(pedons$taxpartsize[idx]), decreasing = TRUE) ## ## loamy-skeletal clayey-skeletal ## 5 1 Note: grep() below has an invert argument (default FALSE). This option is very useful for excluding the results of the pattern matching process by inverting whatever the result is. grepl() is the logical version of grep(), so you can invert it using the logical NOT operator: !. Another method is to create an index using which() function. which() takes any logical vector (or expression), and it returns the indices (positions) where that expression returns TRUE. The use of which becomes more important when there are missing values (NA) in an expression. Do a graphical check to see the “typic” profiles are selected. Plot them in R using the SoilProfileCollection “plot” method (e.g., specialized version of the generic plot() function). # adjust margins par(mar=c(1,0,0,1)) # plot the first 10 profiles of subset1 plot(subset1[1:10, ], label = 'taxsubgrp', max.depth = 60) title('Pedons with the word "typic" at subgroup-level of Soil Taxonomy', line=-2) 2.6.8.1 Resources for Regular Expressions A great way to test out regular expressions, and get in-depth explanations of how the syntax is working, is to use an online expression builder. For example, Regex101 or RegExr. https://regex101.com/ & https://regexr.com/ - Online regular expression testers For more information on using regular expressions in grep() for pattern matching operations, see: GNU Regular-expression-syntax Quick Start Guide :http://www.regular-expressions.info/quickstart.html Quick check: Review the chapter content, or run the commands, and review the documentation, to answer the questions. True or False: grepl() returns a numeric vector True or False: which(grepl('typic', pedons$taxsubgrp)) is the same as grep('typic', pedons$taxsubgrp). 2.6.8.2 Statistics for Soil Survey: REGEX Operator Reference . One character, any character * Zero-or-more Quantifier (of previous token) + One-or-more Quantifier (of previous token) {n} quantifier where n is the the number of a match “repeats” (of previous token) [A-Z!] ONE capital letter, or an exclamation mark [0-9]{2} TWO numbers (using { quantifier) | is equivalent to OR: Example: grep('loamy|sandy', c(\"loamy-skeletal\",\"sandy\",\"sandy-skeletal\")) “loamy OR sandy” ^ Anchor to beginning of string / line: Example: grep('^sandy', c(\"loamy-skeletal\",\"sandy\",\"sandy-skeletal\")) “STARTS WITH sandy” $ Anchor to end of string / line: Example: grep('skeletal$', c(\"loamy-skeletal\",\"sandy\",\"sandy-skeletal\")) “ENDS WITH skeletal” \\\\b Anchor to word boundary: Example: grep('\\\\bmesic', c(\"mesic\",\"thermic\",\"isomesic\")) “WORD STARTS WITH mesic” (e.g. not “isomesic”) 2.6.9 Filtering A variety of methods are available to subset or “filter” R data objects, from a simple data.frame or vector, to something more complex like a Spatial object or a SoilProfileCollection. You can index many R objects using numeric or logical expressions as above. There are also methods that make this process a little easier. The base R method for this is subset() and it works on data.frame objects. It is nice because you can specify column names without explicitly referencing the data set, since subset uses non-standard evaluation of expressions passed as arguments. 2.6.9.1 Filtering with aqp::subset() We use the SoilProfileCollection subset method, where we first specify a data (pedons) object then we can write expressions for the columns that exist in that object. Here, we combine two logical expressions to find taxsubgrp containing \"alfs\" (Alfisols) with obsdate before January 1st, 2010. subset2 <- subset(pedons, grepl("alfs", taxsubgrp) & obsdate < as.POSIXlt("2010-01-01")) # check taxonomic range of particle size classes in the data # overwhelmingly these are described as loamy-skeletal ultic haploxeralfs sort(table(subset2$taxsubgrp), decreasing = TRUE) ## ## ultic haploxeralfs mollic haploxeralfs ## 28 1 sort(table(subset2$taxpartsize), decreasing = TRUE) ## ## loamy-skeletal clayey-skeletal fine fine-loamy ## 25 2 1 1 # check year described and taxpartsize table(subset2$taxpartsize, substr(subset2$obsdate, 0, 4)) ## ## 2007 2008 2009 ## clayey-skeletal 1 0 1 ## fine 1 0 0 ## fine-loamy 1 0 0 ## loamy-skeletal 19 1 5 # a double equal sign '==' is used for exact character or numeric criteria subset3 <- subset(subset2, taxpartsize == 'loamy-skeletal') table(subset3$taxpartsize) ## ## loamy-skeletal ## 25 par(mar = c(0, 0, 2, 1)) plotSPC(subset3[1:12, ], print.id = FALSE) title('Loamy-skeletal Ultic Haploxeralfs') 2.6.10 Dates and Times Dates and times use special object types in R. The Unix time, also known as “Posix time,” is a system for describing a point in time. Unix epoch is a whole number value that is the number of seconds elapsed since the 00:00:00 UTC on 1 January 1970 minus leap seconds. We can use logical comparison operators on dates and times if their string representation such as \"01/01/1970\" is converted to a common base R UNIX time representation known as POSIXlt or POSIXct. This conversion accounts for important things such as timezone using your computer’s locale–which is important to keep in mind. When converting to POSIX time several unambiguous (year-month-day) date time formats can be detected. For instance, if you want to convert a date in the common month-day-year format, you need to specify the format argument: as.POSIXct(24*60*60, origin = "1970-01-01", tz = "UTC") ## [1] "1970-01-02 UTC" By default the timezone will match your current timezone. Dates without times are treated as being at midnight UTC. You can customize the timezone with tz argument: as.POSIXlt("01/01/1970", tz = "UTC", format = "%m/%d/%Y") ## [1] "1970-01-01 UTC" POSIXlt and POSIXct objects can be formatted with the format() function. strptime() can be used to parse character vectors into date/times. You use as.POSIXlt() with character input, and as.POSIXct() with numeric input. R also has the Date class which can be used for formatting calendar dates. You can convert POSIXlt/POSIXct objects to Date with as.Date() 2.7 Exercise 2: O Horizon Thickness This exercise will use a synthetic dataset of O horizon thicknesses modeled after https://acsess.onlinelibrary.wiley.com/doi/epdf/10.2136/sh1993.1.0022 2.8 fetchNASIS() data checks fetchNASIS() does a lot of the hard work for you by pulling out a variety of child tables and joining them to site/horizon tables This results in a SoilProfileCollection object that has many of the NASIS data columns. In order to do this, a variety of processes are run. Output is generated that you should look at. We will walk through the most common parts. Quality control and limited “filling” of fragments, horizon depth data, site data, tables replacing missing lower horizon depths with top depth + 1cm ... [19 horizons] -> QC: horizon errors detected: Use `get('bad.pedon.ids', envir=soilDB.env)` for pedon record IDs (peiid) Use `get('bad.horizons', envir=soilDB.env)` for horizon designations -> QC: pedons missing bottom hz depths: Use `get('missing.bottom.depths', envir=soilDB.env)` for pedon record IDs (peiid) Notes about default settings and handling of NULL (missing data elements or records) NOTE: some records are missing surface fragment cover NOTE: some records are missing rock fragment volume 2.8.1 Inspecting Results Here we inspect occurrence of andic soil properties in MT647. We will download this “selected set” from the course website as an .rda file to save you the effort of crafting your selected set just for this example. example.data.dir <- "C:/workspace2" example.data.path <- file.path(example.data.dir, "mt647.rda") if (!dir.exists(example.data.dir)) dir.create(example.data.dir, recursive = TRUE) download.file("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt647.rda", destfile = example.data.path) Downloading and installing the above .rda is equivalent to doing NASIS query “_PedonPC_Plus_DataDump_select” (MLRA04 Bozeman) for to fill your selected set for User Site ID: %MT647%, NASIS Site: SSRO_Northwest, NASIS Group: NW-MIS Point Data, followed by mt647 <- fetchNASIS(). 2.8.1.1 Load Example Data To load the sample object data into R, just use load() and the path to the .rda file (example.data.path or \"C:/workspace2/mt647.rda\") # load the sample data example.data.dir <- "C:/workspace2" load(file.path(example.data.dir, "mt647.rda")) length(mt647) ## [1] 481 table(site(mt647)$andic.soil.properties, useNA = "ifany") ## ## FALSE TRUE <NA> ## 2 83 396 # get just the profiles with andic.soil.properties == TRUE subset(mt647, andic.soil.properties) ## SoilProfileCollection with 83 profiles and 446 horizons ## profile ID: peiid | horizon ID: phiid ## Depth range: 20 - 305 cm ## ## ----- Horizons (6 / 446 rows | 10 / 77 columns) ----- ## peiid phiid hzdept hzdepb hzname texture pedon_id dspcomplayerid bounddistinct boundtopo ## 828140 4005861 0 2 Oe <NA> P23-134 <NA> <NA> <NA> ## 828140 4005863 2 13 E CBV-L P23-134 <NA> clear smooth ## 828140 4005859 13 23 Bs1 CBV-L P23-134 <NA> clear smooth ## 828140 4005862 23 33 Bs2 CBV-L P23-134 <NA> gradual smooth ## 828140 4005864 33 69 BC GRX-FSL P23-134 <NA> gradual smooth ## 828140 4005860 69 152 2C GRX-FSL P23-134 <NA> <NA> <NA> ## [... more horizons ...] ## ## ----- Sites (6 / 83 rows | 10 / 132 columns) ----- ## siteiid peiid ecositeid ecositenm ecositecorrdate es_classifier siteecositehistory.classifier es_selection_method upedonid siteobsiid ## 845415 828140 <NA> <NA> <NA> <NA> <NA> <NA> P23-134 821442 ## 845429 828152 <NA> <NA> <NA> <NA> <NA> <NA> P92-052 821456 ## 845430 828153 <NA> <NA> <NA> <NA> <NA> <NA> P92-046 821457 ## 845432 828155 <NA> <NA> <NA> <NA> <NA> <NA> P93-053 821459 ## 845434 828157 <NA> <NA> <NA> <NA> <NA> <NA> P91-103 821461 ## 845451 828176 <NA> <NA> <NA> <NA> <NA> <NA> P89-011 821478 ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] We can compare this to what we see in the NASIS Pedon Diagnostic Features table: Any profiles that have have logic errors detected are stored in soilDB.env bad.pedon.ids variable after you run fetchNASIS. If this variable does not exist either you have not run fetchNASIS() in the current session or there are no errors # these are the troublesome user pedon IDs get('bad.pedon.ids', envir = soilDB.env) ## [1] "P93-037" "P90-008" "P90-004" "P90-009" "P93-058" "P93-059" "P90-025" "P90-002" "P90-012" "P92-001" "P92-085" "P90-019" "P90-010" "P90-015" ## [15] "P91-094" "P92-029" "P92-076" "P93-026" "P93-035" "P93-063" "P93-064" "P93-041" "P93-043" "P93-044" "P93-083" "P93-112" "P93-113" "P93-124" ## [29] "P93-001" "P96-007" "P91-025" "P93-078" "P92-044" "P91-112" "P92-038" "P90-018" "P93-057" "P93-084" "P90-016" "P92-063" "P92-048" "P93-052" ## [43] "F01-230" "F95-420" "F95-114" "F96-205" "P75-006" "P91-105" "P91-059" # by default, rmHzErrors removes the "bad" illogical pedons any(mt647$upedonid %in% get('bad.pedon.ids', envir=soilDB.env)) ## [1] FALSE When fetchNASIS(..., rmHzErrors = TRUE) (the default), any horizons that were omitted from the SoilProfileCollection will be stored in the bad.horizons variable in the soilDB.env environment. head(get('bad.horizons', envir=soilDB.env)) ## peiid phiid upedonid hzname hzdept hzdepb ## 67 868038 4270406 F01-230 E NA NA ## 68 868038 4270407 F01-230 Bw NA NA ## 95 868072 4270514 F95-114 <NA> NA NA ## 99 868048 4270437 F95-420 <NA> NA NA ## 111 868074 4270519 F96-205 B NA NA ## 112 868074 4270521 F96-205 C NA NA 2.8.1.2 Logic Checks for the SoilProfileCollection The aqp package has several functions that do logic checks on SoilProfileCollection objects. The main method that does this in aqp is checkHzDepthLogic() which returns a data.frame of results of running four logic tests on the horizon data from each profile. Checks for: bottom depths less than top depth / bad top depth order (\"depthLogic\") bottom depths equal to top depth (\"sameDepth\") overlaps and gaps (\"overlapOrGap\") missing depths (\"missingDepth\") logic_tests <- checkHzDepthLogic(mt647err) # look at first few (look OK; valid == TRUE) head(logic_tests) ## peiid valid depthLogic sameDepth missingDepth overlapOrGap ## 1 828138 TRUE FALSE FALSE FALSE FALSE ## 2 828139 TRUE FALSE FALSE FALSE FALSE ## 3 828140 TRUE FALSE FALSE FALSE FALSE ## 4 828141 TRUE FALSE FALSE FALSE FALSE ## 5 828142 TRUE FALSE FALSE FALSE FALSE ## 6 828143 TRUE FALSE FALSE FALSE FALSE # these all have overlapOrGap errors head(logic_tests[!logic_tests$valid, ]) ## peiid valid depthLogic sameDepth missingDepth overlapOrGap ## 11 828148 FALSE FALSE FALSE FALSE TRUE ## 23 828160 FALSE FALSE FALSE FALSE TRUE ## 25 828162 FALSE FALSE FALSE FALSE TRUE ## 34 828171 FALSE FALSE FALSE FALSE TRUE ## 35 828172 FALSE FALSE FALSE FALSE TRUE ## 36 828173 FALSE FALSE FALSE FALSE TRUE # join the logic test data into the site table site(mt647err) <- logic_tests Use the $valid vector in result to filter out profiles with missing depths (logic_tests$valid == FALSE) bad.profiles <- subset(mt647err, !valid) bad.profiles ## SoilProfileCollection with 49 profiles and 338 horizons ## profile ID: peiid | horizon ID: phiid ## Depth range: 15 - 152 cm ## ## ----- Horizons (6 / 338 rows | 10 / 77 columns) ----- ## peiid phiid hzdept hzdepb hzname texture pedon_id dspcomplayerid bounddistinct boundtopo ## 828148 4005908 0 3 Oe <NA> P93-037 <NA> <NA> <NA> ## 828148 4005907 3 5 Oi <NA> P93-037 <NA> <NA> <NA> ## 828148 4005905 5 15 E CB-FSL P93-037 <NA> clear smooth ## 828148 4005911 15 23 Bs CB-SIL P93-037 <NA> abrupt smooth ## 828148 4005909 23 25 2E CBV-FSL P93-037 <NA> clear smooth ## 828148 4005910 25 58 2B CBV-FSL P93-037 <NA> gradual smooth ## [... more horizons ...] ## ## ----- Sites (6 / 49 rows | 10 / 137 columns) ----- ## peiid siteiid ecositeid ecositenm ecositecorrdate es_classifier siteecositehistory.classifier es_selection_method upedonid siteobsiid ## 828148 845423 <NA> <NA> <NA> <NA> <NA> <NA> P93-037 821450 ## 828160 845435 <NA> <NA> <NA> <NA> <NA> <NA> P90-008 821462 ## 828162 845437 <NA> <NA> <NA> <NA> <NA> <NA> P90-004 821464 ## 828171 845446 <NA> <NA> <NA> <NA> <NA> <NA> P90-009 821473 ## 828172 845447 <NA> <NA> <NA> <NA> <NA> <NA> P93-058 821474 ## 828173 845448 <NA> <NA> <NA> <NA> <NA> <NA> P93-059 821475 ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] And also filter out the valid ones (logic_tests$valid == TRUE) good.profiles <- subset(mt647err, logic_tests$valid) good.profiles ## SoilProfileCollection with 481 profiles and 2536 horizons ## profile ID: peiid | horizon ID: phiid ## Depth range: 14 - 1552 cm ## ## ----- Horizons (6 / 2536 rows | 10 / 77 columns) ----- ## peiid phiid hzdept hzdepb hzname texture pedon_id dspcomplayerid bounddistinct boundtopo ## 828138 4005848 0 5 O <NA> P91-043 <NA> <NA> <NA> ## 828138 4005852 5 18 E GR-L P91-043 <NA> clear smooth ## 828138 4005850 18 38 Bw1 GRV-L P91-043 <NA> gradual wavy ## 828138 4005849 38 51 Bw2 CBV-FSL P91-043 <NA> gradual wavy ## 828138 4005853 51 71 BC CBV-SL P91-043 <NA> clear wavy ## 828138 4005851 71 81 R <NA> P91-043 <NA> <NA> <NA> ## [... more horizons ...] ## ## ----- Sites (6 / 481 rows | 10 / 137 columns) ----- ## peiid siteiid ecositeid ecositenm ecositecorrdate es_classifier siteecositehistory.classifier es_selection_method upedonid siteobsiid ## 828138 845413 <NA> <NA> <NA> <NA> <NA> <NA> P91-043 821440 ## 828139 845414 <NA> <NA> <NA> <NA> <NA> <NA> P91-029 821441 ## 828140 845415 <NA> <NA> <NA> <NA> <NA> <NA> P23-134 821442 ## 828141 845416 <NA> <NA> <NA> <NA> <NA> <NA> P93-025 821443 ## 828142 845417 <NA> <NA> <NA> <NA> <NA> <NA> P93-075 821444 ## 828143 845418 <NA> <NA> <NA> <NA> <NA> <NA> P93-074 821445 ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] 2.9 Extended Data Functions Additional data related to both site and horizon information can be fetched using the get_extended_data_from_NASIS() function. This function returns a named list() with several tables that fetchNASIS draws from–in addition to the typical Site/Pedon/Component/Horizon tables. There are a variety of calculated fields that are included in the default fetchNASIS result based on the extended data–you can make use of these to simplify queries and aggregations for a variety of analyses… And then follow up with more detailed data as needed. 2.9.1 Elements of get_extended_data_from_NASIS() Ecological Site History (\"ecositehistory\") Diagnostic Features (\"diagnostic\") Diagnostic Feature TRUE/FALSE Summary (\"diagHzBoolean\") Restrictions (\"restriction\") Fragment and Texture Summaries Horizon Fragments (\"frag_summary\") Horizon Artifacts (\"art_summary\") Surface Fragments (\"surf_frag_summary\") Texture Class Modifiers (\"texmodifier\") Geomorphic Table Summaries (\"geomorph\") Parent Material Summaries (\"pm\") Taxonomic History (\"taxhistory\") Site Text Notes w/ Photo links(\"photo\") Horizon Structure (\"struct\") Horizon Designation (\"hzdesgn\") 2.9.2 Load Example Data Below is a summary of additional information that can be readily brought into R from your NASIS selected set via the get_extended_data_from_NASIS() function. To download the sample 2015MT663% data from the course page with R: example.data.dir <- "C:/workspace2" example.data.path <- file.path(example.data.dir, "mt663.rda") if (!dir.exists(example.data.dir)) dir.create(example.data.dir, recursive = TRUE) download.file("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt663.rda", destfile = example.data.path) Before continuing, imagine opening the NASIS client, populating your selected set with 2015MT663% using a query like “NSSC Pangaea – POINT-Pedon/Site by User Pedon ID” Load the data like we did above. # load the sample data example.data.dir <- "C:/workspace2" load(file.path(example.data.dir, "mt663.rda")) ## fetch extended site and horizon data from local NASIS # mt663ext <- get_extended_data_from_NASIS_db() We could use the get_extended_data_from_NASIS_db() function if 2015MT663% or other data were in the selected set, but we will use the mt663ext data we loaded from the .rda file. The column names are the names of variables that you could join to your site or horizon data by various means. Generally these variable names, with a few exceptions, mirror the NASIS 7 data model names. # site and pedon related extended data # list all dataframes in the extended data str(mt663ext, 1) ## List of 14 ## $ ecositehistory:'data.frame': 0 obs. of 7 variables: ## $ siteaoverlap :'data.frame': 127 obs. of 5 variables: ## $ diagnostic :'data.frame': 292 obs. of 4 variables: ## $ diagHzBoolean :'data.frame': 115 obs. of 20 variables: ## $ restriction :'data.frame': 11 obs. of 8 variables: ## $ frag_summary :'data.frame': 561 obs. of 18 variables: ## $ art_summary :'data.frame': 561 obs. of 14 variables: ## $ texmodifier :'data.frame': 622 obs. of 5 variables: ## $ geomorph :'data.frame': 241 obs. of 9 variables: ## $ taxhistory :'data.frame': 115 obs. of 23 variables: ## $ photo :'data.frame': 793 obs. of 4 variables: ## $ pm :'data.frame': 179 obs. of 9 variables: ## $ struct :'data.frame': 444 obs. of 6 variables: ## $ hzdesgn :'data.frame': 561 obs. of 19 variables: # vegetation data summary colnames(mt663ext$ecositehistory) ## [1] "siteiid" "ecositeid" "ecositenm" "ecositecorrdate" ## [5] "es_classifier" "siteecositehistory.classifier" "es_selection_method" # diagnostic features colnames(mt663ext$diagnostic) ## [1] "peiid" "featkind" "featdept" "featdepb" # surface rock fragments colnames(mt663ext$surf_frag_summary) ## NULL # geomorphic description colnames(mt663ext$geomorph) ## [1] "peiid" "geomicrorelief" "geommicelev" "geomfmod" "geomfname" "geomfeatid" "existsonfeat" "geomfiidref" ## [9] "geomftname" # taxonomic history data colnames(mt663ext$taxhistory) ## [1] "peiid" "classdate" "classifier" "classtype" "taxonname" "localphase" "taxonkind" ## [8] "seriesstatus" "taxclname" "taxpartsize" "taxorder" "taxsuborder" "taxgrtgroup" "taxsubgrp" ## [15] "soiltaxedition" "osdtypelocflag" "taxmoistcl" "taxtempregime" "taxfamother" "taxreaction" "taxfamhahatmatcl" ## [22] "psctopdepth" "pscbotdepth" # linked photo stored in site textnotes colnames(mt663ext$photo) ## [1] "siteiid" "recdate" "textcat" "imagepath" # site parent materials colnames(mt663ext$pm) ## [1] "siteiid" "seqnum" "pmorder" "pmdept" "pmdepb" "pmmodifier" "pmgenmod" "pmkind" "pmorigin" ### ### horizon related extended data ### # rock fragments colnames(mt663ext$frag_summary) ## [1] "phiid" "fine_gravel" "gravel" "cobbles" "stones" "boulders" ## [7] "channers" "flagstones" "parafine_gravel" "paragravel" "paracobbles" "parastones" ## [13] "paraboulders" "parachanners" "paraflagstones" "unspecified" "total_frags_pct_nopf" "total_frags_pct" # soil texture modifers colnames(mt663ext$texmodifier) ## [1] "peiid" "phiid" "phtiid" "seqnum" "texmod" # soil structure data colnames(mt663ext$struct) ## [1] "phiid" "structgrade" "structsize" "structtype" "structid" "structpartsto" 2.9.3 Visualizing Common Landforms The following code generates a simple graphical summary of the 10 most commonly occurring \"landform_string\" (a calculated field in fetchNASIS()) to inspect which are the most common. # load data from a NASIS selected set (or sample object) pedons <- mt663 # create 'lf' object of landform factors sorted in descending order lf <- sort(table(pedons$landform_string), decreasing = TRUE) # plot top 10 or length, whichever is shorter Hmisc::dotchart2(lf[1:pmin(10, length(lf))], col = 'black', xlim = c(0, max(lf)), cex.labels = 0.75) For a challenge and to further inspect your own data try the above code with some other summaries of geomorphic data produced by fetchNASIS(). You can swap landform_string for: landscape_string (landscape), hillslopeprof (2D), geomposmntn, geomposhill, geompostrce, geomposflats (3D), slope_shape, shapeacross, shapedown (slope shape across/down), microfeature_string (microfeature), or geomicrorelief_string (site observation microrelief). 2.9.4 Diagnostic Features 2.9.4.1 Boolean Diagnostic Features in fetchNASIS If diagnostic features are populated in the Pedon Diagnostic Features table in NASIS, then Boolean (TRUE or FALSE, or “logical”) fields are created for each diagnostic feature type found in the data brought in by fetchNASIS. These fields can be used to model presence / absence of a diagnostic soil feature by extracting the site data from the SoilProfileCollection with site(). 2.9.4.2 Thickness from Diagnostic Features Table The following is an example of how you could use the diagnostic features (if populated!) from the extended data to determine the thickness of a diagnostic feature of interest. # get diagnostic features associated with pedons loaded from selected set d <- diagnostic_hz(mt663) # summary of the diagnostic features in your data! unique(d$featkind) ## [1] "ochric epipedon" "cambic horizon" "lithic contact" "mollic epipedon" "argillic horizon" ## [6] "redox concentrations" "andic soil properties" "secondary carbonates" "sapric soil materials" "aquic conditions" ## [11] "reduced matrix" "albic horizon" "spodic horizon" "glossic horizon" "spodic materials" ## [16] "lithologic discontinuity" "densic materials" "umbric epipedon" "albic materials" NA # tabulate sort(table(droplevels(factor(d$featkind))), decreasing = TRUE) ## ## ochric epipedon cambic horizon argillic horizon mollic epipedon andic soil properties lithic contact ## 61 54 43 42 30 20 ## secondary carbonates umbric epipedon albic horizon spodic horizon glossic horizon reduced matrix ## 7 7 6 4 3 3 ## sapric soil materials lithologic discontinuity albic materials aquic conditions densic materials redox concentrations ## 3 2 1 1 1 1 ## spodic materials ## 1 # subset argillic horizons d <- d[d$featkind == 'argillic horizon', ] # create a new column and subtract the upper from the lower depth d$argillic_thickness_cm <- d$featdepb - d$featdept # create another new column with the upper depth to the diagnostic feature d$depth_to_argillic_cm <- d$featdept # omit NA values d <- na.omit(d) # subset to pedon records IDs and calculated thickness d <- d[, c('peiid', 'argillic_thickness_cm', 'depth_to_argillic_cm')] head(d) ## peiid argillic_thickness_cm depth_to_argillic_cm ## 7 1092610 56 30 ## 24 1092617 38 34 ## 26 1092618 29 23 ## 28 1092619 38 32 ## 30 1092620 29 24 ## 33 1092621 23 19 # left-join with existing site data site(mt663) <- d # plot as histogram par(mar = c(4.5, 4.5, 1, 1)) # note additional arguments to adjust figure labels hist( mt663$argillic_thickness_cm, xlab = 'Thickness of argillic (cm)', main = '', las = 1 ) hist( mt663$depth_to_argillic_cm, xlab = 'Depth to argillic top depth (cm)', main = '', las = 1 ) Quick check: What can you do with the boolean diagnostic feature data stored in the site table of a fetchNASIS() SoilProfileCollection? 2.9.4.3 Diagnostic Feature Diagrams # work up diagnostic plot based on the mt663 dataset loaded above library(aqp) library(soilDB) library(sharpshootR) # can limit which diagnostic features to show by setting 'v' manually v <- c('ochric.epipedon', 'mollic.epipedon', 'andic.soil.properties', 'argillic.horizon', 'cambic.horizon', 'lithic.contact') # the default concatenated landform_string may have multiple levels # depending on how the geomorphic tables were populated # these are concatenated using the ampersand (&) character # so take the first string split using ampersand as a delimiter mt663$first_landform <- sapply(strsplit(mt663$landform_string, "&"), function(x) x[[1]]) # plot with diagnostic features ordered according to co-occurrence # v: site-level attributes to consider # k: number of clusters to identify diagnosticPropertyPlot( mt663[1:30, ], v = v, k = 5, grid.label = 'usiteid', dend.label = 'first_landform', sort.vars = TRUE ) 2.10 Exercise 3: Diagnostic Horizons in Your Own Data Use the following script to generate a diagnostic-feature diagram for the pedon data you’ve loaded from your NASIS selected set. Alternately, you may use the MT663 data from the example above, just substitute the object mt663 for f. You can select a subset of desired diagnostic properties or use all diagnostic feature columns. library(aqp) library(soilDB) library(sharpshootR) # Load data f <- fetchNASIS(from = 'pedons') # ... May need to use subset() to reduce the number of pedons! # get all diagnostic feature columns from site data # by pattern matching on '[.]' in the site attribute names # this is not a generic rule, but works here idx <- grep('[.]', siteNames(f)) v <- siteNames(f)[idx] # inspect v v # insert diagnostics of interest from the possible list in 'v' v <- c('ochric.epipedon', 'cambic.horizon', 'argillic.horizon', 'paralithic.contact', 'lithic.contact') # generate diagnostic property diagram diagnosticPropertyPlot( f, v = v, k = 5, grid.label = 'usiteid', dend.label = 'taxonname' ) For more information on generating diagnostic feature diagrams, see the following tutorial: Diagnostic Feature Property Plots. Questions: Use the results of site(), horizons(), diagnostic_hz() to answer the following questions about your own data. These functions return data.frame objects from a SoilProfileCollection derived from your local NASIS data. How many pedons do you have in your selected set? Check the number of rows in the site portion of the SoilProfileCollection with nrow(), or use the method length() on the collection. How many diagnostic features do you have for those pedons? How many different \"featkind\"? You can calculate the number of unique values with with length() and unique() Interpret: What diagnostic features did you choose to plot? Did you notice any patterns in the diagnostic features that tend to occur together? Send your mentor a copy of your results and the commands you used. 2.11 Custom Queries to Local NASIS Database fetchNASIS() and related convenience functions are wrappers around commonly used chunks of SQL (Structured Query Language). Queries of the NASIS local database can be written in T-SQL which is the dialect of SQL used to communicate with Microsoft SQL Server. This is the connection that you set for the pre-course. To create a DBIConnection object that can access the NASIS local database, use dbConnectNASIS() or simply NASIS(). This will look for an ODBC connection of the name \"nasis_local\" and will authenticate with the read-only credentials. You can also pass an existing DBIConnection or path to SQLite file as the dsn argument to connect to an alternate source. The default driver type used for NASIS connections is OdbcConnection from the odbc package. To query or execute SQL commands on a connection you created, you can use dbGetQuery(connection, query), where connection is your DBIConnection object and query is the SQL to execute. The soilDB package also includes a helper function dbQueryNASIS(), which functions just like dbGetQuery() except the default is to close the connection after returning the result. This can be convenient for interactive use or cases where a function needs to only execute a single query, as it will prevent you from leaving connections open accidentally. 2.11.1 Example: Site Soil Temperature Data from CA792 (Sequoia-Kings Canyon National Park) The following example will return all records in your selected set sitesoiltemp table, along with a couple of fields from the site, siteobs, and pedon tables. This is a convenient way to collect all of the field-based soil temperature data associated with the pedons in your selected set for further analysis. You can use the CA792 (Sequoia-Kings Canyon National Park) pedons as an example. Use a query that searches user pedon ID for the following pattern %CA792% to download and populate a selected set in the NASIS client. library(soilDB) # write query as a character string q <- "SELECT siteiid as siteiid, peiid, usiteid, obsdate, soitemp, soitempdep FROM site_View_1 INNER JOIN siteobs_View_1 ON site_View_1.siteiid = siteobs_View_1.siteiidref LEFT OUTER JOIN sitesoiltemp_View_1 ON siteobs_View_1.siteobsiid = sitesoiltemp_View_1.siteobsiidref LEFT OUTER JOIN pedon_View_1 ON siteobs_View_1.siteobsiid = pedon_View_1.siteobsiidref ORDER BY obsdate, siteiid;" # setup connection to local NASIS channel <- NASIS() # exec query d <- dbQueryNASIS(channel, q) The functions dbConnectNASIS() (alias NASIS()) and dbQueryNASIS() allow you to create a connection to the NASIS local database and send queries to that connection, respectively. By default, dbQueryNASIS() will close your connection after completing the query; you can change this by setting close=FALSE. # check results str(d) # remove records missing values d <- na.omit(d) # tabulate unique soil depths table(d$soitempdep) # extract doy of year d$doy <- as.integer(format(d$obsdate, "%j")) # when where measurements collected? hist( d$doy, xlim = c(1, 366), las = 1, main = 'Soil Temperature Measurements', xlab = 'Day of Year' ) # soil temperature by day of year plot( soitemp ~ doy, data = d, main = 'Soil Temperature Measurements (CA792)\\nNASIS "Site Soil Temperature" table', type = 'p', pch = 21, bg = 'royalblue', xlim = c(1, 366), ylim = c(-1, 26), xlab = 'Day of Year', ylab = 'Soil Temperature at 50cm (deg C)', las = 1 ) # vernal equinox, summer solstice, autumnal equinox, winter solstice x <- as.Date(c('2022-03-20', '2022-06-21', '2022-09-23', '2022-12-21')) # convert dates -> Julian date, or day-of-year doy <- as.integer(format(x, "%j")) # add vertical lines abline(v = doy, lty = 3, col = grey(0.45)) # annotate # pos argument: left-center offset text( x = doy, y = -1, labels = c('vernal equinox', 'summer solstice', 'autumnal equinox', 'winter solstice'), pos = 2, cex = 0.75, font = 3 ) # box/whisker plot showing distribution of day-of-year # when measurements (pedon descriptions) were collected boxplot(d$doy, at = 26, horizontal = TRUE, add = TRUE, lty = 1, width = 1, col = 'white', axes = FALSE) + 2.12 Exercise 4: Generalized Horizons with Loafercreek Here we will introduce the concept of using regular expressions to apply “Generalized Horizon Labels” based on the field soil description horizon designations. This demonstrates one way of grouping horizon data for determining the Range in Characteristics of layers within a Soil Series or a SSURGO component. Generalized Horizon Labels with Loafercreek For the exercise during class, we will give you some time to read over the materials and apply the process to the sample loafercreek data. The code to apply the process to loafercreek is given. Then we ask that you apply a similar process to your own data, adjusting your generalized horizon patterns as needed for your local soils. This may take more time than we have during class itself, so you should follow up as needed with your mentor to complete the exercise. Chapter 3 Exploratory Data Analysis will get deeper into some of the topics that are referenced in the loafercreek code, such as summary statistics on grouped data. You will send a table and profile plots to your mentor when you are done. This tutorial gives some further discussion of generalized horizon labels to order profiles based on horizon level properties. Pair-Wise Distances by Generalized Horizon Labels tutorial "],["eda.html", "Chapter 3 Exploratory Data Analysis 3.1 Objectives (Exploratory Data Analysis) 3.2 Statistics 3.3 Data Inspection 3.4 Exercise 1: Fetch and Inspect 3.5 Descriptive Statistics 3.6 Exercise 2: Compute Descriptive Statistics 3.7 Graphical Methods 3.8 Exercise 3: Graphical Methods 3.9 Transformations 3.10 The Shiny Package 3.11 Exercise 4: Using the North Central Region Web App 3.12 soilReports 3.13 Exercise 5: Run Lab Summary By Taxon Name Soil Report 3.14 Exercise 6: Run Shiny Pedon Summary 3.15 Exercise 7: Run Mapunit Comparison 3.16 Additional Reading (Exploratory Data Analysis)", " Chapter 3 Exploratory Data Analysis Before embarking on developing statistical models and generating predictions, it is essential to understand your data. This is typically done using conventional numerical and graphical methods. John Tukey ((Tukey 1977)) advocated the practice of exploratory data analysis (EDA) as a critical part of the scientific process. “No catalog of techniques can convey a willingness to look for what can be seen, whether or not anticipated. Yet this is at the heart of exploratory data analysis. The graph paper and transparencies are there, not as a technique, but rather as a recognition that the picture examining eye is the best finder we have of the wholly unanticipated.” Fortunately, we can dispense with the graph paper and transparencies and use software that makes routine work of developing the ‘pictures’ (i.e., graphical output) and descriptive statistics needed to explore our data. NASIS has an abundance of tabular soils data captured within it, dating back in some cases as far as 1975. These records capture a large amount of raw information about our soil series and map unit component concepts. In many cases, the data are not as clear to interpret or detailed as we would like. This chapter will demonstrate ways to characterize a variety of different data types. 3.1 Objectives (Exploratory Data Analysis) Review methods for estimating Low, RV, and High values Review different methods for visualizing soil data Review data transformations 3.2 Statistics Descriptive statistics include: Mean - arithmetic average Median - middle value Mode - most frequent value Standard Deviation - variation around the mean Interquartile Range - range encompasses 50% of the values Kurtosis - peakedness of the data distribution Skewness - symmetry of the data distribution Graphical methods include: Histogram - a bar plot where each bar represents the frequency of observations for a given range of values Density estimation - an estimation of the frequency distribution based on the sample data Quantile-quantile plot - a plot of the actual data values against a normal distribution Box plots - a visual representation of median, quartiles, symmetry, skewness, and outliers Scatter plots - a graphical display of one variable plotted on the x axis and another on the y axis Radial plots - plots formatted for the representation of circular data 3.3 Data Inspection Before you start an EDA, you should inspect your data and correct all typos and blatant errors. EDA can then be used to identify additional errors such as outliers and help you determine the appropriate statistical analyses. For this chapter we’ll use the loafercreek dataset from the CA630 Soil Survey Area. library(dplyr) # Load from the the loakercreek dataset data("loafercreek", package = "soilDB") # Extract the horizon table h <- aqp::horizons(loafercreek) # Construct generalized horizon designations n <- c("A", "BAt", "Bt1", "Bt2", "Cr", "R") # REGEX rules p <- c("A", "BA|AB", "Bt|Bw", "Bt3|Bt4|2B|C", "Cr", "R") # Compute genhz labels and add to loafercreek dataset h$genhz <- aqp::generalize.hz(h$hzname, n, p) # Examine genhz vs hznames (wide format) table(h$genhz, h$hzname) ## ## 2BC 2BCt 2Bt1 2Bt2 2Bt3 2Bt4 2Bt5 2CB 2CBt 2Cr 2Crt 2R A A1 A2 AB ABt Ad Ap B BA BAt BC BCt Bt Bt1 Bt2 Bt3 Bt4 Bw Bw1 Bw2 Bw3 C CBt Cd Cr ## A 0 0 0 0 0 0 0 0 0 0 0 0 97 7 7 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## BAt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 31 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## Bt1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 8 93 88 0 0 10 2 2 1 0 0 0 0 ## Bt2 1 1 3 8 8 6 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 16 0 0 0 47 8 0 0 0 0 6 6 1 0 ## Cr 0 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 ## R 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## not-used 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## ## Cr/R Crt H1 Oi R Rt ## A 0 0 0 0 0 0 ## BAt 0 0 0 0 0 0 ## Bt1 0 0 0 0 0 0 ## Bt2 0 0 0 0 0 0 ## Cr 0 20 0 0 0 0 ## R 1 0 0 0 40 1 ## not-used 0 0 1 24 0 0 # Examine matching pairs (long format) h %>% group_by(genhz, hzname) %>% count() ## # A tibble: 43 × 3 ## # Groups: genhz, hzname [43] ## genhz hzname n ## <fct> <chr> <int> ## 1 A A 97 ## 2 A A1 7 ## 3 A A2 7 ## 4 A Ad 1 ## 5 A Ap 1 ## 6 BAt AB 1 ## 7 BAt BA 31 ## 8 BAt BAt 8 ## 9 Bt1 ABt 2 ## 10 Bt1 Bt 8 ## # ℹ 33 more rows As noted in Chapter 1, a visual examination of the raw data is possible by clicking on the dataset in the environment tab, or via commandline: View(h) This view is fine for a small dataset, but can be cumbersome for larger ones. The summary() function can be used to quickly summarize a dataset however, even for our small example dataset, the output can be voluminous. Therefore in the interest of saving space we’ll only look at a sample of columns. h %>% select(genhz, claytotest, total_frags_pct, phfield, effclass) %>% summary() ## genhz claytotest total_frags_pct phfield effclass ## A :113 Min. :10.00 Min. : 0.00 Min. :4.90 Length:626 ## BAt : 40 1st Qu.:18.00 1st Qu.: 0.00 1st Qu.:6.00 Class :character ## Bt1 :206 Median :22.00 Median : 5.00 Median :6.30 Mode :character ## Bt2 :118 Mean :23.63 Mean :13.88 Mean :6.18 ## Cr : 75 3rd Qu.:28.00 3rd Qu.:20.00 3rd Qu.:6.50 ## R : 48 Max. :60.00 Max. :95.00 Max. :7.00 ## not-used: 26 NA's :167 NA's :381 The summary() function is known as a generic R function. It will return a preprogrammed summary for any R object. Because h is a data frame, we get a summary of each column. Factors will be summarized by their frequency (i.e., number of observations), while numeric or integer variables will print out a five number summary, and characters simply print their length. The number of missing observations for any variable will also be printed if they are present. If any of these metrics look unfamiliar to you, don’t worry we’ll cover them shortly. When you do have missing data and the function you want to run will not run with missing values, the following options are available: Exclude all rows or columns that contain missing values using the function na.exclude(), such as h2 <- na.exclude(h). However this can be wasteful because it removes all rows (e.g., horizons), regardless if the row only has 1 missing value. Instead it’s sometimes best to create a temporary copy of the variable in question and then remove the missing variables, such as claytotest <- na.exclude(h$claytotest). Replace missing values with another value, such as zero, a global constant, or the mean or median value for that column, such as h$claytotest <- ifelse(is.na(h$claytotest), 0, h$claytotest) # or h[is.na(h$claytotest), ] <- 0. Read the help file for the function you’re attempting to use. Many functions have additional arguments for dealing with missing values, such as na.rm. A quick check for typos would be to examine the list of levels for a factor or character, such as: # just for factors levels(h$genhz) ## [1] "A" "BAt" "Bt1" "Bt2" "Cr" "R" "not-used" # for characters and factors sort(unique(h$hzname)) ## [1] "2BC" "2BCt" "2Bt1" "2Bt2" "2Bt3" "2Bt4" "2Bt5" "2CB" "2CBt" "2Cr" "2Crt" "2R" "A" "A1" "A2" "AB" "ABt" "Ad" "Ap" "B" "BA" ## [22] "BAt" "BC" "BCt" "Bt" "Bt1" "Bt2" "Bt3" "Bt4" "Bw" "Bw1" "Bw2" "Bw3" "C" "CBt" "Cd" "Cr" "Cr/R" "Crt" "H1" "Oi" "R" ## [43] "Rt" If the unique() function returned typos such as “BT” or “B t”, you could either fix your original dataset or you could make an adjustment in R, such as: h$hzname <- ifelse(h$hzname == "BT", "Bt", h$hzname) Typo errors such as these are a common problem with old pedon data in NASIS. 3.4 Exercise 1: Fetch and Inspect Create a new R script Load the gopheridge dataset found within the soilDB package or use your own data (highly encouraged) and inspect the dataset Apply the generalized horizon rules below or develop your own, see the following job-aid Summarize the hzdept, genhz, texture_class, sandtotest, and fine gravel. Save your R script, and forward to your instructor. # gopheridge rules n <- c('A', 'Bt1', 'Bt2', 'Bt3','Cr','R') p <- c('^A|BA$', 'Bt1|Bw','Bt$|Bt2', 'Bt3|CBt$|BCt','Cr','R') 3.5 Descriptive Statistics Table 3.1: Short Description of Descriptive Statistics and R Functions Parameter NASIS Description R function Mean RV ? arithmetic average mean() Weighted Mean RV weighted arithmetic average weighted.mean() Median RV middle value, 50% quantile median() Mode RV most frequent value sort(table(), decreasing = TRUE)[1] Standard Deviation L & H ? variation around mean sd() Quantiles L & H percent rank of values, such that all values are <= p quantile() 3.5.1 Measures of Central Tendency These measures are used to determine the mid-point of the range of observed values. In NASIS speak this should ideally be equivalent to the representative value (RV) for numeric and integer data. The mean and median are the most commonly used measures for our purposes. Mean - is the arithmetic average all are familiar with, formally expressed as: \\(\\bar{x} =\\frac{\\sum_{i=1}^{n}x_i}{n}\\) which sums ( \\(\\sum\\) ) all the X values in the sample and divides by the number (n) of samples. It is assumed that all references in this document refer to samples rather than a population. The mean clay content from the loafercreek dataset may be determined: mean(h$claytotest, na.rm = TRUE) ## [1] 23.62767 Median is the middle measurement of a sample set, and as such is a more robust estimate of central tendency than the mean. This is known as the middle or 50th quantile, meaning there are an equal number of samples with values less than and greater than the median. For example, assuming there are 21 samples, sorted in ascending order, the median would be the 11th sample. The median from the sample dataset may be determined: median(h$claytotest, na.rm = TRUE) ## [1] 22 Mode - is the most frequent measurement in the sample. The use of mode is typically reserved for factors, which we will discuss shortly. One issue with using the mode for numeric data is that the data need to be rounded to the level of desired precision. R does not include a function for calculating the mode, but we can calculate it using the following example. # sort and select the 1st value, which will be the mode sort(table(round(h$claytotest)), decreasing = TRUE)[1] ## 25 ## 42 Frequencies To summarize factors and characters we can examine their frequency or number of observations. This is accomplished using the table() or summary() functions. table(h$genhz) ## ## A BAt Bt1 Bt2 Cr R not-used ## 113 40 206 118 75 48 26 # or summary(h$genhz) ## A BAt Bt1 Bt2 Cr R not-used ## 113 40 206 118 75 48 26 This gives us a count of the number of observations for each horizon. If we want to see the comparison between two different factors or characters, we can include two variables. table(h$genhz, h$texcl) ## ## c cl l scl sic sicl sil sl ## A 0 0 78 0 0 0 27 6 ## BAt 0 2 31 0 0 1 4 1 ## Bt1 2 44 127 4 1 5 20 1 ## Bt2 16 54 29 5 1 3 5 0 ## Cr 1 0 0 0 0 0 0 0 ## R 0 0 0 0 0 0 0 0 ## not-used 0 1 0 0 0 0 0 0 # or h %>% count(genhz, texcl) ## genhz texcl n ## 1 A l 78 ## 2 A sil 27 ## 3 A sl 6 ## 4 A <NA> 2 ## 5 BAt cl 2 ## 6 BAt l 31 ## 7 BAt sicl 1 ## 8 BAt sil 4 ## 9 BAt sl 1 ## 10 BAt <NA> 1 ## 11 Bt1 c 2 ## 12 Bt1 cl 44 ## 13 Bt1 l 127 ## 14 Bt1 scl 4 ## 15 Bt1 sic 1 ## 16 Bt1 sicl 5 ## 17 Bt1 sil 20 ## 18 Bt1 sl 1 ## 19 Bt1 <NA> 2 ## 20 Bt2 c 16 ## 21 Bt2 cl 54 ## 22 Bt2 l 29 ## 23 Bt2 scl 5 ## 24 Bt2 sic 1 ## 25 Bt2 sicl 3 ## 26 Bt2 sil 5 ## 27 Bt2 <NA> 5 ## 28 Cr c 1 ## 29 Cr <NA> 74 ## 30 R <NA> 48 ## 31 not-used cl 1 ## 32 not-used <NA> 25 We can also add margin totals to the table or convert the table frequencies to proportions. # append the table with row and column sums addmargins(table(h$genhz, h$texcl)) ## ## c cl l scl sic sicl sil sl Sum ## A 0 0 78 0 0 0 27 6 111 ## BAt 0 2 31 0 0 1 4 1 39 ## Bt1 2 44 127 4 1 5 20 1 204 ## Bt2 16 54 29 5 1 3 5 0 113 ## Cr 1 0 0 0 0 0 0 0 1 ## R 0 0 0 0 0 0 0 0 0 ## not-used 0 1 0 0 0 0 0 0 1 ## Sum 19 101 265 9 2 9 56 8 469 # calculate the proportions relative to the rows, margin = 1 calculates for rows, margin = 2 calculates for columns, margin = NULL calculates for total observations table(h$genhz, h$texture_class) %>% prop.table(margin = 1) %>% round(2) * 100 ## ## br c cb cl gr l pg scl sic sicl sil sl spm ## A 0 0 0 0 0 70 0 0 0 0 24 5 0 ## BAt 0 0 0 5 0 79 0 0 0 3 10 3 0 ## Bt1 0 1 0 22 0 62 0 2 0 2 10 0 0 ## Bt2 0 14 1 46 2 25 1 4 1 3 4 0 0 ## Cr 97 2 0 0 2 0 0 0 0 0 0 0 0 ## R 100 0 0 0 0 0 0 0 0 0 0 0 0 ## not-used 0 0 0 4 0 0 0 0 0 0 0 0 96 To determine the mean by a group or category, use the group_by and summarize functions: h %>% group_by(genhz) %>% summarize(clay_avg = mean(claytotest, na.rm = TRUE), clay_med = median(claytotest, na.rm = TRUE)) ## # A tibble: 7 × 3 ## genhz clay_avg clay_med ## <fct> <dbl> <dbl> ## 1 A 16.2 16 ## 2 BAt 19.5 19 ## 3 Bt1 24.0 24 ## 4 Bt2 31.2 30 ## 5 Cr 15 15 ## 6 R NaN NA ## 7 not-used NaN NA 3.5.2 Measures of Dispersion These are measures used to determine the spread of values around the mid-point. This is useful to determine if the samples are spread widely across the range of observations or concentrated near the mid-point. In NASIS speak these values might equate to the low (L) and high (H) values for numeric and integer data. Variance is a positive value indicating deviation from the mean: \\(s^2 = \\frac{\\sum_{i=1}^{n}(x_i - \\bar{x})^2} {n - 1}\\) This is the square of the sum of the deviations from the mean, divided by the number of samples minus 1. It is commonly referred to as the sum of squares. As the deviation increases, the variance increases. Conversely, if there is no deviation, the variance will equal 0. As a squared value, variance is always positive. Variance is an important component for many statistical analyses including the most commonly referred to measure of dispersion, the standard deviation. Variance for the sample dataset is: var(h$claytotest, na.rm=TRUE) ## [1] 64.27607 Standard Deviation is the square root of the variance: \\(s = \\sqrt\\frac{\\sum_{i=1}^{n}(x_i - \\bar{x})^2} {n - 1}\\) The units of the standard deviation are the same as the units measured. From the formula you can see that the standard deviation is simply the square root of the variance. Standard deviation for the sample dataset is: sd(h$claytotest, na.rm = TRUE) ## [1] 8.017236 # or sqrt(var(h$claytotest, na.rm = TRUE)) ## [1] 8.017236 Coefficient of Variation (CV) is a relative (i.e., unitless) measure of standard deviation: \\(CV = \\frac{s}{\\bar{x}} \\times 100\\) CV is calculated by dividing the standard deviation by the mean and multiplying by 100. Since standard deviation varies in magnitude with the value of the mean, the CV is useful for comparing relative variation amongst different datasets. However Webster (2001) discourages using CV to compare different variables. Webster (2001) also stresses that CV is reserved for variables that have an absolute 0, like clay content. CV may be calculated for the sample dataset as: # remove NA values and create a new variable clay <- na.exclude(h$claytotest) sd(clay) / mean(clay) * 100 ## [1] 33.93156 Quantiles (a.k.a. Percentiles) - the percentile is the value that cuts off the first nth percent of the data values when sorted in ascending order. The default for the quantile() function returns the min, 25th percentile, median or 50th percentile, 75th percentile, and max, known as the five number summary originally proposed by Tukey. Other probabilities however can be used. At present the 5th, 50th, and 95th are being proposed for determining the range in characteristics (RIC) for a given soil property. quantile(h$claytotest, na.rm = TRUE) ## 0% 25% 50% 75% 100% ## 10 18 22 28 60 # or quantile(h$claytotest, probs = c(0.05, 0.5, 0.95), na.rm = TRUE) ## 5% 50% 95% ## 13.0 22.0 38.1 Thus, for the five number summary 25% of the observations fall between each of the intervals. Quantiles are a useful metric because they are largely unaffected by the distribution of the data, and have a simple interpretation. Range is the difference between the highest and lowest measurement of a group. Using the sample data it may be determined as: range(clay) ## [1] 10 60 which returns the minimum and maximum values observed, or: diff(range(clay)) ## [1] 50 # or max(clay) - min(clay) ## [1] 50 Interquartile Range (IQR) is the range from the upper (75%) quartile to the lower (25%) quartile. This represents 50% of the observations occurring in the mid-range of a sample. IQR is a robust measure of dispersion, unaffected by the distribution of data. In soil survey lingo you could consider the IQR to estimate the central concept of a soil property. IQR may be calculated for the sample dataset as: IQR(clay) ## [1] 10 # or diff(quantile(clay, p = c(0.25, 0.75))) ## 75% ## 10 3.5.3 Weighted Summaries Weighted Mean - is the weighted arithmetic average. In the ordinary arithmetic average, each data point is assigned the same weight, whereas in a weighted mean the contribution of each data point to the final average can vary. The function weighted.mean() takes two major inputs: x, a vector of data values, and w, a vector of weights. Like other statistics, you can remove missing values with na.rm=TRUE. # calculate horizon thickness h$hzthk <- h$hzdepb - h$hzdept # weighted mean (across all horizons and profiles) weighted.mean(h$claytotest, h$hzthk, na.rm = TRUE) ## [1] 25.24812 The above example is a little contrived since it is applied to all profiles and all horizons: so we only get one value out across 106 profiles and 626 horizons. More commonly use the weighted mean to depth-weighted averages for individual pedons or components and mapunit averages. Depth-weighted averages commonly use horizon thicknesses as weights. Mapunit averages commonly use component percentages as weights. In other cases the weights may be derived from expert knowledge or some other source when we want to scale the contribution of particular observations or variables to a final result. 3.5.3.1 Profile-specific Weighted Calculations A more practical application of weighted.mean() is Particle Size Control Section weighted average properties. For this we need to use the horizon thickness within the control section as weights. The aqp function trunc() allows you to remove portions of profiles that are outside specified depth intervals (such as the PSCS boundaries). profileApply() allows for iterating over all profiles in a SoilProfileCollection to call some function on each one. Here we calculate the PSCS weighted mean clay content for each profile in loafercreek: # calculate a "truncated" SPC with just the PSCS; drop = FALSE retains empty profiles for missing PSCS loafercreek_pscs <- trunc(loafercreek, loafercreek$psctopdepth, loafercreek$pscbotdepth, drop = FALSE) # calculate weighted mean for each profile, using the truncated horizon thicknesses as weights loafercreek$pscs_clay <- profileApply(loafercreek_pscs, function(p) { weighted.mean(p$claytotest, w = p$hzdepb - p$hzdept, na.rm = TRUE) }) # inspect loafercreek$pscs_clay ## [1] 28.76471 28.76471 25.88000 NaN 16.00000 37.32000 32.63415 NaN 33.78571 29.57576 29.00000 23.02632 25.28000 23.36364 26.25000 34.12000 ## [17] 47.69565 30.73171 28.32609 32.00000 27.12500 27.76316 25.00000 28.60870 23.39535 22.32000 24.10000 20.91600 22.52000 20.48780 44.38000 37.88000 ## [33] 28.70000 28.80000 36.46000 23.78000 30.72000 24.33333 23.76000 21.78000 28.72727 20.83871 19.56000 25.48000 28.92000 33.95122 20.18000 18.86486 ## [49] 18.12500 25.56000 17.34000 25.84000 19.00000 28.37500 27.10870 24.72000 26.20370 25.13514 26.00000 24.38000 24.20000 26.24000 27.44444 29.90000 ## [65] 24.00000 42.08000 28.34000 29.36842 23.10000 24.56818 29.10000 24.16000 28.82000 NaN 18.77500 NaN 45.82917 25.25161 NaN 20.50000 ## [81] 21.28889 24.86000 32.34000 33.36585 31.04000 23.05405 17.22000 26.52000 29.22000 20.00000 24.60000 19.74000 18.25000 20.70000 31.84000 21.97959 ## [97] 32.44737 29.56000 NaN 22.09412 21.34000 27.46154 26.68000 20.10526 31.00000 22.65000 Note that several of these pedons have NaN values in the result. This can happen even with na.rm=TRUE because pedons either do not have both psctopdepth and pscbotdepth populated in NASIS or all horizons in the PSCS have NA clay content. # inspect new site-level column pscs_clay head(site(loafercreek)[, c("peiid", "upedonid", "psctopdepth", "pscbotdepth", "pscs_clay")]) # plot just the pedons with missing pscs_clay plot(subset(loafercreek, is.na(pscs_clay)), color = "claytotest") You always need to pay attention to the possibility of missing data or weights because missing values can dramatically the final result–sometimes in unexpected ways! 3.5.3.2 Other Weighted Statistics There are many other weighted statistics available. Essentially all will use a matrix of data values and a matrix of weights to scale the contribution of data values to the final statistic value. The package Hmisc defines several weighted variants of common summary statistics, notably Hmisc::wtd.quantile(). The DescTools package also defines Quantile() which strictly follows the Eurostat definition of a weighted quantile. 3.5.4 Correlation A correlation matrix is a table of the calculated correlation coefficients of all variables. This provides a quantitative measure to guide the decision making process. The following will produce a correlation matrix for the sp4 dataset: h$hzdepm <- (h$hzdepb + h$hzdept) / 2 # Compute the middle horizon depth h %>% select(hzdepm, claytotest, sandtotest, total_frags_pct, phfield) %>% cor(use = "complete.obs") %>% round(2) ## hzdepm claytotest sandtotest total_frags_pct phfield ## hzdepm 1.00 0.59 -0.08 0.50 -0.03 ## claytotest 0.59 1.00 -0.17 0.28 0.13 ## sandtotest -0.08 -0.17 1.00 -0.05 0.12 ## total_frags_pct 0.50 0.28 -0.05 1.00 -0.16 ## phfield -0.03 0.13 0.12 -0.16 1.00 As seen in the output, variables are perfectly correlated with themselves and have a correlation coefficient of 1.0. Negative values indicate a negative relationship between variables. What is considered highly correlated? A good rule of thumb is anything with a value of 0.7 or greater is considered highly correlated. 3.6 Exercise 2: Compute Descriptive Statistics Add to your existing R script from Exercise 1. Aggregate by genhz and calculate several descriptive statistics for hzdept, gravel and phfield. Cross-tabulate geomposhill and argillic.horizon from the site table, as a percentage. Compute a correlation matrix between hzdept, gravel and phfield. Save your R script, and forward to your instructor. 3.7 Graphical Methods Now that we’ve checked for missing values and typos and made corrections, we can graphically examine the sample data distribution of our data. Frequency distributions are useful because they can help us visualize the center (e.g., RV) and spread or dispersion (e.g., low and high) of our data. Typically in introductory statistics the normal (i.e., Gaussian) distribution is emphasized. Table 3.2: Short Description of Graphical Methods Plot Types Description Bar a plot where each bar represents the frequency of observations for a ‘group’ Histogram a plot where each bar represents the frequency of observations for a ‘given range of values’ Density an estimation of the frequency distribution based on the sample data Quantile-Quantile a plot of the actual data values against a normal distribution Box-Whisker a visual representation of median, quartiles, symmetry, skewness, and outliers Scatter & Line a graphical display of one variable plotted on the x axis and another on the y axis Table 3.3: Comparison of R’s 3 Graphing Systems and their Equivalent Functions for Plotting Plot Types Base R lattice ggplot geoms Bar barplot() barchart() geom_bar() Histogram hist() histogram() geom_histogram() Density plot(density()) densityplot() geom_density() Quantile-Quantile qqnorm() qq() geom_qq() Box-Whisker boxplot() bwplot() geom_boxplot() Scatter & Line plot() xyplot geom_point() 3.7.1 Distributions 3.7.2 Bar Plot A bar plot is a graphical display of the frequency (i.e. number of observations (count or n)), such as soil texture, that fall within a given class. It is a graphical alternative to to the table() function. library(ggplot2) # bar plot ggplot(h, aes(x = texcl)) + geom_bar() 3.7.3 Histogram A histogram is similar to a bar plot, except that instead of summarizing categorical data, it categorizes a continuous variable like clay content into non-overlappying intervals for the sake of display. The number of intervals can be specified by the user, or can be automatically determined using an algorithm, such as nclass.Sturges(). Since histograms are dependent on the number of bins, for small datasets they’re not the best method of determining the shape of a distribution. ggplot(h, aes(x = claytotest)) + geom_histogram(bins = nclass.Sturges(h$claytotest)) 3.7.4 Density Curve A density estimation, also known as a Kernel density plot, generally provides a better visualization of the shape of the distribution in comparison to the histogram. Compared to the histogram where the y-axis represents the number or percent (i.e., frequency) of observations, the y-axis for the density plot represents the probability of observing any given value, such that the area under the curve equals one. One curious feature of the density curve is the hint of two peaks (i.e. bimodal distribution?). Given that our sample includes a mixture of surface and subsurface horizons, we may have two different populations. However, considering how much the two distributions overlap, it seems impractical to separate them in this instance. ggplot(h, aes(x = claytotest)) + geom_density() 3.7.5 Box plots Box plots are a graphical representation of the five number summary, depicting quartiles (i.e. the 25%, 50%, and 75% quantiles), minimum, maximum and outliers (if present). Boxplots convey the shape of the data distribution, the presence of extreme values, and the ability to compare with other variables using the same scale, providing an excellent tool for screening data, determining thresholds for variables and developing working hypotheses. The parts of the boxplot are shown in the figure below. The “box” of the boxplot is defined as the 1st quartile and the 3rd quartile. The median, or 2nd quartile, is the dark line in the box. The whiskers (typically) show data that is 1.5 * IQR above and below the 3rd and 1st quartile. Any data point that is beyond a whisker is considered an outlier. That is not to say the outlier points are in error, just that they are extreme compared to the rest of the data set. However, you may want to evaluate these points to ensure that they are correct. ggplot(h, aes(x = genhz, y = claytotest)) + geom_boxplot() The above box plot shows a steady increase in clay content with depth. Notice the outliers in the box plots, identified by the individual circles. 3.7.6 Quantile comparison plots (QQplot) A QQ plot is a plot of the actual data values against a normal distribution (which has a mean of 0 and standard deviation of 1). # QQ Plot for Clay ggplot(h, aes(sample = claytotest)) + geom_qq() + geom_qq_line() # QQ Plot for Frags ggplot(h, aes(sample = total_frags_pct)) + geom_qq() + geom_qq_line() If the data set is perfectly symmetric (i.e. normal), the data points will form a straight line. Overall this plot shows that our clay example is more or less symmetric. However the second plot shows that our rock fragments are far from evenly distributed. A more detailed explanation of QQ plots may be found on Wikipedia: https://en.wikipedia.org/wiki/QQ_plot 3.7.7 The ‘Normal’ distribution What is a normal distribution and why should you care? Many statistical methods are based on the properties of a normal distribution. Applying certain methods to data that are not normally distributed can give misleading or incorrect results. Most methods that assume normality are robust enough for all data except the very abnormal. This section is not meant to be a recipe for decision making, but more an extension of tools available to help you examine your data and proceed accordingly. The impact of normality is most commonly seen for parameters used by pedologists for documenting the ranges of a variable (i.e., Low, RV and High values). Often a rule-of thumb similar to: “two standard deviations” is used to define the low and high values of a variable. This is fine if the data are normally distributed. However, if the data are skewed, using the standard deviation as a parameter does not provide useful information of the data distribution. The quantitative measures of Kurtosis (peakedness) and Skewness (symmetry) can be used to assist in accessing normality and can be found in the fBasics package, but Webster (2001) cautions against using significance tests for assessing normality. The preceding sections and chapters will demonstrate various methods to cope with alternative distributions. A Gaussian distribution is often referred to as “Bell Curve”, and has the following properties: Gaussian distributions are symmetric around their mean The mean, median, and mode of a Gaussian distribution are equal The area under the curve is equal to 1.0 Gaussian distributions are denser in the center and less dense in the tails Gaussian distributions are defined by two parameters, the mean and the standard deviation 68% of the area under the curve is within one standard deviation of the mean Approximately 95% of the area of a Gaussian distribution is within two standard deviations of the mean Viewing a histogram or density plot of your data provides a quick visual reference for determining normality. Distributions are typically normal, Bimodal or Skewed: Examples of different types of distributions Occasionally distributions are Uniform, or nearly so: With the loafercreek dataset the mean and median for clay were only slightly different, so we can safely assume that we have a normal distribution. However many soil variables often have a non-normal distribution. For example, let’s look at graphical examination of the mean vs. median for clay and rock fragments: The solid lines represent the breakpoint for the mean and standard deviations. The dashed lines represents the median and quantiles. The median is a more robust measure of central tendency compared to the mean. In order for the mean to be a useful measure, the data distribution must be approximately normal. The further the data departs from normality, the less meaningful the mean becomes. The median always represents the same thing independent of the data distribution, namely, 50% of the samples are below and 50% are above the median. The example for clay again indicates that distribution is approximately normal. However for rock fragments, we commonly see a long tailed distribution (e.g., skewed). Using the mean in this instance would overestimate the rock fragments. Although in this instance the difference between the mean and median is only 9 percent. 3.7.8 Scatterplots and Line Plots Plotting points of one ratio or interval variable against another is a scatter plot. Plots can be produced for a single or multiple pairs of variables. Many independent variables are often under consideration in soil survey work. This is especially common when GIS is used, which offers the potential to correlate soil attributes with a large variety of raster datasets. The purpose of a scatterplot is to see how one variable relates to another. With modeling in general the goal is parsimony (i.e., simple). The goal is to determine the fewest number of variables required to explain or describe a relationship. If two variables explain the same thing, i.e., they are highly correlated, only one variable is needed. The scatterplot provides a perfect visual reference for this. Create a basic scatter plot using the loafercreek dataset. # scatter plot ggplot(h, aes(x = claytotest, y = hzdepm)) + geom_point() + ylim(100, 0) # line plot ggplot(h, aes(y = claytotest, x = hzdepm, group = peiid)) + geom_line() + coord_flip() + xlim(100, 0) This plots clay on the X axis and depth on the X axis. As shown in the scatterplot above, there is a moderate correlation between these variables. The function below produces a scatterplot matrix for all the numeric variables in the dataset. This is a good command to use for determining rough linear correlations for continuous variables. library(GGally) h %>% select(hzdepm, claytotest, phfield, total_frags_pct) %>% ggpairs() 3.7.9 3rd Dimension - Color, Shape, Size, Layers, etc… 3.7.9.1 Color and Groups # scatter plot ggplot(h, aes(x = claytotest, y = hzdepm, color = genhz)) + geom_point(size = 3) + ylim(100, 0) # density plot ggplot(h, aes(x = claytotest, color = genhz)) + geom_density(size = 2) # bar plot ggplot(h, aes(x = genhz, fill = texture_class)) + geom_bar() # box plot ggplot(h, aes(x = genhz, y = claytotest)) + geom_boxplot() # heat map (pseudo bar plot) s <- aqp::site(loafercreek) ggplot(s, aes(x = landform_string, y = pmkind)) + geom_tile(alpha = 0.2) 3.7.9.2 Facets - box plots library(tidyr) # convert to long format df <- h %>% select(peiid, genhz, hzdepm, claytotest, phfield, total_frags_pct) %>% pivot_longer(cols = c("claytotest", "phfield", "total_frags_pct")) ggplot(df, aes(x = genhz, y = value)) + geom_boxplot() + xlab("genhz") + facet_wrap(~ name, scales = "free_y") 3.7.9.3 Facets - depth plots data(loafercreek, package = "soilDB") s <- aqp::slab(loafercreek, fm = ~ claytotest + phfield + total_frags_pct, slab.structure = 0:100, slab.fun = function(x) quantile(x, c(0.1, 0.5, 0.9), na.rm = TRUE)) ggplot(s, aes(x = top, y = X50.)) + # plot median geom_line() + # plot 10th & 90th quantiles geom_ribbon(aes(ymin = X10., ymax = X90., x = top), alpha = 0.2) + # invert depths xlim(c(100, 0)) + # flip axis coord_flip() + facet_wrap(~ variable, scales = "free_x") 3.8 Exercise 3: Graphical Methods Add to your existing R script from Exercise 2. Create a faceted boxplot of genhz vs gravel and phfield. Create a facted depth plot for gravel and phfield Save your R script, and forward to your instructor. 3.9 Transformations Slope aspect and pH are two common variables warranting special consideration for pedologists. 3.9.1 pH There is a recurring debate as to the best way to average pH since is it a log transformed variable. Remember, pHs of 6 and 5 correspond to hydrogen ion concentrations of 0.000001 and 0.00001 respectively. The actual average is 5.26; -log10((0.000001 + 0.00001) / 2). If no conversions are made for pH, the mean and sd in the summary are considered the geometric mean and sd, not the arithmetic. The wider the pH range, the greater the difference between the geometric and arithmetic mean. The difference between the arithmetic average of 5.26 and the geometric average of 5.5 is small. Boyd, Tucker, and Viriyatum (2011) examined the issue in detail, and suggests that regardless of the method is used it should be documented. If you have a table with pH values and wish to calculate the arithmetic mean using R, this example will work: # arithmetic mean log10(mean(1/10^-h$phfield, na.rm = TRUE)) ## [1] 6.371026 # geometric mean mean(h$phfield, na.rm = TRUE) ## [1] 6.18 3.9.2 Circular data Slope aspect - requires the use of circular statistics for numerical summaries, or graphical interpretation using circular plots. For example, if soil map units being summarized have a uniform distribution of slope aspects ranging from 335 degrees to 25 degrees, the Zonal Statistics tool in ArcGIS would return a mean of 180. The most intuitive means available for evaluating and describing slope aspect are circular plots available with the circular package in R and the radial plot option in the TEUI Toolkit. The circular package in R will also calculate circular statistics like mean, median, quartiles etc. library(circular) # Extract the site table s <- aqp::site(loafercreek) aspect <- s$aspect_field aspect <- circular(aspect, template="geographic", units="degrees", modulo="2pi") summary(aspect) ## n Min. 1st Qu. Median Mean 3rd Qu. Max. Rho NA's ## 101.0000 12.0000 255.0000 195.0000 199.5000 115.0000 20.0000 0.1772 5.0000 The numeric output is fine, but a following graphic is more revealing, which shows the dominant Southwest slope aspect. rose.diag(aspect, bins = 8, col="grey") 3.9.3 Texture Class and Fine-earth Separates Many pedon descriptions include soil texture class and modifiers, but lack numeric estimates such as clay content and rock fragments percentage. This lack of “continuous” numeric data makes it difficult to analyze and estimate certain properties precisely. While numeric data on textural separates may be missing, it can still be estimated by the class ranges and averages. NASIS has many calculations used to estimate missing values. To facilitate this process in R, several new functions have recently been added to the aqp package. These new aqp functions are intended to impute missing values or check existing values. The ssc_to_texcl() function uses the same logic as the particle size estimator calculation in NASIS to classify sand and clay into texture class. The results are stored in data(soiltexture) and used by texcl_to_ssc() as a lookup table to convert texture class to sand, silt and clay. The function texcl_to_ssc() replicates the functionality described by Levi (2017). Unlike the other functions, texture_to_taxpartsize() is intended to be computed on weighted averages within the family particle size control section. Below is a demonstration of these new aqp R functions. library(aqp) library(soiltexture) # example of texcl_to_ssc(texcl) texcl <- c("s", "ls", "l", "cl", "c") test <- texcl_to_ssc(texcl) head(cbind(texcl, test)) # example of ssc_to_texcl() ssc <- data.frame( CLAY = c(55, 33, 18, 6, 3), SAND = c(20, 33, 42, 82, 93), SILT = c(25, 34, 40, 12, 4) ) texcl <- ssc_to_texcl(sand = ssc$SAND, clay = ssc$CLAY) ssc_texcl <- cbind(ssc, texcl) head(ssc_texcl) # plot on a textural triangle TT.plot( class.sys = "USDA-NCSS.TT", tri.data = ssc_texcl, pch = 16, col = "blue" ) # example of texmod_to_fragvoltol() frags <- c("gr", "grv", "grx", "pgr", "pgrv", "pgrx") test <- texmod_to_fragvoltot(frags)[1:4] head(test) # example of texture_to_taxpartsize() tex <- data.frame( texcl = c("c", "cl", "l", "ls", "s"), clay = c(55, 33, 18, 6, 3), sand = c(20, 33, 42, 82, 93), fragvoltot = c(35, 15, 34, 60, 91) ) tex$fpsc <- texture_to_taxpartsize( texcl = tex$texcl, clay = tex$clay, sand = tex$sand, fragvoltot = tex$fragvoltot ) head(tex) 3.10 The Shiny Package Shiny is an R package which combines R programming with the interactivity of the web. install.packages("shiny") Methods for Use Online Locally The shiny package, created by RStudio, enables users to not only use interactive applications created by others, but to build them as well. 3.10.1 Online Easiest Method Click a Link: https://gallery.shinyapps.io/lake_erie_fisheries_stock_assessment_app/ Open a web browser Navigate to a URL The ability to use a shiny app online is one of the most useful features of the package. All of the R code is executed on a remote computer which sends the results over a live http connection. Very little is required of the user in order to obtain results. 3.10.2 Locally No Internet required once configured Install R and RStudio (done) Install Required packages (app dependent) Download, open in RStudio and click “Run App” The online method may be easy for the user, but it does require a significant amount of additional effort for the creator. We won’t get into those details here! The local method, however simply requires the creator to share a single app.R file. It is the user which needs to put forth the additional effort. 3.10.3 Web App Demonstration Online: https://usda.shinyapps.io/ncr_app/ Local: https://github.com/ncss-tech/vitrusa/raw/master/r11_smp_app/app.R Online apps such as the North Central Region Web App are useful tools, available for all to use during soil survey, ecological site development, or other evaluations. The North Central Region app is however limited to data which is already available online, such as SDA (Soil Data Access) and NASIS (National Soil Information System) Web Reports. It is also reliant on the successful operation of those data systems. If the NASIS Web Reports or SDA is down for maintenance, the app fails. Local apps have the ability to leverage local data systems more easily like NASIS or other proprietary data. 3.10.4 Troubleshooting Errors Reload the app and try again. (refresh browser, or click stop, and run app again in RStudio) When the app throws an error, it stops. All other tabs/reports will no longer function until the app is reloaded. Read the getting started section on the home page. This is a quick summary of tips to avoid issues, and will be updated as needed. Check to see if SDA and NASIS Web Reports are operational, if they aren’t working, then the app won’t work either. Double check your query inputs. (typos, wildcards, null data, and too much data, can be common issues) 5 minutes of inactivity will cause the connection to drop, be sure you are actively using the app. Run the app locally - the online app does not show console activity, which can be a big help when identifying problems. Check the app issues page to see if the issue you are experiencing is already documented. (Polite but not required) Contact the app author (john.hammerly@usda.gov) When you run into trouble, there are a few steps you can take on your own to get things working again. This list may help you get your issue resolved. If not, contact (john.hammerly@usda.gov) for assistance. 3.10.5 Shiny App Embedding Shiny apps are extremely versatile, they can be embedded into presentations, Markdown, or HTML Those same formats can also be embedded in to a shiny app. This is a very simple example of a shiny app which consists of an interactive dropdown menu which controls what region is displayed in the bar chart. Let’s take a look at the code. 3.10.5.1 Shiny App Code shinyApp( # Use a fluid Bootstrap layout ui = fluidPage( # Give the page a title titlePanel("Telephones by region"), # Generate a row with a sidebar sidebarLayout( # Define the sidebar with one input sidebarPanel( selectInput("region", "Region:", choices = colnames(datasets::WorldPhones)), hr(), helpText("Data from AT&T (1961) The World's Telephones.") ), # Create a spot for the barplot mainPanel( plotOutput("phonePlot") ) ) ), # Define a server function for the Shiny app server = function(input, output) { # Fill in the spot we created for a plot output$phonePlot <- renderPlot({ # Render a barplot barplot( datasets::WorldPhones[, input$region] * 1000, main = input$region, ylab = "Number of Telephones", xlab = "Year" ) }) } ) Shiny apps consist of a ui and a server. The ui is the part of the shiny app the user sees, the user interface. In the ui, a user can choose or enter inputs for processing and viewing the results. The server takes the inputs, performs some data processing and rendering of those inputs and generates the outputs for the ui to display. 3.10.6 Questions What new features in RStudio are available for you to use once the shiny package is installed? The Region 11 Web App uses which two data sources for reports? If an error occurs while using the Region 11 Web App, what should you do? 3.10.7 Examples 3.10.7.1 NASIS Reports The NASIS Reports button is a link to a master list of NASIS Web reports for Regions 10 and 11. 3.10.7.2 Water Table The query method option allows you to choose between MUKEY, NATSYM, MUNAME. It also has a radio button for switching between flooding and ponding. Plots and Data Tables are on separate sub-menu items. 3.10.7.3 Organic Matter Same options as the Water Table Tab except no radio button. The query method option allows you to choose between MUKEY, NATSYM, MUNAME. Plots and Data Tables are on separate sub-menu items. 3.10.7.4 Project Report The project report can accept multiple projects. Use the semicolon (;) as a separator. You can also save a copy of the report by clicking the link below the submit button. 3.10.7.5 Project Extent Type in Year, type or select office and type project name for the Project extent query. Zoom and pan to view extent. Use the layers button to change the basemap or toggle layers. Click the link below the submit button to download a .zip containing the extent as a ESRI shapefile. 3.10.7.6 Long Range Plan Enter an office symbol to generate a long range plan report. 3.10.7.7 Interpretations Enter the national mapunit symbol to plot all available interpretations for the mapunit from SDA. 3.11 Exercise 4: Using the North Central Region Web App 3.11.0.1 Project Report Use the project report to generate a report on a project in your own area. Save the results and explain the results of pH plots for one of your components. 3.11.0.2 Project Extent Map an extent of a project. How many layers are available to choose from as a basemap? How many layers can be toggled on or off? 3.11.0.3 Long Range Plan Choose an office to generate a long range plan. What is the highest acreage project for 2025? 3.12 soilReports One of the strengths of NASIS is that it that has many queries and reports to access the complex data. This makes it easy for the average user to load their data, process it, and run numerous reports. The soilReports R package is essentially just a collection of R Markdown (.Rmd) documents. R Markdown is a plain text markup format for creating reproducible, dynamic reports with R. These .Rmd files can be used to generate HTML, PDF, Word, Markdown documents with a variety of forms, templates and applications. Example report output can be found at the following link: https://github.com/ncss-tech/soilReports#example-output. Detailed instructions are provided for each report: https://github.com/ncss-tech/soilReports#choose-an-available-report Install the soilReports package. This package is updated regularly and should be installed from GitHub. # Install the soilReports package from GitHub remotes::install_github("ncss-tech/soilReports", dependencies = FALSE, build = FALSE) To view the list of available reports first load the package then use the listReports() function. # Load the soilReports package library(soilReports) # List reports listReports() ## name version description ## 1 national/DT-report 1.0 Create interactive data tables from CSV files ## 2 national/NASIS-site-export 1.0 Export NASIS Sites to Spatial Layer ## 3 region11/component_summary_by_project 0.1 summarize component data for an MLRA project ## 4 region11/lab_summary_by_taxonname 1.0 summarize lab data from NASIS Lab Layer table ## 5 region11/mupolygon_summary_by_project 0.1 summarize mupolygon layer from a geodatabase ## 6 region11/pedon_summary_by_taxonname 1.1 summarize field pedons from NASIS pedon table ## 7 region2/dmu-diff 0.7 Differences between select DMU ## 8 region2/dmu-summary 0.4 DMU Summary Report ## 9 region2/edit-soil-features 0.2.1 Generate summaries of NASIS components for EDIT Soil Features sections ## 10 region2/gdb-acreage 1.0 Geodatabase Mapunit Acreage Summary Report ## 11 region2/mlra-comparison-dynamic 0.1 compare MLRA/LRU-scale delineations, based on mu-comparison report ## 12 region2/mlra-comparison 2.0 compare MLRA using pre-made, raster sample databases ## 13 region2/mu-comparison-dashboard 0.0.0 interactively subset and summarize SSURGO data for input to `region2/mu-comparison` report ## 14 region2/mu-comparison 4.0.3 compare stack of raster data, sampled from polygons associated with 1-8 map units ## 15 region2/mu-summary 1 summarize raster data for a large collection of map unit polygons ## 16 region2/pedon-summary 1.0 Generate summaries from NASIS pedons and associated spatial data ## 17 region2/QA-summary 0.6 QA Summary Report ## 18 region2/shiny-pedon-summary 1.1 Interactively subset and summarize NASIS pedon data from one or more map units ## 19 region2/spatial-pedons 1.0 Visualize NASIS pedons in interactive HTML report with overlays of SSURGO, STATSGO or custom polygons ## 20 templates/minimal 1.0 A minimal soilReports template 3.12.1 Extending soilReports Each report in soilReports has a “manifest” that describes any dependencies, configuration files or inputs for your R Markdown report document. If you can identify these things it is easy to convert your own R-based analyses to the soilReports format. The .Rmd file allows R code and text with Markdown markup to be mingled in the same document and then “executed” like an R script. 3.13 Exercise 5: Run Lab Summary By Taxon Name Soil Report For another exercise you can use the region11/lab_summary_by_taxonname report report to summarize laboratory data for a soil series. This report requires you to get some data from the Pedon “NCSS Lab” tables in NASIS. 3.13.1 Requirements Data are properly populated, otherwise the report may fail. Common examples include: Horizon depths don’t lineup Either the Pedon or Site tables isn’t loaded ODBC connection to NASIS is set up Beware each report has a unique configuration file that may need to be edited. 3.13.2 Instructions Load your NASIS selected set. Run a query such as “POINT - Pedon/Site/NCSSlabdata by upedonid and Taxon Name” from the Region 11 report folder to load your selected set. Be sure to target both the site, pedon and lab layer tables. Remove from your selected set the pedons and sites you wish to exclude from the report. Copy the lab summary to your working directory. copyReport(reportName = "region11/lab_summary_by_taxonname", outputDir = "C:/workspace2/lab_sum") Examine the report folder contents. The report is titled report.Rmd. Notice there are several other support files. The parameters for the report are contained in the config.R file. Check or create a genhz_rules file for a soil series. In order to aggregate the pedons by horizon designation, a genhz_rules file (e.g., Miami_rules.R) is needed. See above. If none exists see the following job aid on how to create one, Assigning Generalized Horizon Labels. Pay special attention to how caret ^ and dollar $ symbols are used in REGEX. They function as anchors for the beginning and end of the string, respectively. A ^ placed before an A horizon, ^A, will match any horizon designation that starts with A, such as Ap, Ap1, but not something merely containing A, such as BA. Placing a $ after a Bt horizon, Bt$, will match any horizon designation that ends with Bt, such as 2Bt or 3Bt, but not something with a vertical subdivision, such as Bt2. Wrapping pattern with both ^ and $ symbols will result only in exact matches – i.e. that start and end with the contents between ^ and $. For example ^[AC]$, will only match A or C, not Ap, Ap2, or Cg. Execute the report. Command-line approach # Set report parameters series <- "Miami" genhz_rules <- "C:/workspace2/lab_sum/Miami_rules.R" # report file path report_path <- "C:/workspace2/lab_sum/report.Rmd" # Run the report render(input = report_path, output_dir = "C:/workspace2", output_file = "C:/workspace2/lab_sum.html", envir = new.env(), params = list(series = series, genhz_rules = genhz_rules ) ) Manual approach Open the report.Rmd, hit the Knit drop down arrow, and select Knit with Parameters. Save the report. The report is automatically saved upon creation in the same folder as the R report. However, it is given the same generic name as the R report (i.e., “C:/workspace/lab_sum/report.html”), and will be overwritten the next time the report is run. Therefore, if you wish to save the report, rename the .html file to a name of your choosing and/or convert it to a PDF. Also, beware when opening the .html file with Internet Explorer – be sure to click on “Allow blocked content” if prompted. Otherwise, Internet Explorer will alter the formatting of tables etc. within the document. Sample pedon report Brief summary of steps: Load your selected set with the pedon and site table for an existing GHL file, or make your own (highly encouraged) Run the lab_summary_by_taxonname.Rmd report on a soil series of your choice. Show your work and submit the results to your mentor. 3.14 Exercise 6: Run Shiny Pedon Summary The region2/shiny-pedon-summary report is an interactive Shiny-based report that uses flexdashboard to help the user subset and summarize NASIS pedons from a graphical interface. You can try a ShinyApps.io demo here The “Shiny Pedon Summary” allows one to rapidly generate reports from a large set of pedons in their NASIS selected set. The left INPUT sidebar has numerous options for subsetting pedon data. Specifically, you can change REGEX patterns for mapunit symbol, taxon name, local phase, and User Pedon ID. Also, you can use the drop down boxes to filter on taxon kind or compare different “modal”/RV pedons. Example: Analyzing the Loafercreek Taxadjuncts Create an instance of the region2/shiny-pedon-summary report with soilReports: # create new instance of reports library(soilReports) # set path for shiny-pedon-summary report instance shinyped.path <- "C:/workspace2/chapter3/shiny-pedon" # create directories (if needed) if(!dir.exists(shinyped.path)) dir.create(shinyped.path, recursive = TRUE) # get report dependencies reportSetup('region2/shiny-pedon-summary') # copy report contents to target path copyReport('region2/shiny-pedon-summary', outputDir = shinyped.path, overwrite = TRUE) Update the config.R file You can update the config.R file in “C:/workspace2/chapter3/shiny-pedon” (or wherever you installed the report) to use the soilDB datasets loafercreek and gopheridge by setting demo_mode <- TRUE. This is the simplest way to demonstrate how this report works. Alternately, when demo_mode <- FALSE, pedons will be loaded from your NASIS selected set. config.R also allows you to specify a shapefile for overlaying the points on – to determine mapunit symbol – as well as several raster data sources whose values will be extracted at point locations and summarized. The demo dataset does not use either of these by default, due to large file sizes. Furthermore, a default (very general) set of REGEX generalized horizon patterns is provided to assign generalized horizon labels for provisional grouping. These provided patterns are unlikely to cover ALL cases, and always need to be modified for final correlation. That said, they do a decent job of making a first-pass correlation for diverse types of soils. The default config.R settings use the general patterns: use_regex_ghz <- TRUE. You are welcome to modify the defaults. If you want to use the values you have populated in NASIS Pedon Horizon Component Layer ID, set use_regex_ghz <- FALSE. Run the report via shiny.Rmd This report uses the Shiny flexdashboard interface. Open up shiny.Rmd and click the “Run Document” button to start the report. This will load the pedon and spatial data specified in config.R. NOTE: If a Viewer Window does not pop-up right away, click the gear icon to the right of the “Run Document” button. Be sure the option “Preview in Window” is checked, then click “Run Document” again. All of the subset parameters are in the left-hand sidebar. Play around with all of these options – the graphs and plots in the tabs to the right will automatically update as you make changes. When you like what you have, you can export a non-interactive HTML file for your records. To do this, first, set the “Report name:” box to something informative – this will be your report output file name. Then, scroll down to the bottom of the INPUT sidebar and click “Export Report” button. Check the “output” folder (subdirectory of where you installed the report) for your results. 3.15 Exercise 7: Run Mapunit Comparison Another popular report in soilReports is the region2/mu-comparison report. This report uses constant density sampling (sharpshootR::constantDensitySampling()) to extract numeric and categorical values from multiple raster data sources that overlap a set of user-supplied polygons. In this example, we clip a small portion of SSURGO polygons from the CA630 soil survey area extent. We then select a small set of mapunit symbols (5012, 3046, 7083, 7085, 7088) that occur within the clipping extent. These mapunits have soil forming factors we expect to contrast with one another in several ways. You can inspect other mapunit symbols by changing mu.set in config.R. Download the demo data: # set up ch4 path and path for report mucomp.path <- "C:/workspace2/chapter3/mucomp" # create any directories that may be missing if(!dir.exists(mucomp.path)) { dir.create(mucomp.path, recursive = TRUE) } mucomp.zip <- file.path(mucomp.path, 'mucomp-data.zip') # download raster data, SSURGO clip from CA630, and sample script for clipping your own raster data download.file('https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_3-mucomp-data/mucomp-data.zip', mucomp.zip) unzip(mucomp.zip, exdir = mucomp.path, overwrite = TRUE) Create an instance of the region2/mu-comparison report with soilReports: # create new instance of reports library(soilReports) # get report dependencies reportSetup('region2/mu-comparison') # create report instance copyReport('region2/mu-comparison', outputDir = mucomp.path, overwrite = TRUE) If you want, you can now set up the default config.R that is created by copyReport() to work with your own data. OR you can use the “sample” config.R file (called new_config.R) in the ZIP file downloaded above. Run this code to replace the default config.R with the sample data config.R: # copy config file containing relative paths to rasters downloaded above file.copy(from = file.path(mucomp.path, "new_config.R"), to = file.path(mucomp.path, "config.R"), overwrite = TRUE) Open report.Rmd in the C:/workspace2/chapter3/mucomp folder and click the “Knit” button at the top of the RStudio source pane to run the report. Inspect the report output HTML file, as well as the spatial and tabular data output in the output folder. Question: What differences can you see between the five mapunit symbols that were analyzed? 3.16 Additional Reading (Exploratory Data Analysis) Healy, K., 2018. Data Visualization: a practical introduction. Princeton University Press. http://socviz.co/ Helsel, D.R., Hirsch, R.M., Ryberg, K.R., Archfield, S.A., and Gilroy, E.J., 2020, Statistical methods in water resources: U.S. Geological Survey Techniques and Methods, book 4, chap. A3, 458 p., https://doi.org/10.3133/tm4a3. [Supersedes USGS Techniques of Water-Resources Investigations, book 4, chap. A3, version 1.1.] Kabacoff, R.I., 2018. Data Visualization in R. https://rkabacoff.github.io/datavis/ Peng, R. D., 2016. Exploratory Data Analysis with R. Leanpub. https://bookdown.org/rdpeng/exdata/ Wilke, C.O., 2019. Fundamentals of Data Visualization. O’Reily Media, Inc. https://clauswilke.com/dataviz/ References Boyd, Claude E., Craig S. Tucker, and Rawee Viriyatum. 2011. “Interpretation of pH, Acidity, and Alkalinity in Aquaculture and Fisheries.” North American Journal of Aquaculture 73 (4): 403–8. https://doi.org/10.1080/15222055.2011.620861. Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co. https://archive.org/details/exploratorydataa0000tuke_7616. Webster, R. 2001. “Statistics to Support Soil Research and Their Presentation.” European Journal of Soil Science 52 (2): 331–40. https://doi.org/10.1046/j.1365-2389.2001.00383.x. "],["spatial.html", "Chapter 4 Spatial Data in R 4.1 Objectives (Spatial Data) 4.2 Making Maps with R 4.3 Spatial Data Sources 4.4 Viewing Pedon Locations 4.5 Exercise 1: Pedon Locations 4.6 Packages for Vector Data 4.7 Exercise 2: Map your favorite soil series extents 4.8 Packages for Raster Data 4.9 Coordinate Reference Systems (CRS) 4.10 Load Required Packages 4.11 Download Example Data 4.12 Load Example MLRA Data 4.13 Vector Data 4.14 Raster Data 4.15 Exercise 3: Creating a Slope Map 4.16 Spatial Overlay Operations 4.17 Exercise 4: Extracting Raster Data 4.18 Additional Reading (Spatial)", " Chapter 4 Spatial Data in R This chapter is a brief demonstration of possible ways to process spatial data in R. This will help you to develop a strategy for selecting spatial data processing methods. 4.1 Objectives (Spatial Data) Gain experience creating, editing, and exporting spatial data objects in R. Learn the basics of sf package for vector (points, lines, polygons) data Learn the basics of terra classes and functions for vector and raster data Learn about some interfaces to NCSS spatial data sources Create maps with R The next sections will require loading these libraries into the R session. # SPC and soil database interface library(aqp) library(soilDB) # "Simple Feature" (vector) data structures library(sf) # superseded by sf -- spatial object classes e.g. SpatialPoints/SpatialPolygons library(sp) # gridded data management / analysis library(terra) # superseded by terra # library(raster) # interactive maps with leaflet library(mapview) There are many packages available for working with spatial data, however we only have time to cover introducing a few common libraries. A couple resources are linked here for 5 packages that provide different ways displaying spatial data graphically: tmap ggplot2, ggmap mapview mapdeck leaflet 4.2 Making Maps with R R has become a powerful tool for visualization and interaction with spatial data. There are many tools available for making maps with R! It is not all geostatistics and coordinate reference system transformations. There are powerful ways to automate your GIS workflow from beginning to end–from creating terrain derivatives from a source DEM, to high-quality, publication-ready maps and interactive HTML/JavaScript widgets. An excellent resource for making maps with R is the chapter in “Geocomputation with R” geocompr: Making maps with R 4.3 Spatial Data Sources Spatial data sources: “raster” and “vector” Raster data sources (grids/images): GeoTIFF, ERDAS, BIL, ASCII grid, WMS, … Vector data sources (points/lines/polygons): Shape File, ESRI File Geodatabase, KML, GeoJSON, GML, WFS, … Conventional data sources that can be upgraded to be spatial data because they contain GeoJSON, WKT, or point coordinates include: NASIS/LIMS reports Web pages and Web Services Excel and CSV files Photo EXIF information Here are some R-based interfaces to NCSS data sources via soilDB package. Functions that return tabular data contain longitude, latitude coordinates: fetchNASIS(): NASIS “site” data fetchLDM(): KSSL “site” data from Lab Data Mart fetchKSSL(): KSSL “site” data from SoilWeb Functions that return spatial data: fetchSDA_spatial(): polygon, bounding box and centroid data from SSURGO, STATSGO and the sapolygon (Soil Survey Area Polygon) from Soil Data Access (SDA) fetchHenry(): sensor / weather station locations as points SDA_query(): SSURGO data as points, lines, polygons (via SDA) SDA_spatialQuery(): use points or polygons as a “query” to SDA seriesExtent() and taxaExtent(): extent of series and taxonomic classes derived from SSURGO (SoilWeb) in vector and raster format (800m resolution). The vector output is identical to series extents reported by Series Extent Explorer mukey.wcs() and ISSR800.wcs() provide an interface to gSSURGO (mukey), gNATSGO (mukey), and the ISSR-800 (gridded soil property) data. 4.4 Viewing Pedon Locations In this section we will introduce the sf package with mapview. 4.4.1 Plotting Geographic Data Making maps of data gives you some idea how data look spatially and whether their distribution is what you expect. Typos are relatively common when coordinates are manually entered. Viewing the data spatially is a quick way to see if any points plot far outside of the expected geographic area of interest. # plot the locations of the gopheridge pedons with R # # Steps: # 1) create and inspect an sf data.frame object # 2) plot the data with mapview # load libraries library(aqp) library(soilDB) library(sf) library(mapview) # this creates sample gopheridge object in your environment data("gopheridge", package = "soilDB") # replace gopheridge object with fetchNASIS() (your data) # gopheridge <- fetchNASIS() # create simple features POINT geometry data.frame # st_as_sf(): convert data.frame to spatial simple features, with points in $geometry # st_crs(): set EPSG:4326 Coordinate Reference System (CRS) as Well-Known Text (WKT) gopher.locations <- st_as_sf( site(gopheridge), coords = c('longstddecimaldegrees','latstddecimaldegrees'), crs = st_crs(4326) ) # create interactive map with sfc_POINT object # use site_id in sf data.frame as labels mapview(gopher.locations, label = gopher.locations$site_id) 4.5 Exercise 1: Pedon Locations In this exercise, you will create an interactive map with the pedons in your selected set. Then you will export them to a shapefile. Modify the code snippets below to make an R plot and a shapefile of pedon data loaded from your NASIS selected set. You will plot pedon locations using the standard WGS84 longitude/latitude decimal degrees fields from Site table of NASIS. In some cases, these data might be incomplete; you need to handle this possibility. In this exercise you will create a subset SoilProfileCollection for the pedons that are not missing spatial data (longstddecimaldegrees and latstddecimaldegrees). Make a new R script, load the aqp, soilDB, sf and mapview packages and some pedons via fetchNASIS() (or similar source). library(aqp) library(soilDB) library(sf) library(mapview) # get pedons from the selected set pedons <- fetchNASIS(from = 'pedons') Use the base R subset() function to create a subset of your SoilProfileCollection using is.na() longstddecimaldegrees and latstddecimaldegrees variables contain WGS84 longitude and latitude in decimal degrees. This is the standard format for location information used in NASIS. # modify this code (replace ...) to create a subset pedons.sp <- aqp::subset(pedons, ...) Create a sf data.frame from the site data in the SoilProfileCollection object pedons.sp using aqp::site(). Replace the ... in the following code. Promoting a data.frame to sf POINT geometry requires that the X and Y columns be specified. pedon.locations <- sf::st_as_sf( ..., coords = c('longstddecimaldegrees', 'latstddecimaldegrees'), crs = sf::st_crs(4326) #WGS84 GCS ) View your sf object pedon.locations interactively with mapview::mapview(), and change the map.types argument to 'Esri.WorldImagery'. Use the pedon.locations column named site_id for the label argument. # plot an interactive map mapview(pedon.locations, legend = FALSE, map.types = 'OpenStreetMap', ...) Create a subset sf data.frame with only the following “site data” columns: pedlabsampnum, upedonid, taxonname, hillslopeprof, elev_field, slope_field, aspect_field, plantassocnm, bedrckdepth, bedrckkind, pmkind, pmorigin. Select the target columns with dplyr::select() (or another method) by replacing the ... in the following code. pedon.locations_sub <- dplyr::select(pedon.locations, ...) # see also base::subset(x, select=...) Export the spatial information in pedon.locations_sub to a shape file (.shp) with sf::st_write() # write to SHP; output CRS is geographic coordinate system WGS84 sf::st_write(pedon.locations_sub, "./NASIS-pedons.shp") Send a screenshot of your interactive map, and your R script, to your mentor. For an example of exporting data to shapefile with the sp package, see this tutorial: Export Pedons to Shapefile with sp. 4.6 Packages for Vector Data 4.6.1 The sf package Simple Features Access is a set of standards that specify a common storage and access model of geographic features. It is used mostly for two-dimensional geometries such as point, line, polygon, multi-point, multi-line, etc. This is one of many ways of modeling the geometry of shapes in the real world. This model happens to be widely adopted in the R ecosystem via the sf package, and very convenient for typical data encountered by soil survey operations. The sf package represents the latest and greatest in spatial data processing within the comfort of an R session. It provides a “main” object class sf to contain geometric data and associated tabular data in a familiar data.frame format. sf methods work on a variety of different levels of abstraction and manipulation of those geometries. Most of the sf package functions start with the prefix st_, such as: st_crs() (get/set coordinate reference system), st_transform() (project feature class to different coordinate reference system), st_bbox() (bounding box), st_buffer() (buffer). Many of these are “verbs” that are common GIS operations. 4.6.1.1 sf vignettes You can the following sf package vignettes for details, sample data sets and usage of sf objects. Simple Features for R Reading, Writing and Converting Simple Features Manipulating Simple Feature Geometries Manipulating Simple Features Plotting Simple Features Miscellaneous Spherical geometry in sf using s2geometry 4.6.2 The sp Package The data structures (“classes”) and functions provided by the sp package have served a foundational role in the handling of spatial data in R for years. Many of the following examples will reference names such as SpatialPoints, SpatialPointsDataFrame, and SpatialPolygonsDataFrame. These are specialized (S4) classes implemented by the sp package. Objects of these classes maintain linkages between all of the components of spatial data. For example, a point, line, or polygon feature will typically be associated with: coordinate geometry bounding box coordinate reference system attribute table 4.6.3 Converting sp and sf sp provides access to the same compiled code libraries (PROJ, GDAL, GEOS) through sf package. For now the different package object types are interchangeable, and you may find yourself having to do this for a variety of reasons. You can convert between object types as needed using sf::as_Spatial() or sf::st_as_sf(). Check the documentation (?functionname) to figure out what object types different methods need as input; and check an input object’s class with class() or inherits(). 4.6.4 Importing / Exporting Vector Data Import a feature class from a ESRI File Geodatabase or shape file. If you have a .shp file, you can specify the whole path, including the file extension in the dsn argument, or just the folder. For a Geodatabase, you should specify the feature class using the layer argument. Note that a trailing “/” is omitted from the dsn (data source name) and the “.shp” suffix is omitted from the layer. 4.6.4.1 sf x <- sf::st_read(dsn = 'E:/gis_data/ca630/FG_CA630_OFFICIAL.gdb', layer = 'ca630_a') x <- sf::read_sf(dsn = 'E:/gis_data/ca630/pedon_locations.shp') sf::st_write(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp') sf::write_sf(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp') 4.6.4.2 sp Export object x to shapefile using the sf syntax. rgdal is no longer available on CRAN. The sf st_read() / read_sf() / st_write() / write_sf() functions have many arguments, so it is worth spending some time reviewing the associated manual pages. 4.6.5 Interactive mapping with mapview and leaflet The mapview and leaflet packages make it possible to display interactive maps of sf objects in RStudio viewer pane, or within an HTML document generated via R Markdown (e.g. this document). mapview package Basics Advanced Features See other “Articles” in this series, you can make complex, interactive maps using the mapview package. leaflet package leafem: ‘leaflet’ Extensions for ‘mapview’ 4.7 Exercise 2: Map your favorite soil series extents The seriesExtent function in soilDB returns an sf object showing generalized extent polygons for a given soil series. # load required packages, just in case library(soilDB) library(sf) library(mapview) # series extents from SoilWeb (sf objects) pentz <- seriesExtent('pentz') amador <- seriesExtent('amador') # combine into a single object s <- rbind(pentz, amador) # colors used in the map # add more colors as needed cols <- c('royalblue', 'firebrick') # make a simple map, colors set by 'series' column mapview(s, zcol = 'series', col.regions = cols, legend = TRUE) The following code demonstrates how to fetch / convert / map soil series extents, using a vector of soil series names. Results appear in the RStudio “Viewer” pane. Be sure to try the “Export” and “show in window” (next to the broom icon) buttons. # load required packages, just in case library(soilDB) library(sf) library(mapview) # vector of series names, letter case does not matter # try several (2-9)! series.names <- c('auberry', 'sierra', 'holland', 'cagwin') # iterate over series names, get extent # result is a list of sf objects s <- lapply(series.names, soilDB::seriesExtent) # flatten list -> single sf object s <- do.call('rbind', s) # colors used in the map # note trick used to dynamically set the number of colors cols <- RColorBrewer::brewer.pal(n = length(series.names), name = 'Set1') # make a simple map, colors set by 'series' column # click on polygons for details # try pop-out / export buttons mapview(s, zcol = 'series', col.regions = cols, legend = TRUE) Question: What do you notice about the areas where the extent polygons occur? Share your thoughts with your peers or mentor 4.8 Packages for Raster Data 4.8.1 The terra Package The terra package package provides most of the commonly used grid and vector processing functionality that one might find in a conventional GIS. It provides high-level data structures and functions for the GDAL (Geospatial Data Abstraction Library). resampling (terra::resample()) projection and warping (terra::project()) cropping, mosaicing, masking (terra::crop(), terra::mosaic(), terra::merge(), terra::mask()) local and focal functions (terra::local(), terra::focal()) raster algebra (arithmetic operators, terra::xapp()) sampling (terra::spatSample()) contouring (terra::contour()) raster/vector conversions (terra::rasterize(), terra::as.polygons()) terrain analysis (terra::terrain()) model-based prediction and interpolation (terra::predict(), terra::interpolate(); more on this in Part 2) 4.8.1.1 Terra Example This is a brief demonstration using sample data files with terra. # use an example from the terra package f <- system.file("ex", "elev.tif", package = "terra") # corresponding luxembourg vector (polygon) data g <- system.file("ex", "lux.shp", package = "terra") r <- terra::rast(f) r ## class : SpatRaster ## dimensions : 90, 95, 1 (nrow, ncol, nlyr) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## source : elev.tif ## name : elevation ## min value : 141 ## max value : 547 v <- terra::vect(g) v ## class : SpatVector ## geometry : polygons ## dimensions : 12, 6 (geometries, attributes) ## extent : 5.74414, 6.528252, 49.44781, 50.18162 (xmin, xmax, ymin, ymax) ## source : lux.shp ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## names : ID_1 NAME_1 ID_2 NAME_2 AREA POP ## type : <num> <chr> <num> <chr> <num> <num> ## values : 1 Diekirch 1 Clervaux 312 1.808e+04 ## 1 Diekirch 2 Diekirch 218 3.254e+04 ## 1 Diekirch 3 Redange 259 1.866e+04 # show SpatRaster details print(r) ## class : SpatRaster ## dimensions : 90, 95, 1 (nrow, ncol, nlyr) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## source : elev.tif ## name : elevation ## min value : 141 ## max value : 547 # default plot method plot(r) lines(v) # interactive (leaflet) plot method p <- plet(r, tiles = "OpenTopoMap") lines(p, v) The R object only stores a reference to the data until they are needed to be loaded into memory. This allows for internal raster manipulation algorithms to intelligently deal with very large grids that may not fit in memory. 4.8.1.2 Other approaches to raster data 4.8.1.2.1 raster A more complete background on the capabilities of the raster package, and the replacement terra, are described in the Spatial Data Science with R online book. # convert r to a RasterLayer object r2 <- raster::raster(f) # show RasterLayer details print(r2) ## class : RasterLayer ## dimensions : 90, 95, 8550 (nrow, ncol, ncell) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) ## crs : +proj=longlat +datum=WGS84 +no_defs ## source : elev.tif ## names : elevation ## values : 141, 547 (min, max) Introduction to the raster package vignette 4.8.1.2.2 stars There is also a package called stars (Spatiotemporal Arrays: Raster and Vector Datacubes) that is the sf-centric way of dealing with higher dimensional raster and vector “datacubes.” Data cubes have additional dimensions related to time, spectral band, or sensor type. The stars data structures are often used for processing spectral data sources from satellites. 4.8.1.3 Related Links sf package website rspatial.org - Spatial Data Science with R Goodbye PROJ.4 strings! How to specify a coordinate reference system in R? 4.8.2 Converting Vector to Raster 4.8.2.1 terra::rasterize() 4.8.2.2 fasterize::fasterize() 4.8.3 Converting Raster to Vector 4.8.3.1 terra::as.polygons() 4.9 Coordinate Reference Systems (CRS) Spatial data aren’t all that useful without an accurate description of the Coordinate Reference System (CRS). This type of information is typically stored within the “.prj” component of a shapefile, or in the header of a GeoTIFF. Without a CRS it is not possible to perform coordinate transformations (e.g. conversion of geographic coordinates to projected coordinates), spatial overlay (e.g. intersection), or geometric calculations (e.g. distance or area). The “old” way (PROJ.4) of specifying coordinate reference systems is using character strings containing, for example: +proj or +init arguments. In general, this still “works,” so you may encounter it and need to know about it. But you also may encounter cases where CRS are specified using integers, strings of the form authority:code, or well-known text (WKT). Some common examples of coordinate system “EPSG” codes and their legacy “PROJ.4” strings. 4 “EPSG” stands for European Petroleum Survey Group. The “EPSG Geodetic Parameter Dataset” is a public registry of geodetic datums, spatial reference systems, Earth ellipsoids, coordinate transformations and related units of measurement. “OGC” refers to the Open Geospatial Consortium, which is an example of another important authority:code. “ESRI” (company that develops ArcGIS) also defines many CRS codes. “PROJ” is the software responsible for transforming coordinates from one CRS to another. The current version of PROJ available is 9, and in PROJ > 6 major changes were made to the way that coordinate reference systems are defined and transformed led to the “PROJ.4” syntax falling out of favor. EPSG: 4326 / PROJ.4:+proj=longlat +datum=WGS84 - geographic, WGS84 datum (NASIS Standard) OGC:CRS84 - geographic, WGS84 datum (same as above but explicit longitude, latitude XY order) EPSG: 4269 / PROJ.4:+proj=longlat +datum=NAD83 - geographic, NAD83 datum EPSG: 4267 / PROJ.4:+proj=longlat +datum=NAD27 - geographic, NAD27 datum EPSG: 26910 / PROJ.4:+proj=utm +zone=10 +datum=NAD83 - projected (UTM zone 10), NAD83 datum EPSG: 5070 / PROJ.4: +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23.0 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs - Albers Equal Area CONUS (gSSURGO) More on the EPSG codes and specifics of CRS definitions: https://spatialreference.org/ref/epsg/ https://epsg.io/ While you may encounter PROJ.4 strings, these are no longer considered the preferred method of referencing Coordinate Reference Systems – and, in general, newer methods are “easier.” Well-known text (WKT) is a human- machine-readable standard format for geometry, so storing the Coordinate Reference System information in a similar format makes sense. This format is returned by the sf::st_crs() method. For example: the WKT representation of EPSG:4326: st_crs(4326) ## Coordinate Reference System: ## User input: EPSG:4326 ## wkt: ## GEOGCRS["WGS 84", ## ENSEMBLE["World Geodetic System 1984 ensemble", ## MEMBER["World Geodetic System 1984 (Transit)"], ## MEMBER["World Geodetic System 1984 (G730)"], ## MEMBER["World Geodetic System 1984 (G873)"], ## MEMBER["World Geodetic System 1984 (G1150)"], ## MEMBER["World Geodetic System 1984 (G1674)"], ## MEMBER["World Geodetic System 1984 (G1762)"], ## MEMBER["World Geodetic System 1984 (G2139)"], ## MEMBER["World Geodetic System 1984 (G2296)"], ## ELLIPSOID["WGS 84",6378137,298.257223563, ## LENGTHUNIT["metre",1]], ## ENSEMBLEACCURACY[2.0]], ## PRIMEM["Greenwich",0, ## ANGLEUNIT["degree",0.0174532925199433]], ## CS[ellipsoidal,2], ## AXIS["geodetic latitude (Lat)",north, ## ORDER[1], ## ANGLEUNIT["degree",0.0174532925199433]], ## AXIS["geodetic longitude (Lon)",east, ## ORDER[2], ## ANGLEUNIT["degree",0.0174532925199433]], ## USAGE[ ## SCOPE["Horizontal component of 3D system."], ## AREA["World."], ## BBOX[-90,-180,90,180]], ## ID["EPSG",4326]] This is using the OGC WKT CRS standard. Adoption of this standard caused some significant changes in packages in the R ecosystem. So you can get familiar, what follows are several examples of doing the same thing: setting the CRS of spatial objects with WGS84 longitude/latitude geographic coordinates. If you have another target coordinate system, it is just a matter of using the correct codes to identify it. 4.9.1 Assigning and Transforming Coordinate Systems Returning to the example from above, lets assign a CRS to our series extent s using different methods. s <- seriesExtent('san joaquin') The following sections give equivalent sf versus sp syntax. 4.9.1.1 sf Use st_crs<- to set, or st_crs() get CRS of sf objects. Supply the target EPSG code as an integer. # the CRS of s is EPSG:4326 st_crs(s) == st_crs(4326) ## [1] TRUE # set CRS using st_crs<- (replace with identical value) st_crs(s) <- st_crs(4326) Transformation of points, lines, and polygons with sf requires an “origin” CRS be defined in the argument x. The “target” CRS is defined as an integer (EPSG code) in the crs argument or is the output of st_crs(). # transform to UTM zone 10 s.utm <- st_transform(x = s, crs = 26910) # transform to GCS NAD27 s.nad27 <- st_transform(x = s, crs = st_crs(4267)) 4.9.1.2 sp You can do the same thing several different ways with sp objects. An equivalent EPSG, OGC and PROJ.4 can be set or get using proj4string<-/proj4string and either a sp CRS object or a PROJ.4 string for Spatial objects. # s is an sf object (we converted it), convert back to Spatial* object s.sp <- sf::as_Spatial(s) # these all create the same internal sp::CRS object proj4string(s.sp) <- sp::CRS('EPSG:4326') # proj >6; EPSG proj4string(s.sp) <- sp::CRS('OGC:CRS84') # proj >6; OGC proj4string(s.sp) <- '+init=epsg:4326' # proj4 style +init string proj4string(s.sp) <- '+proj=longlat +datum=WGS84' # proj4 style +proj string Here, we do the same transformations we did above only using sp: spTransform(). # transform to UTM zone 10 s.utm <- spTransform(s.sp, CRS('+proj=utm +zone=10 +datum=NAD83')) # transform to GCS NAD27 s.nad27 <- spTransform(s.sp, CRS('+proj=longlat +datum=NAD27')) 4.9.1.3 terra and raster To assign or get the coordinate reference system for raster, terra or sp CRS objects use the crs() functions. r <- terra::rast(system.file("ex", "elev.tif", package="terra")) # inspect CRS terra::crs(r) # r is a SpatRaster object; set CRS to current CRS terra::crs(r) <- terra::crs("OGC:CRS84") “Transforming” or “warping” a raster is a different from with a vector as it requires interpolation of pixels to a target resolution and CRS. The method provided by terra is project() and in raster it is projectRaster(). It works the same as the above “transform” methods in that you specify an object to transform, and the target reference system or a template for the object. t.wgs84 <- terra::project(r, terra::crs("+proj=igh")) r.wgs84 <- raster::projectRaster(raster::raster(r), crs = CRS("+proj=igh")) Note that the default warping of raster uses bilinear interpolation (method='bilinear'), which is appropriate for continuous variables. You also have the option of using nearest-neighbor (method='ngb') for categorical variables (class maps) where interpolation would not make sense. If we want to save this transformed raster to file, we can use something like this for terra terra::writeRaster(t.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW")) Similarly for raster: terra::writeRaster(r.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW")) 4.10 Load Required Packages Load required packages into a fresh RStudio Session (Ctrl + Shift + F10) library(aqp) library(soilDB) library(sf) library(terra) 4.11 Download Example Data Run the following to create a path for the example data. Be sure to set a valid path to a local disk. # store path as a variable, in case you want to keep it somewhere else ch4.data.path <- 'C:/workspace2/chapter-4' # make a place to store chapter 2b example data dir.create(ch4.data.path, recursive = TRUE) # download polygon example data from github download.file( 'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-mu-polygons.zip', file.path(ch4.data.path, 'chapter-4-mu-polygons.zip') ) # download raster example data from github download.file( 'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-PRISM.zip', file.path(ch4.data.path, 'chapter-4-PRISM.zip') ) # unzip unzip( file.path(ch4.data.path, 'chapter-4-mu-polygons.zip'), exdir = ch4.data.path, overwrite = TRUE ) unzip( file.path(ch4.data.path, 'chapter-4-PRISM.zip'), exdir = ch4.data.path, overwrite = TRUE ) 4.12 Load Example MLRA Data We will be using polygons associated with MLRA 15 and 18 as part of this demonstration. Import these data with sf::st_read(). # load MLRA polygons mlra <- sf::st_read(file.path(ch4.data.path, 'mlra-18-15-AEA.shp')) ## alternately, use your own MLRA # mlra <- soilDB::fetchSDA_spatial(c("15", "18"), by.col="MLRARSYM", geom.src = "MLRAPOLYGON") |> sf::st_transform("EPSG:5070") We will load the sample MLRA 15 and 18 (California) raster data (PRISM derived) using terra::rast(). If using your own MLRA, you will need to update file paths to use your own rasters. # mean annual air temperature, Deg C maat <- terra::rast(file.path(ch4.data.path, 'MAAT.tif')) # mean annual precipitation, mm map <- terra::rast(file.path(ch4.data.path, 'MAP.tif')) # frost-free days ffd <- terra::rast(file.path(ch4.data.path, 'FFD.tif')) # growing degree days gdd <- terra::rast(file.path(ch4.data.path, 'GDD.tif')) # percent of annual PPT as rain rain_fraction <- terra::rast(file.path(ch4.data.path, 'rain_fraction.tif')) # annual sum of monthly PPT - ET_p ppt_eff <- terra::rast(file.path(ch4.data.path, 'effective_precipitation.tif')) Sometimes it is convenient to “stack” raster data that share a common grid size, extent, and coordinate reference system into a multilayer terra SpatRaster object. Calling terra::rast() on a list of SpatRaster is equivalent to making a RasterStack from several RasterLayer with raster::stack(). # create a raster stack (multiple rasters aligned) rs <- terra::rast(list(maat, map, ffd, gdd, rain_fraction, ppt_eff)) # inspect rs ## class : SpatRaster ## dimensions : 762, 616, 6 (nrow, ncol, nlyr) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : -123.2708, -118.1375, 34.44583, 40.79583 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat NAD83 (EPSG:4269) ## sources : MAAT.tif ## MAP.tif ## FFD.tif ## ... and 3 more sources ## names : MAAT, MAP, FFD, GDD, rain_~ction, effec~ation ## min values : -4.073542, 114, 35, 76, 12, -825.5897 ## max values : 18.676420, 2958, 365, 3173, 100, 2782.3914 plot(rs) 4.13 Vector Data 4.13.1 sf p <- sf::st_as_sf(data.frame(x = -120, y = 37.5), coords = c("x", "y"), crs = 4326) p.aea <- st_transform(p, "EPSG:5070") In sf the functions used to do this are st_intersects() or st_intersection(). st_intersects(p.aea, mlra) ## Sparse geometry binary predicate list of length 1, where the predicate was `intersects' ## 1: 2 st_intersection(p.aea, mlra) ## Simple feature collection with 1 feature and 5 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: -2079434 ymin: 1870764 xmax: -2079434 ymax: 1870764 ## Projected CRS: NAD83 / Conus Albers ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME geometry ## 1 18 23 Sierra Nevada Foothills C California Subtropical Fruit, Truck, and Specialty Crop Region POINT (-2079434 1870764) 4.13.2 terra p <- terra::vect(data.frame(x = -120, y = 37.5), geom = c("x", "y"), crs = "EPSG:4326") p.aea <- project(p, "EPSG:5070") In terra the functions used to determine the intersection is relate(). mlra[relate(vect(mlra), p.aea, relation = "intersects"), ] ## Simple feature collection with 1 feature and 5 fields ## Geometry type: POLYGON ## Dimension: XY ## Bounding box: xmin: -2181926 ymin: 1548989 xmax: -1970476 ymax: 2264711 ## Projected CRS: Albers ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME geometry ## 2 18 23 Sierra Nevada Foothills C California Subtropical Fruit, Truck, and Specialty Crop Region POLYGON ((-2160599 2264711,... 4.13.3 sp In sp objects, you do these operations with the sp::over() function. Access the associated vignette by running vignette(\"over\") in the console when the sp package is loaded. # hand make a SpatialPoints object # note that this is GCS p <- SpatialPoints(coords = cbind(-120, 37.5), proj4string = CRS('+proj=longlat +datum=WGS84')) mlra.sp <- sf::as_Spatial(mlra) # spatial extraction of MLRA data requires a CRS transformation p.aea <- spTransform(p, proj4string(mlra.sp)) over(p.aea, mlra.sp) 4.14 Raster Data 4.14.1 Object Properties SpatRaster and RasterLayer objects are similar to sf, sp and other R spatial objects in that they keep track of the linkages between data, coordinate reference system, and optional attribute tables. Getting and setting the contents of raster objects should be performed using functions such as: terra::NAflag(r) / raster::NAvalue(r): get / set the NODATA value terra::crs(r) / raster::wkt(r) : get / set the coordinate reference system terra::res(r) / raster::res(r): get / set the resolution terra::ext(r) / raster::extent(r): get / set the extent terra::datatype(r) / raster::dataType(r): get / set the data type … many more, see the raster and terra package manuals 4.14.2 Rasters “In Memory” vs. “File-Based” Processing of raster data in memory is always faster than processing on disk, as long as there is sufficient memory. The terra package handles basically all of the logic delegating in vs. out of memory processing internally–so it is rare that any adjustments to defaults are required. With the raster package, the initial file/disk-based reference can be converted to an in-memory RasterLayer with the readAll() function. You can achieve a similar effect in terra by doing set.values(object). 4.14.3 Rasters “Continuous” vs. “Categorical” Rasters can represent both continuous and categorical (factor) variables. Raster categories are stored as integers with one or more associated labels. The categories can be viewed using the levels() and terra::cats() functions. You can have multiple category columns, and the “active” category can be set with terra::activeCat(). You can use the terra::classify() function to assign integer values to each pixel that can be the basis for you categories. Then, you can set the categories associated. For example, we classify the terra sample elevation dataset into high and low elevation areas. We supply a reclassification matrix of values with three columns. The first column is the “low” end of the class range, the second column is the high end of the class range. The third column contains the new values to assign. x <- terra::rast(system.file("ex", "elev.tif", package = "terra")) rcl <- cbind(c(0, 300), c(300, 600), 1:2) colnames(rcl) <- c("low", "high", "new_value") rcl ## low high new_value ## [1,] 0 300 1 ## [2,] 300 600 2 y <- terra::classify(x, rcl) plot(y) Once we classify a raster into a set of integer values, we can assign labels or categories to each value with levels(): new_levels <- data.frame( values = 1:2, region = c("low elevation", "high elevation"), otherlabel = c("A", "B") ) new_levels ## values region otherlabel ## 1 1 low elevation A ## 2 2 high elevation B levels(y) <- new_levels plot(y) Our categories had two columns with labels. The first one (region) is selected by default. We can use the second (otherlabel) if we set it as the active category with terra::activeCat(). terra::activeCat(y) <- "otherlabel" plot(y) We can also handle values that are not matched in classify() matrix with the others argument. Here we set others = 3 so that any cell values that are not included in rcl get assigned value 3. rcl <- cbind(c(200, 300), c(300, 600), 1:2) colnames(rcl) <- c("low", "high", "new_value") rcl ## low high new_value ## [1,] 200 300 1 ## [2,] 300 600 2 y2 <- terra::classify(x, rcl, others = 3) plot(y2) We have not provided handling for NA values so they are not altered by the above classification. We can convert NA values explicitly by adding them to rcl: rcl <- cbind(c(200, 300, NA), c(300, 600, NA), c(1:2, 4)) colnames(rcl) <- c("low", "high", "new_value") rcl ## low high new_value ## [1,] 200 300 1 ## [2,] 300 600 2 ## [3,] NA NA 4 y3 <- terra::classify(x, rcl, others = 3) plot(y3) Note that classify() works with the “raw” values of categorical rasters, ignoring the categories. To simply change the labels of categorical rasters, use terra::subst() instead. 4.14.4 Writing Rasters to File Exporting data requires consideration of the output format, datatype, encoding of NODATA, and other options such as compression. With terra, \"COMPRESS=LZW\" option is used by default when writing GeoTIFF files. Using the gdal argument e.g.: terra::writeRaster(..., gdal=) is equivalent to specifying options argument to raster::writeRaster(). # using previous example data set terra::writeRaster(x, filename = 't.wgs84.tif') For example, a RasterLayer object that you wanted to save to disk as an internally-compressed GeoTIFF: # using previous example data set raster::writeRaster(x, filename = 'r.tif', options = c("COMPRESS=LZW")) 4.14.4.1 Writing Categorical Rasters to File When you write categorical rasters to file, categories will either be stored within the file itself, or in a Persistent Auxiliary Metadata (PAM) into an .aux.xml file automatically. If only using terra or other GDAL tools to work with categorical data this is usually sufficient. You can also write a .vat.dbf file containing categorical information. Writing this file can be important if you want to use your categories in other GIS software such as ArcGIS (which does not necessarily make full use of GDAL PAM). We can write a data.frame containing the levels of our raster to file using foreign::write.dbf() function. You will append the “.vat.dbf” extension to the base filename of your data. x <- terra::rast(system.file("ex", "elev.tif", package = "terra")) rcl <- cbind(c(0, 300), c(300, 600), 1:2) colnames(rcl) <- c("low", "high", "new_value") rcl y <- terra::classify(x, rcl) plot(y) terra::writeRaster(y, "my_categorical_data.tif", overwrite = TRUE) my_categories <- data.frame( values = 1:2, region = c("low elevation", "high elevation"), otherlabel = c("A", "B") ) foreign::write.dbf(my_categories, file = "my_categorical_data.tif.vat.dbf") 4.14.5 Data Types Commonly used raster datatype include: “unsigned integer”, “signed integer”, and “floating point” of variable precision. INT1U: integers from 0 to 255 INT2U: integers from 0 to 65,534 INT2S: integers from -32,767 to 32,767 INT4S: integers from -2,147,483,647 to 2,147,483,647 FLT4S: floating point from -3.4e+38 to 3.4e+38 FLT8S: floating point from -1.7e+308 to 1.7e+308 It is wise to manually specify an output datatype that will “just fit” the required precision. For example, if you have generated a RasterLayer that warrants integer precision and ranges from 0 to 100, then the INT1U data type would provide enough precision to store all possible values and the NODATA value. Raster data stored as integers will always be smaller (sometimes 10-100x) than those stored as floating point, especially when internal compression is enabled. # integer grid with a range of 0-100 raster::writeRaster(x, filename = 'r.tif', datatype = 'INT1U') # floating point grid with very wide range terra::writeRaster(x, filename = 'r.tif', datatype = 'FLT4S') 4.14.5.1 Notes on Compression It is often a good idea to create internally-compressed raster data. The GeoTiff format can accommodate many different compression algorithms, including lossy (JPEG) compression. Usually, the default “LZW” or “DEFLATE” compression will result in significant savings, especially for data encoded as integers. For example, the CONUS gSSURGO map unit key grid at 30m resolution is about 55Gb (GeoTiff, no compression) vs. 2.4Gb after LZW compression. # reasonable compression using LZW is the default, compare to raster::writeRaster(x, filename='r.tif', options=c("COMPRESS=NONE")) # takes longer to write the file, but better compression terra::writeRaster(x, filename='r.tif', gdal=c("COMPRESS=DEFLATE", "PREDICTOR=2", "ZLEVEL=9") See this article for some ideas on optimization of file read/write times and associated compressed file sizes. 4.15 Exercise 3: Creating a Slope Map In this exercise you will create a continuous and categorical slope gradient maps from a digital elevation model. Use the sample Tahoe-area LiDAR elevation dataset from the gdalUtilities package or your own dataset as input. If you use your own data, you may want to make a smaller extent with [terra::crop()] tahoe <- terra::rast(system.file(\"extdata\", \"tahoe_lidar_bareearth.tif\", package = \"gdalUtilities\")) Run terra::terrain() to create a slope map with unit=\"radians\" Convert radians to percent slope (divide by 2*pi, multiply by 100) Make a plot of the continuous percent slope. You can use terra::plot() for static or terra::plet() for interactive map. Use terra::classify() to create a categorical map of slope classes. Use the following breaks and assign the integer values 1 through 5 from lowest to highest. 0 to 3% 3 to 15% 15 to 30% 30 to 60% >60% Use levels() to set the categories of your raster. Write the raster data to a GeoTIFF file with terra::writeRaster() Write the raster attribute table to a .vat.dbf file with foreign::write.dbf() 4.16 Spatial Overlay Operations Spatial data are lot more useful when “related” (overlay, intersect, spatial query, etc.) to generate something new. The CRS of the two objects being overlaid must match. 4.16.1 Working with Vector and Raster Data Typically, spatial queries of raster data by geometry features (point, line, polygon) are performed in two ways: For each geometry, collect all pixels that overlap (exactextractr approach) For each geometry, collect a sample of pixels defined by sampling points The first method ensures that all data are included in the analysis, however, processing can be slow for multiple/detailed rasters, and the results may not fit into memory. The second method is more efficient (10-100x faster), requires less memory, and can remain statistically sound–as long as a reasonable sampling strategy is applied. Sampling may also help you avoid low-acreage “anomalies” in the raster product. More on sampling methods in the next chapter. The extract() function can perform several operations in one call, such as buffering (in projected units) with buffer argument. See the manual page for an extensive listing of optional arguments and what they do. Sampling and extraction with terra the results in a SpatVector object. Sampling and extraction with raster methods results in a matrix object. # sampling single layer SpatRaster terra::spatSample(maat, size = 10) ## MAAT ## 1 9.397423 ## 2 -1.126910 ## 3 NA ## 4 9.886487 ## 5 15.875959 ## 6 NA ## 7 18.440052 ## 8 NA ## 9 NA ## 10 NA # sampling SpatRaster terra::spatSample(rs, size = 10) ## MAAT MAP FFD GDD rain_fraction effective_precipitation ## 1 NA -1.700e+308 -1.70e+308 -1.700e+308 -1.7e+308 -1.700000e+308 ## 2 11.635321 1.320e+02 1.61e+02 2.008e+03 9.6e+01 -5.705471e+02 ## 3 16.726570 2.810e+02 3.12e+02 2.707e+03 1.0e+02 -6.213870e+02 ## 4 16.538191 8.410e+02 3.13e+02 2.635e+03 9.9e+01 -4.493016e+01 ## 5 7.654097 1.109e+03 1.06e+02 1.278e+03 7.8e+01 5.588147e+02 ## 6 11.174964 2.330e+02 1.59e+02 1.907e+03 9.4e+01 -4.623396e+02 ## 7 16.199104 2.600e+02 2.63e+02 2.719e+03 9.8e+01 -5.985933e+02 ## 8 16.639013 2.920e+02 3.11e+02 2.691e+03 1.0e+02 -6.162298e+02 ## 9 NA -1.700e+308 -1.70e+308 -1.700e+308 -1.7e+308 -1.700000e+308 ## 10 17.618853 5.770e+02 3.22e+02 2.891e+03 9.9e+01 -3.374104e+02 par(mfcol = c(1, 2), mar = c(1, 1, 3, 1)) # regular sampling + extraction of raster values x.regular <- terra::spatSample( maat, method = "regular", size = 100, as.points = TRUE ) x.regular ## class : SpatVector ## geometry : points ## dimensions : 112, 1 (geometries, attributes) ## extent : -123, -118.4083, 34.64167, 40.6 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat NAD83 (EPSG:4269) ## names : MAAT ## type : <num> ## values : NA ## 16.4 ## 10.89 # see also raster::sampleRegular() plot(maat, axes = FALSE, legend = FALSE, main = 'Regular Sampling') points(x.regular) # random sample + extraction of raster values # note that NULL values are removed x.random <- terra::spatSample( maat, size = 100, as.points = TRUE, na.rm = TRUE ) # see also raster::sampleRandom() plot(maat, axes = FALSE, legend = FALSE, main = 'Random Sampling with NA Removal') points(x.random) Note that the mean can be efficiently estimated, even with a relatively small number of samples. # all values: slow for large grids mean(terra::values(maat), na.rm = TRUE) # regular sampling: efficient, central tendency comparable to above mean(x.regular$MAAT, na.rm = TRUE) # this value will be pseudorandom # depends on number of samples, pattern of NA mean(x.random$MAAT, na.rm = TRUE) Just how much variation can we expect when collecting 100, randomly-located samples over such a large area? # 10 replications of samples of n=100 z <- replicate(10, { mean(terra::spatSample(maat, size = 100, na.rm = TRUE)$MAAT, na.rm = TRUE) }) # 90% of the time the mean MAAT values were within: quantile(z, probs = c(0.05, 0.95)) Do the above routine 100 times: compute the mean MAAT from 100 randomly-located samples. Does it make a difference in your estimates? # MLRA polygons in native coordinate system plot(sf::st_geometry(mlra), main = 'MLRA 15 and 18') box() # MAAT raster plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)') # plot MAAT raster with MLRA polygons on top # this requires transforming to CRS of MAAT mlra.gcs <- sf::st_transform(mlra, sf::st_crs(maat)) plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)') plot(sf::st_geometry(mlra.gcs), main = 'MLRA 15 and 18', add = TRUE) 4.17 Exercise 4: Extracting Raster Data 4.17.1 Raster Summary By Point: NASIS Pedon Locations Extract PRISM data at the coordinates associated with NASIS pedons that have been correlated to the Loafercreek series. We will use the sample dataset loafercreek from the soilDB package to get NASIS data. This example can be easily adapted to your own pedon data extracted from NASIS using fetchNASIS(), but if your points are not in California, you will need to supply your own raster data. Get some NASIS data and upgrade the “site” data to a sf object. data("loafercreek", package="soilDB") # result is a SoilProfileCollection object pedons <- loafercreek ## alternately, use fetchNASIS() # pedons <- fetchNASIS() # extract site data s <- sf::st_as_sf(aqp::site(pedons), coords = c("longstddecimaldegrees", "latstddecimaldegrees"), crs = 4326, na.fail = FALSE) Extract PRISM data (the SpatRaster object we made earlier) at the Loafercreek pedon locations and summarize. # convert sf object s to terra SpatVector # and project to CRS of the raster s2 <- project(terra::vect(s), rs) # pass to terra::extract() e <- terra::extract(rs, s2, df = TRUE) # summarize: remove first (ID) column using [, -1] j index summary(e[, -1]) ## MAAT MAP FFD GDD rain_fraction effective_precipitation ## Min. :13.15 Min. : 432.0 Min. :189.0 Min. :2085 Min. :96.00 Min. :-433.14 ## 1st Qu.:15.59 1st Qu.: 576.0 1st Qu.:261.2 1st Qu.:2479 1st Qu.:99.00 1st Qu.:-263.46 ## Median :15.99 Median : 682.5 Median :285.0 Median :2540 Median :99.00 Median :-152.00 ## Mean :15.82 Mean : 680.4 Mean :281.0 Mean :2515 Mean :98.81 Mean :-146.05 ## 3rd Qu.:16.24 3rd Qu.: 771.0 3rd Qu.:307.8 3rd Qu.:2592 3rd Qu.:99.00 3rd Qu.: -36.87 ## Max. :16.58 Max. :1049.0 Max. :330.0 Max. :2654 Max. :99.00 Max. : 201.61 Join the extracted PRISM data with the original SoilProfileCollection object. # combine site data (sf) with extracted raster values (data.frame), row-order is identical, result is sf res <- cbind(s, e) # extract unique IDs and PRISM data # dplyr verbs work with sf data.frames res2 <- dplyr::select(res, upedonid, MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation) # join with original SoilProfileCollection object via pedon_key site(pedons) <- res2 The extracted values are now part of the “pedons” SoilProfileCollection object via site(<SoilProfileCollection>) <- data.frame LEFT JOIN method. Let’s summarize the data we extracted using quantiles. # define some custom functions for calculating range observed in site data my_low_function <- function(x) quantile(x, probs = 0.05, na.rm = TRUE) my_rv_function <- function(x) median(x, na.rm = TRUE) my_high_function <- function(x) quantile(x, probs = 0.95, na.rm = TRUE) site(pedons) |> dplyr::select(upedonid, MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation) |> dplyr::summarize(dplyr::across( MAAT:effective_precipitation, list(low = my_low_function, rv = my_rv_function, high = my_high_function) )) ## MAAT_low MAAT_rv MAAT_high MAP_low MAP_rv MAP_high FFD_low FFD_rv FFD_high GDD_low GDD_rv GDD_high rain_fraction_low rain_fraction_rv ## 1 14.33665 15.98908 16.51595 479.5 682.5 904 220 285 320 2274.75 2540.5 2638.75 97.25 99 ## rain_fraction_high effective_precipitation_low effective_precipitation_rv effective_precipitation_high ## 1 99 -369.3428 -151.9985 94.25339 4.17.2 Raster Summary By Polygon: Series Extent The seriesExtent() function from the soilDB package provides a simple interface to Series Extent Explorer data files. Note that these series extents have been generalized for rapid display at regional to continental scales. A more precise representation of “series extent” can be generated from SSURGO polygons and queried from SDA. Get an approximate extent for the Loafercreek soil series from SEE. See the seriesExtent tutorial and manual page for additional options and related functions. # get (generalized) amador soil series extent from SoilWeb x <- soilDB::seriesExtent(s = 'loafercreek') # convert to EPSG:5070 Albers Equal Area x <- sf::st_transform(x, 5070) Generate 100 sampling points within the extent using a hexagonal grid. These point locations will be used to extract raster values from our SpatRaster of PRISM data. Note that using a “hexagonal” grid is not supported on geographic coordinates. samples <- sf::st_sample(x, size = 100, type = 'hexagonal') For comparison, extract a single point from each SSURGO map unit delineation that contains Loafercreek as a major component. This will require a query to SDA for the set of matching map unit keys (mukey), followed by a second request to SDA for the geometry. The SDA_query function is used to send arbitrary queries written in SQL to SDA, the results may be a data.frame or list, depending on the complexity of the query. The fetchSDA_spatial function returns map unit geometry as either polygons, polygon envelopes, or a single point within each polygon as selected by mukey or nationalmusym. # result is a data.frame mukeys <- soilDB::SDA_query("SELECT DISTINCT mukey FROM component WHERE compname = 'Loafercreek' AND majcompflag = 'Yes';") # result is a sf data.frame loafercreek.pts <- soilDB::fetchSDA_spatial( mukeys$mukey, by.col = 'mukey', method = 'point', chunk.size = 35 ) Graphically check both methods: # prepare samples and mapunit points for viewing on PRISM data hexagonal <- sf::st_transform(samples, sf::st_crs(maat)) x_gcs <- sf::st_transform(x, sf::st_crs(maat)) maatcrop <- terra::crop(maat, x_gcs) # adjust margins and setup plot device for two columns par(mar = c(1, 1, 3, 1), mfcol = c(1, 2)) # first figure plot(maatcrop, main = 'PRISM MAAT\\n100 Sampling Points from Extent', axes = FALSE) plot(sf::st_geometry(x_gcs), add = TRUE) plot(hexagonal, cex = 0.25, add = T) plot(maatcrop, main = 'PRISM MAAT\\n"Loafercreek" Polygon Centroids', axes = FALSE) plot(loafercreek.pts, cex = 0.25, add = TRUE) Extract PRISM data (the SpatRaster object we made earlier) at the sampling locations (100 regularly-spaced and from MU polygon centroids) and summarize. Note that CRS transformations are automatic (when possible), with a warning. # return the result as a data.frame object e <- terra::extract(rs, terra::vect(hexagonal), df = TRUE) e.pts <- terra::extract(rs, terra::vect(loafercreek.pts), df = TRUE) # check out the extracted data summary(e[,-1]) ## MAAT MAP FFD GDD rain_fraction effective_precipitation ## Min. :13.48 Min. : 338.0 Min. :201.0 Min. :2147 Min. :96.0 Min. :-553.46 ## 1st Qu.:15.72 1st Qu.: 514.0 1st Qu.:271.0 1st Qu.:2495 1st Qu.:99.0 1st Qu.:-341.91 ## Median :16.16 Median : 620.5 Median :300.5 Median :2566 Median :99.0 Median :-206.74 ## Mean :15.98 Mean : 646.8 Mean :288.7 Mean :2542 Mean :98.8 Mean :-187.58 ## 3rd Qu.:16.46 3rd Qu.: 763.8 3rd Qu.:313.8 3rd Qu.:2625 3rd Qu.:99.0 3rd Qu.: -45.42 ## Max. :16.95 Max. :1212.0 Max. :335.0 Max. :2729 Max. :99.0 Max. : 354.69 # all pair-wise correlations knitr::kable(cor(e[,-1]), digits = 2) MAAT MAP FFD GDD rain_fraction effective_precipitation MAAT 1.00 -0.60 0.96 0.99 0.83 -0.70 MAP -0.60 1.00 -0.56 -0.65 -0.34 0.99 FFD 0.96 -0.56 1.00 0.94 0.72 -0.66 GDD 0.99 -0.65 0.94 1.00 0.80 -0.75 rain_fraction 0.83 -0.34 0.72 0.80 1.00 -0.43 effective_precipitation -0.70 0.99 -0.66 -0.75 -0.43 1.00 Quickly compare the two sets of samples. # compile results into a list maat.comparison <- list('regular samples' = e$MAAT, 'polygon centroids' = e.pts$MAAT) # number of samples per method lapply(maat.comparison, length) ## $`regular samples` ## [1] 98 ## ## $`polygon centroids` ## [1] 2336 # summary() applied by group lapply(maat.comparison, summary) ## $`regular samples` ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 13.48 15.72 16.16 15.98 16.46 16.95 ## ## $`polygon centroids` ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 12.70 15.82 16.19 16.02 16.44 17.41 # box-whisker plot par(mar = c(4.5, 8, 3, 1), mfcol = c(1, 1)) boxplot( maat.comparison, horizontal = TRUE, las = 1, xlab = 'MAAT (deg C)', varwidth = TRUE, boxwex = 0.5, main = 'MAAT Comparison' ) Basic climate summaries from a standardized source (e.g. PRISM) might be a useful addition to an OSD, or checking the ranges reported in mapunits. 4.17.3 Raster Summary By Polygon: MLRA The following example is a simplified version of what is available in the soilReports package, reports on the ncss-tech GitHub repository. Efficient summary of large raster data sources can be accomplished using: internally-compressed raster data sources, stored on a local disk, can be in any coordinate system polygons stored in an equal-area or UTM coordinate system, with CRS units of meters fixed-density sampling of polygons estimation of quantiles from collected raster samples Back to our example data. The first step is to check the MLRA polygons (mlra); how many features per MLRA symbol? Note that some MLRA have more than one polygon. table(mlra$MLRARSYM) Convert polygon area from square meters to acres and summarize. Note that this will only make sense when using a projected CRS with units of meters (equal area)! poly.area <- terra::expanse(terra::vect(mlra)) / 4046.86 sf::sf_use_s2(TRUE) poly.area.s2 <- units::set_units(x = sf::st_area(mlra), value = "acre") sf::sf_use_s2(FALSE) poly.area.sf <- units::set_units(x = sf::st_area(mlra), value = "acre") summary(poly.area) sum(poly.area) sum(poly.area.s2) sum(poly.area.sf) Sample each polygon at a constant sampling density of 0.001 samples per acre (1 sample for every 1,000 ac.). At this sampling density we should expect approximately 16,700 samples–more than enough for our simple example. library(sharpshootR) # the next function requires a polygon ID: # each polygon gets a unique number 1--number of polygons mlra$pID <- 1:nrow(mlra) cds <- constantDensitySampling(mlra, n.pts.per.ac = 0.001) Extract MLRA symbol at sample points using the sf::st_intersection() function. The result will be a sf object with attributes from our MLRA polygons which intersect the sampling points (cds). # spatial overlay: sampling points and MLRA polygons res <- sf::st_intersection(sf::st_transform(sf::st_as_sf(cds), sf::st_crs(mlra)), mlra) # row / feature order is preserved, so we can directly copy cds$mlra <- res$MLRARSYM # tabulate number of samples per MLRA table(cds$mlra) ## ## 15 18 ## 11658 5204 Extract values from the SpatVector of PRISM data as a data.frame. e <- terra::extract(rs, terra::project(cds, terra::crs(rs))) # join columns from extracted values and sampling points s.df <- cbind(as(cds, 'data.frame'), e) # check results head(s.df) ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME pID mlra ID MAAT MAP FFD ## 1 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 15.19286 1149 306 ## 2 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 2 15.33926 1049 307 ## 3 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 3 15.42254 1041 313 ## 4 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 4 15.44636 1087 308 ## 5 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 5 15.39205 1116 316 ## 6 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 6 15.43280 1058 313 ## GDD rain_fraction effective_precipitation ## 1 2303 99 385.6023 ## 2 2369 99 252.4252 ## 3 2381 99 242.8284 ## 4 2382 99 283.1933 ## 5 2349 99 314.3419 ## 6 2387 99 258.3234 Summarizing multivariate data by group (MLRA) is usually much simpler after reshaping data from “wide” to “long” format. # reshape from wide to long format m <- tidyr::pivot_longer(s.df, cols = c(MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation)) # check "wide" format head(m) ## # A tibble: 6 × 10 ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME pID mlra ID name value ## <chr> <int> <chr> <chr> <chr> <int> <chr> <dbl> <chr> <dbl> ## 1 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 MAAT 15.2 ## 2 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 MAP 1149 ## 3 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 FFD 306 ## 4 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 GDD 2303 ## 5 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 rain_f… 99 ## 6 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 1 effect… 386. A tabular summary of means by MLRA and PRISM variable using dplyr v.s. base tapply(). # tabular summary of mean values dplyr::group_by(m, mlra, name) %>% dplyr::summarize(mean(value)) %>% dplyr::arrange(name) ## # A tibble: 12 × 3 ## # Groups: mlra [2] ## mlra name `mean(value)` ## <chr> <chr> <dbl> ## 1 15 FFD NA ## 2 18 FFD 273. ## 3 15 GDD NA ## 4 18 GDD 2497. ## 5 15 MAAT NA ## 6 18 MAAT 15.7 ## 7 15 MAP NA ## 8 18 MAP 631. ## 9 15 effective_precipitation NA ## 10 18 effective_precipitation -194. ## 11 15 rain_fraction NA ## 12 18 rain_fraction 97.2 # base R tapply(m$value, list(m$mlra, m$name), mean, na.rm = TRUE) ## effective_precipitation FFD GDD MAAT MAP rain_fraction ## 15 -195.9819 284.5447 2385.213 15.24708 588.6219 98.61088 ## 18 -193.5583 273.2077 2496.876 15.66580 630.9076 97.23251 4.17.4 Example: Faster with exactextractr This example shows how to determine the distribution of Frost-Free Days across a soil series extent. The data are extracted from the raster data source very rapidly using the exactextractr package. library(sf) library(soilDB) library(terra) library(lattice) library(exactextractr) # 5-10 seconds to download Series Extent Explorer data series <- c('holland', 'san joaquin') # make SpatialPolygonsDataFrame s <- do.call('rbind', lapply(series, seriesExtent)) # load pointer to PRISM data r <- rast('C:/workspace2/chapter-4/FFD.tif') # transform extent to CRS of raster with sf s <- st_transform(st_as_sf(s), crs = st_crs(r)) # inspect s # use `st_union(s)` to create a MULTI- POINT/LINE/POLYGON from single # use `sf::st_cast(s, 'POLYGON')` to create other types system.time({ ex <- exactextractr::exact_extract(r, s) }) # ex is a list(), with data.frame [value, coverage_fraction] # for each polygon in s (we have one MULTIPOLYGON per series) # combine all list elements `ex` into single data.frame `ex.all` # - use do.call('rbind', ...) to stack data.frames row-wise # - an anonymous function that iterates along length of `ex` # - adding the series name to as a new variable, calculated using `i` ex.all <- do.call('rbind', lapply(seq_along(ex), function(i) { cbind(data.frame(group = series[i]), ex[[i]]) })) # simple summary densityplot(~ value | group, data = ex.all, plot.points = FALSE, bw = 2, lwd = 2, strip = strip.custom(bg = grey(0.85)), scales = list(alternating = 1), col = c('RoyalBlue'), layout = c(1, 2), ylab = 'Density', from = 0, to = 400, xlab = 'Frost-Free Days (50% chance)\\n800m PRISM Data (1981-2010)', main = 'FFD Estimate for Extent of San Joaquin and Holland Series' ) 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics Lattice graphics are useful for summarizing grouped comparisons. The syntax is difficult to learn and remember, but there is a lot of documentation online. library(lattice) tps <- list( box.rectangle = list(col = 'black'), box.umbrella = list(col = 'black', lty = 1), box.dot = list(cex = 0.75), plot.symbol = list( col = rgb(0.1, 0.1, 0.1, alpha = 0.25, maxColorValue = 1), cex = 0.25 ) ) bwplot(mlra ~ value | name, data = m, # setup plot and data source as.table=TRUE, # start panels in top/left corner varwidth=TRUE, # scale width of box by number of obs scales=list(alternating=3, relation='free'), # setup scales strip=strip.custom(bg=grey(0.9)), # styling for strips par.settings=tps, # apply box/line/point styling panel=function(...) { # within in panel, do the following panel.grid(-1, -1) # make grid lines at all tick marks panel.bwplot(...) # make box-whisker plot } ) 4.17.5.0.1 Interactive Summaries Static figures are a good start, but sometimes an interactive summary is more appropriate for EDA. The histboxp function from the Hmisc package creates interactive (HTML) chunks that can be used in RStudio, or embedded in RMarkdown documents (e.g. these notes or soilReports). Use the mouse to hover over, click, drag, etc. to interact with the data. Double-click to reset the plot. library(Hmisc) # interactive exploration of the MAAT distributions by MLRA histboxp( x = s.df$MAAT, group = s.df$mlra, bins = 100, xlab = 'Mean Annual Air Temperature (deg C)' ) # interactive exploration of the Effective PPT distributions by MLRA histboxp( x = s.df$eff.PPT, group = s.df$mlra, bins = 100, xlab = 'Annual Sum of Monthly PPT - PET (mm)' ) –> 4.18 Additional Reading (Spatial) Ahmed, Zia. 2020. Geospatial Data Science with R. Gimond, M., 2019. Intro to GIS and Spatial Analysis https://mgimond.github.io/Spatial/ Hijmans, R.J. 2019. Spatial Data Science with R. https://rspatial.org/ Lovelace, R., J. Nowosad, and J. Muenchow, 2019. Geocomputation with R. CRC Press. https://bookdown.org/robinlovelace/geocompr/ Pebesma, E., and R.S. Bivand. 2005. Classes and methods for spatial data: The sp package. https://cran.r-project.org/web/packages/sp/vignettes/intro_sp.pdf. Pebesma, E. and R. Bivand, 2019. Spatial Data Science. https://keen-swartz-3146c4.netlify.com/ Applied Spatial Data Analysis with R "],["sampling.html", "Chapter 5 Sampling 5.1 Introduction 5.2 Sampling Strategies 5.3 Evaluating a Sampling Strategy 5.4 Additional Reading (Sampling)", " Chapter 5 Sampling 5.1 Introduction Sampling is a fundamental part of statistics. Samples are collected to achieve an understanding of a population because it is typically not feasible to observe all members of the population. The goal is to collect samples that provide an accurate representation of the population. Constraints on time and money dictate that the sampling effort must be efficient. More samples are needed to characterize the nature of highly variable populations than less variable populations. Define your purpose: What are you investigating? Examples include soil properties, soil classes, and plant productivity. How many samples are needed? The question of how many samples are required is complex. As per usual, the answer is ‘it depends’. For example, it depends on the type of analysis (e.g. non-spatial vs spatial) and properties of the data (e.g. continuous vs categorical). In all cases it requires an understanding/assumptions of the underlying population. If a scientist can estimate the several population variables, formulas exist to estimate the required number of samples. The following are a list of methods for estimating sample size: Standard error Confidence interval Power analysis (hypothesis testing) Distance/time Prediction error Rules of thumb NSSH 627.8 The first 3 methods use formulas for their corresponding statistics to solve for the sample size, each results in progressively higher sample size requirements. The PracTools R package (Valliant and Dever 2022) offers several functions for the 1st and 2nd methods. The pwr (Champely 2020) and WebPower (Zhang and Mai 2021) R packages offer several functions for the 3rd method, based on a variety of statistical models. Gelman, Hill, and Vehtari (2020) provides a nice graphical illustration of the variables involved with these methods. 5.1.1 DSM classes A variation of the 2nd method is described by Congalton and Green (2019) for use with categorical data, which is applicable to digital soil mapping. nMultinomial <- function(k = NULL, p = 0.5, error = 0.1, alpha = 0.05) { # k = number of classes # p = proportion of the largest class # error = margin of error # alpha = confidence level probability ceiling(qchisq(1 - alpha / k, 1) * p * (1 - p) / error^2) } nMultinomial(k = c(10, 20, 30)) ## [1] 197 229 248 nMultinomial(k = 10, error = c(0.05, 0.1, 0.2)) ## [1] 788 197 50 nMultinomial(k = 10, alpha = c(0.05, 0.1, 0.2)) ## [1] 197 166 136 5.1.2 Rules of thumb Some rules of thumb for regression models are as follows: Use > 10 observations (n) per predictor (m) (Kutner et al. (2005)). Use > 20 n per m and n > 104 + m to test regression coefficients (Rossiter 2017; Franklin and Miller 2009). Never use n < 5*m (Rossiter 2017). 5.1.3 NSSH 627.8 Documentation requirement for the following data elements are specified in the section 627.8 of the National Soil Survey Handbook (NSSH). # NSSH 627.8 Documentation # soil series data.frame( level = "soil series", n = c(5, 10), acres = c(2000, 20000) ) ## level n acres ## 1 soil series 5 2000 ## 2 soil series 10 20000 # components data.frame( level = "components", n = 1, acres = 3000 ) ## level n acres ## 1 components 1 3000 # map units data.frame( level = "map unit", n = cumsum(c(30, rep(10, 3))), acres = c(2000, seq(from = 4000, by = 4000, length.out = 3)) ) ## level n acres ## 1 map unit 30 2000 ## 2 map unit 40 4000 ## 3 map unit 50 8000 ## 4 map unit 60 12000 5.2 Sampling Strategies library(sf) library(ggplot2) # set the seed for the random number generator set.seed(4) # Create a sixteen square polygon bb <- st_make_grid(st_bbox(c(xmin = 0, xmax = 6, ymin = 0, ymax = 6)), n = 6) grd <- st_as_sf(bb) grd$ID <- 1:length(bb) 5.2.1 Simple Random In simple random sampling, all samples within the region have an equal chance of being selected. A simple random selection of points can be made using either the st_sample() function within the sf R package or the Create Random Points tool in ArcGIS. Advantages Simple Unbiased (equal probability of inclusion) Requires little prior knowledge of the population Howell et al. (2004) - produced a “much more sensitive, more accurate, and greater range of estimated values” than the models from the subjective samples Disadvantages Inefficient (requires large numbers) Lower accuracy Higher cost Samples may not be representative of the feature attribute(s) Uneven spatial distribution (e.g. clustered) # Generate simple random sample test <- st_sample(grd, size = 16, type = "random") ggplot() + geom_sf(data = grd) + geom_sf(data = test) + ggtitle("Simple") 5.2.2 Systematic In systematic sampling, a sample is taken according to a regularized pattern. This approach ensures even spatial coverage. Patterns may be rectilinear, triangular, or hexagonal. This sampling strategy can be inaccurate if the variation in the population doesn’t coincide with the regular pattern (e.g., if the population exhibits periodicity). Advantages Simple Precise estimates Even spatial coverage Greater efficiency Disadvantages Biased estimates (particularly sampling variance) May miss individuals that don’t coincide with the sampling interval If so, the density needs to be increased Limited utility for areas larger than a single field Grid may not optimally fit irregular shapes # Generate systematic random sample test <- st_sample(grd, size = 16, type = "regular") ggplot() + geom_sf(data = grd) + geom_sf(data = test) + ggtitle("Systematic") 5.2.3 Stratified Random In stratified random sampling, the sampling region is spatially subset into different strata, and random sampling is applied to each strata. If prior information is available about the study area, it can be used to develop the strata. Strata may be sampled equally or in proportion to area; however, if the target of interest is rare in the population, it may be preferable to sample the strata equally Franklin and Miller (2009)]. Advantages More efficient than simple-random Higher accuracy Lower cost Sampling can be sized relative to proportion or variance Disadvantages Require pre-existing knowledge of the population (which may be flawed) If sampling is uneven, weights need to be known May need to construct the strata manually grd2 <- st_cast(grd, "MULTIPOLYGON") st_crs(grd2) <- 5070 test <- st_sample(grd2, size = 16, type = "random", by_polygon = TRUE) ggplot() + geom_sf(data = grd2) + geom_sf(data = test) + ggtitle("Stratified") Note that the spsample() function only stratifies the points spatially. Other more sophisticated designs can be implemented using the spsurvey, sharpshootR, or clhs packages. 5.2.4 Multistage Stratified Random In multistage random sampling, the region is separated into different subsets that are randomly selected (i.e., first stage), and then the selected subsets are randomly sampled (i.e., second stage). This is similar to stratified random sampling, except that with stratified random sampling each strata is sampled. Advantages Most efficient Lower cost Sampling can be sized relative to proportion or variance Disadvantages Less precise Uneven spatial distribution (e.g. clustered) Require pre-existing knowledge of the population (which may be flawed) If sampling is uneven, weights need to be known May need to construct the strata manually # Select 8 samples from each square idx <- sample(1:nrow(grd), size = 2, replace = FALSE) grd_sub <- grd[idx, ] test <- sapply(1:2, function(i) { st_coordinates(st_sample(grd_sub[i, ], size = 8, type = "random")) }) test <- st_as_sf(as.data.frame(test), coords = 1:2) ggplot() + geom_sf(data = grd) + geom_sf(data = test) + ggtitle("Two-stage") 5.2.5 Spatial Coverage Sampling (e.g. k-means clustering) # spcosa ---- library(spcosa) grd2 <- st_crs(grd, NA) grd_sp <- as(grd, "Spatial") strata <- stratify(grd_sp, nStrata = 16) pts <- spsample(strata) plot(strata, pts) + ggtitle("Spatial Coverage") 5.2.6 Covariate space coverage sampling (e.g. k-means clustering) Covariate space coverage sampling is a stratified sampling technique to obtain representative samples from feature (attribute) space (Brus 2022). Advantages Maximumly stratifies the predictors Automated sample selection Can incorporates cost constraints Ideal for developing map unit concepts (puts points in central landscape positions) Can incorporate legacy points Easily scales to multiple GIS layers Disadvantages Not ideal for map validation (non – probability sample) Inefficient with large GIS layers library(sf) library(terra) source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R") # import volcano DEM, details at http://geomorphometry.org/content/volcano-maungawhau data("volcano") volcano_r <- rast( volcano[87:1, 61:1], crs = crs("+init=epsg:27200"), extent = c( xmin = 2667405, xmax = 2667405 + 61 * 10, ymin = 6478705, ymax = 6478705 + 87 * 10 ) ) names(volcano_r) <- "elev" # calculate slope from the DEM slope_r <- terrain(volcano_r, v = "slope", unit = "degrees") # Stack Elevation and Slope rs <- c(volcano_r, slope_r) # Covariate Space Coverage Sampling source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R") fs <- cscs(rs, vars = c("elev", "slope"), n = 20) fs_sf <- st_as_sf(fs, coords = c("x", "y"), crs = crs(rs)) # Plot CSCS Samples plot(volcano_r, axes=FALSE) points(fs_sf) 5.2.7 Conditioned Latin Hypercube (cLHS) Conditioned Latin hypercube sampling is a stratified random sampling technique to obtain representative samples from feature (attribute) space (Minasny and McBratney 2006). Advantages Maximumly stratifies the predictors Automated sample selection Incorporates cost constraints Can incorporate legacy points Easily scales to multiple GIS layers Disadvantages Not ideal for map validation (non – probability sample) Not ideal for developing map unit concepts (puts points in weird landscape positions) Difficult to find alternatives for non-accessible points Inefficient with large GIS layers For example, assume you have prior knowledge of a study area and have the time and resources to collect 120 points. You also know the following variables (strata), which are represented as coregistered raster datasets, to be of importance to the soil property or class being investigated: Normalized Difference Vegetation Index (NDVI), Topographic Wetness Index (a.k.a. Wetness Index, compound topographic index), Solar insolation (potential incoming solar radiation), and Relative elevation (a.k.a. relative position, normalized slope height). The cLHS procedure iteratively selects samples from the strata variables such that they replicate the range of values from each stratum. Without a technique such as cLHS, obtaining a sample that is representative of the feature space becomes increasingly difficult as the number of variables (strata) increases. To perform cLHS using R, you can use the clhs package (Roudier 2011). rs2 <- raster::stack(rs) library(clhs) # generate cLHS design cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE) # Plot cLHS Samples par(mar=c(1,1,1,4)) plot(volcano_r, axes=FALSE) points(cs$sampled_data) # Summary of clhs object summary(cs$sampled_data)$data ## elev slope ## Min. : 95.0 Min. : 0.000 ## 1st Qu.:108.8 1st Qu.: 6.701 ## Median :124.5 Median :12.979 ## Mean :130.5 Mean :14.420 ## 3rd Qu.:150.2 3rd Qu.:20.459 ## Max. :184.0 Max. :33.197 ## NA's :1 # Summary of raster objects cbind(summary(volcano_r), summary(slope_r)[1:6]) ## elev ## "Min. : 94.0 " "Min. : 0.000 " ## "1st Qu.:108.0 " "1st Qu.: 7.054 " ## "Median :124.0 " "Median :14.103 " ## "Mean :130.2 " "Mean :14.897 " ## "3rd Qu.:150.0 " "3rd Qu.:21.666 " ## "Max. :195.0 " "Max. :43.032 " Although the above example works well on our small volcano dataset, the clhs package is inefficient if you are working with large raster datasets. To overcome this limitation, you can first take a large random sample and then subsample it using cLHS. sub_s <- spatSample(rs, size = 200, as.points = TRUE) |> st_as_sf() # random sample function from the raster package s <- clhs(sub_s, size = 20, progress = FALSE, simple = FALSE) 5.3 Evaluating a Sampling Strategy To gauge the representativeness of a sampling strategy, you can compare the results it produces to the results for other variables you think might coincide with the soil properties or classes of interest (Hengl 2009). Examples include slope gradient, slope aspect, and vegetative cover. These other variables may be used to stratify the sampling design or to assess the representativeness of our existing samples (e.g., NASIS pedons). The simple example below demonstrates how to compare several sampling strategies by evaluating how well they replicate the distribution of elevation. # set seed set.seed(1234) # create a polygon from the spatial extent of the volcano dataset test <- st_make_grid(ext(volcano_r), n = 1) # take a large random sample sr400 <- spatSample(rs, size = 1000, method = "random", as.points = TRUE) # take a small random sample sr <- spatSample(rs, size = 20, method = "random", as.points = TRUE) # take a small systematic random sample sys <- spatSample(rs, size = 20, method = "regular", as.points = TRUE) # take a cLHS sample cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE) # take a CSCS sample fs <- cscs(rs, vars = c("elev", "slope"), n = 20) # Combind and Extract Samples s <- rbind( data.frame(method = "Simple Random 400", as.data.frame(sr400)), data.frame(method = "Simple Random", as.data.frame(sr)), data.frame(method = "Systematic Random", as.data.frame(sys)), data.frame(method = "cLHS", slot(cs$sampled_data, 'data')), data.frame(method = "CSCS", fs[c("elev", "slope")]) ) # Summarize the sample values aggregate(slope ~ method, data = s, function(x) round(summary(x))) ## method slope.Min. slope.1st Qu. slope.Median slope.Mean slope.3rd Qu. slope.Max. ## 1 cLHS 3 8 15 16 21 32 ## 2 CSCS 1 7 15 16 24 36 ## 3 Simple Random 0 14 17 18 22 34 ## 4 Simple Random 400 0 6 14 15 22 43 ## 5 Systematic Random 1 8 11 14 20 32 # Plot overlapping density plots to compare the distributions between the large and small samples ggplot(s, aes(x = slope, col = method)) + geom_density(cex = 2) # plot the spatial locations par(mfrow = c(2, 2), mar = c(1,2,4,5)) plot(volcano_r, main = "Simple random", cex.main = 2, axes=FALSE) points(sr, pch = 3, cex = 1.2) plot(volcano_r, main = "Systematic random", cex.main = 2, axes=FALSE) points(sys, pch = 3, cex = 1.2) plot(volcano_r, main = "cLHS", cex.main = 2, axes=FALSE) points(cs$sampled_data, pch = 3, cex = 1.2) plot(volcano_r, main = "CSCS", cex.main = 2, axes=FALSE) points(fs_sf, pch = 3, cex = 1.2) The overlapping density plots above illustrate the differences between large and small sets of samples using several sampling designs. The cLHS approach best duplicates the distribution of elevation (because elevation is explicitly used in the stratification process). The contrast is less severe in the summary metrics, but again cLHS more closely resembles the larger sample. Other comparisons are possible using the approaches in the following chapters. 5.3.1 Exercise: Design a Sampling Strategy Load the “tahoe_lidar_highesthit.tif” dataset in the gdalUtilities package (tahoe <- terra::rast(system.file(\"extdata\", \"tahoe_lidar_bareearth.tif\", package = \"gdalUtilities\"))) or use your own data set. Compare two or more sampling approaches and evaluate how representative they are. Show your work and submit the results to your mentor. 5.4 Additional Reading (Sampling) Brungard, C., & Johanson, J. (2015). The gate’s locked! I can’t get to the exact sampling spot … can I sample nearby? Pedometron(37), 8-9. http://www.pedometrics.org/Pedometron/Pedometron37.pdf Brus, D.J. and J.J. de Gruijter. “Random sampling or geostatistical modelling? Choosing between design-based and model-based sampling strategies for soil (with discussion).” Geoderma. Vol. 80. 1. Elsevier, 1997. 1-44. https://www.sciencedirect.com/science/article/pii/S0016706197000724 Brus, Dick J. Spatial Sampling with R. First edition, CRC Press, 2022, https://github.com/DickBrus/SpatialSamplingwithR. de Gruijter, J., D.J. Brus, M.F.P. Bierkens, and M. Knotters. 2006. Sampling for natural resource monitoring: Springer. http://www.springer.com/us/book/9783540224860. Viscarra Rossel, R.A., et al. “Baseline estimates of soil organic carbon by proximal sensing: Comparing design-based, model-assisted and model-based inference.” Geoderma 265 (2016): 152-163. https://www.sciencedirect.com/science/article/pii/S0016706115301312 References Brus, Dick J. 2022. Spatial Sampling with R. 1st ed. Boca Raton: Chapman; Hall/CRC. https://doi.org/10.1201/9781003258940. Champely, Stephane. 2020. “Pwr: Basic Functions for Power Analysis.” https://CRAN.R-project.org/package=pwr. Congalton, Russell G., and Kass Green. 2019. “Thematic Map Accuracy Assessment Considerations.” In Assessing the Accuracy of Remotely Sensed Data, 3rd ed., 77–106. CRC Press. https://doi.org/10.1201/9780429052729-6. Franklin, Janet, and Jennifer A Miller. 2009. Mapping Species Distributions: Spatial Inference and Prediction. Cambridge; New York: Cambridge University Press. https://doi.org/10.1017/CBO9780511810602. Gelman, Andrew, Jennifer Hill, and Aki Vehtari. 2020. “16 - Design and Sample Size Decisions.” In Regression and Other Stories, 1st ed., 291–312. Cambridge University Press. https://doi.org/10.1017/9781139161879. Hengl, Tomislav. 2009. A Practical Guide to Geostatistical Mapping. 2nd extended ed. Amsterdam: Hengl. http://spatial-analyst.net/book/. Kutner, Michael H., Christopher J. Nachtsheism, John Neter, and William Li. 2005. Applied Linear Statistical Models. 5th ed. The McGraw-Hill/Irwin Series Operations and Decision Sciences. Boston: McGraw-Hill Irwin. Minasny, Budiman, and Alex B. McBratney. 2006. “A Conditioned Latin Hypercube Method for Sampling in the Presence of Ancillary Information.” Computers & Geosciences 32 (9): 1378–88. https://doi.org/10.1016/j.cageo.2005.12.009. Rossiter, D. G. 2017. “Sampling for Natural Resources and Environmental Modelling and Monitoring.” Enschede, Netherlands: University of Twente. http://www.css.cornell.edu/faculty/dgr2/teach/index.html. Roudier, Pierre. 2011. Clhs: A r Package for Conditioned Latin Hypercube Sampling. https://cran.r-project.org/web/packages/clhs/. Valliant, Richard, and Jill A. Dever. 2022. “PracTools: Tools for Designing and Weighting Survey Samples.” https://CRAN.R-project.org/package=PracTools. Zhang, Zhiyong, and Yujiao Mai. 2021. “WebPower: Basic and Advanced Statistical Power Analysis.” https://CRAN.R-project.org/package=WebPower. "],["references.html", "References", " References Arnold, R. W., and L. P. Wilding. 1991. “The Need to Quantify Spatial Variability.” In SSSA Special Publications, edited by M. J. Mausbach and L. P. Wilding, 1–8. Madison, WI, USA: Soil Science Society of America. https://doi.org/10.2136/sssaspecpub28.c1. Boyd, Claude E., Craig S. Tucker, and Rawee Viriyatum. 2011. “Interpretation of pH, Acidity, and Alkalinity in Aquaculture and Fisheries.” North American Journal of Aquaculture 73 (4): 403–8. https://doi.org/10.1080/15222055.2011.620861. Brevik, Eric C., Jeffrey A. Homburg, Bradley A. Miller, Thomas E. Fenton, James A. Doolittle, and Samuel J. Indorante. 2016. “Selected Highlights in American Soil Science History from the 1980s to the Mid-2010s.” CATENA 146 (November): 128–46. https://doi.org/10.1016/j.catena.2016.06.021. Brus, Dick J. 2022. Spatial Sampling with R. 1st ed. Boca Raton: Chapman; Hall/CRC. https://doi.org/10.1201/9781003258940. Champely, Stephane. 2020. “Pwr: Basic Functions for Power Analysis.” https://CRAN.R-project.org/package=pwr. Chaney, Nathaniel W., Eric F. Wood, Alexander B. McBratney, Jonathan W. Hempel, Travis W. Nauman, Colby W. Brungard, and Nathan P. Odgers. 2016. “POLARIS: A 30-Meter Probabilistic Soil Series Map of the Contiguous United States.” Geoderma 274: 54–67. https://doi.org/10.1016/j.geoderma.2016.03.025. Congalton, Russell G., and Kass Green. 2019. “Thematic Map Accuracy Assessment Considerations.” In Assessing the Accuracy of Remotely Sensed Data, 3rd ed., 77–106. CRC Press. https://doi.org/10.1201/9780429052729-6. Franklin, Janet, and Jennifer A Miller. 2009. Mapping Species Distributions: Spatial Inference and Prediction. Cambridge; New York: Cambridge University Press. https://doi.org/10.1017/CBO9780511810602. Gelman, Andrew, Jennifer Hill, and Aki Vehtari. 2020. “16 - Design and Sample Size Decisions.” In Regression and Other Stories, 1st ed., 291–312. Cambridge University Press. https://doi.org/10.1017/9781139161879. Hengl, Tomislav. 2009. A Practical Guide to Geostatistical Mapping. 2nd extended ed. Amsterdam: Hengl. http://spatial-analyst.net/book/. Hennemann, G R, and D G Rossiter. 2004. “Training Needs for the Next Generation of Soil Surveyors.” In International Conference on Innovative Techniques in Soil Survey, Cha’am, Thailand, 21-26 March 2004, 22–26. Cha-Am, Thailand: Land Development Department. http://www.css.cornell.edu/faculty/dgr2/Docs/ChaAm/ChaAmKeynoteHennemann.pdf. Ihaka, Ross, and Robert Gentleman. 1996. “R: A Language for Data Analysis and Graphics.” Journal of Computational and Graphical Statistics 5 (3): 299–314. https://doi.org/10.1080/10618600.1996.10474713. Kempen, Bas, Dick J. Brus, Jetse J. Stoorvogel, Gerard B. M. Heuvelink, and Folkert de Vries. 2012. “Efficiency Comparison of Conventional and Digital Soil Mapping for Updating Soil Maps.” Soil Science Society of America Journal 76 (6): 2097–2115. https://doi.org/https://doi.org/10.2136/sssaj2011.0424. Kutner, Michael H., Christopher J. Nachtsheism, John Neter, and William Li. 2005. Applied Linear Statistical Models. 5th ed. The McGraw-Hill/Irwin Series Operations and Decision Sciences. Boston: McGraw-Hill Irwin. MacMillan, Robert A., David E. Moon, and Ray A. Coupé. 2007. “Automated Predictive Ecological Mapping in a Forest Region of b.c., Canada, 2001–2005.” Geoderma 140 (4): 353–73. https://doi.org/10.1016/j.geoderma.2007.04.027. Mausbach, M. J. 2003. “The Importance of Statistical Documentation - Keeping Soil Survey Information Relevant in the 21st Century.” In 2003 National Cooperative Soil Survey Conference, 3–6. Plymouth, Massachusetts: National Cooperative Soil Survey. https://web.archive.org/web/20220121020421/https://www.nrcs.usda.gov/Internet/FSE_DOCUMENTS/nrcs142p2_051833.pdf. Maynard, Jonathan J., Travis W. Nauman, Shawn W. Salley, Brandon T. Bestelmeyer, Michael C. Duniway, Curtis J. Talbot, and Joel R. Brown. 2019. “Digital Mapping of Ecological Land Units Using a Nationally Scalable Modeling Framework.” Soil Science Society of America Journal 83 (3): 666–66. https://doi.org/10.2136/sssaj2018.09.0346. Minasny, Budiman, and Alex B. McBratney. 2006. “A Conditioned Latin Hypercube Method for Sampling in the Presence of Ancillary Information.” Computers & Geosciences 32 (9): 1378–88. https://doi.org/10.1016/j.cageo.2005.12.009. Ramcharan, Amanda, Tomislav Hengl, Travis Nauman, Colby Brungard, Sharon Waltman, Skye Wills, and James Thompson. 2018. “Soil Property and Class Maps of the Conterminous United States at 100-Meter Spatial Resolution.” Soil Science Society of America Journal 82 (1): 186–201. https://doi.org/https://doi.org/10.2136/sssaj2017.04.0122. Rossiter, D. G. 2017. “Sampling for Natural Resources and Environmental Modelling and Monitoring.” Enschede, Netherlands: University of Twente. http://www.css.cornell.edu/faculty/dgr2/teach/index.html. Roudier, Pierre. 2011. Clhs: A r Package for Conditioned Latin Hypercube Sampling. https://cran.r-project.org/web/packages/clhs/. Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co. https://archive.org/details/exploratorydataa0000tuke_7616. Valliant, Richard, and Jill A. Dever. 2022. “PracTools: Tools for Designing and Weighting Survey Samples.” https://CRAN.R-project.org/package=PracTools. Webster, R. 2001. “Statistics to Support Soil Research and Their Presentation.” European Journal of Soil Science 52 (2): 331–40. https://doi.org/10.1046/j.1365-2389.2001.00383.x. Zhang, Zhiyong, and Yujiao Mai. 2021. “WebPower: Basic and Advanced Statistical Power Analysis.” https://CRAN.R-project.org/package=WebPower. "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "Statistics for Soil Survey - Part 1 Pre-course Assignment 0.1 Create Workspace 0.2 Configure RStudio 0.3 Essentials 0.4 Personalization 0.5 Install Required Packages 0.6 Dealing With Errors 0.7 Packages not on CRAN 0.8 Connect Local NASIS 0.9 Proof 0.10 Additional Soil Data and R References", " Statistics for Soil Survey - Part 1 Soil Survey Staff 2025-01-17 Pre-course Assignment 0.1 Create Workspace Make a local folder C:\\workspace2 to use as a working directory for this course. Use all lower case letters please. 0.2 Configure RStudio Open RStudio, and edit the “Global Options” (Main menu: Tools → Global Options). 0.3 Essentials These options are important for pleasant, reproducible and efficient use of the RStudio environment: Change the default working directory to C:\\workspace2 (R General Tab) Uncheck “Restore .Rdata into workspace at startup” (R General Tab) VERY IMPORTANT Figure 1: Example of RStudio General settings. RStudio detects the available R installations on your computer. Individual versions are certified for the Software Center as they become available, and sometimes there is a more recent version available for download. It is worth taking the time before installing packages to get the latest version of R available to you. This is to minimize compatibility issues which arise over time. 0.4 Personalization Figure 2: Example of RStudio Code/Editing settings. Optional: Check “Soft-wrap R source files” (Code/Editing Tab) Optional: Show help tooltips, control auto-completion and diagnostics (Code/Completion and Diagnostics Tabs) Optional: Update code font size, colors and theme (Appearance) Optional: Use RStudio Projects (top-right corner) to manage working directories 0.5 Install Required Packages Packages can be installed by name from the Comprehensive R Archive Network (CRAN) using the base R function install.packages(). There are a lot of packages out there–many more than you will download here, and many of which are useful for Soil Survey work. The first time you install packages, R may ask you if you want to create a local package library. You need to do this because we cannot write to system folders as non-administrator users on CCE machines. The default location for R package library on Windows is: C:\\Users\\<User.Name>\\AppData\\Local\\R\\win-library\\<X.X> where <User.Name> is the current Windows user name and <X.X> is the version of R packages are being installed for. If you have an existing R package library (for same minor version of R), you can copy that library into the AppData\\Local\\R folder as needed. For example, to download and install the remotes package from CRAN: install.packages("remotes") To install the R packages used in this class copy all of the code from the box below and paste into the R console window. Paste after the command prompt (>) and press enter. Downloading and configuring the packages will take a while if you are installing or upgrading all of the packages in the list below. On particularly slow network connections, i.e. over VPN or USDA network in general, it may be necessary to increase the “timeout” option to ensure the downloads have sufficient time to complete. # increase default timeout from 1 minute to 5 minutes (for current session only) options(timeout = 300) ## character vector of package names packages <- c( # soil "aqp", "soilDB", "sharpshootR", "soiltexture", # gis "raster", "sp", "sf", "terra", "gdalUtilities", "rgrass", "RSAGA", "exactextractr", "fasterize", # data management "dplyr", "tidyr", "devtools", "roxygen2", "Hmisc", "circular", "DT", "remotes", # databases "DBI", "odbc", "RSQLite", # graphics "ggplot2", "latticeExtra", "maps", "spData", "tmap", "kableExtra", "corrplot", "farver", "mapview", "ggmap", "plotrix", "rpart.plot", "visreg", "diagram", "GGally", "wesanderson", "viridisLite", "prettymapr", # modeling "car", "rms", "randomForest", "ranger", "party", "caret", "vegan", "ape", "shape", "modEvA", "gower", "MBESS", "yardstick", # sampling "clhs", "spcosa" ) # ipkCRAN: a helper fuction for installing required packages from CRAN source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/ipkCRAN.R") ## - p: vector of package names ## - up: logical - upgrade installed packages? Default: TRUE ## up = TRUE to download all packages ## up = FALSE to download only packages you don't already have installed ipkCRAN(p = packages, up = TRUE) The ipkCRAN function will let you know if any of the above packages fail to install. Whenever you run some code always check the console output for warnings and errors before continuing. It may be easiest to send commands individually to learn about and inspect their output, rather than running the entire file and wondering where an error occurred. 0.6 Dealing With Errors If a lot of output is produced by a command you should scroll up and sift through it as best you can. Copy and paste parts of the error message to use in internet searches, and try to find cases where folks have encountered problems. 0.6.1 No output is produced after pasting into console If you do not have a new command prompt (>) and a blinking cursor on the left hand side of your console, but instead see a + after you run a command, R may think you are still in the middle of submitting input to the “read-eval-print-loop” (REPL). If this is not expected you are possibly missing closing quotes, braces, brackets or parentheses. R needs to know you were done with your expression, so you may need to supply some input to get the command to be complete. Pasting code line-by-line is useful but prone to input errors with multi-line expressions. Alternately, you can run commands or an entire file using the GUI or keyboard shortcuts such as Ctrl+Enter. You have a chance to try this in the example at the end. 0.6.2 ‘SOMEPACKAGE’ is not available (for R version X.Y.Z) This means either: A package named ‘SOMEPACKAGE’ exists but it is not available for your version of R CRAN does not have a package with that name You can try again, but first check for spelling and case-sensitivity. When in doubt search the package name on Google or CRAN to make sure you have it right. Note that not all R packages are available on CRAN: there are many other ways that you can deliver packages (including GitHub described below). 0.7 Packages not on CRAN Some R packages rely on compiled code. Windows users are limited to installing “binary” versions of such packages from CRAN unless they have “Rtools” installed. The Rtools software is available from the Software Center, and is specific to the version of R you have. One way to get the latest binary builds of R packages that use compiled code is by using https://r-universe.dev. This website provides custom repositories that can be used in addition to the defaults in install.packages() For example, you can install raster-related “rspatial” packages from r-universe.dev. This may not be “required” but it is good to know how to specify an alternate package repository source using the repos= argument. Check with your mentor to see if there are known issues with current CRAN packages. install.packages(c('terra', 'raster'), repos='https://rspatial.r-universe.dev') To install the latest version of packages from the Algorithms for Quantitative Pedology (AQP) suite off GitHub we use the remotes package. The AQP packages are updated much more frequently on GitHub than they are on CRAN. Generally, the CRAN versions (installed above) are the “stable” releases whereas the GitHub repositories have new features and bug fixes. remotes::install_github("ncss-tech/aqp", dependencies=FALSE, upgrade=FALSE, build=FALSE) remotes::install_github("ncss-tech/soilDB", dependencies=FALSE, upgrade=FALSE, build=FALSE) remotes::install_github("ncss-tech/sharpshootR", dependencies=FALSE, upgrade=FALSE, build=FALSE) remotes::install_github("ncss-tech/soilReports", dependencies=FALSE, upgrade=FALSE, build=FALSE) 0.8 Connect Local NASIS Establish an ODBC connection to NASIS by following the directions at the following hyperlink (ODBC Connection to NASIS). Once you’ve successfully established a ODBC connection, prove it by loading your NASIS selected set with the site and pedon tables for any pedons from your local area. You only need a few pedons at a minimum for this demo – too many (say, >20) will make the example profile plot cluttered. Paste the below code at the command prompt (>) and press enter, as you did above. Or create a new R script (Main menu: File → New File → R Script) and paste code into the “Source” pane (script editor window). Then, click the Run button in the top-right corner of the Script Editor or use Ctrl+Enter to run code at the cursor location / any selected code. This will execute the code in the Console. Submit the resulting plot to your mentor (from “Plot” pane (bottom-right): Export → Save as PDF…) # load packages into the current session library(aqp) # provides "SoilProfileCollection" object & more library(soilDB) # provides database access methods # get pedons from NASIS selected set test <- fetchNASIS(from = 'pedons') # inspect the result str(test, max.level = 2) # make a profile plot # set margins smaller than default par(mar=c(1,1,1,1)) # make profile plot of selected set, with userpedonid as label plot(test, label='pedon_id') 0.9 Proof Follow the one line example below, copy the output, and submit the results to your mentor. This will help us to verify that all of the required packages have been installed. # dump list of packages that are loaded into the current session sessionInfo() 0.10 Additional Soil Data and R References 0.10.1 Soil Data Videos Paul Finnel’s NASIS webinar Stats for Soil Survey Webinar Soil Data Aggregation using R Webinar 0.10.2 R Books and Manuals R-Intro R for Beginners Spatial Data Analysis and Modeling with R (highly recommended) Geographic Data Science with R book The R Inferno AQP Website and Tutorials "],["intro.html", "Chapter 1 Introduction to R 1.1 Outline 1.2 Course Overview 1.3 What is R? 1.4 RStudio: An Integrated Development Environment (IDE) for R 1.5 R basics 1.6 Managing Packages 1.7 Getting Help 1.8 Documenting your work 1.9 Organizing your work 1.10 Saving your work 1.11 Exercise 1: R packages and Functions 1.12 Loading Data 1.13 Data manipulation 1.14 Exercise 2: Data Manipulation 1.15 Review 1.16 Additional Reading (Introduction)", " Chapter 1 Introduction to R 1.1 Outline Course Overview Review Course Objectives Why is this training needed? Why is course organized this way? What is R? Why should I use R? What can R do? How do I get started? RStudio interface What are packages? How to navigate the Help tab How to save files Manipulating data Loading & viewing data Filtering, transforming, merging, aggregating and reshaping data Exporting data 1.2 Course Overview 1.2.1 Course Objectives Develop solutions to investigate soil survey correlation problems and update activities. Evaluate investigations for interpretive results and determine how to proceed. Summarize data for population in NASIS. Analyze spatial data to investigate soil-landscape relationships Help to pursue the question “why” 1.2.2 Why is this training needed? Long standing goal of the Soil Science Division to have a course in statistics (Mausbach 2003) Opportunities to learn these techniques are limited, especially at the undergraduate level (Hennemann and Rossiter 2004) Consistent methodology (data analysis, data population, sampling design, etc.) There is continually a greater need to use these techniques: Mapping of lands at high production rates ((MacMillan, Moon, and Coupé 2007); (Kempen et al. 2012); (Brevik et al. 2016)) Ecological Sites (Maynard et al. 2019) Soil survey refinement (disaggregation) ((Chaney et al. 2016);(Ramcharan et al. 2018)) 1.2.3 Why is course organized this way? The web content is a long-term investment and serves as a reference Our best judgment for assembling into 24 hours what could be 6 University level courses Mixture of slides and script-enabled web pages is “new” for NRCS Feel free to provide feedback for improving the class for future offerings. 1.3 What is R? R is a free, open-source software and programming language developed in 1995 at the University of Auckland as an environment for statistical computing and graphics (Ihaka and Gentleman 1996). Since then R has become one of the dominant software environments for data analysis and is used by a variety of scientific disiplines, including soil science, ecology, and geoinformatics (Envirometrics CRAN Task View; Spatial CRAN Task View). R is particularly popular for its graphical capabilities, but it is also prized for it’s GIS capabilities which make it relatively easy to generate raster-based models. More recently, R has also gained several packages designed specifically for analyzing soil data. A software environment: statistics graphics programming calculator GIS A language to explore, summarize, and model data functions = verbs objects = nouns 1.3.1 Why Should I Learn R? While the vast majority of people use Microsoft Excel for data analysis, R offers numerous advantages, such as: Cost. R is free! (“Free as in free speech, not free beer.”) Reproducible Research (self-documenting, repeatable) repeatable: code + output in a single document (‘I want the right answer, not a quick answer’ - Paul Finnell) easier the next time (humorous example) numerous Excel horror stories of scientific studies gone wrong exist (TED Talk) scalable: applicable to small or large problems R in a Community Numerous Discipline Specific R Groups Numerous Local R User Groups (including R-Ladies Groups) Stack Overflow Learning Resources (quantity and quality) R books (Free Online) R Books “If we don’t accept these challenges, others who are less qualified will; and soil scientists will be displaced by apathy.” (Arnold and Wilding 1991) While some people find the use of a command line environment daunting, it is becoming a necessary skill for scientists as the volume and variety of data has grown. Thus scripting or programming has become a third language for many scientists, in addition to their native language and discipline specific terminology. Other popular programming languages include: SQL (i.e. NASIS), Python (i.e. ArcGIS), and JavaScript. ODBC and GDAL link R to nearly all possible formats/interfaces 1.3.2 What can R do? 1.3.3 Packages Base R (functionality is extended through packages) basic summaries of quantitative or qualitative data data exploration via graphics GIS data processing and analysis Soil Science R Packages aqp - visualization, aggregation, classification soilDB - access to commonly used soil databases soilReports - handful of report templates soiltexture - textural triangles Ecology R packages vegan - ordination, diversity analysis, etc. dismo - species distribution modeling 1.3.3.1 Soil Science Applications 1.3.3.1.1 Create Maps 1.3.3.1.2 Draw Soil Profiles 1.3.3.1.3 Draw Depth Plots 1.3.3.1.4 Estimate the Range in Characteristics (RIC) variable genhz pct10 median pct90 clay A 13 16 22 clay BAt 16 19 25 clay Bt1 18 24 32 clay Bt2 22 30 44 clay Cr 15 15 15 phfield A 6 6 7 phfield BAt 5 6 6 phfield Bt1 5 6 7 1.4 RStudio: An Integrated Development Environment (IDE) for R RStudio is an integrated development environment (IDE) that allows you to interact with R more readily. RStudio is similar to the standard RGui, but is considerably more user friendly. It has more drop-down menus, windows with multiple tabs, and many customization options. The first time you open RStudio, you will see three windows. A forth window is hidden by default, but can be opened by clicking the File drop-down menu, then New File, and then R Script. Detailed information on using RStudio can be found at at RStudio’s Website. RStudio Windows / Tabs Location Description Console Window lower-left location were commands are entered and the output is printed Source Tabs upper-left built-in text editor Environment Tab upper-right interactive list of loaded R objects History Tab upper-right list of key strokes entered into the Console Files Tab lower-right file explorer to navigate C drive folders Plots Tab lower-right output location for plots Packages Tab lower-right list of installed packages Help Tab lower-right output location for help commands and help search window Viewer Tab lower-right advanced tab for local web content 1.5 R basics R is command-line driven. It requires you to type or copy-and-paste commands after a command prompt (>) that appears when you open R. This is called the “Read-Eval-Print-Loop” or REPL. After typing a command in the R console and pressing Enter on your keyboard, the command will run. If your command is not complete, R issues a continuation prompt (signified by a plus sign: +). R is case sensitive. Make sure your spelling and capitalization are correct. Commands in R are also called functions. The basic format of a function in R is: object <- function.name(argument_1 = data, argument_2 = TRUE). The up arrow (^) on your keyboard can be used to bring up previous commands that you’ve typed in the R console. Comments in R code need to start with the # symbol (a.k.a. hash-tag, comment, pound, or number symbol). R ignores the remainder of the script line following #. # Math 1 + 1 10 * 10 log10(100) # combine values c(1, 2, 3) # Create sequence of values 1:10 # Implicit looping 1:10 * 5 1:10 * 1:10 # Assignment and data types ## numeric clay <- c(10, 12, 15, 26, 30) ## character subgroup <- c("typic haplocryepts","andic haplocryepts","typic dystrocryepts") ## logical andic <- c(FALSE, TRUE ,FALSE) # Print print(clay) subgroup 1.6 Managing Packages Packages are collections of additional functions that can be loaded on demand. They commonly include example data that can be used to demonstrate those functions. Although R comes with many common statistical functions and models, most of our work requires additional packages. 1.6.1 Installing Packages To use a package, you must first install it and then load it. These steps can be done at the command line or using the Packages Tab. Examples of both approaches are provided below. R packages only need to be installed once (until R is upgraded or re-installed). Every time you start a new R session, however, you need to load every package that you intend to use in that session. Within the Packages tab you will see a list of all the packages currently installed on your computer, and 2 buttons labeled either “Install” or “Update”. To install a new package simply select the Install button. You can enter install one or more than one packages at a time by simply separating them with a comma. To find out what packages are installed on your computer, use the following commands: library() # or installed.packages() One useful package for soil scientists is the soiltexture package. It allows you to plot soil textural triangles. The following command shows how to install this package if you do not currently have it downloaded: # CRAN (static version) install.packages(c("soiltexture")) # GitHub (development version) remotes::install_github("julienmoeys/soiltexture/pkg/soiltexture", dependencies = FALSE, upgrade = FALSE, build = FALSE) 1.6.2 Loading Packages Once a package is installed, it must be loaded into the R session to be used. This can be done by using library(). The package name does not need to be quoted. library(soilDB) You can also load packages using the Packages Tab, by checking the box next to the package name. For example, documentation for the soilDB package is available from the help() function. help(package = "soilDB") 1.7 Getting Help R has extensive documentation, numerous mailing lists, and countless books (many of which are free and listed at end of each chapter for this course). To learn more about the function you are using and the options and arguments available, learn to help yourself by taking advantage of some of the following help functions in RStudio: Use the Help tab in the lower-right Window to search commands (such as hist) or topics (such as histogram). Type help(read.csv) or ?read.csv in the Console window to bring up a help page. Results will appear in the Help tab in the lower right-hand window. Certain functions may require quotations, such as help(\"+\"). # Help file for a function help(read.csv) # or ?read.csv # Help files for a package help(package = "soiltexture") 1.8 Documenting your work RStudio’s Source Tabs serve as a built-in text editor. Prior to executing R functions at the Console, commands are typically written down (or scripted). Scripting is essentially showing your work. The sequence of functions necessary to complete a task are scripted in order to document or automate a task. While scripting may seems cumbersome at first, it ultimately saves time in the long run, particularly for repetitive tasks (humorous YouTube Video on Scripting). Benefits include: allows others to reproduce your work, which is the foundation of science serves as instruction/reminder on how to perform a task allows rapid iteration, which saves time and allows the evaluation of incremental changes reduces the chance of human error 1.8.1 Basic Tips for Scripting To write a script, simply open a new R script file by clicking File>New File>R Script. Within the text editor type out a sequence of functions. Place each function (e.g. read.csv()) on a separate line. If a function has a long list of arguments, place each argument on a separate line. A command can be excuted from the text editor by placing the cursor on a line and typing Crtl + Enter, or by clicking the Run button. An entire R script file can be excuted by clicking the Source button. 1.8.2 Comments It is a good idea to include comments in your code, so that in the future both yourself and others can understand what you were doing. Each line with a comment starts with #. In RStudio, you can use # comments to create an “outline” for your source documents. Multiple # signs increase the depth of the hierarchy. Ending a comment line with four hyphens (----) indicates that text should be included in the outline. The source file outline using comments in regular .R source files is analogous to the Markdown syntax used in R Markdown and Quarto for headers. For example, the following code block creates two outline sections, each with a nested subsection. To show the outline view, click the “outline” button in the top-right hand corner of the source window. Paste it in a fresh R document to try it out. # one ---- print("Section 1") ## one two ---- # this is an ordinary comment (does not show in outline) print("Subsection 1.2") # two ---- print("Section 2") ## two one ---- print("Subsection 2.1) 1.9 Organizing your work When you first begin a project you should create a new folder and place within it all the data and code associated with the project. This simplifies the process of accessing your files from R. Using a project folder is also a good habit because it makes it easier to pickup where you left off and find your data if you need to come back to it later. Within R, your project folder is also known as your working directory. This directory will be the default location your plots and other R output are saved. You want to have inputs for your code in the working directory so that you can refer to them using relative file paths. Relative file paths make it easier if you move the folder containing your script(s) around. Or, if you share it with someone else, they will have little issue getting your code to work on their own file system. 1.9.1 Setting the Working Directory Before you begin working in R, you should set your working directory to your project folder; for example, setwd(\"C:\\\\workspace2\\\\projectx...\"). You can use RStudio to manage your projects and folders. NOTE: Beware when specifying any file paths that R uses forward slashes / instead of back slashes \\. Back slashes are reserved for use as an escape character, so you must use two of them to get one in result character string. To change the working directory in RStudio, select main menu Session >> Set Working Directory >> …. Or, from the “Files” tab click More >> Set As Working Directory to use the current location of the “Files” tab as your working directory. Setting the working directory can also be done via the Console with the setwd() command: setwd("C:/workspace2") To check the file path of the current working directory (which should now be \"C:\\\\workspace2\"), type: getwd() 1.9.2 RStudio Projects (.Rproj files) You can also manage your working directory using RStudio Projects. An RStudio Project file (.Rproj) is analogous to, for example, a .mxd file for ArcMap. It contains information about the specific settings you may have set for a “project”. You open or create projects using the drop down menu in the top right-hand corner of the RStudio window (shown below) RStudio Project Menu Here is what a typical Project drop-down menu looks like: RStudio Project Menu (expanded) You can create new projects from existing or new directories with “New Project…”. When you click “Open Project…”, your working directory is automatically set to the .Rproj file’s location – this is extremely handy Any projects you have created/used recently will show up in the “Project List” 1.10 Saving your work In R, you can save several types of files to keep track of the work you do. The file types include: workspace, script, history, and graphics. It is important to save often because R, like any other software, may crash periodically. Such problems are especially likely when working with large files. You can save your workspace in R via the command line or the File menu. 1.10.0.1 R script (.R) An R script is simply a text file of R commands that you’ve typed. You may want to save your scripts (whether they were written in R Editor or another program such as Notepad) so that you can reference them in the future, edit them as needed, and keep track of what you’ve done. To save R scripts in RStudio, simply click the save button from your R script tab. Save scripts with the .R extension. R assumes that script files are saved with only that extension. If you are using another text editor, you won’t need to worry about saving your scripts in R. You can open text files in the RStudio text editor, but beware copying and pasting from Word files as discussed below. To open an R script, click the file icon. 1.10.0.2 Microsoft Word Files Using Microsoft Word to write or save R scripts is generally a bad idea. Certain keyboard characters, such as quotations ““, are not stored the same in Word (e.g. they are”left” and “right” handed). The difference is hard to distinguish, but will not run in R. Also, pasting your R code or output into Wword documents manually is not reproducible, so while it may work in a pinch, it ultimately costs you time. You can use the word_document Rmarkdown template to automatically “Knit” .docx files from R code using a template, which is very handy for quickly getting a nice looking document! 1.10.0.3 R Markdown (.Rmd) R Markdown (.Rmd) documents contain information for the reproducible combination of narrative text and code to produce elegantly formatted output. You can use multiple languages in .Rmd documents including R, Python, and SQL. You can easily “knit” visually appealing and high-quality documents into rich HTML, PDF or Word documents from the RStudio interface. This document is made in bookdown, a variant of rmarkdown used for book templates involving multiple chapters. You can make blogs and websites for your R packages with blogdown and pkgdown. These are all tools based off of the powerful “pandoc” engine and the tools in the R Markdown ecosystem. 1.10.0.4 R history (.Rhistory) An R history file is a copy of all your key strokes. You can think of it as brute force way of saving your work. It can be useful if you didn’t document all your steps in an R script file. Like an R file, an Rhistory file is simply a text file that lists all of the commands that you’ve executed. It does not keep a record of the results. To load or save your R history from the History Tab click the Open File or Save button. If you load an Rhistory file, your previous commands will again become available with the up-arrow and down-arrow keys. You can also use the command line to load or save your history. savehistory(file = "sand.Rhistory") loadhistory(file = "sand.Rhistory") history(max.show=Inf) #displays all previous commands 1.10.0.5 R Graphics Graphic outputs can be saved in various formats. Format Function pdf pdf(“graphic.pdf”) window metafile win.metafile(“graphic.wmf”) png png(“graph.png”) jpeg jpeg(“graph.jpg”) bmp bmp(“graph.bmp”) postscript postscript(“graph.ps”) To save a graphic: (1) Click the Plots Tab window, (2) click the Export button, (3) Choose your desired format, (3) Modify the export settings as you desire, and (4) click Save. The R command for saving a graphic is: png(file = "npk_yield.png") plot(npk$yield) dev.off() The first line of this command creates a blank file named sand with a JPEG extension. The second line plots the data object that you want to create a graphic of (here it is conveniently the same name as the JPEG file we are creating). The third line closes the graphics device. 1.11 Exercise 1: R packages and Functions Using the examples discussed thus far as a guide, demonstrate your mastery of the material by performing the following tasks. Create an R script file, demonstrate 3 basic R functions, and comment (#) your code. Install the FedData R package from CRAN and GitHub. Save the commands in your R script file. Load the FedData R package and read the help file for the get_ssurgo function within the FedData package. What is the 1st input/argument? Save the R command in your R script. Save your R script, and forward to your instructor. 1.12 Loading Data R can load a variety of data formats, however tabular data is by far the most common, and what we will spend of the majority of our time working with. Typically tabular data is stored in spreadsheets (e.g. .txt, .csv, .xlsx), databases (e.g. NASIS), or webpages (.html). Within R tabular data is stored as a data.frame. 1.12.0.1 Text files Text files are a preferable format for storing and transferring small datasets. One basic command for importing text files into R is read.csv(). The command is followed by the file name or URL and then some optional instructions for how to read the file. These files can either be imported into R by clicking the Import Dataset >> From Text buttons from the Environment tab, or by typing the following command into the R console: # from working directory sand <- read.csv("C:/workspace2/sand_example.csv") # from URL sand <- read.csv("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/data/sand_example.csv") 1.12.0.2 Excel files R can import Excel files, but generally speaking it is a bad idea to use Excel. Excel has a dangerous default which automatically converts data with common notations to their standard format without warning or notice. For example, the character “11-JUN” entered into a cell automatically becomes the date 6/11/2021, even though the data is still displayed as 11-JUN. The only way to avoid this default behavior is to manually import your data into Excel via the Data Tab>Get External Data Ribbon, and manually set the data type of all your columns to text. Failure to do so has resulted in numerous retracted research articles (Washington Post Article). Warnings aside, Excel files are a very common and are a format most people are familiar with. Therefore we will illustrate how to bring them into R. Download the sand Excel dataset from GitHub at https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/Pre-course/R_sand/sand_example.xlsx Excel datasets can either be imported into R by clicking the Import Dataset >> From Excel buttons from the Environment tab, or by typing the following command into the R console: library(readxl) sand_example <- read_excel("sand_example.xlsx") 1.12.0.3 NASIS (Web) Reports NASIS provides a plethora of reports, many of which can be read into R for analysis. The soilDB R package provides a series of functions to read data from NASIS either using a local database connection or via HTML web reports. Similar functions also exist for accessing tabular data from Soil Data Access. More details on soilDB will be provided in the next chapter, but now we’ll illustrate how to access some example datasets for manipulating tabular data. library(soilDB) # get projects prj <- get_project_from_NASISWebReport(mlrassoarea = "NE-IND", fiscalyear = 2020) l# get legends leg <- get_legend_from_NASISWebReport(mlraoffice = "Indi%", areasymbol = "%") # get map units mu <- get_mapunit_from_NASISWebReport(areasymbol = c("IN001", "IN11%")) 1.13 Data manipulation Before we can do any sort of analysis, our data often needs to be manipulated one way or another. Estimates vary, but an analyst typically spend 80% of their time manipulating data, and only 20% actually analyzing or modeling. Tasks generally involve filtering, transforming, merging, aggregating, and reshaping data. R has many functions and packages for manipulating data frames, but within the past several years a family of packages, known as the tidyverse, have been developed to simplify interacting with data frames (or tibbles). Within the tidyverse the most commonly used packages are dplyr and tidyr. Many of the tidyverse function names are patterned after SQL syntax. We will review the most common functions you need to know in order to accomplish the majority of data manipulation tasks. 1.13.1 Viewing and Removing Data Once a file is imported, it is imperative that you check to ensure that R correctly imported your data. Make sure numerical data are correctly imported as numerical, that your column headings are preserved, etc. To view the data simply click on the mu dataset listed in the Environment tab. This will open up a separate window that displays a spreadsheet like view. Additionally you can use the following functions to view your data in R. Function Description print() prints the entire object (avoid with large tables) head() prints the first 6 lines of your data str() shows the data structure of an R object names() lists the column names (i.e., headers) of your data ls() lists all the R objects in your workspace directory dput() print code to re-create an R object Try entering the following commands to view the mu dataset in R: str(mu) names(mu) head(mu) ls() dput(mu[1, ]) A data object is anything you’ve created or imported and assigned a name to in R. The Environment tab allows you to see what data objects are in your R session and expand their structure. Right now sand should be the only data object listed. If you wanted to delete all data objects from your R session, you could click the broom icon from the Environments tab. Otherwise you could type: # Remove all R objects rm(list = ls(all = TRUE)) # Remove individual objects rm(mu, leg, sand) 1.13.2 Filtering or Subsetting Data When analyzing data in NASIS, filtering is typically accomplished by loading your selected set with only the records you’re interested in. However, it is often useful or necessary to subset your data after it’s loaded. This can allow you to isolate interesting records within large datasets. For these reasons R has numerous options/functions for filtering data. Data frames can be filtered by both columns and rows, using either names, position (e.g. column 1, row 5), or logical indices (e.g. TRUE/FALSE). Another particularly useful feature is the use of pattern matching which uses regular expressions to select data, which is similar to the LIKE statement from SQL. **Filtering with names and numerical indices # Filtering with names (character values) mu$areasymbol # select column names using $ mu[, c("areasymbol", "musym")] # select column names using [] mu[c("1", "2"), ] # select row names using [] mu[c("1", "2"), c("areasymbol", "musym")] # select column and row names using [] # Filtering by position (integer values) mu[1, ] # select first row mu[, 1] # select first column mu[2, 2] # select second row and second column mu[c(1, 2, 3), ] # select multiple rows mu[c(-1, -2), ] # drop multiple rows Logical Operators == Equal To (NOTE: R uses a double equal sign) != Not Equal To <, >, <=, >= Less than, greater than, less than or equal to, and greater than or equal & Equivalent to AND must match both conditions | Equivalent to OR must match at least one condition %in% equivalent to IN () in SQL (e.g. mu$areasymbol %in% c(\"IN001\", \"IN111\") grepl() similar to LIKE in SQL (e.g. grepl(\"IN%\", mu$areasymbol)) Filtering with logicals # Standard evaluation with base R [] # Filtering with logicals mu[mu$areasymbol == "IN001", ] # select rows that equal IN001 mu[mu$areasymbol != "IN001", ] # select rows that do not equal IN001 mu[, names(mu) == "areasymbol"] # select columns that equal areasymbol mu[, names(mu) %in% c("areasymbol", "musym")] # select columns that match areasymbol and musym mu[grepl("Miami", mu$muname), ] # select rows that contain Miami # Non-standard evaluation with tidyverse library(dplyr) # Filtering rows filter(mu, areasymbol == "IN001") filter(mu, areasymbol != "IN001") filter(mu, areasymbol %in% c("IN001", "IN111")) filter(mu, grepl("Miami", muname)) filter(mu, muacres > 0) # Select columns select(mu, areasymbol, musym) # Slice rows slice(mu, 1:5) 1.13.3 Transforming Data This allows you to create new columns by convert, compute, or combine data within existing columns. mu <- mutate( mu, # convert to hectares muhectares = muacres * 0.4047, # convert muname to TRUE or FALSE if Miami is present using pattern matching miami = grepl("Miami", muname), # compute % minor component n_minor = n_component - n_majcompflag, # combine columns key = paste(areasymbol, musym) ) 1.13.4 Sorting Data Sorting allows you to rearrange your data. Beware R has several similar functions (e.g. sort and order) for sorting data only work with specific datatypes. The tidyverse function arrange is designed to work with data frames. # sort ascending arrange(mu, areasymbol, muname) # sort descending arrange(mu, desc(areasymbol), desc(muname)) 1.13.5 Piping Data Another particularly useful feature provided by the magrittr package and used in the tidyverse is the use of pipe (%>%). Base R also has a native pipe operator (|>). Using the RStudio keyboard shortcut Ctrl + Shift + M inserts the pipe you have selected as default in Global Options > Code. f(x,y) becomes x %>% f(y) The “pipe” is something that occurs in many programming languages and computing contexts. It allows output from one expression to be passed as input to the first argument of the next function. This allows sequences of commands to be read from right to left b(or top to bottom) rather than from the inside out. # non-piping example 1 mu_sub <- filter(mu, areasymbol == "IN001") mu_sub <- mutate(mu_sub, pct_100less = pct_component < 100) # non-piping example 2 mu_sub <- mutate(filter(mu, areasymbol == "IN001"), pct_100less = pct_component < 100) # piping mu_sub <- mu %>% filter(areasymbol == "IN001") %>% mutate(pct_100less = pct_component < 100) 1.13.6 Merging/Joining or Combining Data Joining When working with tabular data you often have 2 or more tables you need to join. There are several ways to join tables. Which direction to join and which columns to join will determine how you achieve the join. # inner join leg_mu <- inner_join(leg, mu, by = c("liid", "areasymbol")) # left join leg_mu <- left_join(leg, mu, by = c("liid")) # right_join leg_mu <- right_join(leg, mu, by = "liid") Combining If your tables have the same structure (e.g. columns), or length and order you may simply combine them. For example, if you have two different mapunit tables. # combine rows rbind(mu, mu) rbind(mu, leg) # won't work # combine columns cbind(mu, mu) # beware combine tables with duplicate column names cbind(mu, areasymbol_2 = mu$areasymbol) cbind(mu, leg) # won't work 1.13.7 Aggregating or Grouping Data Because soil data has multiple dimensions (e.g. properties and depths) and levels of organization (e.g. many to one relationships), it is often necessary to aggregate it. For example, when we wish to make a map we often need to aggregate over components and then map units. Depending on the data type this aggregation may involve taking a weighted average or selecting the dominant condition. The group_by function defines the groups over which we wish to summarize the data. mu_agg <- mu %>% group_by(grpname, areasymbol) %>% summarize(sum_muacres = sum(muacres), n_musym = length(musym)) 1.13.8 Reshaping Data Typically data is stored in what is known as a wide format, where each column contains a different variable (e.g. depth, clay, sand, rocks). However, sometimes it is necessary to reshape or pivot to a long format, where each variable/column is compressed into 2 new rows. One new column contains the old column names, while another new column contains the values from the old columns. This is particularly useful when combining multiple variables into a single plot. library(tidyr) # Simplify mu example dataset mu2 <- mu %>% select(grpname, areasymbol, musym, muacres, n_component, pct_hydric) %>% slice(1:5) print(mu2) # Pivot long mu2_long <- pivot_longer(mu2, cols = c(muacres, n_component, pct_hydric)) print(mu2_long) # Pivot wide mu2_wide <- pivot_wider(mu2_long, names_from = name) print(mu2_wide) 1.13.9 Exporting Data To export data from R, use the command write.csv() or write.dbf() functions. Since we have already set our working directory, R automatically saves our file into the working directory. write.csv(mu_agg, file = "mu_agg.csv") library(foreign) write.dbf(as.data.frame(mu_agg), file = "mu_agg.dbf") 1.14 Exercise 2: Data Manipulation Create a new R script file. To get information from the NASIS legend table for the state of Wisconsin use the soilDB function get_legend_from_NASISWebReport() for mlraoffice = \"%\" and areasymbol = \"WI%\" Filter the legend table for rows where areaacres is less than 200,000. Inspect the result to find the areasymbol values. Load the mapunit table, using soilDB get_mapunit_from_NASISWebReport() using the area symbols you identified in step 3. Calculate the acreage of hydric soils for each mapunit by multiplying muacres by pct_hydric. Note: pct_hydric is a percentage, not a proportion. Aggregate the total acreage of hydric soils each soil survey area using dplyr functions group_by() and summarize(). Join the aggregated mapunit table from Step 6 to the legend table from Step 3 using dplyr left_join(). Calculate the proportion of the total soil survey area acres (areaacres) that are hydric soils. Answer the following questions: What Wisconsin soil survey areas are less than 200,000 acres? What proportion of those soil survey areas are hydric soils? Bonus: How does your joined result in Step 7 differ if you replace dplyr left_join() with inner_join()? Why? Save your R script and forward to your instructor. 1.15 Review Given what you now know about R, try to answer the following questions: Can you think of a situation where an existing hypothesis or conventional wisdom was not repeatable? What are packages? What is GitHub? Where can you get help? What is a data frame? What are 3 ways you can manipulate a data frame? 1.16 Additional Reading (Introduction) Introductory R Books R for Data Science RStudio Cheatsheets Quick-R Advanced DSM R Books Predictive Soil Mapping with R Using R for Digital Soil Mapping (not free) Soil Spectral Inference with R (not free) GSP SOC Cookbook GSP SAS Manual Soil Science R Applications aqp and soilDB tutorials ISRIC World Soil Information Example Training Courses ISRIC World Soil Information YouTube Channel OpenGeoHub Trainings OpenGeoHub YouTube Channel David Rossiter’s Cornell Homepage Pierre Roudier Soil Sciences and Statistics Review Articles Arkely, R., 1976. Statistical Methods in Soil Classification Research. Advances in Agronomy 28:37-70. https://www.sciencedirect.com/science/article/pii/S0065211308605520 Mausbach, M., and L. Wilding, 1991. Spatial Variability of Soils and Landforms. Soil Science Society of America, Madison. https://dl.sciencesocieties.org/publications/books/tocs/sssaspecialpubl/spatialvariabil Wilding, L., Smeck, N., and G. Hall, 1983. Spatial Variability and Pedology. In : L. Widling, N. Smeck, and G. Hall (Eds). Pedogenesis and Soil Taxonomy I. Conceps and Interactions. Elseiver, Amsterdam, pp. 83-116. https://www.sciencedirect.com/science/article/pii/S0166248108705993 References Arnold, R. W., and L. P. Wilding. 1991. “The Need to Quantify Spatial Variability.” In SSSA Special Publications, edited by M. J. Mausbach and L. P. Wilding, 1–8. Madison, WI, USA: Soil Science Society of America. https://doi.org/10.2136/sssaspecpub28.c1. Brevik, Eric C., Jeffrey A. Homburg, Bradley A. Miller, Thomas E. Fenton, James A. Doolittle, and Samuel J. Indorante. 2016. “Selected Highlights in American Soil Science History from the 1980s to the Mid-2010s.” CATENA 146 (November): 128–46. https://doi.org/10.1016/j.catena.2016.06.021. Chaney, Nathaniel W., Eric F. Wood, Alexander B. McBratney, Jonathan W. Hempel, Travis W. Nauman, Colby W. Brungard, and Nathan P. Odgers. 2016. “POLARIS: A 30-Meter Probabilistic Soil Series Map of the Contiguous United States.” Geoderma 274: 54–67. https://doi.org/10.1016/j.geoderma.2016.03.025. Hennemann, G R, and D G Rossiter. 2004. “Training Needs for the Next Generation of Soil Surveyors.” In International Conference on Innovative Techniques in Soil Survey, Cha’am, Thailand, 21-26 March 2004, 22–26. Cha-Am, Thailand: Land Development Department. http://www.css.cornell.edu/faculty/dgr2/Docs/ChaAm/ChaAmKeynoteHennemann.pdf. Ihaka, Ross, and Robert Gentleman. 1996. “R: A Language for Data Analysis and Graphics.” Journal of Computational and Graphical Statistics 5 (3): 299–314. https://doi.org/10.1080/10618600.1996.10474713. Kempen, Bas, Dick J. Brus, Jetse J. Stoorvogel, Gerard B. M. Heuvelink, and Folkert de Vries. 2012. “Efficiency Comparison of Conventional and Digital Soil Mapping for Updating Soil Maps.” Soil Science Society of America Journal 76 (6): 2097–2115. https://doi.org/https://doi.org/10.2136/sssaj2011.0424. MacMillan, Robert A., David E. Moon, and Ray A. Coupé. 2007. “Automated Predictive Ecological Mapping in a Forest Region of b.c., Canada, 2001–2005.” Geoderma 140 (4): 353–73. https://doi.org/10.1016/j.geoderma.2007.04.027. Mausbach, M. J. 2003. “The Importance of Statistical Documentation - Keeping Soil Survey Information Relevant in the 21st Century.” In 2003 National Cooperative Soil Survey Conference, 3–6. Plymouth, Massachusetts: National Cooperative Soil Survey. https://web.archive.org/web/20220121020421/https://www.nrcs.usda.gov/Internet/FSE_DOCUMENTS/nrcs142p2_051833.pdf. Maynard, Jonathan J., Travis W. Nauman, Shawn W. Salley, Brandon T. Bestelmeyer, Michael C. Duniway, Curtis J. Talbot, and Joel R. Brown. 2019. “Digital Mapping of Ecological Land Units Using a Nationally Scalable Modeling Framework.” Soil Science Society of America Journal 83 (3): 666–66. https://doi.org/10.2136/sssaj2018.09.0346. Ramcharan, Amanda, Tomislav Hengl, Travis Nauman, Colby Brungard, Sharon Waltman, Skye Wills, and James Thompson. 2018. “Soil Property and Class Maps of the Conterminous United States at 100-Meter Spatial Resolution.” Soil Science Society of America Journal 82 (1): 186–201. https://doi.org/https://doi.org/10.2136/sssaj2017.04.0122. "],["data.html", "Chapter 2 The Data We Use 2.1 Objectives (The Data We Use) 2.2 The Structure of Soil Data 2.3 Challenges with Pedon Data 2.4 The SoilProfileCollection 2.5 Exercise 1: Assemble a SoilProfileCollection from several CSV files 2.6 Using the soilDB Package 2.7 Exercise 2: O Horizon Thickness 2.8 fetchNASIS() data checks 2.9 Extended Data Functions 2.10 Exercise 3: Diagnostic Horizons in Your Own Data 2.11 Custom Queries to Local NASIS Database 2.12 Exercise 4: Generalized Horizons with Loafercreek", " Chapter 2 The Data We Use 2.1 Objectives (The Data We Use) Expand on basic R skills from Chapter 1 Inspect and work with different data types Perform operations on data such as filtering and aggregation Begin to explore regular expression (regex) patterns for text data Learn how functions can be used to bundle operations Work with Soil Data Sources and Structures Use the soilDB package to load data into R Understand the SoilProfileCollection (SPC) object Learn about the data checks in the fetchNASIS() function 2.2 The Structure of Soil Data What if you could extract, organize, and visualize data from NASIS and many other commonly used soil database sources with a couple of lines of code? The aqp (Algorithms for Quantitative Pedology) and soilDB packages enable data to be fetched from various sources and cast into a SoilProfileCollection (SPC) object. Tabular and spatial data objects fetched via soilDB and processed using aqp methods can simplify the process of working with commonly used soil data. 2.2.1 Package References Package ‘aqp’ manual Package ‘soilDB’ manual Package ‘sharpshootR’ manual SoilProfileCollection Object Introduction Tutorials on the AQP website We load aqp and soilDB packages using the library() command. # load the libraries library(aqp) library(soilDB) The manual pages for soilDB and aqp are accessible online and from the Help tab in RStudio. 2.2.2 Importance of Pedon Data The importance of pedon data for present and future work cannot be overstated. These data represent decades of on-the-ground observations of the soil resource for a given area. As difficult as it may be to take the time to enter legacy pedon data, it is vitally important that we capture this resource and get these data into NASIS as an archive of point observations. 2.2.3 Some Issues With Pedon Data Making and documenting observations of soil requires hard work. Digging is difficult, and writing soil descriptions is time consuming! Our confidence in observations typically weakens with the depth of the material described. If we acknowledge this, which we must, then how do we deal with it in pedon data? Use a cutoff depth, for example 100 cm, can be used to truncate observations to a zone of greater confidence. Show the relative confidence of the data with depth. 2.3 Challenges with Pedon Data Consistency Missing data Confidence in the observations Uncertainty with depth Description style differences Depth described, horizonation usage styles Legacy data vintage Decadal span of data Taxonomy updates, horizon nomenclature changes Location confidence Origin of the location information Datum used for data collection Accuracy for GPS values at the time of data collection 2.4 The SoilProfileCollection The SoilProfileCollection class (SPC) provided by the aqp package is a specialized structure for soil data analysis. It simplifies the process of working with collections of data associated with soil profiles, e.g., site-level, horizon-level, spatial, diagnostic horizons, and other metadata. A SoilProfileCollection is similar to the NASIS Site/Pedon “object” in that it provides generalizations, specific routines and rules about data tables and their relationships. The SoilProfileCollection is an S4 R object. S4 objects have slots. Of primary importance, are the slots for site-level and horizon-level data. In many ways the SPC is more adaptable than the NASIS “Pedon” concept because it is more general. However, the SPC is not as expressive as the complex hierarchy of objects in NASIS, which are more aligned with data archival vs. analysis. 2.4.1 SoilProfileCollection methods Many “familiar” methods are defined for the SoilProfileCollection object. Some are unique, and others operate like more common functions of vector and data.frame objects, such as nrow() (“how many horizons?”) or length() (“how many sites/pedons?”). Perhaps most importantly, when you access the site data (with site(<object>)) or the horizon data (with horizons(<object>)) of a SoilProfileCollection, you get a data.frame object that you can use like any other you might use or make in R. 2.4.1.1 Promoting a data.frame to SoilProfileCollection The SoilProfileCollection object is a collection of 1-dimensional profile descriptions, of the type conventionally described on a Form 232, or of tabular data returned from laboratory. The object is “horizon data forward” in that you start with the layers, and can add or create site-level attributes by normalization, joins, and calculation. Most of the time if you are using your NASIS data, or an official database, there are defined ways of getting the data “into” an SPC. For example, fetchOSD returns a SoilProfileCollection that has been assembled from horizon and site level attributes gleaned from the OSDs text, Soil Classification database, and other sources. In the pre-course, we had you set up a process so you could connect to your local NASIS instance to “fetch” data and have methods like fetchNASIS put things together for you. This input to make a SoilProfileCollection can be represented most simply as a data.frame with unique site or profile ID and depth combinations for each horizon or layer–for example, a subset of the phorizon or chorizon table in NASIS. A simple demonstration of “tabular horizon data” is the sp4 data set bundled with aqp: some serpentine soil profiles stored in a data.frame in the aqp package (after McGahan et al., 2009). library(aqp) # Load sample serpentine soil data (McGahan et al., 2009) data(sp4, package = "aqp") # this is a data.frame # same as if loaded from CSV file etc. class(sp4) ## [1] "data.frame" # inspect the first couple of rows head(sp4) ## id name top bottom K Mg Ca CEC_7 ex_Ca_to_Mg sand silt clay CF ## 1 colusa A 0 3 0.3 25.7 9.0 23.0 0.35 46 33 21 0.12 ## 2 colusa ABt 3 8 0.2 23.7 5.6 21.4 0.23 42 31 27 0.27 ## 3 colusa Bt1 8 30 0.1 23.2 1.9 23.7 0.08 40 28 32 0.27 ## 4 colusa Bt2 30 42 0.1 44.3 0.3 43.0 0.01 27 18 55 0.16 ## 5 glenn A 0 9 0.2 21.9 4.4 18.8 0.20 54 20 25 0.55 ## 6 glenn Bt 9 34 0.3 18.9 4.5 27.5 0.20 49 18 34 0.84 To convert this horizon data into a SoilProfileCollection, we need to identify three parameters: idname, top, and bottom. These parameters refer to the columns of unique profile IDs, top depths and bottom depths, respectively. There are a couple of important constraints and considerations: records (rows) represent horizons profiles are uniquely identified by a column (user pedon ID, pedon record ID, etc.) profiles IDs cannot contain missing values (NA) horizon top and bottom depths are identified by column names ideally there are no gaps, overlap, or missing top/bottom depths (more on that later) Use a formula to specify column names in the data.frame, in this case \"id\", \"top\" and \"bottom\". # profile ID ~ top depth + bottom depth depths(sp4) <- id ~ top + bottom # note new class class(sp4) ## [1] "SoilProfileCollection" ## attr(,"package") ## [1] "aqp" # compact summary sp4 ## SoilProfileCollection with 10 profiles and 30 horizons ## profile ID: id | horizon ID: hzID ## Depth range: 16 - 49 cm ## ## ----- Horizons (6 / 30 rows | 10 / 14 columns) ----- ## id hzID top bottom name K Mg Ca CEC_7 ex_Ca_to_Mg ## colusa 1 0 3 A 0.3 25.7 9.0 23.0 0.35 ## colusa 2 3 8 ABt 0.2 23.7 5.6 21.4 0.23 ## colusa 3 8 30 Bt1 0.1 23.2 1.9 23.7 0.08 ## colusa 4 30 42 Bt2 0.1 44.3 0.3 43.0 0.01 ## glenn 5 0 9 A 0.2 21.9 4.4 18.8 0.20 ## glenn 6 9 34 Bt 0.3 18.9 4.5 27.5 0.20 ## [... more horizons ...] ## ## ----- Sites (6 / 10 rows | 1 / 1 columns) ----- ## id ## colusa ## glenn ## kings ## mariposa ## mendocino ## napa ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] The formula expresses the idea that a profile id defined by set of top and bottom depths. NOTE: A character vector with same names has the same effect, and can be easier to “program” with than the formula-based syntax. depths(sp4) <- c("id", "top", "bottom") 2.4.2 Promoting to “Spatial” SoilProfileCollection You can also use the SoilProfileCollection to manage the information about a profile’s position on the Earth. Chapter 4 will cover spatial data in greater detail, and the SoilProfileCollection Reference has a section on Spatial Data. For now know you can use the initSpatial<- method to define “X” and “Y” coordinate columns and the coordinate reference system in one line: sp4$x <- runif(10) sp4$y <- runif(10) # dummy XY coordinates initSpatial(sp4, crs = "OGC:CRS84") <- ~ x + y This is new syntax introduced in aqp 2.0, the older syntax uses the coordinates<- and proj4string<- methods. 2.4.2.1 Extracting Site and Horizon Data You can extract values from the collection’s @site and @horizon slots using the site() and horizons() functions. These create data.frame objects that are separate from the SoilProfileCollection. # extract site data from SPC into new data.frame 's' # note that it only contains profile IDs s <- site(sp4) str(s) ## 'data.frame': 10 obs. of 1 variable: ## $ id: chr "colusa" "glenn" "kings" "mariposa" ... # extract horizon data from SPC into new data.frame 'h' h <- horizons(sp4) str(h) ## 'data.frame': 30 obs. of 14 variables: ## $ id : chr "colusa" "colusa" "colusa" "colusa" ... ## $ name : chr "A" "ABt" "Bt1" "Bt2" ... ## $ top : int 0 3 8 30 0 9 0 4 13 0 ... ## $ bottom : int 3 8 30 42 9 34 4 13 40 3 ... ## $ K : num 0.3 0.2 0.1 0.1 0.2 0.3 0.2 0.6 0.8 0.6 ... ## $ Mg : num 25.7 23.7 23.2 44.3 21.9 18.9 12.1 12.1 17.7 28.3 ... ## $ Ca : num 9 5.6 1.9 0.3 4.4 4.5 1.4 7 4.4 5.8 ... ## $ CEC_7 : num 23 21.4 23.7 43 18.8 27.5 23.7 18 20 29.3 ... ## $ ex_Ca_to_Mg: num 0.35 0.23 0.08 0.01 0.2 0.2 0.58 0.51 0.25 0.2 ... ## $ sand : int 46 42 40 27 54 49 43 36 27 42 ... ## $ silt : int 33 31 28 18 20 18 55 49 45 26 ... ## $ clay : int 21 27 32 55 25 34 3 15 27 32 ... ## $ CF : num 0.12 0.27 0.27 0.16 0.55 0.84 0.5 0.75 0.67 0.25 ... ## $ hzID : chr "1" "2" "3" "4" ... 2.4.2.2 Methods like data.frame The base R functions for accessing and setting data.frame columns by name such as $ and [[ work for SoilProfileCollection objects, too. Review data.frame methods: [[ and $: single columns in data.frame, by name x[['variable']] x$variable [: combinations of rows and columns, by name or index x[i, ]: specified rows, all columns x[, j]: all rows, specified columns x[i, j]: specified rows, specified columns See Chapter 1 and the Chapter 2 Appendix for additional details and examples. 2.4.2.2.1 Column Access by Name: $ and [[ # sp4 is a SoilProfileCollection sp4$clay ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 sp4[['clay']] ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 # horizon data.frame h$clay ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 h[['clay']] ## [1] 21 27 32 55 25 34 3 15 27 32 25 31 33 13 21 23 15 17 12 19 14 14 22 25 40 51 67 24 25 32 # use $<- or [[<- to set proportional clay content sp4$clay <- sp4[['clay']] / 100 # undo what we did above; back to percentage sp4[['clay']] <- sp4$clay * 100 # create new site variable ("numberone" recycled for all sites) site(sp4)$newvar1 <- "numberone" # create new horizon variable ("numbertwo" recycled for all horizons) horizons(sp4)$newvar2 <- "numbertwo" 2.4.2.2.2 Row Access: [ The SoilProfileCollection also has [ (“single bracket”), but with a different interpretation from the [i, j] indexing of data.frame objects. In a data.frame you have object[row, column, drop=TRUE]; the result is a data.frame (or a vector with default drop=TRUE). In a SoilProfileCollection you have object[site, horizon]; the result is a SoilProfileCollection. # i-index: first 2 profiles, all horizons sp4[1:2, ] ## SoilProfileCollection with 2 profiles and 6 horizons ## profile ID: id | horizon ID: hzID ## Depth range: 34 - 42 cm ## ## ----- Horizons (6 / 6 rows | 10 / 15 columns) ----- ## id hzID top bottom name K Mg Ca CEC_7 ex_Ca_to_Mg ## colusa 1 0 3 A 0.3 25.7 9.0 23.0 0.35 ## colusa 2 3 8 ABt 0.2 23.7 5.6 21.4 0.23 ## colusa 3 8 30 Bt1 0.1 23.2 1.9 23.7 0.08 ## colusa 4 30 42 Bt2 0.1 44.3 0.3 43.0 0.01 ## glenn 5 0 9 A 0.2 21.9 4.4 18.8 0.20 ## glenn 6 9 34 Bt 0.3 18.9 4.5 27.5 0.20 ## ## ----- Sites (2 / 2 rows | 2 / 2 columns) ----- ## id newvar1 ## colusa numberone ## glenn numberone ## ## Spatial Data: ## [EMPTY] # j-index: all profiles; first 2 horizons of each profile sp4[, 1:2] ## SoilProfileCollection with 10 profiles and 20 horizons ## profile ID: id | horizon ID: hzID ## Depth range: 5 - 40 cm ## ## ----- Horizons (6 / 20 rows | 10 / 15 columns) ----- ## id hzID top bottom name K Mg Ca CEC_7 ex_Ca_to_Mg ## colusa 1 0 3 A 0.3 25.7 9.0 23.0 0.35 ## colusa 2 3 8 ABt 0.2 23.7 5.6 21.4 0.23 ## glenn 5 0 9 A 0.2 21.9 4.4 18.8 0.20 ## glenn 6 9 34 Bt 0.3 18.9 4.5 27.5 0.20 ## kings 7 0 4 A 0.2 12.1 1.4 23.7 0.58 ## kings 8 4 13 Bt1 0.6 12.1 7.0 18.0 0.51 ## [... more horizons ...] ## ## ----- Sites (6 / 10 rows | 2 / 2 columns) ----- ## id newvar1 ## colusa numberone ## glenn numberone ## kings numberone ## mariposa numberone ## mendocino numberone ## napa numberone ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] When you use the [ function, everything in the SoilProfileCollection is subset simultaneously depending on the constraints specified by the indices. # First profile, first 2 horizons horizons(sp4[1, 1:2]) ## id name top bottom K Mg Ca CEC_7 ex_Ca_to_Mg sand silt clay CF hzID newvar2 ## 1 colusa A 0 3 0.3 25.7 9.0 23.0 0.35 46 33 21 0.12 1 numbertwo ## 2 colusa ABt 3 8 0.2 23.7 5.6 21.4 0.23 42 31 27 0.27 2 numbertwo All slots in the collection have a relationship to the site or i-index. When you remove sites (profiles), all associated records (e.g. spatial, diagnostics, horizons, etc.) in the object are removed. Similarly, when all horizons are removed (say, you request the 6th j-index from a profile that has only 5 layers), the site index and all associated data are removed from the collection. 2.5 Exercise 1: Assemble a SoilProfileCollection from several CSV files Link to exercise R code Questions: Run the code in the linked R file and answer these questions. How many profiles (sites) and horizons are in the granite SoilProfileCollection? How many in andesite? See length() and nrow() functions for SoilProfileCollection objects. Which profile (and which horizon in that profile) has the highest ratio of oxalate-extractable Fe to dithionite-citrate-extractable Fe (Fe_o_to_Fe_d)? Send the results of questions (and any code you used) to your mentor. 2.6 Using the soilDB Package The soilDB package for R provides functions for accessing data stored in NASIS, KSSL, SDA, SoilWeb, SoilGrids and other sources. These high-level ‘fetch’ functions bundle or wrap lower-level ‘get’ functions which access internal database interfaces to NASIS and other data sources. The ODBC connection to NASIS that you set up during the pre-course is an example of an internal database interface. Basic data checks are run within ‘fetch’ functions. These checks ensure the basic integrity of the data as it is queried and moved from its existing structure into an SPC. There are times when it is useful to use the lower-level get functions individually. They generally return single data.frame or list of data.frame. You can set up scripts to make custom queries against these or other sources on your own – there is an example at the end of this section. For now, we will start with the ‘fetch’ functions and others that will get you a large variety of data you can use for soil and ecological site analyses. 2.6.1 soilDB functions for tabular data soilDB functions are the quickest way to get up and running: fetchNASIS() Gets and re-packages data from a local NASIS database. soilDB Vignette Columns in fetchNASIS(from=\"pedons\") fetchVegdata() Gets Vegetation Plot and related/child tables into a list from a local NASIS database. fetchNASISLabData() Gets KSSL laboratory pedon/horizon layer data from a local NASIS database. fetchNASISWebReport() SDA_query() Can be used to access SSURGO, STATSGO (spatial and tabular), and Lab DataMart snapshots Submits queries to the Soil Data Access system. Soil Data Access Tutorial SDA and Spatial Data SDA and Interpretations fetchLDM() Gets KSSL data from the Lab Data Mart snapshot in Soil Data Access fetchSDA() Fetches legend/mapunit/component/horizon data from Soil Data Access. fetchKSSL() Gets KSSL data from the SoilWeb system via BBOX, MLRA, or series name query. KSSL Data Demo Water Retention Curve Development from KSSL Data fetchOSD() Fetches a limited subset of horizon- and site-level attributes for named soil series from the SoilWeb system. Querying Soil Series Data OSDquery() Full-text searching of OSD sections. Querying Soil Series Data fetchSCAN() Queries soil and climate data from USDA-NRCS SCAN Stations. A Unified Interface to SCAN/SNOTEL Data fetchHenry() Downloads data from the Henry Mount Soil Climate Database. Henry Mount Soil Climate Database Tutorial fetchPedonPC() Fetches commonly used site and horizon data from a PedonPC (MS Access) database. 2.6.2 Open Database Connectivity (ODBC) Connection to NASIS After setting up an ODBC connection, as you did as part of the pre-course, you can use R to access data from a selected set defined in your local NASIS database. How to Create an ODBC Connection to local NASIS database for R. Does NASIS need to be open and running to query data using soilDB? No, fetchNASIS() works whether the NASIS application is running or not. You just need to make sure that the data you want has been loaded into your selected set. 2.6.3 fetchNASIS() The fetchNASIS() convenience function extracts data from a NASIS selected set via Structured Query Language (SQL). Note that the import process in fetchNASIS(), and the other methods, is not comprehensive. It does not pull every column for every table related to pedon data out of NASIS. Instead, it pulls essential / commonly used pedon and horizon data. Higher level functions like fetchNASIS() bundle a series of lower-level queries to get specific parts of the Pedon or Component data structures. Much of the nested complexity of NASIS is simplified in the resulting object. Many-to-one relationships are “flattened” where possible by fetchNASIS(). This aggregates the data from various tables into one “site” record with related horizon records, per profile. You can see the child tables that are aggregated using the get_extended_data_from_NASIS() method, which returns a named list of child table sources that can be joined to the SoilProfileCollection made with fetchNASIS() using the internal record IDs. 2.6.3.1 fetchNASIS arguments fetchNASIS() has a number of different arguments: from = ‘pedons’ or ‘components’ or ‘pedon_report’ This option allows you to select which data you want to load from NASIS. Choosing either ‘pedons’ or ‘components’ will load data from your local database. If ‘pedon_report’ is specified then it will load data from the text file generated by the NASIS report ‘fetchNASIS’ (run offline). This is useful for loading more than 20,000 pedons at one time, such for an entire Soil Survey Region. url = string specifying the (temporary) URL for the NASIS pedon_report output generated by the fetchNASIS NASIS Report that can be run “Offline Against National Database” EXAMPLE OUTPUT (MT663) SS = TRUE/FALSE The Selected Set (SS) option allows you to choose whether you want the data to load from your current selected set in NASIS or from the local database tables. The default is set to TRUE so if unspecified fetchNASIS() will always load from the data in the selected set. stringAsFactors = NULL This option is no longer used. See soilDB::NASISDomainsAsFactor() rmHzErrors = TRUE/FALSE Setting this value to TRUE removes pedons that do not pass checks for horizon depth consistency. Default: FALSE nullFragsAreZero = TRUE/FALSE Setting this value to TRUE (the default) converts null entries for rock fragment volumes to 0. This is typically the right assumption because rock fragment data are typically populated only when observed. If you know that your data contain a combination of omitted information (e.g. no rock fragment volumes are populated) then consider setting this argument to FALSE. soilColorState = ‘moist’ or ‘dry’ Select dry or moist colors to be converted and placed into a horizon-level attribute called soil_color. The default is set to ‘moist’ unless specified. Moist and dry colors are also stored in moist_soil_color and dry_soil_color. lab = TRUE/FALSE This option allows for loading the data associated with horizons that may be in the phlabresults table. The default is set to FALSE, which will not load records from the phlabresults table. fill = TRUE/FALSE This option adds horizons to pedons or components that lack horizon data in the database, preserving their “position” within the output SoilProfileCollection object. Default is FALSE such that profiles without horizons are omitted from the result. dropAdditional = TRUE/FALSE Used only for from='components' with duplicates = TRUE. Prevent “duplication” of mustatus == \"additional\" mapunits? Default: TRUE dropNonRepresentative = TRUE/FALSE Used only for from='components' with duplicates = TRUE. Prevent “duplication” of non-representative data mapunits? Default: TRUE duplicates = FALSE Used only for from='components'. Duplicate components for all instances of use (i.e. one for each legend data mapunit is used on; optionally for additional mapunits, and/or non-representative data mapunits?). This will include columns from get_component_correlation_data_from_NASIS_db() that identify which legend(s) each component is used on. NOTE: This requires that parent tables above “component” (such as legend, mapunit, correlation and datamapunit) are loaded in your NASIS database/selected set. dsn = NULL Optional: custom path to an SQLite snapshot or DBIConnection object to database with NASIS schema. See soilDB::createStaticNASIS(). For more information on the data checks and adjusting the default options to fetchNASIS() function, see the following resource: Tips on Getting Data from NASIS into R. 2.6.4 The gopheridge Dataset The gopheridge sample data set is a sample R object returned from fetchNASIS() in a self-contained .rda file stored in soilDB. Open RStudio, and set up the environment by loading packages and the gopheridge sample dataset. library(aqp) library(soilDB) # load example dataset data(gopheridge, package = "soilDB") # what kind of object is this? class(gopheridge) ## [1] "SoilProfileCollection" ## attr(,"package") ## [1] "aqp" # what does the internal structure look like? str(gopheridge, 2) ## Formal class 'SoilProfileCollection' [package "aqp"] with 8 slots ## ..@ idcol : chr "peiid" ## ..@ hzidcol : chr "phiid" ## ..@ depthcols : chr [1:2] "hzdept" "hzdepb" ## ..@ metadata :List of 6 ## ..@ horizons :'data.frame': 317 obs. of 77 variables: ## ..@ site :'data.frame': 52 obs. of 164 variables: ## ..@ diagnostic :'data.frame': 164 obs. of 4 variables: ## ..@ restrictions:'data.frame': 56 obs. of 8 variables: There are many columns in the data.frame objects within a fetchNASIS() SoilProfileCollection. The following guide is part of the soilDB documentation and describes the columns that are returned from a fetchNASIS(from=\"pedons\") call. In the future this guide will be extended to describe component data. fetchNASIS(from=“pedons”) column description guide With siteNames() and horizonNames() we can view the names for eachslot respectively in the gopheridge object. # the fields at the site and horizon levels within the SPC siteNames(gopheridge) ## [1] "peiid" "siteiid" ## [3] "ecositeid" "ecositenm" ## [5] "ecositecorrdate" "es_classifier" ## [7] "siteecositehistory.classifier" "es_selection_method" ## [9] "upedonid" "siteobsiid" ## [11] "usiteid" "obsdate" ## [13] "utmzone" "utmeasting" ## [15] "utmnorthing" "horizdatnm" ## [17] "longstddecimaldegrees" "latstddecimaldegrees" ## [19] "gpspositionalerror" "describer" ## [21] "descname" "pedonpurpose" ## [23] "pedontype" "pedlabsampnum" ## [25] "labdatadescflag" "tsectstopnum" ## [27] "tsectinterval" "utransectid" ## [29] "tsectkind" "tsectselmeth" ## [31] "erocl" "elev_field" ## [33] "slope_field" "aspect_field" ## [35] "elev" "slope" ## [37] "aspect" "ecostatename" ## [39] "ecostateid" "commphasename" ## [41] "commphaseid" "plantassocnm" ## [43] "earthcovkind1" "earthcovkind2" ## [45] "bedrckdepth" "bedrckkind" ## [47] "bedrckhardness" "pmgroupname" ## [49] "hillslopeprof" "geomslopeseg" ## [51] "shapeacross" "shapedown" ## [53] "slopecomplex" "drainagecl" ## [55] "geomposhill" "geomposmntn" ## [57] "geompostrce" "geomposflats" ## [59] "swaterdepth" "flodfreqcl" ## [61] "floddurcl" "flodmonthbeg" ## [63] "pondfreqcl" "ponddurcl" ## [65] "pondmonthbeg" "climstaid" ## [67] "climstanm" "climstatype" ## [69] "ffd" "map" ## [71] "reannualprecip" "airtempa" ## [73] "soiltempa" "airtemps" ## [75] "soiltemps" "airtempw" ## [77] "soiltempw" "surface_fine_gravel" ## [79] "surface_gravel" "surface_cobbles" ## [81] "surface_stones" "surface_boulders" ## [83] "surface_channers" "surface_flagstones" ## [85] "surface_parafine_gravel" "surface_paragravel" ## [87] "surface_paracobbles" "surface_parastones" ## [89] "surface_paraboulders" "surface_parachanners" ## [91] "surface_paraflagstones" "surface_unspecified" ## [93] "surface_total_frags_pct_nopf" "surface_total_frags_pct" ## [95] "othervegid" "othervegclass" ## [97] "site_state" "site_county" ## [99] "site_mlra" "slope_shape" ## [101] "surface_fgravel" "classdate" ## [103] "classifier" "classtype" ## [105] "taxonname" "localphase" ## [107] "taxonkind" "seriesstatus" ## [109] "taxclname" "taxpartsize" ## [111] "taxorder" "taxsuborder" ## [113] "taxgrtgroup" "taxsubgrp" ## [115] "soiltaxedition" "osdtypelocflag" ## [117] "taxmoistcl" "taxtempregime" ## [119] "taxfamother" "taxreaction" ## [121] "taxfamhahatmatcl" "psctopdepth" ## [123] "pscbotdepth" "selection_method" ## [125] "ochric.epipedon" "argillic.horizon" ## [127] "paralithic.contact" "lithic.contact" ## [129] "umbric.epipedon" "cambic.horizon" ## [131] "mollic.epipedon" "densic.materials" ## [133] "paralithic.materials" "lithologic.discontinuity" ## [135] "andic.soil.properties" "densic.contact" ## [137] "abrupt.textural.change" "aquic.conditions" ## [139] "duripan" "slickensides" ## [141] "redox.depletions.with.chroma.2.or.less" "redox.concentrations" ## [143] "reduced.matrix" "histic.epipedon" ## [145] "albic.horizon" "spodic.horizon" ## [147] "fibric.soil.materials" "hemic.soil.materials" ## [149] "sapric.soil.materials" "volcanic.glass" ## [151] "folistic.epipedon" "strongly.contrasting.particle.size.class" ## [153] "calcic.horizon" "human.transported.material" ## [155] "albic.materials" "secondary.carbonates" ## [157] "anthropic.epipedon" "landform_string" ## [159] "landscape_string" "microfeature_string" ## [161] "geomicrorelief_string" "pmkind" ## [163] "pmorigin" "site_id" horizonNames(gopheridge) ## [1] "phiid" "peiid" "pedon_id" "hzname" "dspcomplayerid" ## [6] "hzdept" "hzdepb" "bounddistinct" "boundtopo" "claytotest" ## [11] "silttotest" "sandtotest" "clay" "silt" "sand" ## [16] "fragvoltot" "texture" "texcl" "lieutex" "phfield" ## [21] "effclass" "labsampnum" "rupresblkdry" "rupresblkmst" "rupresblkcem" ## [26] "stickiness" "plasticity" "ksatpedon" "texture_class" "hzID" ## [31] "d_hue" "d_value" "d_chroma" "dry_soil_color" "d_r" ## [36] "d_g" "d_b" "d_sigma" "m_hue" "m_value" ## [41] "m_chroma" "moist_soil_color" "m_r" "m_g" "m_b" ## [46] "m_sigma" "soil_color" "fine_gravel" "gravel" "cobbles" ## [51] "stones" "boulders" "channers" "flagstones" "parafine_gravel" ## [56] "paragravel" "paracobbles" "parastones" "paraboulders" "parachanners" ## [61] "paraflagstones" "unspecified" "total_frags_pct_nopf" "total_frags_pct" "art_fgr" ## [66] "art_gr" "art_cb" "art_st" "art_by" "art_ch" ## [71] "art_fl" "art_unspecified" "total_art_pct" "huartvol_cohesive" "huartvol_penetrable" ## [76] "huartvol_innocuous" "huartvol_persistent" 2.6.4.1 Make profile sketches The plotSPC() or plot() function applied to a SoilProfileCollection object generates sketches based on horizon depths, designations, and colors. The SoilProfileCollection Reference vignette contains many examples demonstrating way in which these sketches can be customized. The Soil Profile Sketches tutorial contains additional examples that demonstrate various ways to customize soil profile sketches. See ?plotSPC for a detailed list of arguments and examples. The fetchNASIS() function automatically converts moist Munsell colors into R-style colors, available in the soil_color horizon level attribute. This color is used by default in plotSPC() par(mar = c(1, 1, 1, 1)) # omitting pedon IDs and horizon designations plotSPC(gopheridge, print.id = FALSE, name = NA, width = 0.3) title('Pedons from the `gopheridge` sample dataset', line = -0.5) Additional examples / documentation related to soil profile sketches: SoilProfileCollection Reference OSD Dendrogram tutorial Visualization of Horizon Boundaries tutorial Competing Series tutorial 2.6.4.2 Pedon Data Checks When you load pedons using the fetchNASIS() function, the following data checks are performed: Presence of multiple map datums. Results reported to the user and the data are not modified. Inconsistent horizon boundaries. Pedons with inconsistent horizon boundaries are not loaded unless rmHzErrors = FALSE. In most cases, this occurs when the bottom depth of a horizon is not the same as the upper depth of the next lower horizon. ## hzname top bot ## 1 A 0 30 ## 2 Bt1 38 56 ## 3 Bt2 56 121 ## 4 Bk 121 135 ## 5 R 135 NA Note the issue above. The bottom depth of the A horizon and the upper depth of the Bt1 horizon should be the same: either 30 or 38 cm. The correct depth needs to be determined and fixed in the database. Missing lower horizon depths. Offending horizons are fixed by replacing the missing bottom depth with the top depth plus 2 cm. In the case of the profile shown above, a bottom depth of 137 cm would be inserted where the depth is missing. Sites missing pedon records. Data without corresponding horizons are not loaded. 2.6.4.3 Find Data with Errors If errors in the pedon data are detected when loading data using fetchNASIS(), the following “get” commands can trace them back to the corresponding records in NASIS. These access an option that is stored in a special object called an environment associated with the soilDB package – they generally contain vectors of IDs to help locating the problematic data. get('sites.missing.pedons', envir = soilDB.env) Returns user site ID for sites missing pedons get('dup.pedon.ids', envir = soilDB.env) Returns user pedon ID for sites with duplicate pedon ID get('bad.pedon.ids', envir = soilDB.env) Returns user pedon ID for pedons with inconsistent horizon depths get('bad.horizons', envir = soilDB.env) Returns a data.frame of horizon-level information for pedons with inconsistent horizon depths # fetchNASIS("pedons") get('sites.missing.pedons', envir = get_soilDB_env()) get('dup.pedon.ids', envir = get_soilDB_env()) get('bad.pedon.ids', envir = get_soilDB_env()) get('missing.bottom.depths', envir=get_soilDB_env()) get('top.bottom.equal', envir=get_soilDB_env()) get('bad.horizons', envir = get_soilDB_env()) get('rock.fragment.volume.gt100.phiid', envir=get_soilDB_env()) get('artifact.volume.gt100.phiid', envir=get_soilDB_env()) get('multisiteobs.surface', envir=get_soilDB_env()) get('surface.fragment.cover.gt100.siteobsiid', envir=get_soilDB_env()) get('multiple.labsampnum.per.phiid', envir=get_soilDB_env()) # fetchNASISLabData() get('bad.labpedon.ids', envir=get_soilDB_env()) # fetchNASIS("components"), fetchNASISWebReport() get('dupe.coiids', envir=get_soilDB_env()) get('dupe.muiids', envir=get_soilDB_env()) get('multiple.mu.per.dmu', envir=get_soilDB_env()) get("component.hz.problems", envir = get_soilDB_env()) get('multiple.ecosite.per.coiid', envir=get_soilDB_env()) get('multiple.otherveg.per.coiid', envir=get_soilDB_env()) # Soil Data Access get('dup.compmgrp.cokeyrvindictor', envir=get_soilDB_env()) get('component.hz.problems', envir=get_soilDB_env()) get('component.ecosite.problems', envir = get_soilDB_env()) These get() calls access variables stored in the package environment soilDB.env. The variables only exist if there are “problems” / values found by the data checks – and if you fix the errors in the NASIS database and the checks don’t find any errors then nothing will be returned by these functions. 2.6.5 Summaries Now that you’ve loaded some data, you can look at additional ways to summarize and interact with data elements. 2.6.5.1 table() and Cross Tabulation The base R table() function is very useful for quick summary operations. It returns a named vector with the amount of each unique level of the a given vector. The numeric vector of “counts” is commonly combined with other functions such as sort(), order(), prop.table(), is.na() to identify abundance, proportions, or missing data (NA). # load required packages library(aqp) library(soilDB) data("gopheridge", package = "soilDB") # for these examples, we use the gopheridge object as our "selected set" pedons <- gopheridge ## you can use fetchNASIS to load your own data, like this: # pedons <- fetchNASIS() # summarize which soil taxa we have loaded table(pedons$taxonname) ## ## Gopheridge ## 52 # sort taxonomic names in descending order sort(table(pedons$taxonname), decreasing = TRUE) ## Gopheridge ## 52 # could do the same thing for taxonomic subgroups table(pedons$taxsubgrp) ## ## mollic haploxeralfs typic haploxerepts ultic haploxeralfs ultic haploxerolls ## 1 6 44 1 sort(table(pedons$taxsubgrp), decreasing = TRUE) ## ## ultic haploxeralfs typic haploxerepts mollic haploxeralfs ultic haploxerolls ## 44 6 1 1 We can convert counts in the table() result into proportions with prop.table(): prop.table(table(pedons$taxsubgrp)) ## ## mollic haploxeralfs typic haploxerepts ultic haploxeralfs ultic haploxerolls ## 0.01923077 0.11538462 0.84615385 0.01923077 table() can be used to get counts over multiple dimensions of factor levels. This is called cross tabulation. For instance, let’s cross tabulate taxonomic subgroup (taxsubgrp) and the particle size family class (taxpartsize) for pedons table(pedons$taxsubgrp, pedons$taxpartsize) ## ## clayey-skeletal coarse-loamy fine fine-loamy loamy-skeletal ## mollic haploxeralfs 0 0 0 0 1 ## typic haploxerepts 1 0 0 0 5 ## ultic haploxeralfs 2 0 1 1 40 ## ultic haploxerolls 0 1 0 0 0 As expected with gopheridge the vast majority of pedons are Loamy-skeletal Ultic Haploxeralfs. Since pedons contains site and horizon level data, when cross-tabulating we need to be sure pair a column from the site data with other site-level columns, and the same for horizon-level. This is because all arguments to table() must have the same length. For example, let’s cross-tabulate horizon designation (hzname) with horizon texture class (texcl). We can use the addmargins() function to add the row and column sums to the margins of the table for easier interpretation when there are many rows/columns in the result. addmargins(table(pedons$hzname, pedons$texcl)) ## ## c cl l scl sic sicl sil sl Sum ## 2BCt5 0 1 0 0 0 0 0 0 1 ## 2Bt1 0 0 3 0 0 0 0 0 3 ## 2Bt2 1 2 1 1 0 0 0 0 5 ## 2Bt3 1 3 1 0 0 0 0 0 5 ## 2Bt4 2 0 0 0 0 0 0 0 2 ## 2CBt 0 0 0 1 0 0 0 0 1 ## 2Cr 0 0 0 0 0 0 0 0 0 ## 2Crt 0 0 0 0 0 0 0 0 0 ## 2R 0 0 0 0 0 0 0 0 0 ## A 0 0 33 0 0 0 12 3 48 ## A1 0 0 2 0 0 0 2 0 4 ## A2 0 0 2 0 0 0 2 0 4 ## A3 0 0 1 0 0 0 0 0 1 ## AB 0 0 2 0 0 0 2 0 4 ## BA 0 0 17 0 0 1 0 0 18 ## BC 0 0 4 0 0 0 0 0 4 ## BCt 0 2 2 1 0 0 1 0 6 ## Bt 0 0 1 1 1 0 0 0 3 ## Bt1 0 3 28 1 0 3 5 0 40 ## Bt2 3 15 14 1 1 3 1 0 38 ## Bt3 4 8 6 1 0 1 1 0 21 ## Bt4 1 2 2 0 0 0 0 0 5 ## Bw 0 0 6 0 0 0 1 0 7 ## Bw1 0 0 5 0 0 0 0 0 5 ## Bw2 0 0 5 0 0 0 0 0 5 ## Bw3 0 0 3 0 0 0 0 0 3 ## C 1 0 1 0 0 0 0 0 2 ## C/Brt 0 1 0 0 0 0 0 0 1 ## CBt 0 0 0 1 0 0 0 0 1 ## Cr 0 0 1 0 0 0 0 0 1 ## Crt 0 0 0 0 0 0 0 0 0 ## Ct 0 0 1 0 0 0 0 0 1 ## Oe 0 0 0 0 0 0 0 0 0 ## Oi 0 0 0 0 0 0 0 0 0 ## R 0 0 0 0 0 0 0 0 0 ## Sum 13 37 141 8 2 8 27 3 239 2.6.5.2 The dplyr package and “tidy” data principles Tidy Data Principles This is a stub to talk about dplyr some links to tidyverse-centric examples of working with data.frame/tibble and summarizing them. Talk about cool things like rowwise(), across() and translation to high-performance code (dtplyr) and SQL (dbplyr). 2.6.6 Missing Values “Missing” values are encoded in R as NA. table() has a useNA argument that affects whether NA values are counted. Use is.na() to return a logical value that identifies missing data. table(pedons$taxsubgrp, useNA = "ifany") ## ## mollic haploxeralfs typic haploxerepts ultic haploxeralfs ultic haploxerolls ## 1 6 44 1 # is.na(...) table(is.na(pedons$taxsubgrp)) ## ## FALSE ## 52 # is NOT NA !is.na(...) table(!is.na(pedons$taxsubgrp)) ## ## TRUE ## 52 # it can also be applied to horizon level columns in the SPC sort(table(pedons$texture), decreasing=TRUE) ## ## BR L GR-L GRV-L CBV-L SPM GRX-L SIL GRV-CL CBV-CL GR-SIL CBX-L GRX-CL ## 58 36 33 24 18 14 12 12 9 8 7 6 5 ## CBX-CL GRV-SIL CL GRV-SCL GRX-C MPM SL CB-L GR-CL GRX-SCL PGR-C PGRX-L SICL ## 4 4 3 3 3 3 3 2 2 2 2 2 2 ## STV-CL STV-L STX-C STX-L C CB-C CB-CL CB-SCL CB-SIL CBV-SIL CBX-SCL CN-L CN-SICL ## 2 2 2 2 1 1 1 1 1 1 1 1 1 ## CNX-L CNX-SICL FLV-L GR-C GR-SIC GRV-SICL GRX-SIC GRX-SIL PCB-SICL PCBV-SICL PCN-C PCNX-CL PGRV-C ## 1 1 1 1 1 1 1 1 1 1 1 1 1 ## PGRV-CL PGRX-SCL PGRX-SIL ST-L STV-C STX-CL STX-SICL ## 1 1 1 1 1 1 1 2.6.7 Logical Operators Logical operators act on vectors for the purposes of comparison. == “EQUAL TO” != “NOT EQUAL TO” < LESS than LESS than or equal to <= > GREATER than GREATER than or equal to >= %in% Equivalent to IN () in SQL; same logic as match() but returns a logical, not integer Example: pedons$taxpartsize %in% c('loamy-skeletal', 'sandy-skeletal') Returns a vector of TRUE/FALSE equal in length to left-hand side & logical AND | logical OR Any logical operation on NA returns NA, so it is important to make sure your data are complete before relying on logical expressions to find conditions of interest. 2.6.8 Pattern Matching The following examples use the grep() function to pattern match within the data. We do this to create an index of the SoilProfileCollection for records that match the specified pattern, and then use that index to filter to specific sites and profiles. Patterns are specified using regular expression (REGEX) syntax. This process can be applied to many different columns in the SPC based on how you need to filter the data. This example pattern matches on the taxsubgrp column, but another useful application might be to pattern match on geomorphology or parent material. Say we want to see what the variation of particle size classes are within a specific subgroup. We can use grep() to create a row index, then apply that index to the SoilProfileCollection. # create a numeric index for pedons with taxsubgroup containing 'typic' idx <- grep('typic', pedons$taxsubgrp) idx ## [1] 11 12 13 14 26 50 # use square bracket notation to subset 'typic' soils in `subset1` object subset1 <- pedons[idx,] # or use the index directly to summarize taxpartsize for 'typic' soils sort(table(pedons$taxpartsize[idx]), decreasing = TRUE) ## ## loamy-skeletal clayey-skeletal ## 5 1 Note: grep() below has an invert argument (default FALSE). This option is very useful for excluding the results of the pattern matching process by inverting whatever the result is. grepl() is the logical version of grep(), so you can invert it using the logical NOT operator: !. Another method is to create an index using which() function. which() takes any logical vector (or expression), and it returns the indices (positions) where that expression returns TRUE. The use of which becomes more important when there are missing values (NA) in an expression. Do a graphical check to see the “typic” profiles are selected. Plot them in R using the SoilProfileCollection “plot” method (e.g., specialized version of the generic plot() function). # adjust margins par(mar=c(1,0,0,1)) # plot the first 10 profiles of subset1 plot(subset1[1:10, ], label = 'taxsubgrp', max.depth = 60) title('Pedons with the word "typic" at subgroup-level of Soil Taxonomy', line=-2) 2.6.8.1 Resources for Regular Expressions A great way to test out regular expressions, and get in-depth explanations of how the syntax is working, is to use an online expression builder. For example, Regex101 or RegExr. https://regex101.com/ & https://regexr.com/ - Online regular expression testers For more information on using regular expressions in grep() for pattern matching operations, see: GNU Regular-expression-syntax Quick Start Guide :http://www.regular-expressions.info/quickstart.html Quick check: Review the chapter content, or run the commands, and review the documentation, to answer the questions. True or False: grepl() returns a numeric vector True or False: which(grepl('typic', pedons$taxsubgrp)) is the same as grep('typic', pedons$taxsubgrp). 2.6.8.2 Statistics for Soil Survey: REGEX Operator Reference . One character, any character * Zero-or-more Quantifier (of previous token) + One-or-more Quantifier (of previous token) {n} quantifier where n is the the number of a match “repeats” (of previous token) [A-Z!] ONE capital letter, or an exclamation mark [0-9]{2} TWO numbers (using { quantifier) | is equivalent to OR: Example: grep('loamy|sandy', c(\"loamy-skeletal\",\"sandy\",\"sandy-skeletal\")) “loamy OR sandy” ^ Anchor to beginning of string / line: Example: grep('^sandy', c(\"loamy-skeletal\",\"sandy\",\"sandy-skeletal\")) “STARTS WITH sandy” $ Anchor to end of string / line: Example: grep('skeletal$', c(\"loamy-skeletal\",\"sandy\",\"sandy-skeletal\")) “ENDS WITH skeletal” \\\\b Anchor to word boundary: Example: grep('\\\\bmesic', c(\"mesic\",\"thermic\",\"isomesic\")) “WORD STARTS WITH mesic” (e.g. not “isomesic”) 2.6.9 Filtering A variety of methods are available to subset or “filter” R data objects, from a simple data.frame or vector, to something more complex like a Spatial object or a SoilProfileCollection. You can index many R objects using numeric or logical expressions as above. There are also methods that make this process a little easier. The base R method for this is subset() and it works on data.frame objects. It is nice because you can specify column names without explicitly referencing the data set, since subset uses non-standard evaluation of expressions passed as arguments. 2.6.9.1 Filtering with aqp::subset() We use the SoilProfileCollection subset method, where we first specify a data (pedons) object then we can write expressions for the columns that exist in that object. Here, we combine two logical expressions to find taxsubgrp containing \"alfs\" (Alfisols) with obsdate before January 1st, 2010. subset2 <- subset(pedons, grepl("alfs", taxsubgrp) & obsdate < as.POSIXlt("2010-01-01")) # check taxonomic range of particle size classes in the data # overwhelmingly these are described as loamy-skeletal ultic haploxeralfs sort(table(subset2$taxsubgrp), decreasing = TRUE) ## ## ultic haploxeralfs mollic haploxeralfs ## 28 1 sort(table(subset2$taxpartsize), decreasing = TRUE) ## ## loamy-skeletal clayey-skeletal fine fine-loamy ## 25 2 1 1 # check year described and taxpartsize table(subset2$taxpartsize, substr(subset2$obsdate, 0, 4)) ## ## 2007 2008 2009 ## clayey-skeletal 1 0 1 ## fine 1 0 0 ## fine-loamy 1 0 0 ## loamy-skeletal 19 1 5 # a double equal sign '==' is used for exact character or numeric criteria subset3 <- subset(subset2, taxpartsize == 'loamy-skeletal') table(subset3$taxpartsize) ## ## loamy-skeletal ## 25 par(mar = c(0, 0, 2, 1)) plotSPC(subset3[1:12, ], print.id = FALSE) title('Loamy-skeletal Ultic Haploxeralfs') 2.6.10 Dates and Times Dates and times use special object types in R. The Unix time, also known as “Posix time,” is a system for describing a point in time. Unix epoch is a whole number value that is the number of seconds elapsed since the 00:00:00 UTC on 1 January 1970 minus leap seconds. We can use logical comparison operators on dates and times if their string representation such as \"01/01/1970\" is converted to a common base R UNIX time representation known as POSIXlt or POSIXct. This conversion accounts for important things such as timezone using your computer’s locale–which is important to keep in mind. When converting to POSIX time several unambiguous (year-month-day) date time formats can be detected. For instance, if you want to convert a date in the common month-day-year format, you need to specify the format argument: as.POSIXct(24*60*60, origin = "1970-01-01", tz = "UTC") ## [1] "1970-01-02 UTC" By default the timezone will match your current timezone. Dates without times are treated as being at midnight UTC. You can customize the timezone with tz argument: as.POSIXlt("01/01/1970", tz = "UTC", format = "%m/%d/%Y") ## [1] "1970-01-01 UTC" POSIXlt and POSIXct objects can be formatted with the format() function. strptime() can be used to parse character vectors into date/times. You use as.POSIXlt() with character input, and as.POSIXct() with numeric input. R also has the Date class which can be used for formatting calendar dates. You can convert POSIXlt/POSIXct objects to Date with as.Date() 2.7 Exercise 2: O Horizon Thickness This exercise uses a synthetic transect generated with R code. The 10 hypothetical pedons along the transect have all been described using the a standardized set of horizon designations: Oi, Oe, A, C, Cg. The thicknesses of layers, the depth to gleyed matrix, and soil organic carbon content vary between pedons. We will start to examine this dataset graphically, and then will utilize some functions defined for the SoilProfileCollection to extract information from the data. The function thicknessOf() can be used to calculate the thickness of horizons matching a regular expression pattern. For example, to calculate the O horizon thickness we can match the pattern \"O\": ohz_thickness <- thicknessOf(ohz, pattern = "O", prefix = "O_") ohz_thickness ## id O_thickness ## 1 P-01 23 ## 2 P-02 40 ## 3 P-03 37 ## 4 P-04 42 ## 5 P-05 24 ## 6 P-06 45 ## 7 P-07 43 ## 8 P-08 33 ## 9 P-09 47 ## 10 P-10 42 We will use the site() LEFT JOIN method to merge the data into the SoilProfileCollection. site(ohz) <- ohz_thickness Now, let’s plot the profiles in order of cumulative O horizon thickness. We draw lines at 20 and 40cm to indicate the thresholds for histic epipedon and Histosols soil order: plotSPC(ohz, plot.order = order(ohz$O_thickness)) abline(h = c(20, 40), lty = 2) Using the object ohz object we just inspected, answer the following questions using techniques from the previous sections. Check your logic by comparing to the plot above. Check if any soil organic carbon values are NA. Make a profile sketch (plotSPC()) using organic carbon percentage (\"soc\") to color the profiles. Then calculate a new column using the function is.na() and use that to color the profiles. Which profiles have missing data? In which horizons? Tabulate unique horizon designations (ohz$name). How many of each horizon designation are present? Use regular expressions to count the number of Cg horizons in the collection. Filter the ohz object using aqp::subset() to select pedons where O_thickness is greater than 20 and less than 40. This is the histic epipedon thickness requirement. How many pedons have a histic epipedon? Filter the ohz object using aqp::subset() to select pedons where O_thickness is greater than 40. This is the Histosols order thickness requirement. How many pedons are Histosols? Submit an .R script containing code used to answer 1 through 5 to your mentor. 2.8 fetchNASIS() data checks fetchNASIS() does a lot of the hard work for you by pulling out a variety of child tables and joining them to site/horizon tables This results in a SoilProfileCollection object that has many of the NASIS data columns. In order to do this, a variety of processes are run. Output is generated that you should look at. We will walk through the most common parts. Quality control and limited “filling” of fragments, horizon depth data, site data, tables replacing missing lower horizon depths with top depth + 1cm ... [19 horizons] -> QC: horizon errors detected: Use `get('bad.pedon.ids', envir=soilDB.env)` for pedon record IDs (peiid) Use `get('bad.horizons', envir=soilDB.env)` for horizon designations -> QC: pedons missing bottom hz depths: Use `get('missing.bottom.depths', envir=soilDB.env)` for pedon record IDs (peiid) Notes about default settings and handling of NULL (missing data elements or records) NOTE: some records are missing surface fragment cover NOTE: some records are missing rock fragment volume 2.8.1 Inspecting Results We will analyze occurrence of andic soil properties in pedons from MT647. We will download this “selected set” from the course website from an .rda file to save you the effort of crafting your selected set just for this example. Downloading and installing the .rda is equivalent to NASIS query SSRO_Northwest: _PedonPC_Plus_DataDump_select for User Site ID: %MT647%, NASIS Site: SSRO_Northwest, and NASIS Group: NW-MIS Point Data. After populating your NASIS selected set mt647 is created in R with mt647 <- fetchNASIS(). 2.8.1.1 Load Example Data To load the sample object data into R, just use load() and the path to the .rda file. In this case we are using a remote path, so we use url() to open the connection: load(url("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt647.rda")) length(mt647) ## [1] 481 table(site(mt647)$andic.soil.properties, useNA = "ifany") ## ## FALSE TRUE <NA> ## 2 83 396 # get just the profiles with andic.soil.properties == TRUE subset(mt647, andic.soil.properties) ## SoilProfileCollection with 83 profiles and 446 horizons ## profile ID: peiid | horizon ID: phiid ## Depth range: 20 - 305 cm ## ## ----- Horizons (6 / 446 rows | 10 / 77 columns) ----- ## peiid phiid hzdept hzdepb hzname texture pedon_id dspcomplayerid bounddistinct boundtopo ## 828140 4005861 0 2 Oe <NA> P23-134 <NA> <NA> <NA> ## 828140 4005863 2 13 E CBV-L P23-134 <NA> clear smooth ## 828140 4005859 13 23 Bs1 CBV-L P23-134 <NA> clear smooth ## 828140 4005862 23 33 Bs2 CBV-L P23-134 <NA> gradual smooth ## 828140 4005864 33 69 BC GRX-FSL P23-134 <NA> gradual smooth ## 828140 4005860 69 152 2C GRX-FSL P23-134 <NA> <NA> <NA> ## [... more horizons ...] ## ## ----- Sites (6 / 83 rows | 10 / 132 columns) ----- ## siteiid peiid ecositeid ecositenm ecositecorrdate es_classifier siteecositehistory.classifier es_selection_method upedonid ## 845415 828140 <NA> <NA> <NA> <NA> <NA> <NA> P23-134 ## 845429 828152 <NA> <NA> <NA> <NA> <NA> <NA> P92-052 ## 845430 828153 <NA> <NA> <NA> <NA> <NA> <NA> P92-046 ## 845432 828155 <NA> <NA> <NA> <NA> <NA> <NA> P93-053 ## 845434 828157 <NA> <NA> <NA> <NA> <NA> <NA> P91-103 ## 845451 828176 <NA> <NA> <NA> <NA> <NA> <NA> P89-011 ## siteobsiid ## 821442 ## 821456 ## 821457 ## 821459 ## 821461 ## 821478 ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] We can compare this to what we see in the NASIS Pedon Diagnostic Features table: Any profiles that have have logic errors detected are stored in soilDB.env bad.pedon.ids variable after you run fetchNASIS. If this variable does not exist either you have not run fetchNASIS() in the current session or there are no errors # these are the troublesome user pedon IDs get('bad.pedon.ids', envir = soilDB.env) ## [1] "P93-037" "P90-008" "P90-004" "P90-009" "P93-058" "P93-059" "P90-025" "P90-002" "P90-012" "P92-001" "P92-085" "P90-019" ## [13] "P90-010" "P90-015" "P91-094" "P92-029" "P92-076" "P93-026" "P93-035" "P93-063" "P93-064" "P93-041" "P93-043" "P93-044" ## [25] "P93-083" "P93-112" "P93-113" "P93-124" "P93-001" "P96-007" "P91-025" "P93-078" "P92-044" "P91-112" "P92-038" "P90-018" ## [37] "P93-057" "P93-084" "P90-016" "P92-063" "P92-048" "P93-052" "F01-230" "F95-420" "F95-114" "F96-205" "P75-006" "P91-105" ## [49] "P91-059" # rmHzErrors=TRUE removes the "bad" illogical pedons any(mt647$upedonid %in% get('bad.pedon.ids', envir=soilDB.env)) ## [1] FALSE When fetchNASIS(..., rmHzErrors = TRUE) (the default), any horizons that were omitted from the SoilProfileCollection will be stored in the bad.horizons variable in the soilDB.env environment. head(get('bad.horizons', envir=soilDB.env)) ## peiid phiid upedonid hzname hzdept hzdepb ## 67 868038 4270406 F01-230 E NA NA ## 68 868038 4270407 F01-230 Bw NA NA ## 95 868072 4270514 F95-114 <NA> NA NA ## 99 868048 4270437 F95-420 <NA> NA NA ## 111 868074 4270519 F96-205 B NA NA ## 112 868074 4270521 F96-205 C NA NA 2.8.1.2 Logic Checks for the SoilProfileCollection The aqp package has several functions that do logic checks on SoilProfileCollection objects. The main method that does this in aqp is checkHzDepthLogic() which returns a data.frame of results of running four logic tests on the horizon data from each profile. Checks for: bottom depths less than top depth / bad top depth order (\"depthLogic\") bottom depths equal to top depth (\"sameDepth\") overlaps and gaps (\"overlapOrGap\") missing depths (\"missingDepth\") logic_tests <- checkHzDepthLogic(mt647err) # look at first few (look OK; valid == TRUE) head(logic_tests) ## peiid valid depthLogic sameDepth missingDepth overlapOrGap ## 1 828138 TRUE FALSE FALSE FALSE FALSE ## 2 828139 TRUE FALSE FALSE FALSE FALSE ## 3 828140 TRUE FALSE FALSE FALSE FALSE ## 4 828141 TRUE FALSE FALSE FALSE FALSE ## 5 828142 TRUE FALSE FALSE FALSE FALSE ## 6 828143 TRUE FALSE FALSE FALSE FALSE # these all have overlapOrGap errors head(logic_tests[!logic_tests$valid, ]) ## peiid valid depthLogic sameDepth missingDepth overlapOrGap ## 11 828148 FALSE FALSE FALSE FALSE TRUE ## 23 828160 FALSE FALSE FALSE FALSE TRUE ## 25 828162 FALSE FALSE FALSE FALSE TRUE ## 34 828171 FALSE FALSE FALSE FALSE TRUE ## 35 828172 FALSE FALSE FALSE FALSE TRUE ## 36 828173 FALSE FALSE FALSE FALSE TRUE # join the logic test data into the site table site(mt647err) <- logic_tests Use the $valid vector in result to filter out profiles with missing depths (logic_tests$valid == FALSE) bad.profiles <- subset(mt647err, !valid) bad.profiles ## SoilProfileCollection with 49 profiles and 338 horizons ## profile ID: peiid | horizon ID: phiid ## Depth range: 15 - 152 cm ## ## ----- Horizons (6 / 338 rows | 10 / 77 columns) ----- ## peiid phiid hzdept hzdepb hzname texture pedon_id dspcomplayerid bounddistinct boundtopo ## 828148 4005908 0 3 Oe <NA> P93-037 <NA> <NA> <NA> ## 828148 4005907 3 5 Oi <NA> P93-037 <NA> <NA> <NA> ## 828148 4005905 5 15 E CB-FSL P93-037 <NA> clear smooth ## 828148 4005911 15 23 Bs CB-SIL P93-037 <NA> abrupt smooth ## 828148 4005909 23 25 2E CBV-FSL P93-037 <NA> clear smooth ## 828148 4005910 25 58 2B CBV-FSL P93-037 <NA> gradual smooth ## [... more horizons ...] ## ## ----- Sites (6 / 49 rows | 10 / 137 columns) ----- ## peiid siteiid ecositeid ecositenm ecositecorrdate es_classifier siteecositehistory.classifier es_selection_method upedonid ## 828148 845423 <NA> <NA> <NA> <NA> <NA> <NA> P93-037 ## 828160 845435 <NA> <NA> <NA> <NA> <NA> <NA> P90-008 ## 828162 845437 <NA> <NA> <NA> <NA> <NA> <NA> P90-004 ## 828171 845446 <NA> <NA> <NA> <NA> <NA> <NA> P90-009 ## 828172 845447 <NA> <NA> <NA> <NA> <NA> <NA> P93-058 ## 828173 845448 <NA> <NA> <NA> <NA> <NA> <NA> P93-059 ## siteobsiid ## 821450 ## 821462 ## 821464 ## 821473 ## 821474 ## 821475 ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] And also filter out the valid ones (logic_tests$valid == TRUE) good.profiles <- subset(mt647err, logic_tests$valid) good.profiles ## SoilProfileCollection with 481 profiles and 2536 horizons ## profile ID: peiid | horizon ID: phiid ## Depth range: 14 - 1552 cm ## ## ----- Horizons (6 / 2536 rows | 10 / 77 columns) ----- ## peiid phiid hzdept hzdepb hzname texture pedon_id dspcomplayerid bounddistinct boundtopo ## 828138 4005848 0 5 O <NA> P91-043 <NA> <NA> <NA> ## 828138 4005852 5 18 E GR-L P91-043 <NA> clear smooth ## 828138 4005850 18 38 Bw1 GRV-L P91-043 <NA> gradual wavy ## 828138 4005849 38 51 Bw2 CBV-FSL P91-043 <NA> gradual wavy ## 828138 4005853 51 71 BC CBV-SL P91-043 <NA> clear wavy ## 828138 4005851 71 81 R <NA> P91-043 <NA> <NA> <NA> ## [... more horizons ...] ## ## ----- Sites (6 / 481 rows | 10 / 137 columns) ----- ## peiid siteiid ecositeid ecositenm ecositecorrdate es_classifier siteecositehistory.classifier es_selection_method upedonid ## 828138 845413 <NA> <NA> <NA> <NA> <NA> <NA> P91-043 ## 828139 845414 <NA> <NA> <NA> <NA> <NA> <NA> P91-029 ## 828140 845415 <NA> <NA> <NA> <NA> <NA> <NA> P23-134 ## 828141 845416 <NA> <NA> <NA> <NA> <NA> <NA> P93-025 ## 828142 845417 <NA> <NA> <NA> <NA> <NA> <NA> P93-075 ## 828143 845418 <NA> <NA> <NA> <NA> <NA> <NA> P93-074 ## siteobsiid ## 821440 ## 821441 ## 821442 ## 821443 ## 821444 ## 821445 ## [... more sites ...] ## ## Spatial Data: ## [EMPTY] 2.9 Extended Data Functions Additional data related to both site and horizon information can be fetched using the get_extended_data_from_NASIS() function. This function returns a named list() with several tables that fetchNASIS draws from–in addition to the typical Site/Pedon/Component/Horizon tables. There are a variety of calculated fields that are included in the default fetchNASIS result based on the extended data–you can make use of these to simplify queries and aggregations for a variety of analyses… And then follow up with more detailed data as needed. 2.9.1 Elements of get_extended_data_from_NASIS() Ecological Site History (\"ecositehistory\") Diagnostic Features (\"diagnostic\") Diagnostic Feature TRUE/FALSE Summary (\"diagHzBoolean\") Restrictions (\"restriction\") Fragment and Texture Summaries Horizon Fragments (\"frag_summary\") Horizon Artifacts (\"art_summary\") Surface Fragments (\"surf_frag_summary\") Texture Class Modifiers (\"texmodifier\") Geomorphic Table Summaries (\"geomorph\") Parent Material Summaries (\"pm\") Taxonomic History (\"taxhistory\") Site Text Notes w/ Photo links(\"photo\") Horizon Structure (\"struct\") Horizon Designation (\"hzdesgn\") 2.9.2 Load Example Data Below is a summary of additional information that can be readily brought into R from your NASIS selected set via the get_extended_data_from_NASIS() function. Before continuing, imagine opening the NASIS client, populating your selected set with 2015MT663% using a query like “NSSC Pangaea – POINT-Pedon/Site by User Pedon ID” Load the data like we did above. load(url("https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/book/02/mt663.rda")) ## fetch extended site and horizon data from local NASIS # mt663ext <- get_extended_data_from_NASIS_db() We could use the get_extended_data_from_NASIS_db() function if 2015MT663% or other data were in the selected set, but we will use the mt663ext data we loaded from the .rda file. The column names are the names of variables that you could join to your site or horizon data by various means. Generally these variable names, with a few exceptions, mirror the NASIS 7 data model names. # site and pedon related extended data # list all dataframes in the extended data str(mt663ext, 1) ## List of 14 ## $ ecositehistory:'data.frame': 0 obs. of 7 variables: ## $ siteaoverlap :'data.frame': 127 obs. of 5 variables: ## $ diagnostic :'data.frame': 292 obs. of 4 variables: ## $ diagHzBoolean :'data.frame': 115 obs. of 20 variables: ## $ restriction :'data.frame': 11 obs. of 8 variables: ## $ frag_summary :'data.frame': 561 obs. of 18 variables: ## $ art_summary :'data.frame': 561 obs. of 14 variables: ## $ texmodifier :'data.frame': 622 obs. of 5 variables: ## $ geomorph :'data.frame': 241 obs. of 9 variables: ## $ taxhistory :'data.frame': 115 obs. of 23 variables: ## $ photo :'data.frame': 793 obs. of 4 variables: ## $ pm :'data.frame': 179 obs. of 9 variables: ## $ struct :'data.frame': 444 obs. of 6 variables: ## $ hzdesgn :'data.frame': 561 obs. of 19 variables: # vegetation data summary colnames(mt663ext$ecositehistory) ## [1] "siteiid" "ecositeid" "ecositenm" "ecositecorrdate" ## [5] "es_classifier" "siteecositehistory.classifier" "es_selection_method" # diagnostic features colnames(mt663ext$diagnostic) ## [1] "peiid" "featkind" "featdept" "featdepb" # surface rock fragments colnames(mt663ext$surf_frag_summary) ## NULL # geomorphic description colnames(mt663ext$geomorph) ## [1] "peiid" "geomicrorelief" "geommicelev" "geomfmod" "geomfname" "geomfeatid" "existsonfeat" ## [8] "geomfiidref" "geomftname" # taxonomic history data colnames(mt663ext$taxhistory) ## [1] "peiid" "classdate" "classifier" "classtype" "taxonname" "localphase" ## [7] "taxonkind" "seriesstatus" "taxclname" "taxpartsize" "taxorder" "taxsuborder" ## [13] "taxgrtgroup" "taxsubgrp" "soiltaxedition" "osdtypelocflag" "taxmoistcl" "taxtempregime" ## [19] "taxfamother" "taxreaction" "taxfamhahatmatcl" "psctopdepth" "pscbotdepth" # linked photo stored in site textnotes colnames(mt663ext$photo) ## [1] "siteiid" "recdate" "textcat" "imagepath" # site parent materials colnames(mt663ext$pm) ## [1] "siteiid" "seqnum" "pmorder" "pmdept" "pmdepb" "pmmodifier" "pmgenmod" "pmkind" "pmorigin" ### ### horizon related extended data ### # rock fragments colnames(mt663ext$frag_summary) ## [1] "phiid" "fine_gravel" "gravel" "cobbles" "stones" ## [6] "boulders" "channers" "flagstones" "parafine_gravel" "paragravel" ## [11] "paracobbles" "parastones" "paraboulders" "parachanners" "paraflagstones" ## [16] "unspecified" "total_frags_pct_nopf" "total_frags_pct" # soil texture modifers colnames(mt663ext$texmodifier) ## [1] "peiid" "phiid" "phtiid" "seqnum" "texmod" # soil structure data colnames(mt663ext$struct) ## [1] "phiid" "structgrade" "structsize" "structtype" "structid" "structpartsto" 2.9.3 Visualizing Common Landforms The following code generates a simple graphical summary of the 10 most commonly occurring \"landform_string\" (a calculated field in fetchNASIS()) to inspect which are the most common. # load data from a NASIS selected set (or sample object) pedons <- mt663 # create 'lf' object of landform factors sorted in descending order lf <- sort(table(pedons$landform_string), decreasing = TRUE) # plot top 10 or length, whichever is shorter Hmisc::dotchart2(lf[1:pmin(10, length(lf))], col = 'black', xlim = c(0, max(lf)), cex.labels = 0.75) For a challenge and to further inspect your own data try the above code with some other summaries of geomorphic data produced by fetchNASIS(). You can swap landform_string for: landscape_string (landscape), hillslopeprof (2D), geomposmntn, geomposhill, geompostrce, geomposflats (3D), slope_shape, shapeacross, shapedown (slope shape across/down), microfeature_string (microfeature), or geomicrorelief_string (site observation microrelief). 2.9.4 Diagnostic Features 2.9.4.1 Boolean Diagnostic Features in fetchNASIS If diagnostic features are populated in the Pedon Diagnostic Features table in NASIS, then Boolean (TRUE or FALSE, or “logical”) fields are created for each diagnostic feature type found in the data brought in by fetchNASIS. These fields can be used to model presence / absence of a diagnostic soil feature by extracting the site data from the SoilProfileCollection with site(). 2.9.4.2 Thickness from Diagnostic Features Table The following is an example of how you could use the diagnostic features (if populated!) from the extended data to determine the thickness of a diagnostic feature of interest. # get diagnostic features associated with pedons loaded from selected set d <- diagnostic_hz(mt663) # summary of the diagnostic features in your data! unique(d$featkind) ## [1] "ochric epipedon" "cambic horizon" "lithic contact" "mollic epipedon" ## [5] "argillic horizon" "redox concentrations" "andic soil properties" "secondary carbonates" ## [9] "sapric soil materials" "aquic conditions" "reduced matrix" "albic horizon" ## [13] "spodic horizon" "glossic horizon" "spodic materials" "lithologic discontinuity" ## [17] "densic materials" "umbric epipedon" "albic materials" NA # tabulate sort(table(droplevels(factor(d$featkind))), decreasing = TRUE) ## ## ochric epipedon cambic horizon argillic horizon mollic epipedon andic soil properties ## 61 54 43 42 30 ## lithic contact secondary carbonates umbric epipedon albic horizon spodic horizon ## 20 7 7 6 4 ## glossic horizon reduced matrix sapric soil materials lithologic discontinuity albic materials ## 3 3 3 2 1 ## aquic conditions densic materials redox concentrations spodic materials ## 1 1 1 1 # subset argillic horizons d <- d[d$featkind == 'argillic horizon', ] # create a new column and subtract the upper from the lower depth d$argillic_thickness_cm <- d$featdepb - d$featdept # create another new column with the upper depth to the diagnostic feature d$depth_to_argillic_cm <- d$featdept # omit NA values d <- na.omit(d) # subset to pedon records IDs and calculated thickness d <- d[, c('peiid', 'argillic_thickness_cm', 'depth_to_argillic_cm')] head(d) ## peiid argillic_thickness_cm depth_to_argillic_cm ## 7 1092610 56 30 ## 24 1092617 38 34 ## 26 1092618 29 23 ## 28 1092619 38 32 ## 30 1092620 29 24 ## 33 1092621 23 19 # left-join with existing site data site(mt663) <- d # plot as histogram par(mar = c(4.5, 4.5, 1, 1)) # note additional arguments to adjust figure labels hist( mt663$argillic_thickness_cm, xlab = 'Thickness of argillic (cm)', main = '', las = 1 ) hist( mt663$depth_to_argillic_cm, xlab = 'Depth to argillic top depth (cm)', main = '', las = 1 ) Quick check: What can you do with the boolean diagnostic feature data stored in the site table of a fetchNASIS() SoilProfileCollection? 2.9.4.3 Diagnostic Feature Diagrams # work up diagnostic plot based on the mt663 dataset loaded above library(aqp) library(soilDB) library(sharpshootR) # can limit which diagnostic features to show by setting 'v' manually v <- c('ochric.epipedon', 'mollic.epipedon', 'andic.soil.properties', 'argillic.horizon', 'cambic.horizon', 'lithic.contact') # the default concatenated landform_string may have multiple levels # depending on how the geomorphic tables were populated # these are concatenated using the ampersand (&) character # so take the first string split using ampersand as a delimiter mt663$first_landform <- sapply(strsplit(mt663$landform_string, "&"), function(x) x[[1]]) # plot with diagnostic features ordered according to co-occurrence # v: site-level attributes to consider # k: number of clusters to identify diagnosticPropertyPlot( mt663[1:30, ], v = v, k = 5, grid.label = 'usiteid', dend.label = 'first_landform', sort.vars = TRUE ) 2.10 Exercise 3: Diagnostic Horizons in Your Own Data Use the following script to generate a diagnostic-feature diagram for the pedon data you’ve loaded from your NASIS selected set. Alternately, you may use the MT663 data from the example above, just substitute the object mt663 for f. You can select a subset of desired diagnostic properties or use all diagnostic feature columns. library(aqp) library(soilDB) library(sharpshootR) # Load data f <- fetchNASIS(from = 'pedons') # ... May need to use subset() to reduce the number of pedons! # get all diagnostic feature columns from site data # by pattern matching on '[.]' in the site attribute names # this is not a generic rule, but works here idx <- grep('[.]', siteNames(f)) v <- siteNames(f)[idx] # inspect v v # insert diagnostics of interest from the possible list in 'v' v <- c('ochric.epipedon', 'cambic.horizon', 'argillic.horizon', 'paralithic.contact', 'lithic.contact') # generate diagnostic property diagram diagnosticPropertyPlot( f, v = v, k = 5, grid.label = 'usiteid', dend.label = 'taxonname' ) For more information on generating diagnostic feature diagrams, see the following tutorial: Diagnostic Feature Property Plots. Questions: Use the results of site(), horizons(), diagnostic_hz() to answer the following questions about your own data. These functions return data.frame objects from a SoilProfileCollection derived from your local NASIS data. How many pedons do you have in your selected set? Check the number of rows in the site portion of the SoilProfileCollection with nrow(), or use the method length() on the collection. How many diagnostic features do you have for those pedons? How many different \"featkind\"? You can calculate the number of unique values with with length() and unique() Interpret: What diagnostic features did you choose to plot? Did you notice any patterns in the diagnostic features that tend to occur together? Send your mentor a copy of your results and the commands you used. 2.11 Custom Queries to Local NASIS Database fetchNASIS() and related convenience functions are wrappers around commonly used chunks of SQL (Structured Query Language). Queries of the NASIS local database can be written in T-SQL which is the dialect of SQL used to communicate with Microsoft SQL Server. This is the connection that you set for the pre-course. To create a DBIConnection object that can access the NASIS local database, use dbConnectNASIS() or simply NASIS(). This will look for an ODBC connection of the name \"nasis_local\" and will authenticate with the read-only credentials. You can also pass an existing DBIConnection or path to SQLite file as the dsn argument to connect to an alternate source. The default driver type used for NASIS connections is OdbcConnection from the odbc package. To query or execute SQL commands on a connection you created, you can use dbGetQuery(connection, query), where connection is your DBIConnection object and query is the SQL to execute. The soilDB package also includes a helper function dbQueryNASIS(), which functions just like dbGetQuery() except the default is to close the connection after returning the result. This can be convenient for interactive use or cases where a function needs to only execute a single query, as it will prevent you from leaving connections open accidentally. 2.11.1 Example: Site Soil Temperature Data from CA792 (Sequoia-Kings Canyon National Park) The following example will return all records in your selected set sitesoiltemp table, along with a couple of fields from the site, siteobs, and pedon tables. This is a convenient way to collect all of the field-based soil temperature data associated with the pedons in your selected set for further analysis. You can use the CA792 (Sequoia-Kings Canyon National Park) pedons as an example. Use a query that searches user pedon ID for the following pattern %CA792% to download and populate a selected set in the NASIS client. library(soilDB) # write query as a character string q <- "SELECT siteiid as siteiid, peiid, usiteid, obsdate, soitemp, soitempdep FROM site_View_1 INNER JOIN siteobs_View_1 ON site_View_1.siteiid = siteobs_View_1.siteiidref LEFT OUTER JOIN sitesoiltemp_View_1 ON siteobs_View_1.siteobsiid = sitesoiltemp_View_1.siteobsiidref LEFT OUTER JOIN pedon_View_1 ON siteobs_View_1.siteobsiid = pedon_View_1.siteobsiidref ORDER BY obsdate, siteiid;" # setup connection to local NASIS channel <- NASIS() # exec query d <- dbQueryNASIS(channel, q) The functions dbConnectNASIS() (alias NASIS()) and dbQueryNASIS() allow you to create a connection to the NASIS local database and send queries to that connection, respectively. By default, dbQueryNASIS() will close your connection after completing the query; you can change this by setting close=FALSE. # check results str(d) # remove records missing values d <- na.omit(d) # tabulate unique soil depths table(d$soitempdep) # extract doy of year d$doy <- as.integer(format(d$obsdate, "%j")) # when where measurements collected? hist( d$doy, xlim = c(1, 366), las = 1, main = 'Soil Temperature Measurements', xlab = 'Day of Year' ) # soil temperature by day of year plot( soitemp ~ doy, data = d, main = 'Soil Temperature Measurements (CA792)\\nNASIS "Site Soil Temperature" table', type = 'p', pch = 21, bg = 'royalblue', xlim = c(1, 366), ylim = c(-1, 26), xlab = 'Day of Year', ylab = 'Soil Temperature at 50cm (deg C)', las = 1 ) # vernal equinox, summer solstice, autumnal equinox, winter solstice x <- as.Date(c('2022-03-20', '2022-06-21', '2022-09-23', '2022-12-21')) # convert dates -> Julian date, or day-of-year doy <- as.integer(format(x, "%j")) # add vertical lines abline(v = doy, lty = 3, col = grey(0.45)) # annotate # pos argument: left-center offset text( x = doy, y = -1, labels = c('vernal equinox', 'summer solstice', 'autumnal equinox', 'winter solstice'), pos = 2, cex = 0.75, font = 3 ) # box/whisker plot showing distribution of day-of-year # when measurements (pedon descriptions) were collected boxplot(d$doy, at = 26, horizontal = TRUE, add = TRUE, lty = 1, width = 1, col = 'white', axes = FALSE) + 2.12 Exercise 4: Generalized Horizons with Loafercreek Here we will introduce the concept of using regular expressions to apply “Generalized Horizon Labels” based on the field soil description horizon designations. This demonstrates one way of grouping horizon data for determining the Range in Characteristics of layers within a Soil Series or a SSURGO component. Generalized Horizon Labels with Loafercreek For the exercise during class, we will give you some time to read over the materials and apply the process to the sample loafercreek data. The code to apply the process to loafercreek is given. Then we ask that you apply a similar process to your own data, adjusting your generalized horizon patterns as needed for your local soils. This may take more time than we have during class itself, so you should follow up as needed with your mentor to complete the exercise. Chapter 3 Exploratory Data Analysis will get deeper into some of the topics that are referenced in the loafercreek code, such as summary statistics on grouped data. You will send a table and profile plots to your mentor when you are done. This tutorial gives some further discussion of generalized horizon labels to order profiles based on horizon level properties. Pair-Wise Distances by Generalized Horizon Labels tutorial "],["eda.html", "Chapter 3 Exploratory Data Analysis 3.1 Objectives (Exploratory Data Analysis) 3.2 Statistics 3.3 Data Inspection 3.4 Exercise 1: Fetch and Inspect 3.5 Descriptive Statistics 3.6 Exercise 2: Compute Descriptive Statistics 3.7 Graphical Methods 3.8 Exercise 3: Graphical Methods 3.9 Transformations 3.10 The Shiny Package 3.11 Exercise 4: Using the North Central Region Web App 3.12 soilReports 3.13 Exercise 5: Run Lab Summary By Taxon Name Soil Report 3.14 Exercise 6: Run Shiny Pedon Summary 3.15 Exercise 7: Run Mapunit Comparison 3.16 Additional Reading (Exploratory Data Analysis)", " Chapter 3 Exploratory Data Analysis Before embarking on developing statistical models and generating predictions, it is essential to understand your data. This is typically done using conventional numerical and graphical methods. John Tukey ((Tukey 1977)) advocated the practice of exploratory data analysis (EDA) as a critical part of the scientific process. “No catalog of techniques can convey a willingness to look for what can be seen, whether or not anticipated. Yet this is at the heart of exploratory data analysis. The graph paper and transparencies are there, not as a technique, but rather as a recognition that the picture examining eye is the best finder we have of the wholly unanticipated.” Fortunately, we can dispense with the graph paper and transparencies and use software that makes routine work of developing the ‘pictures’ (i.e., graphical output) and descriptive statistics needed to explore our data. NASIS has an abundance of tabular soils data captured within it, dating back in some cases as far as 1975. These records capture a large amount of raw information about our soil series and map unit component concepts. In many cases, the data are not as clear to interpret or detailed as we would like. This chapter will demonstrate ways to characterize a variety of different data types. 3.1 Objectives (Exploratory Data Analysis) Review methods for estimating Low, RV, and High values Review different methods for visualizing soil data Review data transformations 3.2 Statistics Descriptive statistics include: Mean - arithmetic average Median - middle value Mode - most frequent value Standard Deviation - variation around the mean Interquartile Range - range encompasses 50% of the values Kurtosis - peakedness of the data distribution Skewness - symmetry of the data distribution Graphical methods include: Histogram - a bar plot where each bar represents the frequency of observations for a given range of values Density estimation - an estimation of the frequency distribution based on the sample data Quantile-quantile plot - a plot of the actual data values against a normal distribution Box plots - a visual representation of median, quartiles, symmetry, skewness, and outliers Scatter plots - a graphical display of one variable plotted on the x axis and another on the y axis Radial plots - plots formatted for the representation of circular data 3.3 Data Inspection Before you start an EDA, you should inspect your data and correct all typos and blatant errors. EDA can then be used to identify additional errors such as outliers and help you determine the appropriate statistical analyses. For this chapter we’ll use the loafercreek dataset from the CA630 Soil Survey Area. library(dplyr) # Load from the the loakercreek dataset data("loafercreek", package = "soilDB") # Extract the horizon table h <- aqp::horizons(loafercreek) # Construct generalized horizon designations n <- c("A", "BAt", "Bt1", "Bt2", "Cr", "R") # REGEX rules p <- c("A", "BA|AB", "Bt|Bw", "Bt3|Bt4|2B|C", "Cr", "R") # Compute genhz labels and add to loafercreek dataset h$genhz <- aqp::generalize.hz(h$hzname, n, p) # Examine genhz vs hznames (wide format) table(h$genhz, h$hzname) ## ## 2BC 2BCt 2Bt1 2Bt2 2Bt3 2Bt4 2Bt5 2CB 2CBt 2Cr 2Crt 2R A A1 A2 AB ABt Ad Ap B BA BAt BC BCt Bt Bt1 Bt2 Bt3 Bt4 Bw Bw1 ## A 0 0 0 0 0 0 0 0 0 0 0 0 97 7 7 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ## BAt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 31 8 0 0 0 0 0 0 0 0 0 ## Bt1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 8 93 88 0 0 10 2 ## Bt2 1 1 3 8 8 6 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 16 0 0 0 47 8 0 0 ## Cr 0 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## R 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## not-used 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ## ## Bw2 Bw3 C CBt Cd Cr Cr/R Crt H1 Oi R Rt ## A 0 0 0 0 0 0 0 0 0 0 0 0 ## BAt 0 0 0 0 0 0 0 0 0 0 0 0 ## Bt1 2 1 0 0 0 0 0 0 0 0 0 0 ## Bt2 0 0 6 6 1 0 0 0 0 0 0 0 ## Cr 0 0 0 0 0 49 0 20 0 0 0 0 ## R 0 0 0 0 0 0 1 0 0 0 40 1 ## not-used 0 0 0 0 0 0 0 0 1 24 0 0 # Examine matching pairs (long format) h %>% group_by(genhz, hzname) %>% count() ## # A tibble: 43 × 3 ## # Groups: genhz, hzname [43] ## genhz hzname n ## <fct> <chr> <int> ## 1 A A 97 ## 2 A A1 7 ## 3 A A2 7 ## 4 A Ad 1 ## 5 A Ap 1 ## 6 BAt AB 1 ## 7 BAt BA 31 ## 8 BAt BAt 8 ## 9 Bt1 ABt 2 ## 10 Bt1 Bt 8 ## # ℹ 33 more rows As noted in Chapter 1, a visual examination of the raw data is possible by clicking on the dataset in the environment tab, or via commandline: View(h) This view is fine for a small dataset, but can be cumbersome for larger ones. The summary() function can be used to quickly summarize a dataset however, even for our small example dataset, the output can be voluminous. Therefore in the interest of saving space we’ll only look at a sample of columns. h %>% select(genhz, claytotest, total_frags_pct, phfield, effclass) %>% summary() ## genhz claytotest total_frags_pct phfield effclass ## A :113 Min. :10.00 Min. : 0.00 Min. :4.90 Length:626 ## BAt : 40 1st Qu.:18.00 1st Qu.: 0.00 1st Qu.:6.00 Class :character ## Bt1 :206 Median :22.00 Median : 5.00 Median :6.30 Mode :character ## Bt2 :118 Mean :23.63 Mean :13.88 Mean :6.18 ## Cr : 75 3rd Qu.:28.00 3rd Qu.:20.00 3rd Qu.:6.50 ## R : 48 Max. :60.00 Max. :95.00 Max. :7.00 ## not-used: 26 NA's :167 NA's :381 The summary() function is known as a generic R function. It will return a preprogrammed summary for any R object. Because h is a data frame, we get a summary of each column. Factors will be summarized by their frequency (i.e., number of observations), while numeric or integer variables will print out a five number summary, and characters simply print their length. The number of missing observations for any variable will also be printed if they are present. If any of these metrics look unfamiliar to you, don’t worry we’ll cover them shortly. When you do have missing data and the function you want to run will not run with missing values, the following options are available: Exclude all rows or columns that contain missing values using the function na.exclude(), such as h2 <- na.exclude(h). However this can be wasteful because it removes all rows (e.g., horizons), regardless if the row only has 1 missing value. Instead it’s sometimes best to create a temporary copy of the variable in question and then remove the missing variables, such as claytotest <- na.exclude(h$claytotest). Replace missing values with another value, such as zero, a global constant, or the mean or median value for that column, such as h$claytotest <- ifelse(is.na(h$claytotest), 0, h$claytotest) # or h[is.na(h$claytotest), ] <- 0. Read the help file for the function you’re attempting to use. Many functions have additional arguments for dealing with missing values, such as na.rm. A quick check for typos would be to examine the list of levels for a factor or character, such as: # just for factors levels(h$genhz) ## [1] "A" "BAt" "Bt1" "Bt2" "Cr" "R" "not-used" # for characters and factors sort(unique(h$hzname)) ## [1] "2BC" "2BCt" "2Bt1" "2Bt2" "2Bt3" "2Bt4" "2Bt5" "2CB" "2CBt" "2Cr" "2Crt" "2R" "A" "A1" "A2" "AB" "ABt" "Ad" ## [19] "Ap" "B" "BA" "BAt" "BC" "BCt" "Bt" "Bt1" "Bt2" "Bt3" "Bt4" "Bw" "Bw1" "Bw2" "Bw3" "C" "CBt" "Cd" ## [37] "Cr" "Cr/R" "Crt" "H1" "Oi" "R" "Rt" If the unique() function returned typos such as “BT” or “B t”, you could either fix your original dataset or you could make an adjustment in R, such as: h$hzname <- ifelse(h$hzname == "BT", "Bt", h$hzname) Typo errors such as these are a common problem with old pedon data in NASIS. 3.4 Exercise 1: Fetch and Inspect Create a new R script Load the gopheridge dataset found within the soilDB package or use your own data (highly encouraged) and inspect the dataset Apply the generalized horizon rules below or develop your own, see the following job-aid Summarize the hzdept, genhz, texture_class, sandtotest, and fine gravel. Save your R script, and forward to your instructor. # gopheridge rules n <- c('A', 'Bt1', 'Bt2', 'Bt3','Cr','R') p <- c('^A|BA$', 'Bt1|Bw','Bt$|Bt2', 'Bt3|CBt$|BCt','Cr','R') 3.5 Descriptive Statistics Table 3.1: Short Description of Descriptive Statistics and R Functions Parameter NASIS Description R function Mean RV ? arithmetic average mean() Weighted Mean RV weighted arithmetic average weighted.mean() Median RV middle value, 50% quantile median() Mode RV most frequent value sort(table(), decreasing = TRUE)[1] Standard Deviation L & H ? variation around mean sd() Quantiles L & H percent rank of values, such that all values are <= p quantile() 3.5.1 Measures of Central Tendency These measures are used to determine the mid-point of the range of observed values. In NASIS speak this should ideally be equivalent to the representative value (RV) for numeric and integer data. The mean and median are the most commonly used measures for our purposes. Mean - is the arithmetic average all are familiar with, formally expressed as: \\(\\bar{x} =\\frac{\\sum_{i=1}^{n}x_i}{n}\\) which sums ( \\(\\sum\\) ) all the X values in the sample and divides by the number (n) of samples. It is assumed that all references in this document refer to samples rather than a population. The mean clay content from the loafercreek dataset may be determined: mean(h$claytotest, na.rm = TRUE) ## [1] 23.62767 Median is the middle measurement of a sample set, and as such is a more robust estimate of central tendency than the mean. This is known as the middle or 50th quantile, meaning there are an equal number of samples with values less than and greater than the median. For example, assuming there are 21 samples, sorted in ascending order, the median would be the 11th sample. The median from the sample dataset may be determined: median(h$claytotest, na.rm = TRUE) ## [1] 22 Mode - is the most frequent measurement in the sample. The use of mode is typically reserved for factors, which we will discuss shortly. One issue with using the mode for numeric data is that the data need to be rounded to the level of desired precision. R does not include a function for calculating the mode, but we can calculate it using the following example. # sort and select the 1st value, which will be the mode sort(table(round(h$claytotest)), decreasing = TRUE)[1] ## 25 ## 42 Frequencies To summarize factors and characters we can examine their frequency or number of observations. This is accomplished using the table() or summary() functions. table(h$genhz) ## ## A BAt Bt1 Bt2 Cr R not-used ## 113 40 206 118 75 48 26 # or summary(h$genhz) ## A BAt Bt1 Bt2 Cr R not-used ## 113 40 206 118 75 48 26 This gives us a count of the number of observations for each horizon. If we want to see the comparison between two different factors or characters, we can include two variables. table(h$genhz, h$texcl) ## ## c cl l scl sic sicl sil sl ## A 0 0 78 0 0 0 27 6 ## BAt 0 2 31 0 0 1 4 1 ## Bt1 2 44 127 4 1 5 20 1 ## Bt2 16 54 29 5 1 3 5 0 ## Cr 1 0 0 0 0 0 0 0 ## R 0 0 0 0 0 0 0 0 ## not-used 0 1 0 0 0 0 0 0 # or h %>% count(genhz, texcl) ## genhz texcl n ## 1 A l 78 ## 2 A sil 27 ## 3 A sl 6 ## 4 A <NA> 2 ## 5 BAt cl 2 ## 6 BAt l 31 ## 7 BAt sicl 1 ## 8 BAt sil 4 ## 9 BAt sl 1 ## 10 BAt <NA> 1 ## 11 Bt1 c 2 ## 12 Bt1 cl 44 ## 13 Bt1 l 127 ## 14 Bt1 scl 4 ## 15 Bt1 sic 1 ## 16 Bt1 sicl 5 ## 17 Bt1 sil 20 ## 18 Bt1 sl 1 ## 19 Bt1 <NA> 2 ## 20 Bt2 c 16 ## 21 Bt2 cl 54 ## 22 Bt2 l 29 ## 23 Bt2 scl 5 ## 24 Bt2 sic 1 ## 25 Bt2 sicl 3 ## 26 Bt2 sil 5 ## 27 Bt2 <NA> 5 ## 28 Cr c 1 ## 29 Cr <NA> 74 ## 30 R <NA> 48 ## 31 not-used cl 1 ## 32 not-used <NA> 25 We can also add margin totals to the table or convert the table frequencies to proportions. # append the table with row and column sums addmargins(table(h$genhz, h$texcl)) ## ## c cl l scl sic sicl sil sl Sum ## A 0 0 78 0 0 0 27 6 111 ## BAt 0 2 31 0 0 1 4 1 39 ## Bt1 2 44 127 4 1 5 20 1 204 ## Bt2 16 54 29 5 1 3 5 0 113 ## Cr 1 0 0 0 0 0 0 0 1 ## R 0 0 0 0 0 0 0 0 0 ## not-used 0 1 0 0 0 0 0 0 1 ## Sum 19 101 265 9 2 9 56 8 469 # calculate the proportions relative to the rows, margin = 1 calculates for rows, margin = 2 calculates for columns, margin = NULL calculates for total observations table(h$genhz, h$texture_class) %>% prop.table(margin = 1) %>% round(2) * 100 ## ## br c cb cl gr l pg scl sic sicl sil sl spm ## A 0 0 0 0 0 70 0 0 0 0 24 5 0 ## BAt 0 0 0 5 0 79 0 0 0 3 10 3 0 ## Bt1 0 1 0 22 0 62 0 2 0 2 10 0 0 ## Bt2 0 14 1 46 2 25 1 4 1 3 4 0 0 ## Cr 97 2 0 0 2 0 0 0 0 0 0 0 0 ## R 100 0 0 0 0 0 0 0 0 0 0 0 0 ## not-used 0 0 0 4 0 0 0 0 0 0 0 0 96 To determine the mean by a group or category, use the group_by and summarize functions: h %>% group_by(genhz) %>% summarize(clay_avg = mean(claytotest, na.rm = TRUE), clay_med = median(claytotest, na.rm = TRUE)) ## # A tibble: 7 × 3 ## genhz clay_avg clay_med ## <fct> <dbl> <dbl> ## 1 A 16.2 16 ## 2 BAt 19.5 19 ## 3 Bt1 24.0 24 ## 4 Bt2 31.2 30 ## 5 Cr 15 15 ## 6 R NaN NA ## 7 not-used NaN NA 3.5.2 Measures of Dispersion These are measures used to determine the spread of values around the mid-point. This is useful to determine if the samples are spread widely across the range of observations or concentrated near the mid-point. In NASIS speak these values might equate to the low (L) and high (H) values for numeric and integer data. Variance is a positive value indicating deviation from the mean: \\(s^2 = \\frac{\\sum_{i=1}^{n}(x_i - \\bar{x})^2} {n - 1}\\) This is the square of the sum of the deviations from the mean, divided by the number of samples minus 1. It is commonly referred to as the sum of squares. As the deviation increases, the variance increases. Conversely, if there is no deviation, the variance will equal 0. As a squared value, variance is always positive. Variance is an important component for many statistical analyses including the most commonly referred to measure of dispersion, the standard deviation. Variance for the sample dataset is: var(h$claytotest, na.rm=TRUE) ## [1] 64.27607 Standard Deviation is the square root of the variance: \\(s = \\sqrt\\frac{\\sum_{i=1}^{n}(x_i - \\bar{x})^2} {n - 1}\\) The units of the standard deviation are the same as the units measured. From the formula you can see that the standard deviation is simply the square root of the variance. Standard deviation for the sample dataset is: sd(h$claytotest, na.rm = TRUE) ## [1] 8.017236 # or sqrt(var(h$claytotest, na.rm = TRUE)) ## [1] 8.017236 Coefficient of Variation (CV) is a relative (i.e., unitless) measure of standard deviation: \\(CV = \\frac{s}{\\bar{x}} \\times 100\\) CV is calculated by dividing the standard deviation by the mean and multiplying by 100. Since standard deviation varies in magnitude with the value of the mean, the CV is useful for comparing relative variation amongst different datasets. However Webster (2001) discourages using CV to compare different variables. Webster (2001) also stresses that CV is reserved for variables that have an absolute 0, like clay content. CV may be calculated for the sample dataset as: # remove NA values and create a new variable clay <- na.exclude(h$claytotest) sd(clay) / mean(clay) * 100 ## [1] 33.93156 Quantiles (a.k.a. Percentiles) - the percentile is the value that cuts off the first nth percent of the data values when sorted in ascending order. The default for the quantile() function returns the min, 25th percentile, median or 50th percentile, 75th percentile, and max, known as the five number summary originally proposed by Tukey. Other probabilities however can be used. At present the 5th, 50th, and 95th are being proposed for determining the range in characteristics (RIC) for a given soil property. quantile(h$claytotest, na.rm = TRUE) ## 0% 25% 50% 75% 100% ## 10 18 22 28 60 # or quantile(h$claytotest, probs = c(0.05, 0.5, 0.95), na.rm = TRUE) ## 5% 50% 95% ## 13.0 22.0 38.1 Thus, for the five number summary 25% of the observations fall between each of the intervals. Quantiles are a useful metric because they are largely unaffected by the distribution of the data, and have a simple interpretation. Range is the difference between the highest and lowest measurement of a group. Using the sample data it may be determined as: range(clay) ## [1] 10 60 which returns the minimum and maximum values observed, or: diff(range(clay)) ## [1] 50 # or max(clay) - min(clay) ## [1] 50 Interquartile Range (IQR) is the range from the upper (75%) quartile to the lower (25%) quartile. This represents 50% of the observations occurring in the mid-range of a sample. IQR is a robust measure of dispersion, unaffected by the distribution of data. In soil survey lingo you could consider the IQR to estimate the central concept of a soil property. IQR may be calculated for the sample dataset as: IQR(clay) ## [1] 10 # or diff(quantile(clay, p = c(0.25, 0.75))) ## 75% ## 10 3.5.3 Weighted Summaries Weighted Mean - is the weighted arithmetic average. In the ordinary arithmetic average, each data point is assigned the same weight, whereas in a weighted average the contribution of each data point to the mean can vary. The function weighted.mean() takes two major inputs: x, a vector of data values, and w, a vector of weights. Like other statistics, you can remove missing values with na.rm=TRUE. # calculate horizon thickness h$hzthk <- h$hzdepb - h$hzdept # weighted mean (across all horizons and profiles) weighted.mean(h$claytotest, h$hzthk, na.rm = TRUE) ## [1] 25.24812 The above example is a little contrived since it is applied to all profiles and all horizons. We only get one value out across 106 profiles and 626 horizons. More commonly we use the weighted mean for depth-weighted averages in individual pedons or components and, also, for mapunit averages. Depth-weighted averages commonly use horizon thicknesses as weights. Mapunit averages commonly use component percentages as weights. When we want to scale the contribution of particular observations or variables to a final result, weights may be derived from expert knowledge or some other data source. 3.5.3.1 Profile-specific Weighted Calculations A more practical application of weighted.mean() is Particle Size Control Section (PSCS) weighted average properties. For this we need to use the horizon thickness within the control section as weights. The aqp function trunc() allows you to remove portions of profiles that are outside specified depth intervals (such as the PSCS boundaries). profileApply() allows for iterating over all profiles in a SoilProfileCollection to call some function on each one. Here we calculate the PSCS weighted mean clay content for each profile in loafercreek: # calculate a "truncated" SPC with just the PSCS; drop = FALSE retains empty profiles for missing PSCS loafercreek_pscs <- trunc(loafercreek, loafercreek$psctopdepth, loafercreek$pscbotdepth, drop = FALSE) # calculate weighted mean for each profile, using the truncated horizon thicknesses as weights loafercreek$pscs_clay <- profileApply(loafercreek_pscs, function(p) { weighted.mean(p$claytotest, w = p$hzdepb - p$hzdept, na.rm = TRUE) }) # inspect loafercreek$pscs_clay ## [1] 28.76471 28.76471 25.88000 NaN 16.00000 37.32000 32.63415 NaN 33.78571 29.57576 29.00000 23.02632 25.28000 23.36364 ## [15] 26.25000 34.12000 47.69565 30.73171 28.32609 32.00000 27.12500 27.76316 25.00000 28.60870 23.39535 22.32000 24.10000 20.91600 ## [29] 22.52000 20.48780 44.38000 37.88000 28.70000 28.80000 36.46000 23.78000 30.72000 24.33333 23.76000 21.78000 28.72727 20.83871 ## [43] 19.56000 25.48000 28.92000 33.95122 20.18000 18.86486 18.12500 25.56000 17.34000 25.84000 19.00000 28.37500 27.10870 24.72000 ## [57] 26.20370 25.13514 26.00000 24.38000 24.20000 26.24000 27.44444 29.90000 24.00000 42.08000 28.34000 29.36842 23.10000 24.56818 ## [71] 29.10000 24.16000 28.82000 NaN 18.77500 NaN 45.82917 25.25161 NaN 20.50000 21.28889 24.86000 32.34000 33.36585 ## [85] 31.04000 23.05405 17.22000 26.52000 29.22000 20.00000 24.60000 19.74000 18.25000 20.70000 31.84000 21.97959 32.44737 29.56000 ## [99] NaN 22.09412 21.34000 27.46154 26.68000 20.10526 31.00000 22.65000 Note that several of these pedons have NaN values in the result. This can happen even with na.rm=TRUE because pedons either do not have both psctopdepth and pscbotdepth populated in NASIS or all horizons in the PSCS have NA clay content. # inspect new site-level column pscs_clay head(site(loafercreek)[, c("peiid", "upedonid", "psctopdepth", "pscbotdepth", "pscs_clay")]) # plot just the pedons with missing pscs_clay plot(subset(loafercreek, is.na(pscs_clay)), color = "claytotest") You always need to pay attention to the possibility of missing data or weights because missing values can dramatically the final result–sometimes in unexpected ways! 3.5.3.2 Other Weighted Statistics There are many other weighted statistics available. Essentially all will use a matrix of data values and a matrix of weights to scale the contribution of data values to the final statistic value. The package Hmisc defines several weighted variants of common summary statistics, notably Hmisc::wtd.quantile(). The DescTools package also defines Quantile() which strictly follows the Eurostat definition of a weighted quantile. 3.5.4 Correlation A correlation matrix is a table of the calculated correlation coefficients of all variables. This provides a quantitative measure to guide the decision making process. The following will produce a correlation matrix for the sp4 dataset: h$hzdepm <- (h$hzdepb + h$hzdept) / 2 # Compute the middle horizon depth h %>% select(hzdepm, claytotest, sandtotest, total_frags_pct, phfield) %>% cor(use = "complete.obs") %>% round(2) ## hzdepm claytotest sandtotest total_frags_pct phfield ## hzdepm 1.00 0.59 -0.08 0.50 -0.03 ## claytotest 0.59 1.00 -0.17 0.28 0.13 ## sandtotest -0.08 -0.17 1.00 -0.05 0.12 ## total_frags_pct 0.50 0.28 -0.05 1.00 -0.16 ## phfield -0.03 0.13 0.12 -0.16 1.00 As seen in the output, variables are perfectly correlated with themselves and have a correlation coefficient of 1.0. Negative values indicate a negative relationship between variables. What is considered highly correlated? A good rule of thumb is anything with a value of 0.7 or greater is considered highly correlated. 3.6 Exercise 2: Compute Descriptive Statistics Add to your existing R script from Exercise 1. Aggregate by genhz and calculate several descriptive statistics for hzdept, gravel and phfield. Cross-tabulate geomposhill and argillic.horizon from the site table, as a percentage. Compute a correlation matrix between hzdept, gravel and phfield. Save your R script, and forward to your instructor. 3.7 Graphical Methods Now that we’ve checked for missing values and typos and made corrections, we can graphically examine the sample data distribution of our data. Frequency distributions are useful because they can help us visualize the center (e.g., RV) and spread or dispersion (e.g., low and high) of our data. Typically in introductory statistics the normal (i.e., Gaussian) distribution is emphasized. Table 3.2: Short Description of Graphical Methods Plot Types Description Bar a plot where each bar represents the frequency of observations for a ‘group’ Histogram a plot where each bar represents the frequency of observations for a ‘given range of values’ Density an estimation of the frequency distribution based on the sample data Quantile-Quantile a plot of the actual data values against a normal distribution Box-Whisker a visual representation of median, quartiles, symmetry, skewness, and outliers Scatter & Line a graphical display of one variable plotted on the x axis and another on the y axis Table 3.3: Comparison of R’s 3 Graphing Systems and their Equivalent Functions for Plotting Plot Types Base R lattice ggplot geoms Bar barplot() barchart() geom_bar() Histogram hist() histogram() geom_histogram() Density plot(density()) densityplot() geom_density() Quantile-Quantile qqnorm() qq() geom_qq() Box-Whisker boxplot() bwplot() geom_boxplot() Scatter & Line plot() xyplot geom_point() 3.7.1 Distributions 3.7.2 Bar Plot A bar plot is a graphical display of the frequency (i.e. number of observations (count or n)), such as soil texture, that fall within a given class. It is a graphical alternative to to the table() function. library(ggplot2) # bar plot ggplot(h, aes(x = texcl)) + geom_bar() 3.7.3 Histogram A histogram is similar to a bar plot, except that instead of summarizing categorical data, it categorizes a continuous variable like clay content into non-overlappying intervals for the sake of display. The number of intervals can be specified by the user, or can be automatically determined using an algorithm, such as nclass.Sturges(). Since histograms are dependent on the number of bins, for small datasets they’re not the best method of determining the shape of a distribution. ggplot(h, aes(x = claytotest)) + geom_histogram(bins = nclass.Sturges(h$claytotest)) 3.7.4 Density Curve A density estimation, also known as a Kernel density plot, generally provides a better visualization of the shape of the distribution in comparison to the histogram. Compared to the histogram where the y-axis represents the number or percent (i.e., frequency) of observations, the y-axis for the density plot represents the probability of observing any given value, such that the area under the curve equals one. One curious feature of the density curve is the hint of two peaks (i.e. bimodal distribution?). Given that our sample includes a mixture of surface and subsurface horizons, we may have two different populations. However, considering how much the two distributions overlap, it seems impractical to separate them in this instance. ggplot(h, aes(x = claytotest)) + geom_density() 3.7.5 Box plots Box plots are a graphical representation of the five number summary, depicting quartiles (i.e. the 25%, 50%, and 75% quantiles), minimum, maximum and outliers (if present). Boxplots convey the shape of the data distribution, the presence of extreme values, and the ability to compare with other variables using the same scale, providing an excellent tool for screening data, determining thresholds for variables and developing working hypotheses. The parts of the boxplot are shown in the figure below. The “box” of the boxplot is defined as the 1st quartile and the 3rd quartile. The median, or 2nd quartile, is the dark line in the box. The whiskers (typically) show data that is 1.5 * IQR above and below the 3rd and 1st quartile. Any data point that is beyond a whisker is considered an outlier. That is not to say the outlier points are in error, just that they are extreme compared to the rest of the data set. However, you may want to evaluate these points to ensure that they are correct. ggplot(h, aes(x = genhz, y = claytotest)) + geom_boxplot() The above box plot shows a steady increase in clay content with depth. Notice the outliers in the box plots, identified by the individual circles. 3.7.6 Quantile comparison plots (QQplot) A QQ plot is a plot of the actual data values against a normal distribution (which has a mean of 0 and standard deviation of 1). # QQ Plot for Clay ggplot(h, aes(sample = claytotest)) + geom_qq() + geom_qq_line() # QQ Plot for Frags ggplot(h, aes(sample = total_frags_pct)) + geom_qq() + geom_qq_line() If the data set is perfectly symmetric (i.e. normal), the data points will form a straight line. Overall this plot shows that our clay example is more or less symmetric. However the second plot shows that our rock fragments are far from evenly distributed. A more detailed explanation of QQ plots may be found on Wikipedia: https://en.wikipedia.org/wiki/QQ_plot 3.7.7 The ‘Normal’ distribution What is a normal distribution and why should you care? Many statistical methods are based on the properties of a normal distribution. Applying certain methods to data that are not normally distributed can give misleading or incorrect results. Most methods that assume normality are robust enough for all data except the very abnormal. This section is not meant to be a recipe for decision making, but more an extension of tools available to help you examine your data and proceed accordingly. The impact of normality is most commonly seen for parameters used by pedologists for documenting the ranges of a variable (i.e., Low, RV and High values). Often a rule-of thumb similar to: “two standard deviations” is used to define the low and high values of a variable. This is fine if the data are normally distributed. However, if the data are skewed, using the standard deviation as a parameter does not provide useful information of the data distribution. The quantitative measures of Kurtosis (peakedness) and Skewness (symmetry) can be used to assist in accessing normality and can be found in the fBasics package, but Webster (2001) cautions against using significance tests for assessing normality. The preceding sections and chapters will demonstrate various methods to cope with alternative distributions. A Gaussian distribution is often referred to as “Bell Curve”, and has the following properties: Gaussian distributions are symmetric around their mean The mean, median, and mode of a Gaussian distribution are equal The area under the curve is equal to 1.0 Gaussian distributions are denser in the center and less dense in the tails Gaussian distributions are defined by two parameters, the mean and the standard deviation 68% of the area under the curve is within one standard deviation of the mean Approximately 95% of the area of a Gaussian distribution is within two standard deviations of the mean Viewing a histogram or density plot of your data provides a quick visual reference for determining normality. Distributions are typically normal, Bimodal or Skewed: Examples of different types of distributions Occasionally distributions are Uniform, or nearly so: With the loafercreek dataset the mean and median for clay were only slightly different, so we can safely assume that we have a normal distribution. However many soil variables often have a non-normal distribution. For example, let’s look at graphical examination of the mean vs. median for clay and rock fragments: The solid lines represent the breakpoint for the mean and standard deviations. The dashed lines represents the median and quantiles. The median is a more robust measure of central tendency compared to the mean. In order for the mean to be a useful measure, the data distribution must be approximately normal. The further the data departs from normality, the less meaningful the mean becomes. The median always represents the same thing independent of the data distribution, namely, 50% of the samples are below and 50% are above the median. The example for clay again indicates that distribution is approximately normal. However for rock fragments, we commonly see a long tailed distribution (e.g., skewed). Using the mean in this instance would overestimate the rock fragments. Although in this instance the difference between the mean and median is only 9 percent. 3.7.8 Scatterplots and Line Plots Plotting points of one ratio or interval variable against another is a scatter plot. Plots can be produced for a single or multiple pairs of variables. Many independent variables are often under consideration in soil survey work. This is especially common when GIS is used, which offers the potential to correlate soil attributes with a large variety of raster datasets. The purpose of a scatterplot is to see how one variable relates to another. With modeling in general the goal is parsimony (i.e., simple). The goal is to determine the fewest number of variables required to explain or describe a relationship. If two variables explain the same thing, i.e., they are highly correlated, only one variable is needed. The scatterplot provides a perfect visual reference for this. Create a basic scatter plot using the loafercreek dataset. # scatter plot ggplot(h, aes(x = claytotest, y = hzdepm)) + geom_point() + ylim(100, 0) # line plot ggplot(h, aes(y = claytotest, x = hzdepm, group = peiid)) + geom_line() + coord_flip() + xlim(100, 0) This plots clay on the X axis and depth on the X axis. As shown in the scatterplot above, there is a moderate correlation between these variables. The function below produces a scatterplot matrix for all the numeric variables in the dataset. This is a good command to use for determining rough linear correlations for continuous variables. library(GGally) h %>% select(hzdepm, claytotest, phfield, total_frags_pct) %>% ggpairs() 3.7.9 3rd Dimension - Color, Shape, Size, Layers, etc… 3.7.9.1 Color and Groups # scatter plot ggplot(h, aes(x = claytotest, y = hzdepm, color = genhz)) + geom_point(size = 3) + ylim(100, 0) # density plot ggplot(h, aes(x = claytotest, color = genhz)) + geom_density(size = 2) # bar plot ggplot(h, aes(x = genhz, fill = texture_class)) + geom_bar() # box plot ggplot(h, aes(x = genhz, y = claytotest)) + geom_boxplot() # heat map (pseudo bar plot) s <- aqp::site(loafercreek) ggplot(s, aes(x = landform_string, y = pmkind)) + geom_tile(alpha = 0.2) 3.7.9.2 Facets - box plots library(tidyr) # convert to long format df <- h %>% select(peiid, genhz, hzdepm, claytotest, phfield, total_frags_pct) %>% pivot_longer(cols = c("claytotest", "phfield", "total_frags_pct")) ggplot(df, aes(x = genhz, y = value)) + geom_boxplot() + xlab("genhz") + facet_wrap(~ name, scales = "free_y") 3.7.9.3 Facets - depth plots data(loafercreek, package = "soilDB") s <- aqp::slab(loafercreek, fm = ~ claytotest + phfield + total_frags_pct, slab.structure = 0:100, slab.fun = function(x) quantile(x, c(0.1, 0.5, 0.9), na.rm = TRUE)) ggplot(s, aes(x = top, y = X50.)) + # plot median geom_line() + # plot 10th & 90th quantiles geom_ribbon(aes(ymin = X10., ymax = X90., x = top), alpha = 0.2) + # invert depths xlim(c(100, 0)) + # flip axis coord_flip() + facet_wrap(~ variable, scales = "free_x") 3.8 Exercise 3: Graphical Methods Add to your existing R script from Exercise 2. Create a faceted boxplot of genhz vs gravel and phfield. Create a facted depth plot for gravel and phfield Save your R script, and forward to your instructor. 3.9 Transformations Slope aspect and pH are two common variables warranting special consideration for pedologists. 3.9.1 pH There is a recurring debate as to the best way to average pH since is it a log transformed variable. Remember, pHs of 6 and 5 correspond to hydrogen ion concentrations of 0.000001 and 0.00001 respectively. The actual average is 5.26; -log10((0.000001 + 0.00001) / 2). If no conversions are made for pH, the mean and sd in the summary are considered the geometric mean and sd, not the arithmetic. The wider the pH range, the greater the difference between the geometric and arithmetic mean. The difference between the arithmetic average of 5.26 and the geometric average of 5.5 is small. Boyd, Tucker, and Viriyatum (2011) examined the issue in detail, and suggests that regardless of the method is used it should be documented. If you have a table with pH values and wish to calculate the arithmetic mean using R, this example will work: # arithmetic mean log10(mean(1/10^-h$phfield, na.rm = TRUE)) ## [1] 6.371026 # geometric mean mean(h$phfield, na.rm = TRUE) ## [1] 6.18 3.9.2 Circular data Slope aspect - requires the use of circular statistics for numerical summaries, or graphical interpretation using circular plots. For example, if soil map units being summarized have a uniform distribution of slope aspects ranging from 335 degrees to 25 degrees, the Zonal Statistics tool in ArcGIS would return a mean of 180. The most intuitive means available for evaluating and describing slope aspect are circular plots available with the circular package in R and the radial plot option in the TEUI Toolkit. The circular package in R will also calculate circular statistics like mean, median, quartiles etc. library(circular) # Extract the site table s <- aqp::site(loafercreek) aspect <- s$aspect_field aspect <- circular(aspect, template="geographic", units="degrees", modulo="2pi") summary(aspect) ## n Min. 1st Qu. Median Mean 3rd Qu. Max. Rho NA's ## 101.0000 12.0000 255.0000 195.0000 199.5000 115.0000 20.0000 0.1772 5.0000 The numeric output is fine, but a following graphic is more revealing, which shows the dominant Southwest slope aspect. rose.diag(aspect, bins = 8, col="grey") 3.9.3 Texture Class and Fine-earth Separates Many pedon descriptions include soil texture class and modifiers, but lack numeric estimates such as clay content and rock fragments percentage. This lack of “continuous” numeric data makes it difficult to analyze and estimate certain properties precisely. While numeric data on textural separates may be missing, it can still be estimated by the class ranges and averages. NASIS has many calculations used to estimate missing values. To facilitate this process in R, several new functions have recently been added to the aqp package. These new aqp functions are intended to impute missing values or check existing values. The ssc_to_texcl() function uses the same logic as the particle size estimator calculation in NASIS to classify sand and clay into texture class. The results are stored in data(soiltexture) and used by texcl_to_ssc() as a lookup table to convert texture class to sand, silt and clay. The function texcl_to_ssc() replicates the functionality described by Levi (2017). Unlike the other functions, texture_to_taxpartsize() is intended to be computed on weighted averages within the family particle size control section. Below is a demonstration of these new aqp R functions. library(aqp) library(soiltexture) # example of texcl_to_ssc(texcl) texcl <- c("s", "ls", "l", "cl", "c") test <- texcl_to_ssc(texcl) head(cbind(texcl, test)) # example of ssc_to_texcl() ssc <- data.frame( CLAY = c(55, 33, 18, 6, 3), SAND = c(20, 33, 42, 82, 93), SILT = c(25, 34, 40, 12, 4) ) texcl <- ssc_to_texcl(sand = ssc$SAND, clay = ssc$CLAY) ssc_texcl <- cbind(ssc, texcl) head(ssc_texcl) # plot on a textural triangle TT.plot( class.sys = "USDA-NCSS.TT", tri.data = ssc_texcl, pch = 16, col = "blue" ) # example of texmod_to_fragvoltol() frags <- c("gr", "grv", "grx", "pgr", "pgrv", "pgrx") test <- texmod_to_fragvoltot(frags)[1:4] head(test) # example of texture_to_taxpartsize() tex <- data.frame( texcl = c("c", "cl", "l", "ls", "s"), clay = c(55, 33, 18, 6, 3), sand = c(20, 33, 42, 82, 93), fragvoltot = c(35, 15, 34, 60, 91) ) tex$fpsc <- texture_to_taxpartsize( texcl = tex$texcl, clay = tex$clay, sand = tex$sand, fragvoltot = tex$fragvoltot ) head(tex) 3.10 The Shiny Package Shiny is an R package which combines R programming with the interactivity of the web. install.packages("shiny") Methods for Use Online Locally The shiny package, created by RStudio, enables users to not only use interactive applications created by others, but to build them as well. 3.10.1 Online Easiest Method Click a Link: https://gallery.shinyapps.io/lake_erie_fisheries_stock_assessment_app/ Open a web browser Navigate to a URL The ability to use a shiny app online is one of the most useful features of the package. All of the R code is executed on a remote computer which sends the results over a live http connection. Very little is required of the user in order to obtain results. 3.10.2 Locally No Internet required once configured Install R and RStudio (done) Install Required packages (app dependent) Download, open in RStudio and click “Run App” The online method may be easy for the user, but it does require a significant amount of additional effort for the creator. We won’t get into those details here! The local method, however simply requires the creator to share a single app.R file. It is the user which needs to put forth the additional effort. 3.10.3 Web App Demonstration Online: https://usda.shinyapps.io/ncr_app/ Local: https://github.com/ncss-tech/vitrusa/raw/master/r11_smp_app/app.R Online apps such as the North Central Region Web App are useful tools, available for all to use during soil survey, ecological site development, or other evaluations. The North Central Region app is however limited to data which is already available online, such as SDA (Soil Data Access) and NASIS (National Soil Information System) Web Reports. It is also reliant on the successful operation of those data systems. If the NASIS Web Reports or SDA is down for maintenance, the app fails. Local apps have the ability to leverage local data systems more easily like NASIS or other proprietary data. 3.10.4 Troubleshooting Errors Reload the app and try again. (refresh browser, or click stop, and run app again in RStudio) When the app throws an error, it stops. All other tabs/reports will no longer function until the app is reloaded. Read the getting started section on the home page. This is a quick summary of tips to avoid issues, and will be updated as needed. Check to see if SDA and NASIS Web Reports are operational, if they aren’t working, then the app won’t work either. Double check your query inputs. (typos, wildcards, null data, and too much data, can be common issues) 5 minutes of inactivity will cause the connection to drop, be sure you are actively using the app. Run the app locally - the online app does not show console activity, which can be a big help when identifying problems. Check the app issues page to see if the issue you are experiencing is already documented. (Polite but not required) Contact the app author (john.hammerly@usda.gov) When you run into trouble, there are a few steps you can take on your own to get things working again. This list may help you get your issue resolved. If not, contact (john.hammerly@usda.gov) for assistance. 3.10.5 Shiny App Embedding Shiny apps are extremely versatile, they can be embedded into presentations, Markdown, or HTML Those same formats can also be embedded in to a shiny app. This is a very simple example of a shiny app which consists of an interactive dropdown menu which controls what region is displayed in the bar chart. Let’s take a look at the code. 3.10.5.1 Shiny App Code shinyApp( # Use a fluid Bootstrap layout ui = fluidPage( # Give the page a title titlePanel("Telephones by region"), # Generate a row with a sidebar sidebarLayout( # Define the sidebar with one input sidebarPanel( selectInput("region", "Region:", choices = colnames(datasets::WorldPhones)), hr(), helpText("Data from AT&T (1961) The World's Telephones.") ), # Create a spot for the barplot mainPanel( plotOutput("phonePlot") ) ) ), # Define a server function for the Shiny app server = function(input, output) { # Fill in the spot we created for a plot output$phonePlot <- renderPlot({ # Render a barplot barplot( datasets::WorldPhones[, input$region] * 1000, main = input$region, ylab = "Number of Telephones", xlab = "Year" ) }) } ) Shiny apps consist of a ui and a server. The ui is the part of the shiny app the user sees, the user interface. In the ui, a user can choose or enter inputs for processing and viewing the results. The server takes the inputs, performs some data processing and rendering of those inputs and generates the outputs for the ui to display. 3.10.6 Questions What new features in RStudio are available for you to use once the shiny package is installed? The Region 11 Web App uses which two data sources for reports? If an error occurs while using the Region 11 Web App, what should you do? 3.10.7 Examples 3.10.7.1 NASIS Reports The NASIS Reports button is a link to a master list of NASIS Web reports for Regions 10 and 11. 3.10.7.2 Water Table The query method option allows you to choose between MUKEY, NATSYM, MUNAME. It also has a radio button for switching between flooding and ponding. Plots and Data Tables are on separate sub-menu items. 3.10.7.3 Organic Matter Same options as the Water Table Tab except no radio button. The query method option allows you to choose between MUKEY, NATSYM, MUNAME. Plots and Data Tables are on separate sub-menu items. 3.10.7.4 Project Report The project report can accept multiple projects. Use the semicolon (;) as a separator. You can also save a copy of the report by clicking the link below the submit button. 3.10.7.5 Project Extent Type in Year, type or select office and type project name for the Project extent query. Zoom and pan to view extent. Use the layers button to change the basemap or toggle layers. Click the link below the submit button to download a .zip containing the extent as a ESRI shapefile. 3.10.7.6 Long Range Plan Enter an office symbol to generate a long range plan report. 3.10.7.7 Interpretations Enter the national mapunit symbol to plot all available interpretations for the mapunit from SDA. 3.11 Exercise 4: Using the North Central Region Web App 3.11.0.1 Project Report Use the project report to generate a report on a project in your own area. Save the results and explain the results of pH plots for one of your components. 3.11.0.2 Project Extent Map an extent of a project. How many layers are available to choose from as a basemap? How many layers can be toggled on or off? 3.11.0.3 Long Range Plan Choose an office to generate a long range plan. What is the highest acreage project for 2025? 3.12 soilReports One of the strengths of NASIS is that it that has many queries and reports to access the complex data. This makes it easy for the average user to load their data, process it, and run numerous reports. The soilReports R package is essentially just a collection of R Markdown (.Rmd) documents. R Markdown is a plain text markup format for creating reproducible, dynamic reports with R. These .Rmd files can be used to generate HTML, PDF, Word, Markdown documents with a variety of forms, templates and applications. Example report output can be found at the following link: https://github.com/ncss-tech/soilReports#example-output. Detailed instructions are provided for each report: https://github.com/ncss-tech/soilReports#choose-an-available-report Install the soilReports package. This package is updated regularly and should be installed from GitHub. # Install the soilReports package from GitHub remotes::install_github("ncss-tech/soilReports", dependencies = FALSE, build = FALSE) To view the list of available reports first load the package then use the listReports() function. # Load the soilReports package library(soilReports) # List reports listReports() ## name version ## 1 national/DT-report 1.0 ## 2 national/NASIS-site-export 1.0 ## 3 region11/component_summary_by_project 0.1 ## 4 region11/lab_summary_by_taxonname 1.0 ## 5 region11/mupolygon_summary_by_project 0.1 ## 6 region11/pedon_summary_by_taxonname 1.1 ## 7 region2/dmu-diff 0.7 ## 8 region2/dmu-summary 0.4 ## 9 region2/edit-soil-features 0.2.1 ## 10 region2/gdb-acreage 1.0 ## 11 region2/mlra-comparison-dynamic 0.1 ## 12 region2/mlra-comparison 2.0 ## 13 region2/mu-comparison-dashboard 0.0.0 ## 14 region2/mu-comparison 4.0.3 ## 15 region2/mu-summary 1 ## 16 region2/pedon-summary 1.0 ## 17 region2/QA-summary 0.6 ## 18 region2/shiny-pedon-summary 1.1 ## 19 region2/spatial-pedons 1.0 ## 20 templates/minimal 1.0 ## description ## 1 Create interactive data tables from CSV files ## 2 Export NASIS Sites to Spatial Layer ## 3 summarize component data for an MLRA project ## 4 summarize lab data from NASIS Lab Layer table ## 5 summarize mupolygon layer from a geodatabase ## 6 summarize field pedons from NASIS pedon table ## 7 Differences between select DMU ## 8 DMU Summary Report ## 9 Generate summaries of NASIS components for EDIT Soil Features sections ## 10 Geodatabase Mapunit Acreage Summary Report ## 11 compare MLRA/LRU-scale delineations, based on mu-comparison report ## 12 compare MLRA using pre-made, raster sample databases ## 13 interactively subset and summarize SSURGO data for input to `region2/mu-comparison` report ## 14 compare stack of raster data, sampled from polygons associated with 1-8 map units ## 15 summarize raster data for a large collection of map unit polygons ## 16 Generate summaries from NASIS pedons and associated spatial data ## 17 QA Summary Report ## 18 Interactively subset and summarize NASIS pedon data from one or more map units ## 19 Visualize NASIS pedons in interactive HTML report with overlays of SSURGO, STATSGO or custom polygons ## 20 A minimal soilReports template 3.12.1 Extending soilReports Each report in soilReports has a “manifest” that describes any dependencies, configuration files or inputs for your R Markdown report document. If you can identify these things it is easy to convert your own R-based analyses to the soilReports format. The .Rmd file allows R code and text with Markdown markup to be mingled in the same document and then “executed” like an R script. 3.13 Exercise 5: Run Lab Summary By Taxon Name Soil Report For another exercise you can use the region11/lab_summary_by_taxonname report report to summarize laboratory data for a soil series. This report requires you to get some data from the Pedon “NCSS Lab” tables in NASIS. 3.13.1 Requirements Data are properly populated, otherwise the report may fail. Common examples include: Horizon depths don’t lineup Either the Pedon or Site tables isn’t loaded ODBC connection to NASIS is set up Beware each report has a unique configuration file that may need to be edited. 3.13.2 Instructions Load your NASIS selected set. Run a query such as “POINT - Pedon/Site/NCSSlabdata by upedonid and Taxon Name” from the Region 11 report folder to load your selected set. Be sure to target both the site, pedon and lab layer tables. Remove from your selected set the pedons and sites you wish to exclude from the report. Copy the lab summary to your working directory. copyReport(reportName = "region11/lab_summary_by_taxonname", outputDir = "C:/workspace2/lab_sum") Examine the report folder contents. The report is titled report.Rmd. Notice there are several other support files. The parameters for the report are contained in the config.R file. Check or create a genhz_rules file for a soil series. In order to aggregate the pedons by horizon designation, a genhz_rules file (e.g., Miami_rules.R) is needed. See above. If none exists see the following job aid on how to create one, Assigning Generalized Horizon Labels. Pay special attention to how caret ^ and dollar $ symbols are used in REGEX. They function as anchors for the beginning and end of the string, respectively. A ^ placed before an A horizon, ^A, will match any horizon designation that starts with A, such as Ap, Ap1, but not something merely containing A, such as BA. Placing a $ after a Bt horizon, Bt$, will match any horizon designation that ends with Bt, such as 2Bt or 3Bt, but not something with a vertical subdivision, such as Bt2. Wrapping pattern with both ^ and $ symbols will result only in exact matches – i.e. that start and end with the contents between ^ and $. For example ^[AC]$, will only match A or C, not Ap, Ap2, or Cg. Execute the report. Command-line approach # Set report parameters series <- "Miami" genhz_rules <- "C:/workspace2/lab_sum/Miami_rules.R" # report file path report_path <- "C:/workspace2/lab_sum/report.Rmd" # Run the report render(input = report_path, output_dir = "C:/workspace2", output_file = "C:/workspace2/lab_sum.html", envir = new.env(), params = list(series = series, genhz_rules = genhz_rules ) ) Manual approach Open the report.Rmd, hit the Knit drop down arrow, and select Knit with Parameters. Save the report. The report is automatically saved upon creation in the same folder as the R report. However, it is given the same generic name as the R report (i.e., “C:/workspace/lab_sum/report.html”), and will be overwritten the next time the report is run. Therefore, if you wish to save the report, rename the .html file to a name of your choosing and/or convert it to a PDF. Also, beware when opening the .html file with Internet Explorer – be sure to click on “Allow blocked content” if prompted. Otherwise, Internet Explorer will alter the formatting of tables etc. within the document. Sample pedon report Brief summary of steps: Load your selected set with the pedon and site table for an existing GHL file, or make your own (highly encouraged) Run the lab_summary_by_taxonname.Rmd report on a soil series of your choice. Show your work and submit the results to your mentor. 3.14 Exercise 6: Run Shiny Pedon Summary The region2/shiny-pedon-summary report is an interactive Shiny-based report that uses flexdashboard to help the user subset and summarize NASIS pedons from a graphical interface. You can try a ShinyApps.io demo here The “Shiny Pedon Summary” allows one to rapidly generate reports from a large set of pedons in their NASIS selected set. The left INPUT sidebar has numerous options for subsetting pedon data. Specifically, you can change REGEX patterns for mapunit symbol, taxon name, local phase, and User Pedon ID. Also, you can use the drop down boxes to filter on taxon kind or compare different “modal”/RV pedons. Example: Analyzing the Loafercreek Taxadjuncts Create an instance of the region2/shiny-pedon-summary report with soilReports: # create new instance of reports library(soilReports) # set path for shiny-pedon-summary report instance shinyped.path <- "C:/workspace2/chapter3/shiny-pedon" # create directories (if needed) if(!dir.exists(shinyped.path)) dir.create(shinyped.path, recursive = TRUE) # get report dependencies reportSetup('region2/shiny-pedon-summary') # copy report contents to target path copyReport('region2/shiny-pedon-summary', outputDir = shinyped.path, overwrite = TRUE) Update the config.R file You can update the config.R file in “C:/workspace2/chapter3/shiny-pedon” (or wherever you installed the report) to use the soilDB datasets loafercreek and gopheridge by setting demo_mode <- TRUE. This is the simplest way to demonstrate how this report works. Alternately, when demo_mode <- FALSE, pedons will be loaded from your NASIS selected set. config.R also allows you to specify a shapefile for overlaying the points on – to determine mapunit symbol – as well as several raster data sources whose values will be extracted at point locations and summarized. The demo dataset does not use either of these by default, due to large file sizes. Furthermore, a default (very general) set of REGEX generalized horizon patterns is provided to assign generalized horizon labels for provisional grouping. These provided patterns are unlikely to cover ALL cases, and always need to be modified for final correlation. That said, they do a decent job of making a first-pass correlation for diverse types of soils. The default config.R settings use the general patterns: use_regex_ghz <- TRUE. You are welcome to modify the defaults. If you want to use the values you have populated in NASIS Pedon Horizon Component Layer ID, set use_regex_ghz <- FALSE. Run the report via shiny.Rmd This report uses the Shiny flexdashboard interface. Open up shiny.Rmd and click the “Run Document” button to start the report. This will load the pedon and spatial data specified in config.R. NOTE: If a Viewer Window does not pop-up right away, click the gear icon to the right of the “Run Document” button. Be sure the option “Preview in Window” is checked, then click “Run Document” again. All of the subset parameters are in the left-hand sidebar. Play around with all of these options – the graphs and plots in the tabs to the right will automatically update as you make changes. When you like what you have, you can export a non-interactive HTML file for your records. To do this, first, set the “Report name:” box to something informative – this will be your report output file name. Then, scroll down to the bottom of the INPUT sidebar and click “Export Report” button. Check the “output” folder (subdirectory of where you installed the report) for your results. 3.15 Exercise 7: Run Mapunit Comparison Another popular report in soilReports is the region2/mu-comparison report. This report uses constant density sampling (sharpshootR::constantDensitySampling()) to extract numeric and categorical values from multiple raster data sources that overlap a set of user-supplied polygons. In this example, we clip a small portion of SSURGO polygons from the CA630 soil survey area extent. We then select a small set of mapunit symbols (5012, 3046, 7083, 7085, 7088) that occur within the clipping extent. These mapunits have soil forming factors we expect to contrast with one another in several ways. You can inspect other mapunit symbols by changing mu.set in config.R. Download the demo data: # set up ch4 path and path for report mucomp.path <- "C:/workspace2/chapter3/mucomp" # create any directories that may be missing if(!dir.exists(mucomp.path)) { dir.create(mucomp.path, recursive = TRUE) } mucomp.zip <- file.path(mucomp.path, 'mucomp-data.zip') # download raster data, SSURGO clip from CA630, and sample script for clipping your own raster data download.file('https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_3-mucomp-data/mucomp-data.zip', mucomp.zip) unzip(mucomp.zip, exdir = mucomp.path, overwrite = TRUE) Create an instance of the region2/mu-comparison report with soilReports: # create new instance of reports library(soilReports) # get report dependencies reportSetup('region2/mu-comparison') # create report instance copyReport('region2/mu-comparison', outputDir = mucomp.path, overwrite = TRUE) If you want, you can now set up the default config.R that is created by copyReport() to work with your own data. OR you can use the “sample” config.R file (called new_config.R) in the ZIP file downloaded above. Run this code to replace the default config.R with the sample data config.R: # copy config file containing relative paths to rasters downloaded above file.copy(from = file.path(mucomp.path, "new_config.R"), to = file.path(mucomp.path, "config.R"), overwrite = TRUE) Open report.Rmd in the C:/workspace2/chapter3/mucomp folder and click the “Knit” button at the top of the RStudio source pane to run the report. Inspect the report output HTML file, as well as the spatial and tabular data output in the output folder. Question: What differences can you see between the five mapunit symbols that were analyzed? 3.16 Additional Reading (Exploratory Data Analysis) Healy, K., 2018. Data Visualization: a practical introduction. Princeton University Press. http://socviz.co/ Helsel, D.R., Hirsch, R.M., Ryberg, K.R., Archfield, S.A., and Gilroy, E.J., 2020, Statistical methods in water resources: U.S. Geological Survey Techniques and Methods, book 4, chap. A3, 458 p., https://doi.org/10.3133/tm4a3. [Supersedes USGS Techniques of Water-Resources Investigations, book 4, chap. A3, version 1.1.] Kabacoff, R.I., 2018. Data Visualization in R. https://rkabacoff.github.io/datavis/ Peng, R. D., 2016. Exploratory Data Analysis with R. Leanpub. https://bookdown.org/rdpeng/exdata/ Wilke, C.O., 2019. Fundamentals of Data Visualization. O’Reily Media, Inc. https://clauswilke.com/dataviz/ References Boyd, Claude E., Craig S. Tucker, and Rawee Viriyatum. 2011. “Interpretation of pH, Acidity, and Alkalinity in Aquaculture and Fisheries.” North American Journal of Aquaculture 73 (4): 403–8. https://doi.org/10.1080/15222055.2011.620861. Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co. https://archive.org/details/exploratorydataa0000tuke_7616. Webster, R. 2001. “Statistics to Support Soil Research and Their Presentation.” European Journal of Soil Science 52 (2): 331–40. https://doi.org/10.1046/j.1365-2389.2001.00383.x. "],["spatial.html", "Chapter 4 Spatial Data in R 4.1 Objectives (Spatial Data) 4.2 Making Maps with R 4.3 Spatial Data Sources 4.4 Viewing Pedon Locations 4.5 Exercise 1: Pedon Locations 4.6 Packages for Vector Data 4.7 Exercise 2: Map your favorite soil series extents 4.8 Packages for Raster Data 4.9 Coordinate Reference Systems (CRS) 4.10 Load Required Packages 4.11 Download Example Data 4.12 Load Example MLRA Data 4.13 Vector Data 4.14 Raster Data 4.15 Exercise 3: Creating a Slope Map 4.16 Spatial Overlay Operations 4.17 Exercise 4: Extracting Raster Data 4.18 Additional Reading (Spatial)", " Chapter 4 Spatial Data in R This chapter is a brief demonstration of possible ways to process spatial data in R. This will help you to develop a strategy for selecting spatial data processing methods. 4.1 Objectives (Spatial Data) Gain experience creating, editing, and exporting spatial data objects in R. Learn the basics of sf package for vector (points, lines, polygons) data Learn the basics of terra classes and functions for vector and raster data Learn about some interfaces to NCSS spatial data sources Create maps with R The next sections will require loading these libraries into the R session. # SPC and soil database interface library(aqp) library(soilDB) # "Simple Feature" (vector) data structures library(sf) # superseded by sf -- spatial object classes e.g. SpatialPoints/SpatialPolygons library(sp) # gridded data management / analysis library(terra) # superseded by terra # library(raster) # interactive maps with leaflet library(mapview) There are many packages available for working with spatial data, however we only have time to cover introducing a few common libraries. A couple resources are linked here for 5 packages that provide different ways displaying spatial data graphically: tmap ggplot2, ggmap mapview mapdeck leaflet 4.2 Making Maps with R R has become a powerful tool for visualization and interaction with spatial data. There are many tools available for making maps with R! It is not all geostatistics and coordinate reference system transformations. There are powerful ways to automate your GIS workflow from beginning to end–from creating terrain derivatives from a source DEM, to high-quality, publication-ready maps and interactive HTML/JavaScript widgets. An excellent resource for making maps with R is the chapter in “Geocomputation with R” geocompr: Making maps with R 4.3 Spatial Data Sources Spatial data sources: “raster” and “vector” Raster data sources (grids/images): GeoTIFF, ERDAS, BIL, ASCII grid, WMS, … Vector data sources (points/lines/polygons): Shape File, ESRI File Geodatabase, KML, GeoJSON, GML, WFS, … Conventional data sources that can be upgraded to be spatial data because they contain GeoJSON, WKT, or point coordinates include: NASIS/LIMS reports Web pages and Web Services Excel and CSV files Photo EXIF information Here are some R-based interfaces to NCSS data sources via soilDB package. Functions that return tabular data contain longitude, latitude coordinates: fetchNASIS(): NASIS “site” data fetchLDM(): KSSL “site” data from Lab Data Mart fetchKSSL(): KSSL “site” data from SoilWeb Functions that return spatial data: fetchSDA_spatial(): polygon, bounding box and centroid data from SSURGO, STATSGO and the sapolygon (Soil Survey Area Polygon) from Soil Data Access (SDA) fetchHenry(): sensor / weather station locations as points SDA_query(): SSURGO data as points, lines, polygons (via SDA) SDA_spatialQuery(): use points or polygons as a “query” to SDA seriesExtent() and taxaExtent(): extent of series and taxonomic classes derived from SSURGO (SoilWeb) in vector and raster format (800m resolution). The vector output is identical to series extents reported by Series Extent Explorer mukey.wcs() and ISSR800.wcs() provide an interface to gSSURGO (mukey), gNATSGO (mukey), and the ISSR-800 (gridded soil property) data. 4.4 Viewing Pedon Locations In this section we will introduce the sf package with mapview. 4.4.1 Plotting Geographic Data Making maps of data gives you some idea how data look spatially and whether their distribution is what you expect. Typos are relatively common when coordinates are manually entered. Viewing the data spatially is a quick way to see if any points plot far outside of the expected geographic area of interest. # plot the locations of the gopheridge pedons with R # # Steps: # 1) create and inspect an sf data.frame object # 2) plot the data with mapview # load libraries library(aqp) library(soilDB) library(sf) library(mapview) # this creates sample gopheridge object in your environment data("gopheridge", package = "soilDB") # replace gopheridge object with fetchNASIS() (your data) # gopheridge <- fetchNASIS() # create simple features POINT geometry data.frame # st_as_sf(): convert data.frame to spatial simple features, with points in $geometry # st_crs(): set EPSG:4326 Coordinate Reference System (CRS) as Well-Known Text (WKT) gopher.locations <- st_as_sf( site(gopheridge), coords = c('longstddecimaldegrees','latstddecimaldegrees'), crs = st_crs(4326) ) # create interactive map with sfc_POINT object # use site_id in sf data.frame as labels mapview(gopher.locations, label = gopher.locations$site_id) 4.5 Exercise 1: Pedon Locations In this exercise, you will create an interactive map with the pedons in your selected set. Then you will export them to a shapefile. Modify the code snippets below to make an R plot and a shapefile of pedon data loaded from your NASIS selected set. You will plot pedon locations using the standard WGS84 longitude/latitude decimal degrees fields from Site table of NASIS. In some cases, these data might be incomplete; you need to handle this possibility. In this exercise you will create a subset SoilProfileCollection for the pedons that are not missing spatial data (longstddecimaldegrees and latstddecimaldegrees). Make a new R script, load the aqp, soilDB, sf and mapview packages and some pedons via fetchNASIS() (or similar source). library(aqp) library(soilDB) library(sf) library(mapview) # get pedons from the selected set pedons <- fetchNASIS(from = 'pedons') Use the base R subset() function to create a subset of your SoilProfileCollection using is.na() longstddecimaldegrees and latstddecimaldegrees variables contain WGS84 longitude and latitude in decimal degrees. This is the standard format for location information used in NASIS. # modify this code (replace ...) to create a subset pedons.sp <- aqp::subset(pedons, ...) Create a sf data.frame from the site data in the SoilProfileCollection object pedons.sp using aqp::site(). Replace the ... in the following code. Promoting a data.frame to sf POINT geometry requires that the X and Y columns be specified. pedon.locations <- sf::st_as_sf( ..., coords = c('longstddecimaldegrees', 'latstddecimaldegrees'), crs = sf::st_crs(4326) #WGS84 GCS ) View your sf object pedon.locations interactively with mapview::mapview(), and change the map.types argument to 'Esri.WorldImagery'. Use the pedon.locations column named site_id for the label argument. # plot an interactive map mapview(pedon.locations, legend = FALSE, map.types = 'OpenStreetMap', ...) Create a subset sf data.frame with only the following “site data” columns: pedlabsampnum, upedonid, taxonname, hillslopeprof, elev_field, slope_field, aspect_field, plantassocnm, bedrckdepth, bedrckkind, pmkind, pmorigin. Select the target columns with dplyr::select() (or another method) by replacing the ... in the following code. pedon.locations_sub <- dplyr::select(pedon.locations, ...) # see also base::subset(x, select=...) Export the spatial information in pedon.locations_sub to a shape file (.shp) with sf::st_write() # write to SHP; output CRS is geographic coordinate system WGS84 sf::st_write(pedon.locations_sub, "./NASIS-pedons.shp") Send a screenshot of your interactive map, and your R script, to your mentor. For an example of exporting data to shapefile with the sp package, see this tutorial: Export Pedons to Shapefile with sp. 4.6 Packages for Vector Data 4.6.1 The sf package Simple Features Access is a set of standards that specify a common storage and access model of geographic features. It is used mostly for two-dimensional geometries such as point, line, polygon, multi-point, multi-line, etc. This is one of many ways of modeling the geometry of shapes in the real world. This model happens to be widely adopted in the R ecosystem via the sf package, and very convenient for typical data encountered by soil survey operations. The sf package represents the latest and greatest in spatial data processing within the comfort of an R session. It provides a “main” object class sf to contain geometric data and associated tabular data in a familiar data.frame format. sf methods work on a variety of different levels of abstraction and manipulation of those geometries. Most of the sf package functions start with the prefix st_, such as: st_crs() (get/set coordinate reference system), st_transform() (project feature class to different coordinate reference system), st_bbox() (bounding box), st_buffer() (buffer). Many of these are “verbs” that are common GIS operations. 4.6.1.1 sf vignettes You can the following sf package vignettes for details, sample data sets and usage of sf objects. Simple Features for R Reading, Writing and Converting Simple Features Manipulating Simple Feature Geometries Manipulating Simple Features Plotting Simple Features Miscellaneous Spherical geometry in sf using s2geometry 4.6.2 The sp Package The data structures (“classes”) and functions provided by the sp package have served a foundational role in the handling of spatial data in R for years. Many of the following examples will reference names such as SpatialPoints, SpatialPointsDataFrame, and SpatialPolygonsDataFrame. These are specialized (S4) classes implemented by the sp package. Objects of these classes maintain linkages between all of the components of spatial data. For example, a point, line, or polygon feature will typically be associated with: coordinate geometry bounding box coordinate reference system attribute table 4.6.3 Converting sp and sf sp provides access to the same compiled code libraries (PROJ, GDAL, GEOS) through sf package. For now the different package object types are interchangeable, and you may find yourself having to do this for a variety of reasons. You can convert between object types as needed using sf::as_Spatial() or sf::st_as_sf(). Check the documentation (?functionname) to figure out what object types different methods need as input; and check an input object’s class with class() or inherits(). 4.6.4 Importing / Exporting Vector Data Import a feature class from a ESRI File Geodatabase or shape file. If you have a .shp file, you can specify the whole path, including the file extension in the dsn argument, or just the folder. For a Geodatabase, you should specify the feature class using the layer argument. Note that a trailing “/” is omitted from the dsn (data source name) and the “.shp” suffix is omitted from the layer. 4.6.4.1 sf x <- sf::st_read(dsn = 'E:/gis_data/ca630/FG_CA630_OFFICIAL.gdb', layer = 'ca630_a') x <- sf::read_sf(dsn = 'E:/gis_data/ca630/pedon_locations.shp') sf::st_write(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp') sf::write_sf(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp') 4.6.4.2 sp Export object x to shapefile using the sf syntax. rgdal is no longer available on CRAN. The sf st_read() / read_sf() / st_write() / write_sf() functions have many arguments, so it is worth spending some time reviewing the associated manual pages. 4.6.5 Interactive mapping with mapview and leaflet The mapview and leaflet packages make it possible to display interactive maps of sf objects in RStudio viewer pane, or within an HTML document generated via R Markdown (e.g. this document). mapview package Basics Advanced Features See other “Articles” in this series, you can make complex, interactive maps using the mapview package. leaflet package leafem: ‘leaflet’ Extensions for ‘mapview’ 4.7 Exercise 2: Map your favorite soil series extents The seriesExtent function in soilDB returns an sf object showing generalized extent polygons for a given soil series. # load required packages, just in case library(soilDB) library(sf) library(mapview) # series extents from SoilWeb (sf objects) pentz <- seriesExtent('pentz') amador <- seriesExtent('amador') # combine into a single object s <- rbind(pentz, amador) # colors used in the map # add more colors as needed cols <- c('royalblue', 'firebrick') # make a simple map, colors set by 'series' column mapview(s, zcol = 'series', col.regions = cols, legend = TRUE) The following code demonstrates how to fetch / convert / map soil series extents, using a vector of soil series names. Results appear in the RStudio “Viewer” pane. Be sure to try the “Export” and “show in window” (next to the broom icon) buttons. # load required packages, just in case library(soilDB) library(sf) library(mapview) # vector of series names, letter case does not matter # try several (2-9)! series.names <- c('auberry', 'sierra', 'holland', 'cagwin') # iterate over series names, get extent # result is a list of sf objects s <- lapply(series.names, soilDB::seriesExtent) # flatten list -> single sf object s <- do.call('rbind', s) # colors used in the map # note trick used to dynamically set the number of colors cols <- RColorBrewer::brewer.pal(n = length(series.names), name = 'Set1') # make a simple map, colors set by 'series' column # click on polygons for details # try pop-out / export buttons mapview(s, zcol = 'series', col.regions = cols, legend = TRUE) Question: What do you notice about the areas where the extent polygons occur? Share your thoughts with your peers or mentor 4.8 Packages for Raster Data 4.8.1 The terra Package The terra package package provides most of the commonly used grid and vector processing functionality that one might find in a conventional GIS. It provides high-level data structures and functions for the GDAL (Geospatial Data Abstraction Library). resampling (terra::resample()) projection and warping (terra::project()) cropping, mosaicing, masking (terra::crop(), terra::mosaic(), terra::merge(), terra::mask()) local and focal functions (terra::local(), terra::focal()) raster algebra (arithmetic operators, terra::xapp()) sampling (terra::spatSample()) contouring (terra::contour()) raster/vector conversions (terra::rasterize(), terra::as.polygons()) terrain analysis (terra::terrain()) model-based prediction and interpolation (terra::predict(), terra::interpolate(); more on this in Part 2) 4.8.1.1 Terra Example This is a brief demonstration using sample data files with terra. # use an example from the terra package f <- system.file("ex", "elev.tif", package = "terra") # corresponding luxembourg vector (polygon) data g <- system.file("ex", "lux.shp", package = "terra") r <- terra::rast(f) r ## class : SpatRaster ## dimensions : 90, 95, 1 (nrow, ncol, nlyr) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## source : elev.tif ## name : elevation ## min value : 141 ## max value : 547 v <- terra::vect(g) v ## class : SpatVector ## geometry : polygons ## dimensions : 12, 6 (geometries, attributes) ## extent : 5.74414, 6.528252, 49.44781, 50.18162 (xmin, xmax, ymin, ymax) ## source : lux.shp ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## names : ID_1 NAME_1 ID_2 NAME_2 AREA POP ## type : <num> <chr> <num> <chr> <num> <num> ## values : 1 Diekirch 1 Clervaux 312 1.808e+04 ## 1 Diekirch 2 Diekirch 218 3.254e+04 ## 1 Diekirch 3 Redange 259 1.866e+04 # show SpatRaster details print(r) ## class : SpatRaster ## dimensions : 90, 95, 1 (nrow, ncol, nlyr) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat WGS 84 (EPSG:4326) ## source : elev.tif ## name : elevation ## min value : 141 ## max value : 547 # default plot method plot(r) lines(v) # interactive (leaflet) plot method p <- plet(r, tiles = "OpenTopoMap") lines(p, v) The R object only stores a reference to the data until they are needed to be loaded into memory. This allows for internal raster manipulation algorithms to intelligently deal with very large grids that may not fit in memory. 4.8.1.2 Other approaches to raster data 4.8.1.2.1 raster A more complete background on the capabilities of the raster package, and the replacement terra, are described in the Spatial Data Science with R online book. # convert r to a RasterLayer object r2 <- raster::raster(f) # show RasterLayer details print(r2) ## class : RasterLayer ## dimensions : 90, 95, 8550 (nrow, ncol, ncell) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) ## crs : +proj=longlat +datum=WGS84 +no_defs ## source : elev.tif ## names : elevation ## values : 141, 547 (min, max) Introduction to the raster package vignette 4.8.1.2.2 stars There is also a package called stars (Spatiotemporal Arrays: Raster and Vector Datacubes) that is the sf-centric way of dealing with higher dimensional raster and vector “datacubes.” Data cubes have additional dimensions related to time, spectral band, or sensor type. The stars data structures are often used for processing spectral data sources from satellites. 4.8.1.3 Related Links sf package website rspatial.org - Spatial Data Science with R Goodbye PROJ.4 strings! How to specify a coordinate reference system in R? 4.8.2 Converting Vector to Raster 4.8.2.1 terra::rasterize() 4.8.2.2 fasterize::fasterize() 4.8.3 Converting Raster to Vector 4.8.3.1 terra::as.polygons() 4.9 Coordinate Reference Systems (CRS) Spatial data aren’t all that useful without an accurate description of the Coordinate Reference System (CRS). This type of information is typically stored within the “.prj” component of a shapefile, or in the header of a GeoTIFF. Without a CRS it is not possible to perform coordinate transformations (e.g. conversion of geographic coordinates to projected coordinates), spatial overlay (e.g. intersection), or geometric calculations (e.g. distance or area). The “old” way (PROJ.4) of specifying coordinate reference systems is using character strings containing, for example: +proj or +init arguments. In general, this still “works,” so you may encounter it and need to know about it. But you also may encounter cases where CRS are specified using integers, strings of the form authority:code, or well-known text (WKT). Some common examples of coordinate system “EPSG” codes and their legacy “PROJ.4” strings. 4 “EPSG” stands for European Petroleum Survey Group. The “EPSG Geodetic Parameter Dataset” is a public registry of geodetic datums, spatial reference systems, Earth ellipsoids, coordinate transformations and related units of measurement. “OGC” refers to the Open Geospatial Consortium, which is an example of another important authority:code. “ESRI” (company that develops ArcGIS) also defines many CRS codes. “PROJ” is the software responsible for transforming coordinates from one CRS to another. The current version of PROJ available is 9, and in PROJ > 6 major changes were made to the way that coordinate reference systems are defined and transformed led to the “PROJ.4” syntax falling out of favor. EPSG: 4326 / PROJ.4:+proj=longlat +datum=WGS84 - geographic, WGS84 datum (NASIS Standard) OGC:CRS84 - geographic, WGS84 datum (same as above but explicit longitude, latitude XY order) EPSG: 4269 / PROJ.4:+proj=longlat +datum=NAD83 - geographic, NAD83 datum EPSG: 4267 / PROJ.4:+proj=longlat +datum=NAD27 - geographic, NAD27 datum EPSG: 26910 / PROJ.4:+proj=utm +zone=10 +datum=NAD83 - projected (UTM zone 10), NAD83 datum EPSG: 5070 / PROJ.4: +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23.0 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs - Albers Equal Area CONUS (gSSURGO) More on the EPSG codes and specifics of CRS definitions: https://spatialreference.org/ref/epsg/ https://epsg.io/ While you may encounter PROJ.4 strings, these are no longer considered the preferred method of referencing Coordinate Reference Systems – and, in general, newer methods are “easier.” Well-known text (WKT) is a human- machine-readable standard format for geometry, so storing the Coordinate Reference System information in a similar format makes sense. This format is returned by the sf::st_crs() method. For example: the WKT representation of EPSG:4326: st_crs(4326) ## Coordinate Reference System: ## User input: EPSG:4326 ## wkt: ## GEOGCRS["WGS 84", ## ENSEMBLE["World Geodetic System 1984 ensemble", ## MEMBER["World Geodetic System 1984 (Transit)"], ## MEMBER["World Geodetic System 1984 (G730)"], ## MEMBER["World Geodetic System 1984 (G873)"], ## MEMBER["World Geodetic System 1984 (G1150)"], ## MEMBER["World Geodetic System 1984 (G1674)"], ## MEMBER["World Geodetic System 1984 (G1762)"], ## MEMBER["World Geodetic System 1984 (G2139)"], ## MEMBER["World Geodetic System 1984 (G2296)"], ## ELLIPSOID["WGS 84",6378137,298.257223563, ## LENGTHUNIT["metre",1]], ## ENSEMBLEACCURACY[2.0]], ## PRIMEM["Greenwich",0, ## ANGLEUNIT["degree",0.0174532925199433]], ## CS[ellipsoidal,2], ## AXIS["geodetic latitude (Lat)",north, ## ORDER[1], ## ANGLEUNIT["degree",0.0174532925199433]], ## AXIS["geodetic longitude (Lon)",east, ## ORDER[2], ## ANGLEUNIT["degree",0.0174532925199433]], ## USAGE[ ## SCOPE["Horizontal component of 3D system."], ## AREA["World."], ## BBOX[-90,-180,90,180]], ## ID["EPSG",4326]] This is using the OGC WKT CRS standard. Adoption of this standard caused some significant changes in packages in the R ecosystem. So you can get familiar, what follows are several examples of doing the same thing: setting the CRS of spatial objects with WGS84 longitude/latitude geographic coordinates. If you have another target coordinate system, it is just a matter of using the correct codes to identify it. 4.9.1 Assigning and Transforming Coordinate Systems Returning to the example from above, lets assign a CRS to our series extent s using different methods. s <- seriesExtent('san joaquin') The following sections give equivalent sf versus sp syntax. 4.9.1.1 sf Use st_crs<- to set, or st_crs() get CRS of sf objects. Supply the target EPSG code as an integer. # the CRS of s is EPSG:4326 st_crs(s) == st_crs(4326) ## [1] TRUE # set CRS using st_crs<- (replace with identical value) st_crs(s) <- st_crs(4326) Transformation of points, lines, and polygons with sf requires an “origin” CRS be defined in the argument x. The “target” CRS is defined as an integer (EPSG code) in the crs argument or is the output of st_crs(). # transform to UTM zone 10 s.utm <- st_transform(x = s, crs = 26910) # transform to GCS NAD27 s.nad27 <- st_transform(x = s, crs = st_crs(4267)) 4.9.1.2 sp You can do the same thing several different ways with sp objects. An equivalent EPSG, OGC and PROJ.4 can be set or get using proj4string<-/proj4string and either a sp CRS object or a PROJ.4 string for Spatial objects. # s is an sf object (we converted it), convert back to Spatial* object s.sp <- sf::as_Spatial(s) # these all create the same internal sp::CRS object proj4string(s.sp) <- sp::CRS('EPSG:4326') # proj >6; EPSG proj4string(s.sp) <- sp::CRS('OGC:CRS84') # proj >6; OGC proj4string(s.sp) <- '+init=epsg:4326' # proj4 style +init string proj4string(s.sp) <- '+proj=longlat +datum=WGS84' # proj4 style +proj string Here, we do the same transformations we did above only using sp: spTransform(). # transform to UTM zone 10 s.utm <- spTransform(s.sp, CRS('+proj=utm +zone=10 +datum=NAD83')) # transform to GCS NAD27 s.nad27 <- spTransform(s.sp, CRS('+proj=longlat +datum=NAD27')) 4.9.1.3 terra and raster To assign or get the coordinate reference system for raster, terra or sp CRS objects use the crs() functions. r <- terra::rast(system.file("ex", "elev.tif", package="terra")) # inspect CRS terra::crs(r) # r is a SpatRaster object; set CRS to current CRS terra::crs(r) <- terra::crs("OGC:CRS84") “Transforming” or “warping” a raster is a different from with a vector as it requires interpolation of pixels to a target resolution and CRS. The method provided by terra is project() and in raster it is projectRaster(). It works the same as the above “transform” methods in that you specify an object to transform, and the target reference system or a template for the object. t.wgs84 <- terra::project(r, terra::crs("+proj=igh")) r.wgs84 <- raster::projectRaster(raster::raster(r), crs = CRS("+proj=igh")) Note that the default warping of raster uses bilinear interpolation (method='bilinear'), which is appropriate for continuous variables. You also have the option of using nearest-neighbor (method='ngb') for categorical variables (class maps) where interpolation would not make sense. If we want to save this transformed raster to file, we can use something like this for terra terra::writeRaster(t.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW")) Similarly for raster: terra::writeRaster(r.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW")) 4.10 Load Required Packages Load required packages into a fresh RStudio Session (Ctrl + Shift + F10) library(aqp) library(soilDB) library(sf) library(terra) 4.11 Download Example Data Run the following to create a path for the example data. Be sure to set a valid path to a local disk. # store path as a variable, in case you want to keep it somewhere else ch4.data.path <- 'C:/workspace2/chapter-4' # make a place to store chapter 2b example data dir.create(ch4.data.path, recursive = TRUE) # download polygon example data from github download.file( 'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-mu-polygons.zip', file.path(ch4.data.path, 'chapter-4-mu-polygons.zip') ) # download raster example data from github download.file( 'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-PRISM.zip', file.path(ch4.data.path, 'chapter-4-PRISM.zip') ) # unzip unzip( file.path(ch4.data.path, 'chapter-4-mu-polygons.zip'), exdir = ch4.data.path, overwrite = TRUE ) unzip( file.path(ch4.data.path, 'chapter-4-PRISM.zip'), exdir = ch4.data.path, overwrite = TRUE ) 4.12 Load Example MLRA Data We will be using polygons associated with MLRA 15 and 18 as part of this demonstration. Import these data with sf::st_read(). # load MLRA polygons mlra <- sf::st_read(file.path(ch4.data.path, 'mlra-18-15-AEA.shp')) ## alternately, use your own MLRA # mlra <- soilDB::fetchSDA_spatial(c("15", "18"), by.col="MLRARSYM", geom.src = "MLRAPOLYGON") |> sf::st_transform("EPSG:5070") We will load the sample MLRA 15 and 18 (California) raster data (PRISM derived) using terra::rast(). If using your own MLRA, you will need to update file paths to use your own rasters. # mean annual air temperature, Deg C maat <- terra::rast(file.path(ch4.data.path, 'MAAT.tif')) # mean annual precipitation, mm map <- terra::rast(file.path(ch4.data.path, 'MAP.tif')) # frost-free days ffd <- terra::rast(file.path(ch4.data.path, 'FFD.tif')) # growing degree days gdd <- terra::rast(file.path(ch4.data.path, 'GDD.tif')) # percent of annual PPT as rain rain_fraction <- terra::rast(file.path(ch4.data.path, 'rain_fraction.tif')) # annual sum of monthly PPT - ET_p ppt_eff <- terra::rast(file.path(ch4.data.path, 'effective_precipitation.tif')) Sometimes it is convenient to “stack” raster data that share a common grid size, extent, and coordinate reference system into a multilayer terra SpatRaster object. Calling terra::rast() on a list of SpatRaster is equivalent to making a RasterStack from several RasterLayer with raster::stack(). # create a raster stack (multiple rasters aligned) rs <- terra::rast(list(maat, map, ffd, gdd, rain_fraction, ppt_eff)) # inspect rs ## class : SpatRaster ## dimensions : 762, 616, 6 (nrow, ncol, nlyr) ## resolution : 0.008333333, 0.008333333 (x, y) ## extent : -123.2708, -118.1375, 34.44583, 40.79583 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat NAD83 (EPSG:4269) ## sources : MAAT.tif ## MAP.tif ## FFD.tif ## ... and 3 more sources ## names : MAAT, MAP, FFD, GDD, rain_~ction, effec~ation ## min values : -4.073542, 114, 35, 76, 12, -825.5897 ## max values : 18.676420, 2958, 365, 3173, 100, 2782.3914 plot(rs) 4.13 Vector Data 4.13.1 sf p <- sf::st_as_sf(data.frame(x = -120, y = 37.5), coords = c("x", "y"), crs = 4326) p.aea <- st_transform(p, "EPSG:5070") In sf the functions used to do this are st_intersects() or st_intersection(). st_intersects(p.aea, mlra) ## Sparse geometry binary predicate list of length 1, where the predicate was `intersects' ## 1: 2 st_intersection(p.aea, mlra) ## Simple feature collection with 1 feature and 5 fields ## Geometry type: POINT ## Dimension: XY ## Bounding box: xmin: -2079434 ymin: 1870764 xmax: -2079434 ymax: 1870764 ## Projected CRS: NAD83 / Conus Albers ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME ## 1 18 23 Sierra Nevada Foothills C California Subtropical Fruit, Truck, and Specialty Crop Region ## geometry ## 1 POINT (-2079434 1870764) 4.13.2 terra p <- terra::vect(data.frame(x = -120, y = 37.5), geom = c("x", "y"), crs = "EPSG:4326") p.aea <- project(p, "EPSG:5070") In terra the functions used to determine the intersection is relate(). mlra[relate(vect(mlra), p.aea, relation = "intersects"), ] ## Simple feature collection with 1 feature and 5 fields ## Geometry type: POLYGON ## Dimension: XY ## Bounding box: xmin: -2181926 ymin: 1548989 xmax: -1970476 ymax: 2264711 ## Projected CRS: Albers ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME ## 2 18 23 Sierra Nevada Foothills C California Subtropical Fruit, Truck, and Specialty Crop Region ## geometry ## 2 POLYGON ((-2160599 2264711,... 4.13.3 sp In sp objects, you do these operations with the sp::over() function. Access the associated vignette by running vignette(\"over\") in the console when the sp package is loaded. # hand make a SpatialPoints object # note that this is GCS p <- SpatialPoints(coords = cbind(-120, 37.5), proj4string = CRS('+proj=longlat +datum=WGS84')) mlra.sp <- sf::as_Spatial(mlra) # spatial extraction of MLRA data requires a CRS transformation p.aea <- spTransform(p, proj4string(mlra.sp)) over(p.aea, mlra.sp) 4.14 Raster Data 4.14.1 Object Properties SpatRaster and RasterLayer objects are similar to sf, sp and other R spatial objects in that they keep track of the linkages between data, coordinate reference system, and optional attribute tables. Getting and setting the contents of raster objects should be performed using functions such as: terra::NAflag(r) / raster::NAvalue(r): get / set the NODATA value terra::crs(r) / raster::wkt(r) : get / set the coordinate reference system terra::res(r) / raster::res(r): get / set the resolution terra::ext(r) / raster::extent(r): get / set the extent terra::datatype(r) / raster::dataType(r): get / set the data type … many more, see the raster and terra package manuals 4.14.2 Rasters “In Memory” vs. “File-Based” Processing of raster data in memory is always faster than processing on disk, as long as there is sufficient memory. The terra package handles basically all of the logic delegating in vs. out of memory processing internally–so it is rare that any adjustments to defaults are required. With the raster package, the initial file/disk-based reference can be converted to an in-memory RasterLayer with the readAll() function. You can achieve a similar effect in terra by doing set.values(object). 4.14.3 Rasters “Continuous” vs. “Categorical” Rasters can represent both continuous and categorical (factor) variables. Raster categories are stored as integers with one or more associated labels. The categories can be viewed using the levels() and terra::cats() functions. You can have multiple category columns, and the “active” category can be set with terra::activeCat(). You can use the terra::classify() function to assign integer values to each pixel that can be the basis for your categories. Then, you can set the category labels associated with each integer value. For example, we classify the terra sample elevation dataset into high and low elevation areas. We supply a reclassification matrix of values with three columns. The first column is the “low” end of the class range, the second column is the high end of the class range. The third column contains the new values to assign. x <- terra::rast(system.file("ex", "elev.tif", package = "terra")) rcl <- cbind(c(0, 300), c(300, 600), 1:2) colnames(rcl) <- c("low", "high", "new_value") rcl ## low high new_value ## [1,] 0 300 1 ## [2,] 300 600 2 y <- terra::classify(x, rcl) plot(y) Once we classify a raster into a set of integer values, we can assign labels or categories to each value with levels(): new_levels <- data.frame( values = 1:2, region = c("low elevation", "high elevation"), otherlabel = c("A", "B") ) new_levels ## values region otherlabel ## 1 1 low elevation A ## 2 2 high elevation B levels(y) <- new_levels plot(y) Our categories had two columns with labels. The first one (region) is selected by default. We can use the second (otherlabel) if we set it as the active category with terra::activeCat(). terra::activeCat(y) <- "otherlabel" plot(y) We can also handle values that are not matched in classify() matrix with the others argument. Here we set others = 3 so that any cell values that are not included in rcl get assigned value 3. rcl <- cbind(c(200, 300), c(300, 600), 1:2) colnames(rcl) <- c("low", "high", "new_value") rcl ## low high new_value ## [1,] 200 300 1 ## [2,] 300 600 2 y2 <- terra::classify(x, rcl, others = 3) plot(y2) We have not provided handling for NA values so they are not altered by the above classification. We can convert NA values explicitly by adding them to rcl: rcl <- cbind(c(200, 300, NA), c(300, 600, NA), c(1:2, 4)) colnames(rcl) <- c("low", "high", "new_value") rcl ## low high new_value ## [1,] 200 300 1 ## [2,] 300 600 2 ## [3,] NA NA 4 y3 <- terra::classify(x, rcl, others = 3) plot(y3) Note that classify() works with the “raw” values of categorical rasters, ignoring the categories. To simply change the labels of categorical rasters, use terra::subst() instead. 4.14.4 Writing Rasters to File Exporting data requires consideration of the output format, datatype, encoding of NODATA, and other options such as compression. With terra, \"COMPRESS=LZW\" option is used by default when writing GeoTIFF files. Using the gdal argument e.g.: terra::writeRaster(..., gdal=) is equivalent to specifying options argument to raster::writeRaster(). # using previous example data set terra::writeRaster(x, filename = 't.wgs84.tif') For example, a RasterLayer object that you wanted to save to disk as an internally-compressed GeoTIFF: # using previous example data set raster::writeRaster(x, filename = 'r.tif', options = c("COMPRESS=LZW")) 4.14.4.1 Writing Categorical Rasters to File When you write categorical rasters to file, categories will either be stored within the file itself, or in a Persistent Auxiliary Metadata (PAM) into an .aux.xml file automatically. If only using terra or other GDAL tools to work with categorical data this is usually sufficient. You can also write a .vat.dbf file containing categorical information. Writing this file can be important if you want to use your categories in other GIS software such as ArcGIS (which does not necessarily make full use of GDAL PAM). We can write a data.frame containing the levels of our raster to file using foreign::write.dbf() function. You will append the “.vat.dbf” extension to the base filename of your data. x <- terra::rast(system.file("ex", "elev.tif", package = "terra")) rcl <- cbind(c(0, 300), c(300, 600), 1:2) colnames(rcl) <- c("low", "high", "new_value") rcl y <- terra::classify(x, rcl) plot(y) terra::writeRaster(y, "my_categorical_data.tif", overwrite = TRUE) my_categories <- data.frame( values = 1:2, region = c("low elevation", "high elevation"), otherlabel = c("A", "B") ) foreign::write.dbf(my_categories, file = "my_categorical_data.tif.vat.dbf") 4.14.5 Data Types Commonly used raster datatype include: “unsigned integer”, “signed integer”, and “floating point” of variable precision. INT1U: integers from 0 to 255 INT2U: integers from 0 to 65,534 INT2S: integers from -32,767 to 32,767 INT4S: integers from -2,147,483,647 to 2,147,483,647 FLT4S: floating point from -3.4e+38 to 3.4e+38 FLT8S: floating point from -1.7e+308 to 1.7e+308 It is wise to manually specify an output datatype that will “just fit” the required precision. For example, if you have generated a RasterLayer that warrants integer precision and ranges from 0 to 100, then the INT1U data type would provide enough precision to store all possible values and the NODATA value. Raster data stored as integers will always be smaller (sometimes 10-100x) than those stored as floating point, especially when internal compression is enabled. # integer grid with a range of 0-100 raster::writeRaster(x, filename = 'r.tif', datatype = 'INT1U') # floating point grid with very wide range terra::writeRaster(x, filename = 'r.tif', datatype = 'FLT4S') 4.14.5.1 Notes on Compression It is often a good idea to create internally-compressed raster data. The GeoTiff format can accommodate many different compression algorithms, including lossy (JPEG) compression. Usually, the default “LZW” or “DEFLATE” compression will result in significant savings, especially for data encoded as integers. For example, the CONUS gSSURGO map unit key grid at 30m resolution is about 55Gb (GeoTiff, no compression) vs. 2.4Gb after LZW compression. # reasonable compression using LZW is the default, compare to raster::writeRaster(x, filename='r.tif', options=c("COMPRESS=NONE")) # takes longer to write the file, but better compression terra::writeRaster(x, filename='r.tif', gdal=c("COMPRESS=DEFLATE", "PREDICTOR=2", "ZLEVEL=9") See this article for some ideas on optimization of file read/write times and associated compressed file sizes. 4.15 Exercise 3: Creating a Slope Map In this exercise you will create a continuous and categorical slope gradient maps from a digital elevation model. Use the sample Tahoe-area LiDAR elevation dataset from the gdalUtilities package or your own dataset as input. If you use your own data, you may want to make a smaller extent with [terra::crop()] tahoe <- terra::rast(system.file(\"extdata\", \"tahoe_lidar_bareearth.tif\", package = \"gdalUtilities\")) Run terra::terrain() to create a slope map with unit=\"radians\" Convert radians to percent slope (divide by 2*pi, multiply by 100) Make a plot of the continuous percent slope. You can use terra::plot() for static or terra::plet() for interactive map. Use terra::classify() to create a categorical map of slope classes. Use the following breaks and assign the integer values 1 through 5 from lowest to highest. 0 to 3% 3 to 15% 15 to 30% 30 to 60% >60% Use levels() to set the categories of your raster. Write the raster data to a GeoTIFF file with terra::writeRaster() Write the raster attribute table to a .vat.dbf file with foreign::write.dbf() 4.16 Spatial Overlay Operations Spatial data are lot more useful when “related” (overlay, intersect, spatial query, etc.) to generate something new. The CRS of the two objects being overlaid must match. 4.16.1 Working with Vector and Raster Data Typically, spatial queries of raster data by geometry features (point, line, polygon) are performed in two ways: For each geometry, collect all pixels that overlap (exactextractr approach) For each geometry, collect a sample of pixels defined by sampling points The first method ensures that all data are included in the analysis, however, processing can be slow for multiple/detailed rasters, and the results may not fit into memory. The second method is more efficient (10-100x faster), requires less memory, and can remain statistically sound–as long as a reasonable sampling strategy is applied. Sampling may also help you avoid low-acreage “anomalies” in the raster product. More on sampling methods in the next chapter. The extract() function can perform several operations in one call, such as buffering (in projected units) with buffer argument. See the manual page for an extensive listing of optional arguments and what they do. Sampling and extraction with terra the results in a SpatVector object. Sampling and extraction with raster methods results in a matrix object. # sampling single layer SpatRaster terra::spatSample(maat, size = 10) ## MAAT ## 1 15.09774 ## 2 13.68487 ## 3 12.58170 ## 4 10.36163 ## 5 11.19041 ## 6 16.67907 ## 7 12.59997 ## 8 14.65289 ## 9 15.88573 ## 10 16.70181 # sampling SpatRaster terra::spatSample(rs, size = 10) ## MAAT MAP FFD GDD rain_fraction effective_precipitation ## 1 15.877102 3.740e+02 2.54e+02 2.605e+03 9.9e+01 -4.328053e+02 ## 2 1.135120 1.352e+03 6.20e+01 3.770e+02 3.5e+01 1.000904e+03 ## 3 9.808927 2.380e+02 1.44e+02 1.687e+03 9.0e+01 -3.825956e+02 ## 4 14.968859 9.390e+02 3.36e+02 2.208e+03 9.9e+01 1.742938e+02 ## 5 8.980933 1.413e+03 1.43e+02 1.320e+03 7.5e+01 8.255326e+02 ## 6 NA -1.700e+308 -1.70e+308 -1.700e+308 -1.7e+308 -1.700000e+308 ## 7 NA -1.700e+308 -1.70e+308 -1.700e+308 -1.7e+308 -1.700000e+308 ## 8 13.558878 7.690e+02 1.81e+02 2.251e+03 9.5e+01 3.400877e+01 ## 9 18.099649 1.880e+02 3.33e+02 3.048e+03 9.9e+01 -7.499153e+02 ## 10 15.634830 8.830e+02 2.68e+02 2.462e+03 9.8e+01 2.768894e+01 par(mfcol = c(1, 2), mar = c(1, 1, 3, 1)) # regular sampling + extraction of raster values x.regular <- terra::spatSample( maat, method = "regular", size = 100, as.points = TRUE ) x.regular ## class : SpatVector ## geometry : points ## dimensions : 112, 1 (geometries, attributes) ## extent : -123, -118.4083, 34.64167, 40.6 (xmin, xmax, ymin, ymax) ## coord. ref. : lon/lat NAD83 (EPSG:4269) ## names : MAAT ## type : <num> ## values : NA ## 16.4 ## 10.89 # see also raster::sampleRegular() plot(maat, axes = FALSE, legend = FALSE, main = 'Regular Sampling') points(x.regular) # random sample + extraction of raster values # note that NULL values are removed x.random <- terra::spatSample( maat, size = 100, as.points = TRUE, na.rm = TRUE ) # see also raster::sampleRandom() plot(maat, axes = FALSE, legend = FALSE, main = 'Random Sampling with NA Removal') points(x.random) Note that the mean can be efficiently estimated, even with a relatively small number of samples. # all values: slow for large grids mean(terra::values(maat), na.rm = TRUE) # regular sampling: efficient, central tendency comparable to above mean(x.regular$MAAT, na.rm = TRUE) # this value will be pseudorandom # depends on number of samples, pattern of NA mean(x.random$MAAT, na.rm = TRUE) Just how much variation can we expect when collecting 100, randomly-located samples over such a large area? # 10 replications of samples of n=100 z <- replicate(10, { mean(terra::spatSample(maat, size = 100, na.rm = TRUE)$MAAT, na.rm = TRUE) }) # 90% of the time the mean MAAT values were within: quantile(z, probs = c(0.05, 0.95)) Do the above routine 100 times: compute the mean MAAT from 100 randomly-located samples. Does it make a difference in your estimates? # MLRA polygons in native coordinate system plot(sf::st_geometry(mlra), main = 'MLRA 15 and 18') box() # MAAT raster plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)') # plot MAAT raster with MLRA polygons on top # this requires transforming to CRS of MAAT mlra.gcs <- sf::st_transform(mlra, sf::st_crs(maat)) plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)') plot(sf::st_geometry(mlra.gcs), main = 'MLRA 15 and 18', add = TRUE) 4.17 Exercise 4: Extracting Raster Data 4.17.1 Raster Summary By Point: NASIS Pedon Locations Extract PRISM data at the coordinates associated with NASIS pedons that have been correlated to the Loafercreek series. We will use the sample dataset loafercreek from the soilDB package to get NASIS data. This example can be easily adapted to your own pedon data extracted from NASIS using fetchNASIS(), but if your points are not in California, you will need to supply your own raster data. Get some NASIS data and upgrade the “site” data to a sf object. data("loafercreek", package="soilDB") # result is a SoilProfileCollection object pedons <- loafercreek ## alternately, use fetchNASIS() # pedons <- fetchNASIS() # extract site data s <- sf::st_as_sf(aqp::site(pedons), coords = c("longstddecimaldegrees", "latstddecimaldegrees"), crs = 4326, na.fail = FALSE) Extract PRISM data (the SpatRaster object we made earlier) at the Loafercreek pedon locations and summarize. # convert sf object s to terra SpatVector # and project to CRS of the raster s2 <- project(terra::vect(s), rs) # pass to terra::extract() e <- terra::extract(rs, s2, df = TRUE) # summarize: remove first (ID) column using [, -1] j index summary(e[, -1]) ## MAAT MAP FFD GDD rain_fraction effective_precipitation ## Min. :13.15 Min. : 432.0 Min. :189.0 Min. :2085 Min. :96.00 Min. :-433.14 ## 1st Qu.:15.59 1st Qu.: 576.0 1st Qu.:261.2 1st Qu.:2479 1st Qu.:99.00 1st Qu.:-263.46 ## Median :15.99 Median : 682.5 Median :285.0 Median :2540 Median :99.00 Median :-152.00 ## Mean :15.82 Mean : 680.4 Mean :281.0 Mean :2515 Mean :98.81 Mean :-146.05 ## 3rd Qu.:16.24 3rd Qu.: 771.0 3rd Qu.:307.8 3rd Qu.:2592 3rd Qu.:99.00 3rd Qu.: -36.87 ## Max. :16.58 Max. :1049.0 Max. :330.0 Max. :2654 Max. :99.00 Max. : 201.61 Join the extracted PRISM data with the original SoilProfileCollection object. # combine site data (sf) with extracted raster values (data.frame), row-order is identical, result is sf res <- cbind(s, e) # extract unique IDs and PRISM data # dplyr verbs work with sf data.frames res2 <- dplyr::select(res, upedonid, MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation) # join with original SoilProfileCollection object via pedon_key site(pedons) <- res2 The extracted values are now part of the “pedons” SoilProfileCollection object via site(<SoilProfileCollection>) <- data.frame LEFT JOIN method. Let’s summarize the data we extracted using quantiles. # define some custom functions for calculating range observed in site data my_low_function <- function(x) quantile(x, probs = 0.05, na.rm = TRUE) my_rv_function <- function(x) median(x, na.rm = TRUE) my_high_function <- function(x) quantile(x, probs = 0.95, na.rm = TRUE) site(pedons) |> dplyr::select(upedonid, MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation) |> dplyr::summarize(dplyr::across( MAAT:effective_precipitation, list(low = my_low_function, rv = my_rv_function, high = my_high_function) )) ## MAAT_low MAAT_rv MAAT_high MAP_low MAP_rv MAP_high FFD_low FFD_rv FFD_high GDD_low GDD_rv GDD_high rain_fraction_low ## 1 14.33665 15.98908 16.51595 479.5 682.5 904 220 285 320 2274.75 2540.5 2638.75 97.25 ## rain_fraction_rv rain_fraction_high effective_precipitation_low effective_precipitation_rv effective_precipitation_high ## 1 99 99 -369.3428 -151.9985 94.25339 4.17.2 Raster Summary By Polygon: Series Extent The seriesExtent() function from the soilDB package provides a simple interface to Series Extent Explorer data files. Note that these series extents have been generalized for rapid display at regional to continental scales. A more precise representation of “series extent” can be generated from SSURGO polygons and queried from SDA. Get an approximate extent for the Loafercreek soil series from SEE. See the seriesExtent tutorial and manual page for additional options and related functions. # get (generalized) amador soil series extent from SoilWeb x <- soilDB::seriesExtent(s = 'loafercreek') # convert to EPSG:5070 Albers Equal Area x <- sf::st_transform(x, 5070) Generate 100 sampling points within the extent using a hexagonal grid. These point locations will be used to extract raster values from our SpatRaster of PRISM data. Note that using a “hexagonal” grid is not supported on geographic coordinates. samples <- sf::st_sample(x, size = 100, type = 'hexagonal') For comparison, extract a single point from each SSURGO map unit delineation that contains Loafercreek as a major component. This will require a query to SDA for the set of matching map unit keys (mukey), followed by a second request to SDA for the geometry. The SDA_query function is used to send arbitrary queries written in SQL to SDA, the results may be a data.frame or list, depending on the complexity of the query. The fetchSDA_spatial function returns map unit geometry as either polygons, polygon envelopes, or a single point within each polygon as selected by mukey or nationalmusym. # result is a data.frame mukeys <- soilDB::SDA_query("SELECT DISTINCT mukey FROM component WHERE compname = 'Loafercreek' AND majcompflag = 'Yes';") # result is a sf data.frame loafercreek.pts <- soilDB::fetchSDA_spatial( mukeys$mukey, by.col = 'mukey', method = 'point', chunk.size = 35 ) Graphically check both methods: # prepare samples and mapunit points for viewing on PRISM data hexagonal <- sf::st_transform(samples, sf::st_crs(maat)) x_gcs <- sf::st_transform(x, sf::st_crs(maat)) maatcrop <- terra::crop(maat, x_gcs) # adjust margins and setup plot device for two columns par(mar = c(1, 1, 3, 1), mfcol = c(1, 2)) # first figure plot(maatcrop, main = 'PRISM MAAT\\n100 Sampling Points from Extent', axes = FALSE) plot(sf::st_geometry(x_gcs), add = TRUE) plot(hexagonal, cex = 0.25, add = T) plot(maatcrop, main = 'PRISM MAAT\\n"Loafercreek" Polygon Centroids', axes = FALSE) plot(loafercreek.pts, cex = 0.25, add = TRUE) Extract PRISM data (the SpatRaster object we made earlier) at the sampling locations (100 regularly-spaced and from MU polygon centroids) and summarize. Note that CRS transformations are automatic (when possible), with a warning. # return the result as a data.frame object e <- terra::extract(rs, terra::vect(hexagonal), df = TRUE) e.pts <- terra::extract(rs, terra::vect(loafercreek.pts), df = TRUE) # check out the extracted data summary(e[,-1]) ## MAAT MAP FFD GDD rain_fraction effective_precipitation ## Min. :13.18 Min. : 369.0 Min. :191.0 Min. :2077 Min. :95.00 Min. :-532.53 ## 1st Qu.:15.79 1st Qu.: 521.5 1st Qu.:268.8 1st Qu.:2505 1st Qu.:99.00 1st Qu.:-328.93 ## Median :16.14 Median : 665.5 Median :298.5 Median :2564 Median :99.00 Median :-157.65 ## Mean :15.94 Mean : 672.3 Mean :288.5 Mean :2534 Mean :98.75 Mean :-161.31 ## 3rd Qu.:16.43 3rd Qu.: 787.2 3rd Qu.:315.0 3rd Qu.:2614 3rd Qu.:99.00 3rd Qu.: -25.97 ## Max. :17.10 Max. :1206.0 Max. :334.0 Max. :2751 Max. :99.00 Max. : 346.86 # all pair-wise correlations knitr::kable(cor(e[,-1]), digits = 2) MAAT MAP FFD GDD rain_fraction effective_precipitation MAAT 1.00 -0.53 0.95 0.99 0.86 -0.65 MAP -0.53 1.00 -0.47 -0.59 -0.37 0.99 FFD 0.95 -0.47 1.00 0.93 0.75 -0.59 GDD 0.99 -0.59 0.93 1.00 0.84 -0.70 rain_fraction 0.86 -0.37 0.75 0.84 1.00 -0.47 effective_precipitation -0.65 0.99 -0.59 -0.70 -0.47 1.00 Quickly compare the two sets of samples. # compile results into a list maat.comparison <- list('regular samples' = e$MAAT, 'polygon centroids' = e.pts$MAAT) # number of samples per method lapply(maat.comparison, length) ## $`regular samples` ## [1] 104 ## ## $`polygon centroids` ## [1] 2336 # summary() applied by group lapply(maat.comparison, summary) ## $`regular samples` ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 13.18 15.79 16.14 15.94 16.43 17.10 ## ## $`polygon centroids` ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 12.70 15.82 16.19 16.02 16.44 17.41 # box-whisker plot par(mar = c(4.5, 8, 3, 1), mfcol = c(1, 1)) boxplot( maat.comparison, horizontal = TRUE, las = 1, xlab = 'MAAT (deg C)', varwidth = TRUE, boxwex = 0.5, main = 'MAAT Comparison' ) Basic climate summaries from a standardized source (e.g. PRISM) might be a useful addition to an OSD, or checking the ranges reported in mapunits. 4.17.3 Raster Summary By Polygon: MLRA The following example is a simplified version of what is available in the soilReports package, reports on the ncss-tech GitHub repository. Efficient summary of large raster data sources can be accomplished using: internally-compressed raster data sources, stored on a local disk, can be in any coordinate system polygons stored in an equal-area or UTM coordinate system, with CRS units of meters fixed-density sampling of polygons estimation of quantiles from collected raster samples Back to our example data. The first step is to check the MLRA polygons (mlra); how many features per MLRA symbol? Note that some MLRA have more than one polygon. table(mlra$MLRARSYM) Convert polygon area from square meters to acres and summarize. Note that this will only make sense when using a projected CRS with units of meters (equal area)! poly.area <- terra::expanse(terra::vect(mlra)) / 4046.86 sf::sf_use_s2(TRUE) poly.area.s2 <- units::set_units(x = sf::st_area(mlra), value = "acre") sf::sf_use_s2(FALSE) poly.area.sf <- units::set_units(x = sf::st_area(mlra), value = "acre") summary(poly.area) sum(poly.area) sum(poly.area.s2) sum(poly.area.sf) Sample each polygon at a constant sampling density of 0.001 samples per acre (1 sample for every 1,000 ac.). At this sampling density we should expect approximately 16,700 samples–more than enough for our simple example. library(sharpshootR) # the next function requires a polygon ID: # each polygon gets a unique number 1--number of polygons mlra$pID <- 1:nrow(mlra) cds <- constantDensitySampling(mlra, n.pts.per.ac = 0.001) Extract MLRA symbol at sample points using the sf::st_intersection() function. The result will be a sf object with attributes from our MLRA polygons which intersect the sampling points (cds). # spatial overlay: sampling points and MLRA polygons res <- sf::st_intersection(sf::st_transform(sf::st_as_sf(cds), sf::st_crs(mlra)), mlra) # row / feature order is preserved, so we can directly copy cds$mlra <- res$MLRARSYM # tabulate number of samples per MLRA table(cds$mlra) ## ## 15 18 ## 11658 5204 Extract values from the SpatVector of PRISM data as a data.frame. e <- terra::extract(rs, terra::project(cds, terra::crs(rs))) # join columns from extracted values and sampling points s.df <- cbind(as(cds, 'data.frame'), e) # check results head(s.df) ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME pID mlra ## 1 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 ## 2 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 ## 3 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 ## 4 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 ## 5 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 ## 6 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and Specialty Crop Region 1 15 ## ID MAAT MAP FFD GDD rain_fraction effective_precipitation ## 1 1 15.19286 1149 306 2303 99 385.6023 ## 2 2 15.33926 1049 307 2369 99 252.4252 ## 3 3 15.42254 1041 313 2381 99 242.8284 ## 4 4 15.44636 1087 308 2382 99 283.1933 ## 5 5 15.39205 1116 316 2349 99 314.3419 ## 6 6 15.43280 1058 313 2387 99 258.3234 Summarizing multivariate data by group (MLRA) is usually much simpler after reshaping data from “wide” to “long” format. # reshape from wide to long format m <- tidyr::pivot_longer(s.df, cols = c(MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation)) # check "wide" format head(m) ## # A tibble: 6 × 10 ## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME pID mlra ID name value ## <chr> <int> <chr> <chr> <chr> <int> <chr> <dbl> <chr> <dbl> ## 1 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 MAAT 15.2 ## 2 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 MAP 1149 ## 3 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 FFD 306 ## 4 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 GDD 2303 ## 5 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 rain… 99 ## 6 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 effe… 386. A tabular summary of means by MLRA and PRISM variable using dplyr v.s. base tapply(). # tabular summary of mean values dplyr::group_by(m, mlra, name) %>% dplyr::summarize(mean(value)) %>% dplyr::arrange(name) ## # A tibble: 12 × 3 ## # Groups: mlra [2] ## mlra name `mean(value)` ## <chr> <chr> <dbl> ## 1 15 FFD NA ## 2 18 FFD 273. ## 3 15 GDD NA ## 4 18 GDD 2497. ## 5 15 MAAT NA ## 6 18 MAAT 15.7 ## 7 15 MAP NA ## 8 18 MAP 631. ## 9 15 effective_precipitation NA ## 10 18 effective_precipitation -194. ## 11 15 rain_fraction NA ## 12 18 rain_fraction 97.2 # base R tapply(m$value, list(m$mlra, m$name), mean, na.rm = TRUE) ## effective_precipitation FFD GDD MAAT MAP rain_fraction ## 15 -195.9819 284.5447 2385.213 15.24708 588.6219 98.61088 ## 18 -193.5583 273.2077 2496.876 15.66580 630.9076 97.23251 4.17.4 Zonal Statistics with exactextractr This example shows how to determine the distribution of Frost-Free Days across a soil series extent. First, we load some sample data. We use soilDB::seriesExtent() to get some extent polygons for two series of interest. Then we load some PRISM-derived Frost Free Day estimates. library(sf) library(soilDB) library(terra) library(lattice) library(exactextractr) series <- c('holland', 'san joaquin') s <- do.call('rbind', lapply(series, seriesExtent)) # load PRISM data r <- rast('C:/workspace2/chapter-4/FFD.tif') # inspect r # transform extent to CRS of raster s <- st_transform(s, crs = st_crs(r)) # inspect s 4.17.4.1 Directly Returning Extracted Values Data are extracted from the raster data source very rapidly using the exactextractr package. # use `st_union(s)` to create a MULTI- POINT/LINE/POLYGON from single # use `sf::st_cast(s, 'POLYGON')` to create other types system.time({ ex <- exactextractr::exact_extract(r, s) }) ## | | | 0% | |============================================================ | 50% | |=========================================================================================================================| 100% ## user system elapsed ## 0.00 0.00 0.06 # ex is a list(), with data.frame [value, coverage_fraction] # for each polygon in s (we have one MULTIPOLYGON per series) head(ex[[1]]) ## value coverage_fraction ## 1 166 0.1 ## 2 159 1.0 ## 3 158 1.0 ## 4 197 1.0 ## 5 195 1.0 ## 6 200 1.0 # combine all list elements `ex` into single data.frame `ex.all` # - use do.call('rbind', ...) to stack data.frames row-wise # - an anonymous function that iterates along length of `ex` # - adding the series name to as a new variable, calculated using `i` ex.all <- do.call('rbind', lapply(seq_along(ex), function(i) { cbind(data.frame(group = series[i]), ex[[i]]) })) # simple summary densityplot(~ value | group, data = ex.all, plot.points = FALSE, bw = 2, lwd = 2, strip = strip.custom(bg = grey(0.85)), scales = list(alternating = 1), col = c('RoyalBlue'), layout = c(1, 2), ylab = 'Density', from = 0, to = 400, xlab = 'Frost-Free Days (50% chance)\\n800m PRISM Data (1981-2010)', main = 'FFD Estimate for Extent of San Joaquin and Holland Series' ) 4.17.4.2 Predefined Summary Operations In the previous example we extracted all values and their coverage fractions into memory so we could make a graph with them in R. This operation does not scale as well to very large rasters where all values would not fit in memory. exactextractr::exact_extract() has multiple built-in summary statistics we can use. These summary statistics can be processed very efficiently as all pixels do not to be loaded into memory at once. The available methods include weighted variants that account for pixel coverage fraction. You can specify summary options using the fun argument. For example, fun=\"quantile\" calculates quantiles of cell values, weighted by coverage fraction. We used two MULTIPOLYGON geometries corresponding to two series extents, so we get two sets of 3 quantiles for the Frost Free Days (FFD) grid. ex2 <- exactextractr::exact_extract( r, s, fun = "quantile", quantiles = c(0.05, 0.5, 0.95), full_colnames = TRUE, append_cols = "series" ) ## | | | 0% | |============================================================ | 50% | |=========================================================================================================================| 100% ex2 ## series q05.FFD q50.FFD q95.FFD ## HOLLAND HOLLAND 125.6814 185.2306 262.3804 ## SAN JOAQUIN SAN JOAQUIN 301.0902 322.9453 328.7454 The list of summary operations available for use in exact_extract() fun argument includes: \"min\", \"max\", \"count\", \"sum\", \"mean\", \"median\", \"quantile\", \"mode\", \"majority\", \"minority\", \"variety\", \"variance\", \"stdev\", \"coefficient_of_variation\", \"weighted_mean\", \"weighted_sum\", \"weighted_stdev\", \"weighted_variance\", \"frac\", and \"weighted_frac.\" Of interest beyond the typical summary statistics are compositional summaries: \"frac\" and \"weighted_frac\". These two methods calculate composition of unique levels of the raster for the input features. For example, imagine an interpretation for crop suitability. One requirement of this hypothetical crop is a growing season length greater than 250 days. We will estimate the growing season length using Frost Free Days. First we create a classified raster based on our criteria, then we summarize the raster data using the polygon boundaries and fun=\"frac\": # calculate a binary raster # 0: not suitable # 1: suitable r2 <- r > 250 levels(r2) <- data.frame(values = 0:1, suitability = c("Not suitable", "Suitable")) plot(r2) ex3 <- exactextractr::exact_extract( r2, s, fun = "frac", full_colnames = TRUE, append_cols = "series" ) ## | | | 0% | |============================================================ | 50% | |=========================================================================================================================| 100% ex3 ## series frac_0.suitability frac_1.suitability ## HOLLAND HOLLAND 0.9294924736 0.07050756 ## SAN JOAQUIN SAN JOAQUIN 0.0002452183 0.99975479 From this output we can see that only about 0% of areas within the Holland series extent polygon have more than 250 Frost Free Days, whereas almost all of the San Joaquin soil extent polygon would meet the growing season requirement. 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics Lattice graphics are useful for summarizing grouped comparisons. The syntax is difficult to learn and remember, but there is a lot of documentation online. library(lattice) tps <- list( box.rectangle = list(col = 'black'), box.umbrella = list(col = 'black', lty = 1), box.dot = list(cex = 0.75), plot.symbol = list( col = rgb(0.1, 0.1, 0.1, alpha = 0.25, maxColorValue = 1), cex = 0.25 ) ) bwplot(mlra ~ value | name, data = m, # setup plot and data source as.table=TRUE, # start panels in top/left corner varwidth=TRUE, # scale width of box by number of obs scales=list(alternating=3, relation='free'), # setup scales strip=strip.custom(bg=grey(0.9)), # styling for strips par.settings=tps, # apply box/line/point styling panel=function(...) { # within in panel, do the following panel.grid(-1, -1) # make grid lines at all tick marks panel.bwplot(...) # make box-whisker plot } ) 4.17.5.0.1 Interactive Summaries Static figures are a good start, but sometimes an interactive summary is more appropriate for EDA. The histboxp function from the Hmisc package creates interactive (HTML) chunks that can be used in RStudio, or embedded in RMarkdown documents (e.g. these notes or soilReports). Use the mouse to hover over, click, drag, etc. to interact with the data. Double-click to reset the plot. library(Hmisc) # interactive exploration of the MAAT distributions by MLRA histboxp( x = s.df$MAAT, group = s.df$mlra, bins = 100, xlab = 'Mean Annual Air Temperature (deg C)' ) # interactive exploration of the Effective PPT distributions by MLRA histboxp( x = s.df$eff.PPT, group = s.df$mlra, bins = 100, xlab = 'Annual Sum of Monthly PPT - PET (mm)' ) –> 4.18 Additional Reading (Spatial) Ahmed, Zia. 2020. Geospatial Data Science with R. Gimond, M., 2019. Intro to GIS and Spatial Analysis https://mgimond.github.io/Spatial/ Hijmans, R.J. 2019. Spatial Data Science with R. https://rspatial.org/ Lovelace, R., J. Nowosad, and J. Muenchow, 2019. Geocomputation with R. CRC Press. https://bookdown.org/robinlovelace/geocompr/ Pebesma, E., and R.S. Bivand. 2005. Classes and methods for spatial data: The sp package. https://cran.r-project.org/web/packages/sp/vignettes/intro_sp.pdf. Pebesma, E. and R. Bivand, 2019. Spatial Data Science. https://keen-swartz-3146c4.netlify.com/ Applied Spatial Data Analysis with R "],["sampling.html", "Chapter 5 Sampling 5.1 Introduction 5.2 Sampling Strategies 5.3 Evaluating a Sampling Strategy 5.4 Additional Reading (Sampling)", " Chapter 5 Sampling 5.1 Introduction Sampling is a fundamental part of statistics. Samples are collected to achieve an understanding of a population because it is typically not feasible to observe all members of the population. The goal is to collect samples that provide an accurate representation of the population. Constraints on time and money dictate that the sampling effort must be efficient. More samples are needed to characterize the nature of highly variable populations than less variable populations. Define your purpose: What are you investigating? Examples include soil properties, soil classes, and plant productivity. How many samples are needed? The question of how many samples are required is complex. As per usual, the answer is ‘it depends’. For example, it depends on the type of analysis (e.g. non-spatial vs spatial) and properties of the data (e.g. continuous vs categorical). In all cases it requires an understanding/assumptions of the underlying population. If a scientist can estimate the several population variables, formulas exist to estimate the required number of samples. The following are a list of methods for estimating sample size: Standard error Confidence interval Power analysis (hypothesis testing) Distance/time Prediction error Rules of thumb NSSH 627.8 The first 3 methods use formulas for their corresponding statistics to solve for the sample size, each results in progressively higher sample size requirements. The PracTools R package (Valliant and Dever 2022) offers several functions for the 1st and 2nd methods. The pwr (Champely 2020) and WebPower (Zhang and Mai 2021) R packages offer several functions for the 3rd method, based on a variety of statistical models. Gelman, Hill, and Vehtari (2020) provides a nice graphical illustration of the variables involved with these methods. 5.1.1 DSM classes A variation of the 2nd method is described by Congalton and Green (2019) for use with categorical data, which is applicable to digital soil mapping. nMultinomial <- function(k = NULL, p = 0.5, error = 0.1, alpha = 0.05) { # k = number of classes # p = proportion of the largest class # error = margin of error # alpha = confidence level probability ceiling(qchisq(1 - alpha / k, 1) * p * (1 - p) / error^2) } nMultinomial(k = c(10, 20, 30)) ## [1] 197 229 248 nMultinomial(k = 10, error = c(0.05, 0.1, 0.2)) ## [1] 788 197 50 nMultinomial(k = 10, alpha = c(0.05, 0.1, 0.2)) ## [1] 197 166 136 5.1.2 Rules of thumb Some rules of thumb for regression models are as follows: Use > 10 observations (n) per predictor (m) (Kutner et al. (2005)). Use > 20 n per m and n > 104 + m to test regression coefficients (Rossiter 2017; Franklin and Miller 2009). Never use n < 5*m (Rossiter 2017). 5.1.3 NSSH 627.8 Documentation requirement for the following data elements are specified in the section 627.8 of the National Soil Survey Handbook (NSSH). # NSSH 627.8 Documentation # soil series data.frame( level = "soil series", n = c(5, 10), acres = c(2000, 20000) ) ## level n acres ## 1 soil series 5 2000 ## 2 soil series 10 20000 # components data.frame( level = "components", n = 1, acres = 3000 ) ## level n acres ## 1 components 1 3000 # map units data.frame( level = "map unit", n = cumsum(c(30, rep(10, 3))), acres = c(2000, seq(from = 4000, by = 4000, length.out = 3)) ) ## level n acres ## 1 map unit 30 2000 ## 2 map unit 40 4000 ## 3 map unit 50 8000 ## 4 map unit 60 12000 5.2 Sampling Strategies library(sf) library(ggplot2) # set the seed for the random number generator set.seed(4) # Create a sixteen square polygon bb <- st_make_grid(st_bbox(c(xmin = 0, xmax = 6, ymin = 0, ymax = 6)), n = 6) grd <- st_as_sf(bb) grd$ID <- 1:length(bb) 5.2.1 Simple Random In simple random sampling, all samples within the region have an equal chance of being selected. A simple random selection of points can be made using either the st_sample() function within the sf R package or the Create Random Points tool in ArcGIS. Advantages Simple Unbiased (equal probability of inclusion) Requires little prior knowledge of the population Howell et al. (2004) - produced a “much more sensitive, more accurate, and greater range of estimated values” than the models from the subjective samples Disadvantages Inefficient (requires large numbers) Lower accuracy Higher cost Samples may not be representative of the feature attribute(s) Uneven spatial distribution (e.g. clustered) # Generate simple random sample test <- st_sample(grd, size = 16, type = "random") ggplot() + geom_sf(data = grd) + geom_sf(data = test) + ggtitle("Simple") 5.2.2 Systematic In systematic sampling, a sample is taken according to a regularized pattern. This approach ensures even spatial coverage. Patterns may be rectilinear, triangular, or hexagonal. This sampling strategy can be inaccurate if the variation in the population doesn’t coincide with the regular pattern (e.g., if the population exhibits periodicity). Advantages Simple Precise estimates Even spatial coverage Greater efficiency Disadvantages Biased estimates (particularly sampling variance) May miss individuals that don’t coincide with the sampling interval If so, the density needs to be increased Limited utility for areas larger than a single field Grid may not optimally fit irregular shapes # Generate systematic random sample test <- st_sample(grd, size = 16, type = "regular") ggplot() + geom_sf(data = grd) + geom_sf(data = test) + ggtitle("Systematic") 5.2.3 Stratified Random In stratified random sampling, the sampling region is spatially subset into different strata, and random sampling is applied to each strata. If prior information is available about the study area, it can be used to develop the strata. Strata may be sampled equally or in proportion to area; however, if the target of interest is rare in the population, it may be preferable to sample the strata equally Franklin and Miller (2009)]. Advantages More efficient than simple-random Higher accuracy Lower cost Sampling can be sized relative to proportion or variance Disadvantages Require pre-existing knowledge of the population (which may be flawed) If sampling is uneven, weights need to be known May need to construct the strata manually grd2 <- st_cast(grd, "MULTIPOLYGON") st_crs(grd2) <- 5070 test <- st_sample(grd2, size = 16, type = "random", by_polygon = TRUE) ggplot() + geom_sf(data = grd2) + geom_sf(data = test) + ggtitle("Stratified") Note that the spsample() function only stratifies the points spatially. Other more sophisticated designs can be implemented using the spsurvey, sharpshootR, or clhs packages. 5.2.4 Multistage Stratified Random In multistage random sampling, the region is separated into different subsets that are randomly selected (i.e., first stage), and then the selected subsets are randomly sampled (i.e., second stage). This is similar to stratified random sampling, except that with stratified random sampling each strata is sampled. Advantages Most efficient Lower cost Sampling can be sized relative to proportion or variance Disadvantages Less precise Uneven spatial distribution (e.g. clustered) Require pre-existing knowledge of the population (which may be flawed) If sampling is uneven, weights need to be known May need to construct the strata manually # Select 8 samples from each square idx <- sample(1:nrow(grd), size = 2, replace = FALSE) grd_sub <- grd[idx, ] test <- sapply(1:2, function(i) { st_coordinates(st_sample(grd_sub[i, ], size = 8, type = "random")) }) test <- st_as_sf(as.data.frame(test), coords = 1:2) ggplot() + geom_sf(data = grd) + geom_sf(data = test) + ggtitle("Two-stage") 5.2.5 Spatial Coverage Sampling (e.g. k-means clustering) # spcosa ---- library(spcosa) grd2 <- st_crs(grd, NA) grd_sp <- as(grd, "Spatial") strata <- stratify(grd_sp, nStrata = 16) pts <- spsample(strata) plot(strata, pts) + ggtitle("Spatial Coverage") 5.2.6 Covariate space coverage sampling (e.g. k-means clustering) Covariate space coverage sampling is a stratified sampling technique to obtain representative samples from feature (attribute) space (Brus 2022). Advantages Maximumly stratifies the predictors Automated sample selection Can incorporates cost constraints Ideal for developing map unit concepts (puts points in central landscape positions) Can incorporate legacy points Easily scales to multiple GIS layers Disadvantages Not ideal for map validation (non – probability sample) Inefficient with large GIS layers library(sf) library(terra) source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R") # import volcano DEM, details at http://geomorphometry.org/content/volcano-maungawhau data("volcano") volcano_r <- rast( volcano[87:1, 61:1], crs = crs("+init=epsg:27200"), extent = c( xmin = 2667405, xmax = 2667405 + 61 * 10, ymin = 6478705, ymax = 6478705 + 87 * 10 ) ) names(volcano_r) <- "elev" # calculate slope from the DEM slope_r <- terrain(volcano_r, v = "slope", unit = "degrees") # Stack Elevation and Slope rs <- c(volcano_r, slope_r) # Covariate Space Coverage Sampling source("https://raw.githubusercontent.com/ncss-tech/stats_for_soil_survey/master/exercises/fcsc.R") fs <- cscs(rs, vars = c("elev", "slope"), n = 20) fs_sf <- st_as_sf(fs, coords = c("x", "y"), crs = crs(rs)) # Plot CSCS Samples plot(volcano_r, axes=FALSE) points(fs_sf) 5.2.7 Conditioned Latin Hypercube (cLHS) Conditioned Latin hypercube sampling is a stratified random sampling technique to obtain representative samples from feature (attribute) space (Minasny and McBratney 2006). Advantages Maximumly stratifies the predictors Automated sample selection Incorporates cost constraints Can incorporate legacy points Easily scales to multiple GIS layers Disadvantages Not ideal for map validation (non – probability sample) Not ideal for developing map unit concepts (puts points in weird landscape positions) Difficult to find alternatives for non-accessible points Inefficient with large GIS layers For example, assume you have prior knowledge of a study area and have the time and resources to collect 120 points. You also know the following variables (strata), which are represented as coregistered raster datasets, to be of importance to the soil property or class being investigated: Normalized Difference Vegetation Index (NDVI), Topographic Wetness Index (a.k.a. Wetness Index, compound topographic index), Solar insolation (potential incoming solar radiation), and Relative elevation (a.k.a. relative position, normalized slope height). The cLHS procedure iteratively selects samples from the strata variables such that they replicate the range of values from each stratum. Without a technique such as cLHS, obtaining a sample that is representative of the feature space becomes increasingly difficult as the number of variables (strata) increases. To perform cLHS using R, you can use the clhs package (Roudier 2011). rs2 <- raster::stack(rs) library(clhs) # generate cLHS design cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE) # Plot cLHS Samples par(mar=c(1,1,1,4)) plot(volcano_r, axes=FALSE) points(cs$sampled_data) # Summary of clhs object summary(cs$sampled_data)$data ## elev slope ## Min. : 95.0 Min. : 0.000 ## 1st Qu.:108.8 1st Qu.: 6.701 ## Median :124.5 Median :12.979 ## Mean :130.5 Mean :14.420 ## 3rd Qu.:150.2 3rd Qu.:20.459 ## Max. :184.0 Max. :33.197 ## NA's :1 # Summary of raster objects cbind(summary(volcano_r), summary(slope_r)[1:6]) ## elev ## "Min. : 94.0 " "Min. : 0.000 " ## "1st Qu.:108.0 " "1st Qu.: 7.054 " ## "Median :124.0 " "Median :14.103 " ## "Mean :130.2 " "Mean :14.897 " ## "3rd Qu.:150.0 " "3rd Qu.:21.666 " ## "Max. :195.0 " "Max. :43.032 " Although the above example works well on our small volcano dataset, the clhs package is inefficient if you are working with large raster datasets. To overcome this limitation, you can first take a large random sample and then subsample it using cLHS. sub_s <- spatSample(rs, size = 200, as.points = TRUE) |> st_as_sf() # random sample function from the raster package s <- clhs(sub_s, size = 20, progress = FALSE, simple = FALSE) 5.3 Evaluating a Sampling Strategy To gauge the representativeness of a sampling strategy, you can compare the results it produces to the results for other variables you think might coincide with the soil properties or classes of interest (Hengl 2009). Examples include slope gradient, slope aspect, and vegetative cover. These other variables may be used to stratify the sampling design or to assess the representativeness of our existing samples (e.g., NASIS pedons). The simple example below demonstrates how to compare several sampling strategies by evaluating how well they replicate the distribution of elevation. # set seed set.seed(1234) # create a polygon from the spatial extent of the volcano dataset test <- st_make_grid(ext(volcano_r), n = 1) # take a large random sample sr400 <- spatSample(rs, size = 1000, method = "random", as.points = TRUE) # take a small random sample sr <- spatSample(rs, size = 20, method = "random", as.points = TRUE) # take a small systematic random sample sys <- spatSample(rs, size = 20, method = "regular", as.points = TRUE) # take a cLHS sample cs <- clhs(rs2, size = 20, progress = FALSE, simple = FALSE) # take a CSCS sample fs <- cscs(rs, vars = c("elev", "slope"), n = 20) # Combind and Extract Samples s <- rbind( data.frame(method = "Simple Random 400", as.data.frame(sr400)), data.frame(method = "Simple Random", as.data.frame(sr)), data.frame(method = "Systematic Random", as.data.frame(sys)), data.frame(method = "cLHS", slot(cs$sampled_data, 'data')), data.frame(method = "CSCS", fs[c("elev", "slope")]) ) # Summarize the sample values aggregate(slope ~ method, data = s, function(x) round(summary(x))) ## method slope.Min. slope.1st Qu. slope.Median slope.Mean slope.3rd Qu. slope.Max. ## 1 cLHS 3 8 15 16 21 32 ## 2 CSCS 1 7 15 16 24 36 ## 3 Simple Random 0 14 17 18 22 34 ## 4 Simple Random 400 0 6 14 15 22 43 ## 5 Systematic Random 1 8 11 14 20 32 # Plot overlapping density plots to compare the distributions between the large and small samples ggplot(s, aes(x = slope, col = method)) + geom_density(cex = 2) # plot the spatial locations par(mfrow = c(2, 2), mar = c(1,2,4,5)) plot(volcano_r, main = "Simple random", cex.main = 2, axes=FALSE) points(sr, pch = 3, cex = 1.2) plot(volcano_r, main = "Systematic random", cex.main = 2, axes=FALSE) points(sys, pch = 3, cex = 1.2) plot(volcano_r, main = "cLHS", cex.main = 2, axes=FALSE) points(cs$sampled_data, pch = 3, cex = 1.2) plot(volcano_r, main = "CSCS", cex.main = 2, axes=FALSE) points(fs_sf, pch = 3, cex = 1.2) The overlapping density plots above illustrate the differences between large and small sets of samples using several sampling designs. The cLHS approach best duplicates the distribution of elevation (because elevation is explicitly used in the stratification process). The contrast is less severe in the summary metrics, but again cLHS more closely resembles the larger sample. Other comparisons are possible using the approaches in the following chapters. 5.3.1 Exercise: Design a Sampling Strategy Load the “tahoe_lidar_highesthit.tif” dataset in the gdalUtilities package (tahoe <- terra::rast(system.file(\"extdata\", \"tahoe_lidar_bareearth.tif\", package = \"gdalUtilities\"))) or use your own data set. Compare two or more sampling approaches and evaluate how representative they are. Show your work and submit the results to your mentor. 5.4 Additional Reading (Sampling) Brungard, C., & Johanson, J. (2015). The gate’s locked! I can’t get to the exact sampling spot … can I sample nearby? Pedometron(37), 8-9. http://www.pedometrics.org/Pedometron/Pedometron37.pdf Brus, D.J. and J.J. de Gruijter. “Random sampling or geostatistical modelling? Choosing between design-based and model-based sampling strategies for soil (with discussion).” Geoderma. Vol. 80. 1. Elsevier, 1997. 1-44. https://www.sciencedirect.com/science/article/pii/S0016706197000724 Brus, Dick J. Spatial Sampling with R. First edition, CRC Press, 2022, https://github.com/DickBrus/SpatialSamplingwithR. de Gruijter, J., D.J. Brus, M.F.P. Bierkens, and M. Knotters. 2006. Sampling for natural resource monitoring: Springer. http://www.springer.com/us/book/9783540224860. Viscarra Rossel, R.A., et al. “Baseline estimates of soil organic carbon by proximal sensing: Comparing design-based, model-assisted and model-based inference.” Geoderma 265 (2016): 152-163. https://www.sciencedirect.com/science/article/pii/S0016706115301312 References Brus, Dick J. 2022. Spatial Sampling with R. 1st ed. Boca Raton: Chapman; Hall/CRC. https://doi.org/10.1201/9781003258940. Champely, Stephane. 2020. “Pwr: Basic Functions for Power Analysis.” https://CRAN.R-project.org/package=pwr. Congalton, Russell G., and Kass Green. 2019. “Thematic Map Accuracy Assessment Considerations.” In Assessing the Accuracy of Remotely Sensed Data, 3rd ed., 77–106. CRC Press. https://doi.org/10.1201/9780429052729-6. Franklin, Janet, and Jennifer A Miller. 2009. Mapping Species Distributions: Spatial Inference and Prediction. Cambridge; New York: Cambridge University Press. https://doi.org/10.1017/CBO9780511810602. Gelman, Andrew, Jennifer Hill, and Aki Vehtari. 2020. “16 - Design and Sample Size Decisions.” In Regression and Other Stories, 1st ed., 291–312. Cambridge University Press. https://doi.org/10.1017/9781139161879. Hengl, Tomislav. 2009. A Practical Guide to Geostatistical Mapping. 2nd extended ed. Amsterdam: Hengl. http://spatial-analyst.net/book/. Kutner, Michael H., Christopher J. Nachtsheism, John Neter, and William Li. 2005. Applied Linear Statistical Models. 5th ed. The McGraw-Hill/Irwin Series Operations and Decision Sciences. Boston: McGraw-Hill Irwin. Minasny, Budiman, and Alex B. McBratney. 2006. “A Conditioned Latin Hypercube Method for Sampling in the Presence of Ancillary Information.” Computers & Geosciences 32 (9): 1378–88. https://doi.org/10.1016/j.cageo.2005.12.009. Rossiter, D. G. 2017. “Sampling for Natural Resources and Environmental Modelling and Monitoring.” Enschede, Netherlands: University of Twente. http://www.css.cornell.edu/faculty/dgr2/teach/index.html. Roudier, Pierre. 2011. Clhs: A r Package for Conditioned Latin Hypercube Sampling. https://cran.r-project.org/web/packages/clhs/. Valliant, Richard, and Jill A. Dever. 2022. “PracTools: Tools for Designing and Weighting Survey Samples.” https://CRAN.R-project.org/package=PracTools. Zhang, Zhiyong, and Yujiao Mai. 2021. “WebPower: Basic and Advanced Statistical Power Analysis.” https://CRAN.R-project.org/package=WebPower. "],["references.html", "References", " References Arnold, R. W., and L. P. Wilding. 1991. “The Need to Quantify Spatial Variability.” In SSSA Special Publications, edited by M. J. Mausbach and L. P. Wilding, 1–8. Madison, WI, USA: Soil Science Society of America. https://doi.org/10.2136/sssaspecpub28.c1. Boyd, Claude E., Craig S. Tucker, and Rawee Viriyatum. 2011. “Interpretation of pH, Acidity, and Alkalinity in Aquaculture and Fisheries.” North American Journal of Aquaculture 73 (4): 403–8. https://doi.org/10.1080/15222055.2011.620861. Brevik, Eric C., Jeffrey A. Homburg, Bradley A. Miller, Thomas E. Fenton, James A. Doolittle, and Samuel J. Indorante. 2016. “Selected Highlights in American Soil Science History from the 1980s to the Mid-2010s.” CATENA 146 (November): 128–46. https://doi.org/10.1016/j.catena.2016.06.021. Brus, Dick J. 2022. Spatial Sampling with R. 1st ed. Boca Raton: Chapman; Hall/CRC. https://doi.org/10.1201/9781003258940. Champely, Stephane. 2020. “Pwr: Basic Functions for Power Analysis.” https://CRAN.R-project.org/package=pwr. Chaney, Nathaniel W., Eric F. Wood, Alexander B. McBratney, Jonathan W. Hempel, Travis W. Nauman, Colby W. Brungard, and Nathan P. Odgers. 2016. “POLARIS: A 30-Meter Probabilistic Soil Series Map of the Contiguous United States.” Geoderma 274: 54–67. https://doi.org/10.1016/j.geoderma.2016.03.025. Congalton, Russell G., and Kass Green. 2019. “Thematic Map Accuracy Assessment Considerations.” In Assessing the Accuracy of Remotely Sensed Data, 3rd ed., 77–106. CRC Press. https://doi.org/10.1201/9780429052729-6. Franklin, Janet, and Jennifer A Miller. 2009. Mapping Species Distributions: Spatial Inference and Prediction. Cambridge; New York: Cambridge University Press. https://doi.org/10.1017/CBO9780511810602. Gelman, Andrew, Jennifer Hill, and Aki Vehtari. 2020. “16 - Design and Sample Size Decisions.” In Regression and Other Stories, 1st ed., 291–312. Cambridge University Press. https://doi.org/10.1017/9781139161879. Hengl, Tomislav. 2009. A Practical Guide to Geostatistical Mapping. 2nd extended ed. Amsterdam: Hengl. http://spatial-analyst.net/book/. Hennemann, G R, and D G Rossiter. 2004. “Training Needs for the Next Generation of Soil Surveyors.” In International Conference on Innovative Techniques in Soil Survey, Cha’am, Thailand, 21-26 March 2004, 22–26. Cha-Am, Thailand: Land Development Department. http://www.css.cornell.edu/faculty/dgr2/Docs/ChaAm/ChaAmKeynoteHennemann.pdf. Ihaka, Ross, and Robert Gentleman. 1996. “R: A Language for Data Analysis and Graphics.” Journal of Computational and Graphical Statistics 5 (3): 299–314. https://doi.org/10.1080/10618600.1996.10474713. Kempen, Bas, Dick J. Brus, Jetse J. Stoorvogel, Gerard B. M. Heuvelink, and Folkert de Vries. 2012. “Efficiency Comparison of Conventional and Digital Soil Mapping for Updating Soil Maps.” Soil Science Society of America Journal 76 (6): 2097–2115. https://doi.org/https://doi.org/10.2136/sssaj2011.0424. Kutner, Michael H., Christopher J. Nachtsheism, John Neter, and William Li. 2005. Applied Linear Statistical Models. 5th ed. The McGraw-Hill/Irwin Series Operations and Decision Sciences. Boston: McGraw-Hill Irwin. MacMillan, Robert A., David E. Moon, and Ray A. Coupé. 2007. “Automated Predictive Ecological Mapping in a Forest Region of b.c., Canada, 2001–2005.” Geoderma 140 (4): 353–73. https://doi.org/10.1016/j.geoderma.2007.04.027. Mausbach, M. J. 2003. “The Importance of Statistical Documentation - Keeping Soil Survey Information Relevant in the 21st Century.” In 2003 National Cooperative Soil Survey Conference, 3–6. Plymouth, Massachusetts: National Cooperative Soil Survey. https://web.archive.org/web/20220121020421/https://www.nrcs.usda.gov/Internet/FSE_DOCUMENTS/nrcs142p2_051833.pdf. Maynard, Jonathan J., Travis W. Nauman, Shawn W. Salley, Brandon T. Bestelmeyer, Michael C. Duniway, Curtis J. Talbot, and Joel R. Brown. 2019. “Digital Mapping of Ecological Land Units Using a Nationally Scalable Modeling Framework.” Soil Science Society of America Journal 83 (3): 666–66. https://doi.org/10.2136/sssaj2018.09.0346. Minasny, Budiman, and Alex B. McBratney. 2006. “A Conditioned Latin Hypercube Method for Sampling in the Presence of Ancillary Information.” Computers & Geosciences 32 (9): 1378–88. https://doi.org/10.1016/j.cageo.2005.12.009. Ramcharan, Amanda, Tomislav Hengl, Travis Nauman, Colby Brungard, Sharon Waltman, Skye Wills, and James Thompson. 2018. “Soil Property and Class Maps of the Conterminous United States at 100-Meter Spatial Resolution.” Soil Science Society of America Journal 82 (1): 186–201. https://doi.org/https://doi.org/10.2136/sssaj2017.04.0122. Rossiter, D. G. 2017. “Sampling for Natural Resources and Environmental Modelling and Monitoring.” Enschede, Netherlands: University of Twente. http://www.css.cornell.edu/faculty/dgr2/teach/index.html. Roudier, Pierre. 2011. Clhs: A r Package for Conditioned Latin Hypercube Sampling. https://cran.r-project.org/web/packages/clhs/. Tukey, John Wilder. 1977. Exploratory Data Analysis. Addison-Wesley Series in Behavioral Science. Reading, Mass: Addison-Wesley Pub. Co. https://archive.org/details/exploratorydataa0000tuke_7616. Valliant, Richard, and Jill A. Dever. 2022. “PracTools: Tools for Designing and Weighting Survey Samples.” https://CRAN.R-project.org/package=PracTools. Webster, R. 2001. “Statistics to Support Soil Research and Their Presentation.” European Journal of Soil Science 52 (2): 331–40. https://doi.org/10.1046/j.1365-2389.2001.00383.x. Zhang, Zhiyong, and Yujiao Mai. 2021. “WebPower: Basic and Advanced Statistical Power Analysis.” https://CRAN.R-project.org/package=WebPower. "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] diff --git a/book/spatial.html b/book/spatial.html index 66b87924..38a75448 100644 --- a/book/spatial.html +++ b/book/spatial.html @@ -23,7 +23,7 @@ - + @@ -415,7 +415,7 @@
    50. 4.17.1 Raster Summary By Point: NASIS Pedon Locations
    51. 4.17.2 Raster Summary By Polygon: Series Extent
    52. 4.17.3 Raster Summary By Polygon: MLRA
    53. -
    54. 4.17.4 Example: Faster with exactextractr
    55. +
    56. 4.17.4 Zonal Statistics with exactextractr
    57. 4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics
    58. 4.18 Additional Reading (Spatial)
    59. @@ -481,24 +481,24 @@

      4.1 Objectives (Spatial Data)

      Create maps with R

      The next sections will require loading these libraries into the R session.

      -
      # SPC and soil database interface
      -library(aqp)
      -library(soilDB)
      -
      -# "Simple Feature" (vector) data structures 
      -library(sf)
      -
      -# superseded by sf -- spatial object classes e.g. SpatialPoints/SpatialPolygons
      -library(sp)
      -
      -# gridded data management / analysis
      -library(terra)
      -
      -# superseded by terra
      -# library(raster)
      -
      -# interactive maps with leaflet
      -library(mapview)
      +
      # SPC and soil database interface
      +library(aqp)
      +library(soilDB)
      +
      +# "Simple Feature" (vector) data structures 
      +library(sf)
      +
      +# superseded by sf -- spatial object classes e.g. SpatialPoints/SpatialPolygons
      +library(sp)
      +
      +# gridded data management / analysis
      +library(terra)
      +
      +# superseded by terra
      +# library(raster)
      +
      +# interactive maps with leaflet
      +library(mapview)

      There are many packages available for working with spatial data, however we only have time to cover introducing a few common libraries.

      A couple resources are linked here for 5 packages that provide different ways displaying spatial data graphically:

        @@ -559,38 +559,38 @@

        4.4 Viewing Pedon Locations4.4.1 Plotting Geographic Data

        Making maps of data gives you some idea how data look spatially and whether their distribution is what you expect.

        Typos are relatively common when coordinates are manually entered. Viewing the data spatially is a quick way to see if any points plot far outside of the expected geographic area of interest.

        -
        # plot the locations of the gopheridge pedons with R
        -# 
        -# Steps:
        -# 1) create and inspect an sf data.frame object
        -# 2) plot the data with mapview
        -
        -# load libraries
        -library(aqp)
        -library(soilDB)
        -library(sf)
        -library(mapview)
        -
        -# this creates sample gopheridge object in your environment
        -data("gopheridge", package = "soilDB")
        -
        -# replace gopheridge object with fetchNASIS() (your data)
        -# gopheridge <- fetchNASIS()
        -
        -# create simple features POINT geometry data.frame
        -# st_as_sf(): convert data.frame to spatial simple features, with points in $geometry 
        -# st_crs(): set EPSG:4326 Coordinate Reference System (CRS) as Well-Known Text (WKT)
        -gopher.locations <- st_as_sf(
        -  site(gopheridge), 
        -  coords = c('longstddecimaldegrees','latstddecimaldegrees'),
        -  crs = st_crs(4326)
        -)
        -
        -# create interactive map with sfc_POINT object
        -#  use site_id in sf data.frame as labels
        -mapview(gopher.locations, label = gopher.locations$site_id)
        -
        - +
        # plot the locations of the gopheridge pedons with R
        +# 
        +# Steps:
        +# 1) create and inspect an sf data.frame object
        +# 2) plot the data with mapview
        +
        +# load libraries
        +library(aqp)
        +library(soilDB)
        +library(sf)
        +library(mapview)
        +
        +# this creates sample gopheridge object in your environment
        +data("gopheridge", package = "soilDB")
        +
        +# replace gopheridge object with fetchNASIS() (your data)
        +# gopheridge <- fetchNASIS()
        +
        +# create simple features POINT geometry data.frame
        +# st_as_sf(): convert data.frame to spatial simple features, with points in $geometry 
        +# st_crs(): set EPSG:4326 Coordinate Reference System (CRS) as Well-Known Text (WKT)
        +gopher.locations <- st_as_sf(
        +  site(gopheridge), 
        +  coords = c('longstddecimaldegrees','latstddecimaldegrees'),
        +  crs = st_crs(4326)
        +)
        +
        +# create interactive map with sfc_POINT object
        +#  use site_id in sf data.frame as labels
        +mapview(gopher.locations, label = gopher.locations$site_id)
        +
        +

    -
    library(aqp)
    -library(soilDB)
    -library(sf)
    -library(mapview)
    -
    -# get pedons from the selected set
    -pedons <- fetchNASIS(from = 'pedons')
    +
    library(aqp)
    +library(soilDB)
    +library(sf)
    +library(mapview)
    +
    +# get pedons from the selected set
    +pedons <- fetchNASIS(from = 'pedons')
    1. Use the base R subset() function to create a subset of your SoilProfileCollection using is.na()
    @@ -639,8 +639,8 @@

    4.5 Exercise 1: Pedon Locations
  • Export the spatial information in pedon.locations_sub to a shape file (.shp) with sf::st_write()
  • -
    # write to SHP; output CRS is geographic coordinate system WGS84
    -sf::st_write(pedon.locations_sub, "./NASIS-pedons.shp")
    +
    # write to SHP; output CRS is geographic coordinate system WGS84
    +sf::st_write(pedon.locations_sub, "./NASIS-pedons.shp")
    1. Send a screenshot of your interactive map, and your R script, to your mentor.
    @@ -703,10 +703,10 @@

    4.6.4 Importing / Exporting Vecto

    For a Geodatabase, you should specify the feature class using the layer argument. Note that a trailing “/” is omitted from the dsn (data source name) and the “.shp” suffix is omitted from the layer.

    4.6.4.1 sf

    -
    x <- sf::st_read(dsn = 'E:/gis_data/ca630/FG_CA630_OFFICIAL.gdb', layer = 'ca630_a')
    -x <- sf::read_sf(dsn = 'E:/gis_data/ca630/pedon_locations.shp')
    -
    sf::st_write(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp')
    -sf::write_sf(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp')
    +
    x <- sf::st_read(dsn = 'E:/gis_data/ca630/FG_CA630_OFFICIAL.gdb', layer = 'ca630_a')
    +x <- sf::read_sf(dsn = 'E:/gis_data/ca630/pedon_locations.shp')
    +
    sf::st_write(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp')
    +sf::write_sf(x, dsn = 'E:/gis_data/ca630/pedon_locations.shp')

    4.6.4.2 sp

    @@ -732,51 +732,51 @@

    4.6.5 Interactive mapping with

    4.7 Exercise 2: Map your favorite soil series extents

    The seriesExtent function in soilDB returns an sf object showing generalized extent polygons for a given soil series.

    -
    # load required packages, just in case
    -library(soilDB)
    -library(sf)
    -library(mapview)
    -
    -# series extents from SoilWeb (sf objects)
    -pentz <- seriesExtent('pentz')
    -amador <- seriesExtent('amador')
    -
    -# combine into a single object
    -s <- rbind(pentz, amador)
    -
    # colors used in the map
    -# add more colors as needed
    -cols <- c('royalblue', 'firebrick')
    -
    -# make a simple map, colors set by 'series' column
    -mapview(s, zcol = 'series', col.regions = cols, legend = TRUE)
    -
    - -

    The following code demonstrates how to fetch / convert / map soil series extents, using a vector of soil series names.

    -

    Results appear in the RStudio “Viewer” pane. Be sure to try the “Export” and “show in window” (next to the broom icon) buttons.

    # load required packages, just in case
     library(soilDB)
     library(sf)
     library(mapview)
     
    -# vector of series names, letter case does not matter
    -# try several (2-9)!
    -series.names <- c('auberry', 'sierra', 'holland', 'cagwin')
    +# series extents from SoilWeb (sf objects)
    +pentz <- seriesExtent('pentz')
    +amador <- seriesExtent('amador')
     
    -# iterate over series names, get extent
    -# result is a list of sf objects
    -s <- lapply(series.names, soilDB::seriesExtent)
    -
    -# flatten list -> single sf object
    -s <- do.call('rbind', s)
    -
    -# colors used in the map
    -# note trick used to dynamically set the number of colors
    -cols <- RColorBrewer::brewer.pal(n = length(series.names), name = 'Set1')
    -
    -# make a simple map, colors set by 'series' column
    -# click on polygons for details
    -# try pop-out / export buttons
    -mapview(s, zcol = 'series', col.regions = cols, legend = TRUE)
    +# combine into a single object +s <- rbind(pentz, amador)

    +
    # colors used in the map
    +# add more colors as needed
    +cols <- c('royalblue', 'firebrick')
    +
    +# make a simple map, colors set by 'series' column
    +mapview(s, zcol = 'series', col.regions = cols, legend = TRUE)
    +
    + +

    The following code demonstrates how to fetch / convert / map soil series extents, using a vector of soil series names.

    +

    Results appear in the RStudio “Viewer” pane. Be sure to try the “Export” and “show in window” (next to the broom icon) buttons.

    +
    # load required packages, just in case
    +library(soilDB)
    +library(sf)
    +library(mapview)
    +
    +# vector of series names, letter case does not matter
    +# try several (2-9)!
    +series.names <- c('auberry', 'sierra', 'holland', 'cagwin')
    +
    +# iterate over series names, get extent
    +# result is a list of sf objects
    +s <- lapply(series.names, soilDB::seriesExtent)
    +
    +# flatten list -> single sf object
    +s <- do.call('rbind', s)
    +
    +# colors used in the map
    +# note trick used to dynamically set the number of colors
    +cols <- RColorBrewer::brewer.pal(n = length(series.names), name = 'Set1')
    +
    +# make a simple map, colors set by 'series' column
    +# click on polygons for details
    +# try pop-out / export buttons
    +mapview(s, zcol = 'series', col.regions = cols, legend = TRUE)

    Question: What do you notice about the areas where the extent polygons occur? Share your thoughts with your peers or mentor

    @@ -799,14 +799,14 @@

    4.8.1 The terra Pack

    4.8.1.1 Terra Example

    This is a brief demonstration using sample data files with terra.

    -
    # use an example from the terra package
    -f <- system.file("ex", "elev.tif", package = "terra")
    -
    -# corresponding luxembourg vector (polygon) data
    -g <- system.file("ex", "lux.shp", package = "terra")
    -
    -r <- terra::rast(f)
    -r
    +
    # use an example from the terra package
    +f <- system.file("ex", "elev.tif", package = "terra")
    +
    +# corresponding luxembourg vector (polygon) data
    +g <- system.file("ex", "lux.shp", package = "terra")
    +
    +r <- terra::rast(f)
    +r
    ## class       : SpatRaster 
     ## dimensions  : 90, 95, 1  (nrow, ncol, nlyr)
     ## resolution  : 0.008333333, 0.008333333  (x, y)
    @@ -816,8 +816,8 @@ 

    4.8.1.1 Terra Example
    v <- terra::vect(g)
    -v

    +
    v <- terra::vect(g)
    +v
    ##  class       : SpatVector 
     ##  geometry    : polygons 
     ##  dimensions  : 12, 6  (geometries, attributes)
    @@ -829,8 +829,8 @@ 

    4.8.1.1 Terra Example
    # show SpatRaster details
    -print(r)

    +
    # show SpatRaster details
    +print(r)
    ## class       : SpatRaster 
     ## dimensions  : 90, 95, 1  (nrow, ncol, nlyr)
     ## resolution  : 0.008333333, 0.008333333  (x, y)
    @@ -840,16 +840,16 @@ 

    4.8.1.1 Terra Example
    # default plot method
    -plot(r)
    -lines(v)
    -

    -
    # interactive (leaflet) plot method
    -p <- plet(r, tiles = "OpenTopoMap")
    -
    -lines(p, v)
    -
    - +
    # default plot method
    +plot(r)
    +lines(v)
    +

    +
    # interactive (leaflet) plot method
    +p <- plet(r, tiles = "OpenTopoMap")
    +
    +lines(p, v)
    +
    +

    The R object only stores a reference to the data until they are needed to be loaded into memory. This allows for internal raster manipulation algorithms to intelligently deal with very large grids that may not fit in memory.

    @@ -857,11 +857,11 @@

    4.8.1.2 Other approaches to raste
    4.8.1.2.1 raster

    A more complete background on the capabilities of the raster package, and the replacement terra, are described in the Spatial Data Science with R online book.

    -
    # convert r to a RasterLayer object
    -r2 <- raster::raster(f)
    -
    -# show RasterLayer details
    -print(r2) 
    +
    # convert r to a RasterLayer object
    +r2 <- raster::raster(f)
    +
    +# show RasterLayer details
    +print(r2) 
    ## class      : RasterLayer 
     ## dimensions : 90, 95, 8550  (nrow, ncol, ncell)
     ## resolution : 0.008333333, 0.008333333  (x, y)
    @@ -927,7 +927,7 @@ 

    4.9 Coordinate Reference Systems

    While you may encounter PROJ.4 strings, these are no longer considered the preferred method of referencing Coordinate Reference Systems – and, in general, newer methods are “easier.”

    Well-known text (WKT) is a human- machine-readable standard format for geometry, so storing the Coordinate Reference System information in a similar format makes sense. This format is returned by the sf::st_crs() method.

    For example: the WKT representation of EPSG:4326:

    -
    st_crs(4326)
    +
    st_crs(4326)
    ## Coordinate Reference System:
     ##   User input: EPSG:4326 
     ##   wkt:
    @@ -963,138 +963,138 @@ 

    4.9 Coordinate Reference Systems

    4.9.1 Assigning and Transforming Coordinate Systems

    Returning to the example from above, lets assign a CRS to our series extent s using different methods.

    -
    s <- seriesExtent('san joaquin')
    +
    s <- seriesExtent('san joaquin')

    The following sections give equivalent sf versus sp syntax.

    4.9.1.1 sf

    Use st_crs<- to set, or st_crs() get CRS of sf objects. Supply the target EPSG code as an integer.

    -
    # the CRS of s is EPSG:4326
    -st_crs(s) == st_crs(4326)
    +
    # the CRS of s is EPSG:4326
    +st_crs(s) == st_crs(4326)
    ## [1] TRUE
    -
    # set CRS using st_crs<- (replace with identical value)
    -st_crs(s) <- st_crs(4326)
    +
    # set CRS using st_crs<- (replace with identical value)
    +st_crs(s) <- st_crs(4326)

    Transformation of points, lines, and polygons with sf requires an “origin” CRS be defined in the argument x. The “target” CRS is defined as an integer (EPSG code) in the crs argument or is the output of st_crs().

    -
    # transform to UTM zone 10
    -s.utm <- st_transform(x = s, crs = 26910)
    -
    -# transform to GCS NAD27
    -s.nad27 <- st_transform(x = s, crs = st_crs(4267))
    +
    # transform to UTM zone 10
    +s.utm <- st_transform(x = s, crs = 26910)
    +
    +# transform to GCS NAD27
    +s.nad27 <- st_transform(x = s, crs = st_crs(4267))

    4.9.1.2 sp

    You can do the same thing several different ways with sp objects. An equivalent EPSG, OGC and PROJ.4 can be set or get using proj4string<-/proj4string and either a sp CRS object or a PROJ.4 string for Spatial objects.

    -
    # s is an sf object (we converted it), convert back to Spatial* object
    -s.sp <- sf::as_Spatial(s) 
    -
    -# these all create the same internal sp::CRS object
    -proj4string(s.sp) <- sp::CRS('EPSG:4326')          # proj >6; EPSG
    -proj4string(s.sp) <- sp::CRS('OGC:CRS84')          # proj >6; OGC
    -proj4string(s.sp) <- '+init=epsg:4326'             # proj4 style +init string
    -proj4string(s.sp) <- '+proj=longlat +datum=WGS84'  # proj4 style +proj string
    +
    # s is an sf object (we converted it), convert back to Spatial* object
    +s.sp <- sf::as_Spatial(s) 
    +
    +# these all create the same internal sp::CRS object
    +proj4string(s.sp) <- sp::CRS('EPSG:4326')          # proj >6; EPSG
    +proj4string(s.sp) <- sp::CRS('OGC:CRS84')          # proj >6; OGC
    +proj4string(s.sp) <- '+init=epsg:4326'             # proj4 style +init string
    +proj4string(s.sp) <- '+proj=longlat +datum=WGS84'  # proj4 style +proj string

    Here, we do the same transformations we did above only using sp: spTransform().

    -
    # transform to UTM zone 10
    -s.utm <- spTransform(s.sp, CRS('+proj=utm +zone=10 +datum=NAD83'))
    -
    -# transform to GCS NAD27
    -s.nad27 <- spTransform(s.sp, CRS('+proj=longlat +datum=NAD27'))
    +
    # transform to UTM zone 10
    +s.utm <- spTransform(s.sp, CRS('+proj=utm +zone=10 +datum=NAD83'))
    +
    +# transform to GCS NAD27
    +s.nad27 <- spTransform(s.sp, CRS('+proj=longlat +datum=NAD27'))

    4.9.1.3 terra and raster

    To assign or get the coordinate reference system for raster, terra or sp CRS objects use the crs() functions.

    -
    r <- terra::rast(system.file("ex", "elev.tif", package="terra"))
    -
    -# inspect CRS
    -terra::crs(r)
    -
    -# r is a SpatRaster object; set CRS to current CRS
    -terra::crs(r) <- terra::crs("OGC:CRS84")
    +
    r <- terra::rast(system.file("ex", "elev.tif", package="terra"))
    +
    +# inspect CRS
    +terra::crs(r)
    +
    +# r is a SpatRaster object; set CRS to current CRS
    +terra::crs(r) <- terra::crs("OGC:CRS84")

    “Transforming” or “warping” a raster is a different from with a vector as it requires interpolation of pixels to a target resolution and CRS.

    The method provided by terra is project() and in raster it is projectRaster().

    It works the same as the above “transform” methods in that you specify an object to transform, and the target reference system or a template for the object.

    -
    t.wgs84 <- terra::project(r, terra::crs("+proj=igh"))
    -r.wgs84 <- raster::projectRaster(raster::raster(r), crs = CRS("+proj=igh"))
    +
    t.wgs84 <- terra::project(r, terra::crs("+proj=igh"))
    +r.wgs84 <- raster::projectRaster(raster::raster(r), crs = CRS("+proj=igh"))

    Note that the default warping of raster uses bilinear interpolation (method='bilinear'), which is appropriate for continuous variables.

    You also have the option of using nearest-neighbor (method='ngb') for categorical variables (class maps) where interpolation would not make sense.

    If we want to save this transformed raster to file, we can use something like this for terra

    -
    terra::writeRaster(t.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW"))
    +
    terra::writeRaster(t.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW"))

    Similarly for raster:

    -
    terra::writeRaster(r.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW"))
    +
    terra::writeRaster(r.wgs84, filename='s_wgs84.tif', gdal=c("COMPRESS=LZW"))

    4.10 Load Required Packages

    Load required packages into a fresh RStudio Session (Ctrl + Shift + F10)

    -
    library(aqp)
    -library(soilDB)
    -library(sf)
    -library(terra)
    +
    library(aqp)
    +library(soilDB)
    +library(sf)
    +library(terra)

    4.11 Download Example Data

    Run the following to create a path for the example data. Be sure to set a valid path to a local disk.

    -
    # store path as a variable, in case you want to keep it somewhere else
    -ch4.data.path <- 'C:/workspace2/chapter-4'
    -
    -# make a place to store chapter 2b example data
    -dir.create(ch4.data.path, recursive = TRUE)
    -
    -# download polygon example data from github
    -download.file(
    -  'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-mu-polygons.zip', 
    -  file.path(ch4.data.path, 'chapter-4-mu-polygons.zip')
    -)
    -
    -# download raster example data from github 
    -download.file(
    -  'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-PRISM.zip', 
    -  file.path(ch4.data.path, 'chapter-4-PRISM.zip')
    -)
    -
    -# unzip
    -unzip(
    -  file.path(ch4.data.path, 'chapter-4-mu-polygons.zip'), 
    -  exdir = ch4.data.path, overwrite = TRUE
    -)
    -
    -unzip(
    -  file.path(ch4.data.path, 'chapter-4-PRISM.zip'), 
    -  exdir = ch4.data.path, overwrite = TRUE
    -)
    +
    # store path as a variable, in case you want to keep it somewhere else
    +ch4.data.path <- 'C:/workspace2/chapter-4'
    +
    +# make a place to store chapter 2b example data
    +dir.create(ch4.data.path, recursive = TRUE)
    +
    +# download polygon example data from github
    +download.file(
    +  'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-mu-polygons.zip', 
    +  file.path(ch4.data.path, 'chapter-4-mu-polygons.zip')
    +)
    +
    +# download raster example data from github 
    +download.file(
    +  'https://github.com/ncss-tech/stats_for_soil_survey/raw/master/data/chapter_4-spatial-data/chapter-4-PRISM.zip', 
    +  file.path(ch4.data.path, 'chapter-4-PRISM.zip')
    +)
    +
    +# unzip
    +unzip(
    +  file.path(ch4.data.path, 'chapter-4-mu-polygons.zip'), 
    +  exdir = ch4.data.path, overwrite = TRUE
    +)
    +
    +unzip(
    +  file.path(ch4.data.path, 'chapter-4-PRISM.zip'), 
    +  exdir = ch4.data.path, overwrite = TRUE
    +)

    4.12 Load Example MLRA Data

    We will be using polygons associated with MLRA 15 and 18 as part of this demonstration.

    Import these data with sf::st_read().

    -
    # load MLRA polygons
    -mlra <- sf::st_read(file.path(ch4.data.path, 'mlra-18-15-AEA.shp'))
    -
    -## alternately, use your own MLRA
    -# mlra <- soilDB::fetchSDA_spatial(c("15", "18"), by.col="MLRARSYM", geom.src = "MLRAPOLYGON") |> sf::st_transform("EPSG:5070")
    +
    # load MLRA polygons
    +mlra <- sf::st_read(file.path(ch4.data.path, 'mlra-18-15-AEA.shp'))
    +
    +## alternately, use your own MLRA
    +# mlra <- soilDB::fetchSDA_spatial(c("15", "18"), by.col="MLRARSYM", geom.src = "MLRAPOLYGON") |> sf::st_transform("EPSG:5070")

    We will load the sample MLRA 15 and 18 (California) raster data (PRISM derived) using terra::rast(). If using your own MLRA, you will need to update file paths to use your own rasters.

    -
    # mean annual air temperature, Deg C
    -maat <- terra::rast(file.path(ch4.data.path, 'MAAT.tif'))
    -
    -# mean annual precipitation, mm
    -map <- terra::rast(file.path(ch4.data.path, 'MAP.tif'))
    -
    -# frost-free days
    -ffd <- terra::rast(file.path(ch4.data.path, 'FFD.tif'))
    -
    -# growing degree days
    -gdd <- terra::rast(file.path(ch4.data.path, 'GDD.tif'))
    -
    -# percent of annual PPT as rain
    -rain_fraction <- terra::rast(file.path(ch4.data.path, 'rain_fraction.tif'))
    -
    -# annual sum of monthly PPT - ET_p
    -ppt_eff <- terra::rast(file.path(ch4.data.path, 'effective_precipitation.tif'))
    +
    # mean annual air temperature, Deg C
    +maat <- terra::rast(file.path(ch4.data.path, 'MAAT.tif'))
    +
    +# mean annual precipitation, mm
    +map <- terra::rast(file.path(ch4.data.path, 'MAP.tif'))
    +
    +# frost-free days
    +ffd <- terra::rast(file.path(ch4.data.path, 'FFD.tif'))
    +
    +# growing degree days
    +gdd <- terra::rast(file.path(ch4.data.path, 'GDD.tif'))
    +
    +# percent of annual PPT as rain
    +rain_fraction <- terra::rast(file.path(ch4.data.path, 'rain_fraction.tif'))
    +
    +# annual sum of monthly PPT - ET_p
    +ppt_eff <- terra::rast(file.path(ch4.data.path, 'effective_precipitation.tif'))

    Sometimes it is convenient to “stack” raster data that share a common grid size, extent, and coordinate reference system into a multilayer terra SpatRaster object. Calling terra::rast() on a list of SpatRaster is equivalent to making a RasterStack from several RasterLayer with raster::stack().

    -
    # create a raster stack (multiple rasters aligned)
    -rs <- terra::rast(list(maat, map, ffd, gdd, rain_fraction, ppt_eff))
    -
    -# inspect
    -rs
    +
    # create a raster stack (multiple rasters aligned)
    +rs <- terra::rast(list(maat, map, ffd, gdd, rain_fraction, ppt_eff))
    +
    +# inspect
    +rs
    ## class       : SpatRaster 
     ## dimensions  : 762, 616, 6  (nrow, ncol, nlyr)
     ## resolution  : 0.008333333, 0.008333333  (x, y)
    @@ -1107,59 +1107,63 @@ 

    4.12 Load Example MLRA Data

    -
    plot(rs)
    -

    +
    plot(rs)
    +

    4.13 Vector Data

    4.13.1 sf

    -
    p <- sf::st_as_sf(data.frame(x = -120, y = 37.5),
    -                  coords = c("x", "y"),
    -                  crs = 4326)
    -p.aea <- st_transform(p, "EPSG:5070")
    +
    p <- sf::st_as_sf(data.frame(x = -120, y = 37.5),
    +                  coords = c("x", "y"),
    +                  crs = 4326)
    +p.aea <- st_transform(p, "EPSG:5070")

    In sf the functions used to do this are st_intersects() or st_intersection().

    -
    st_intersects(p.aea, mlra)
    +
    st_intersects(p.aea, mlra)
    ## Sparse geometry binary predicate list of length 1, where the predicate was `intersects'
     ##  1: 2
    -
    st_intersection(p.aea, mlra)
    +
    st_intersection(p.aea, mlra)
    ## Simple feature collection with 1 feature and 5 fields
     ## Geometry type: POINT
     ## Dimension:     XY
     ## Bounding box:  xmin: -2079434 ymin: 1870764 xmax: -2079434 ymax: 1870764
     ## Projected CRS: NAD83 / Conus Albers
    -##   MLRARSYM MLRA_ID               MLRA_NAME LRRSYM                                                       LRR_NAME                 geometry
    -## 1       18      23 Sierra Nevada Foothills      C California Subtropical Fruit, Truck, and Specialty Crop Region POINT (-2079434 1870764)
    +## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME +## 1 18 23 Sierra Nevada Foothills C California Subtropical Fruit, Truck, and Specialty Crop Region +## geometry +## 1 POINT (-2079434 1870764)

    4.13.2 terra

    -
    p <- terra::vect(data.frame(x = -120, y = 37.5),
    -                 geom = c("x", "y"),
    -                 crs = "EPSG:4326")
    -p.aea <- project(p, "EPSG:5070")
    +
    p <- terra::vect(data.frame(x = -120, y = 37.5),
    +                 geom = c("x", "y"),
    +                 crs = "EPSG:4326")
    +p.aea <- project(p, "EPSG:5070")

    In terra the functions used to determine the intersection is relate().

    -
    mlra[relate(vect(mlra), p.aea, relation = "intersects"), 
    -]
    +
    mlra[relate(vect(mlra), p.aea, relation = "intersects"), 
    +]
    ## Simple feature collection with 1 feature and 5 fields
     ## Geometry type: POLYGON
     ## Dimension:     XY
     ## Bounding box:  xmin: -2181926 ymin: 1548989 xmax: -1970476 ymax: 2264711
     ## Projected CRS: Albers
    -##   MLRARSYM MLRA_ID               MLRA_NAME LRRSYM                                                       LRR_NAME                       geometry
    -## 2       18      23 Sierra Nevada Foothills      C California Subtropical Fruit, Truck, and Specialty Crop Region POLYGON ((-2160599 2264711,...
    +## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME +## 2 18 23 Sierra Nevada Foothills C California Subtropical Fruit, Truck, and Specialty Crop Region +## geometry +## 2 POLYGON ((-2160599 2264711,...

    4.13.3 sp

    In sp objects, you do these operations with the sp::over() function. Access the associated vignette by running vignette("over") in the console when the sp package is loaded.

    -
    # hand make a SpatialPoints object
    -# note that this is GCS
    -p <- SpatialPoints(coords = cbind(-120, 37.5), 
    -                   proj4string = CRS('+proj=longlat +datum=WGS84'))
    -
    -mlra.sp <- sf::as_Spatial(mlra)
    -# spatial extraction of MLRA data requires a CRS transformation
    -p.aea <- spTransform(p, proj4string(mlra.sp))
    -over(p.aea, mlra.sp)
    +
    # hand make a SpatialPoints object
    +# note that this is GCS
    +p <- SpatialPoints(coords = cbind(-120, 37.5), 
    +                   proj4string = CRS('+proj=longlat +datum=WGS84'))
    +
    +mlra.sp <- sf::as_Spatial(mlra)
    +# spatial extraction of MLRA data requires a CRS transformation
    +p.aea <- spTransform(p, proj4string(mlra.sp))
    +over(p.aea, mlra.sp)
    @@ -1185,91 +1189,91 @@

    4.14.2 Rasters “In Memory” vs

    4.14.3 Rasters “Continuous” vs. “Categorical”

    Rasters can represent both continuous and categorical (factor) variables. Raster categories are stored as integers with one or more associated labels.

    The categories can be viewed using the levels() and terra::cats() functions. You can have multiple category columns, and the “active” category can be set with terra::activeCat().

    -

    You can use the terra::classify() function to assign integer values to each pixel that can be the basis for you categories. Then, you can set the categories associated.

    +

    You can use the terra::classify() function to assign integer values to each pixel that can be the basis for your categories. Then, you can set the category labels associated with each integer value.

    For example, we classify the terra sample elevation dataset into high and low elevation areas. We supply a reclassification matrix of values with three columns. The first column is the “low” end of the class range, the second column is the high end of the class range. The third column contains the new values to assign.

    -
    x <- terra::rast(system.file("ex", "elev.tif", package = "terra"))
    -
    -rcl <- cbind(c(0, 300), c(300, 600), 1:2)
    -colnames(rcl) <- c("low", "high", "new_value")
    -rcl
    +
    x <- terra::rast(system.file("ex", "elev.tif", package = "terra"))
    +
    +rcl <- cbind(c(0, 300), c(300, 600), 1:2)
    +colnames(rcl) <- c("low", "high", "new_value")
    +rcl
    ##      low high new_value
     ## [1,]   0  300         1
     ## [2,] 300  600         2
    -
    y <- terra::classify(x, rcl)
    -plot(y)
    -

    +
    y <- terra::classify(x, rcl)
    +plot(y)
    +

    Once we classify a raster into a set of integer values, we can assign labels or categories to each value with levels():

    -
    new_levels <- data.frame(
    -  values = 1:2,
    -  region = c("low elevation", "high elevation"),
    -  otherlabel = c("A", "B")
    -)
    -new_levels
    +
    new_levels <- data.frame(
    +  values = 1:2,
    +  region = c("low elevation", "high elevation"),
    +  otherlabel = c("A", "B")
    +)
    +new_levels
    ##   values         region otherlabel
     ## 1      1  low elevation          A
     ## 2      2 high elevation          B
    -
    levels(y) <- new_levels
    -plot(y)
    -

    +
    levels(y) <- new_levels
    +plot(y)
    +

    Our categories had two columns with labels. The first one (region) is selected by default. We can use the second (otherlabel) if we set it as the active category with terra::activeCat().

    -
    terra::activeCat(y) <- "otherlabel"
    -plot(y)
    -

    +
    terra::activeCat(y) <- "otherlabel"
    +plot(y)
    +

    We can also handle values that are not matched in classify() matrix with the others argument. Here we set others = 3 so that any cell values that are not included in rcl get assigned value 3.

    -
    rcl <- cbind(c(200, 300), c(300, 600), 1:2)
    -colnames(rcl) <- c("low", "high", "new_value")
    -rcl
    +
    rcl <- cbind(c(200, 300), c(300, 600), 1:2)
    +colnames(rcl) <- c("low", "high", "new_value")
    +rcl
    ##      low high new_value
     ## [1,] 200  300         1
     ## [2,] 300  600         2
    -
    y2 <- terra::classify(x, rcl, others = 3)
    -plot(y2)
    -

    +
    y2 <- terra::classify(x, rcl, others = 3)
    +plot(y2)
    +

    We have not provided handling for NA values so they are not altered by the above classification. We can convert NA values explicitly by adding them to rcl:

    -
    rcl <- cbind(c(200, 300, NA), c(300, 600, NA), c(1:2, 4))
    -colnames(rcl) <- c("low", "high", "new_value")
    -rcl
    +
    rcl <- cbind(c(200, 300, NA), c(300, 600, NA), c(1:2, 4))
    +colnames(rcl) <- c("low", "high", "new_value")
    +rcl
    ##      low high new_value
     ## [1,] 200  300         1
     ## [2,] 300  600         2
     ## [3,]  NA   NA         4
    -
    y3 <- terra::classify(x, rcl, others = 3)
    -plot(y3)
    -

    +
    y3 <- terra::classify(x, rcl, others = 3)
    +plot(y3)
    +

    Note that classify() works with the “raw” values of categorical rasters, ignoring the categories. To simply change the labels of categorical rasters, use terra::subst() instead.

    4.14.4 Writing Rasters to File

    Exporting data requires consideration of the output format, datatype, encoding of NODATA, and other options such as compression.

    With terra, "COMPRESS=LZW" option is used by default when writing GeoTIFF files. Using the gdal argument e.g.: terra::writeRaster(..., gdal=) is equivalent to specifying options argument to raster::writeRaster().

    -
    # using previous example data set
    -terra::writeRaster(x, filename = 't.wgs84.tif')
    +
    # using previous example data set
    +terra::writeRaster(x, filename = 't.wgs84.tif')

    For example, a RasterLayer object that you wanted to save to disk as an internally-compressed GeoTIFF:

    -
    # using previous example data set
    -raster::writeRaster(x, filename = 'r.tif', options = c("COMPRESS=LZW"))
    +
    # using previous example data set
    +raster::writeRaster(x, filename = 'r.tif', options = c("COMPRESS=LZW"))

    4.14.4.1 Writing Categorical Rasters to File

    When you write categorical rasters to file, categories will either be stored within the file itself, or in a Persistent Auxiliary Metadata (PAM) into an .aux.xml file automatically. If only using terra or other GDAL tools to work with categorical data this is usually sufficient.

    You can also write a .vat.dbf file containing categorical information. Writing this file can be important if you want to use your categories in other GIS software such as ArcGIS (which does not necessarily make full use of GDAL PAM).

    We can write a data.frame containing the levels of our raster to file using foreign::write.dbf() function. You will append the “.vat.dbf” extension to the base filename of your data.

    -
    x <- terra::rast(system.file("ex", "elev.tif", package = "terra"))
    -
    -rcl <- cbind(c(0, 300), c(300, 600), 1:2)
    -colnames(rcl) <- c("low", "high", "new_value")
    -rcl
    -
    -y <- terra::classify(x, rcl)
    -plot(y)
    -
    -terra::writeRaster(y, "my_categorical_data.tif", overwrite = TRUE)
    -
    -my_categories <- data.frame(
    -  values = 1:2,
    -  region = c("low elevation", "high elevation"),
    -  otherlabel = c("A", "B")
    -)
    -
    -foreign::write.dbf(my_categories, file = "my_categorical_data.tif.vat.dbf")
    +
    x <- terra::rast(system.file("ex", "elev.tif", package = "terra"))
    +
    +rcl <- cbind(c(0, 300), c(300, 600), 1:2)
    +colnames(rcl) <- c("low", "high", "new_value")
    +rcl
    +
    +y <- terra::classify(x, rcl)
    +plot(y)
    +
    +terra::writeRaster(y, "my_categorical_data.tif", overwrite = TRUE)
    +
    +my_categories <- data.frame(
    +  values = 1:2,
    +  region = c("low elevation", "high elevation"),
    +  otherlabel = c("A", "B")
    +)
    +
    +foreign::write.dbf(my_categories, file = "my_categorical_data.tif.vat.dbf")
    @@ -1285,22 +1289,22 @@

    4.14.5 Data Types
    # integer grid with a range of 0-100
    -raster::writeRaster(x, filename = 'r.tif', datatype = 'INT1U')
    -
    -# floating point grid with very wide range
    -terra::writeRaster(x, filename = 'r.tif', datatype = 'FLT4S')

    +
    # integer grid with a range of 0-100
    +raster::writeRaster(x, filename = 'r.tif', datatype = 'INT1U')
    +
    +# floating point grid with very wide range
    +terra::writeRaster(x, filename = 'r.tif', datatype = 'FLT4S')

    4.14.5.1 Notes on Compression

    It is often a good idea to create internally-compressed raster data.

    The GeoTiff format can accommodate many different compression algorithms, including lossy (JPEG) compression. Usually, the default “LZW” or “DEFLATE” compression will result in significant savings, especially for data encoded as integers.

    For example, the CONUS gSSURGO map unit key grid at 30m resolution is about 55Gb (GeoTiff, no compression) vs. 2.4Gb after LZW compression.

    -
    # reasonable compression using LZW is the default, compare to 
    -
    -raster::writeRaster(x, filename='r.tif', options=c("COMPRESS=NONE"))
    -
    -# takes longer to write the file, but better compression
    -terra::writeRaster(x, filename='r.tif', gdal=c("COMPRESS=DEFLATE", "PREDICTOR=2", "ZLEVEL=9")
    +
    # reasonable compression using LZW is the default, compare to 
    +
    +raster::writeRaster(x, filename='r.tif', options=c("COMPRESS=NONE"))
    +
    +# takes longer to write the file, but better compression
    +terra::writeRaster(x, filename='r.tif', gdal=c("COMPRESS=DEFLATE", "PREDICTOR=2", "ZLEVEL=9")

    See this article for some ideas on optimization of file read/write times and associated compressed file sizes.

    @@ -1309,25 +1313,21 @@

    4.14.5.1 Notes on Compression4.15 Exercise 3: Creating a Slope Map

    In this exercise you will create a continuous and categorical slope gradient maps from a digital elevation model.

      -
    1. Use the sample Tahoe-area LiDAR elevation dataset from the gdalUtilities package or your own dataset as input. If you use your own data, you may want to make a smaller extent with [terra::crop()]
    2. -
    +
  • Use the sample Tahoe-area LiDAR elevation dataset from the gdalUtilities package or your own dataset as input. If you use your own data, you may want to make a smaller extent with [terra::crop()]

    • tahoe <- terra::rast(system.file("extdata", "tahoe_lidar_bareearth.tif", package = "gdalUtilities"))
    • -
    -
      +
    1. Run terra::terrain() to create a slope map with unit="radians"

    2. Convert radians to percent slope (divide by 2*pi, multiply by 100)

    3. Make a plot of the continuous percent slope. You can use terra::plot() for static or terra::plet() for interactive map.

    4. -
    5. Use terra::classify() to create a categorical map of slope classes. Use the following breaks and assign the integer values 1 through 5 from lowest to highest.

    6. -
    +
  • Use terra::classify() to create a categorical map of slope classes. Use the following breaks and assign the integer values 1 through 5 from lowest to highest.

    • 0 to 3%
    • 3 to 15%
    • 15 to 30%
    • 30 to 60%
    • >60%
    • -
    -
      +
    1. Use levels() to set the categories of your raster.

    2. Write the raster data to a GeoTIFF file with terra::writeRaster()

    3. Write the raster attribute table to a .vat.dbf file with foreign::write.dbf()

    4. @@ -1347,42 +1347,42 @@

      4.16.1 Working with Vector and Ra

      The second method is more efficient (10-100x faster), requires less memory, and can remain statistically sound–as long as a reasonable sampling strategy is applied. Sampling may also help you avoid low-acreage “anomalies” in the raster product. More on sampling methods in the next chapter.

      The extract() function can perform several operations in one call, such as buffering (in projected units) with buffer argument. See the manual page for an extensive listing of optional arguments and what they do.

      Sampling and extraction with terra the results in a SpatVector object. Sampling and extraction with raster methods results in a matrix object.

      -
      # sampling single layer SpatRaster
      -terra::spatSample(maat, size = 10)
      -
      ##         MAAT
      -## 1   9.397423
      -## 2  -1.126910
      -## 3         NA
      -## 4   9.886487
      -## 5  15.875959
      -## 6         NA
      -## 7  18.440052
      -## 8         NA
      -## 9         NA
      -## 10        NA
      -
      # sampling SpatRaster
      -terra::spatSample(rs, size = 10)
      +
      # sampling single layer SpatRaster
      +terra::spatSample(maat, size = 10)
      +
      ##        MAAT
      +## 1  15.09774
      +## 2  13.68487
      +## 3  12.58170
      +## 4  10.36163
      +## 5  11.19041
      +## 6  16.67907
      +## 7  12.59997
      +## 8  14.65289
      +## 9  15.88573
      +## 10 16.70181
      +
      # sampling SpatRaster
      +terra::spatSample(rs, size = 10)
      ##         MAAT         MAP        FFD         GDD rain_fraction effective_precipitation
      -## 1         NA -1.700e+308 -1.70e+308 -1.700e+308     -1.7e+308          -1.700000e+308
      -## 2  11.635321   1.320e+02   1.61e+02   2.008e+03       9.6e+01           -5.705471e+02
      -## 3  16.726570   2.810e+02   3.12e+02   2.707e+03       1.0e+02           -6.213870e+02
      -## 4  16.538191   8.410e+02   3.13e+02   2.635e+03       9.9e+01           -4.493016e+01
      -## 5   7.654097   1.109e+03   1.06e+02   1.278e+03       7.8e+01            5.588147e+02
      -## 6  11.174964   2.330e+02   1.59e+02   1.907e+03       9.4e+01           -4.623396e+02
      -## 7  16.199104   2.600e+02   2.63e+02   2.719e+03       9.8e+01           -5.985933e+02
      -## 8  16.639013   2.920e+02   3.11e+02   2.691e+03       1.0e+02           -6.162298e+02
      -## 9         NA -1.700e+308 -1.70e+308 -1.700e+308     -1.7e+308          -1.700000e+308
      -## 10 17.618853   5.770e+02   3.22e+02   2.891e+03       9.9e+01           -3.374104e+02
      -
      par(mfcol = c(1, 2), mar = c(1, 1, 3, 1))
      -
      -# regular sampling + extraction of raster values
      -x.regular <-  terra::spatSample(
      -  maat,
      -  method = "regular",
      -  size = 100,
      -  as.points = TRUE
      -)
      -x.regular
      +## 1 15.877102 3.740e+02 2.54e+02 2.605e+03 9.9e+01 -4.328053e+02 +## 2 1.135120 1.352e+03 6.20e+01 3.770e+02 3.5e+01 1.000904e+03 +## 3 9.808927 2.380e+02 1.44e+02 1.687e+03 9.0e+01 -3.825956e+02 +## 4 14.968859 9.390e+02 3.36e+02 2.208e+03 9.9e+01 1.742938e+02 +## 5 8.980933 1.413e+03 1.43e+02 1.320e+03 7.5e+01 8.255326e+02 +## 6 NA -1.700e+308 -1.70e+308 -1.700e+308 -1.7e+308 -1.700000e+308 +## 7 NA -1.700e+308 -1.70e+308 -1.700e+308 -1.7e+308 -1.700000e+308 +## 8 13.558878 7.690e+02 1.81e+02 2.251e+03 9.5e+01 3.400877e+01 +## 9 18.099649 1.880e+02 3.33e+02 3.048e+03 9.9e+01 -7.499153e+02 +## 10 15.634830 8.830e+02 2.68e+02 2.462e+03 9.8e+01 2.768894e+01 +
      par(mfcol = c(1, 2), mar = c(1, 1, 3, 1))
      +
      +# regular sampling + extraction of raster values
      +x.regular <-  terra::spatSample(
      +  maat,
      +  method = "regular",
      +  size = 100,
      +  as.points = TRUE
      +)
      +x.regular
      ##  class       : SpatVector 
       ##  geometry    : points 
       ##  dimensions  : 112, 1  (geometries, attributes)
      @@ -1393,66 +1393,66 @@ 

      4.16.1 Working with Vector and Ra ## values : NA ## 16.4 ## 10.89

      -
      # see also raster::sampleRegular()
      -
      -plot(maat,
      -     axes = FALSE,
      -     legend = FALSE,
      -     main = 'Regular Sampling')
      -points(x.regular)
      -
      -# random sample + extraction of raster values
      -# note that NULL values are removed
      -x.random <- terra::spatSample(
      -  maat,
      -  size = 100,
      -  as.points = TRUE,
      -  na.rm = TRUE
      -)
      -
      -# see also raster::sampleRandom()
      -
      -plot(maat,
      -     axes = FALSE,
      -     legend = FALSE,
      -     main = 'Random Sampling with NA Removal')
      -points(x.random)
      -

      +
      # see also raster::sampleRegular()
      +
      +plot(maat,
      +     axes = FALSE,
      +     legend = FALSE,
      +     main = 'Regular Sampling')
      +points(x.regular)
      +
      +# random sample + extraction of raster values
      +# note that NULL values are removed
      +x.random <- terra::spatSample(
      +  maat,
      +  size = 100,
      +  as.points = TRUE,
      +  na.rm = TRUE
      +)
      +
      +# see also raster::sampleRandom()
      +
      +plot(maat,
      +     axes = FALSE,
      +     legend = FALSE,
      +     main = 'Random Sampling with NA Removal')
      +points(x.random)
      +

      Note that the mean can be efficiently estimated, even with a relatively small number of samples.

      -
      # all values: slow for large grids
      -mean(terra::values(maat), na.rm = TRUE)
      -
      -# regular sampling: efficient, central tendency comparable to above
      -mean(x.regular$MAAT, na.rm = TRUE)
      -
      -# this value will be pseudorandom
      -#  depends on number of samples, pattern of NA
      -mean(x.random$MAAT, na.rm = TRUE)
      +
      # all values: slow for large grids
      +mean(terra::values(maat), na.rm = TRUE)
      +
      +# regular sampling: efficient, central tendency comparable to above
      +mean(x.regular$MAAT, na.rm = TRUE)
      +
      +# this value will be pseudorandom
      +#  depends on number of samples, pattern of NA
      +mean(x.random$MAAT, na.rm = TRUE)

      Just how much variation can we expect when collecting 100, randomly-located samples over such a large area?

      -
      # 10 replications of samples of n=100
      -z <- replicate(10, {
      -  mean(terra::spatSample(maat,
      -                         size = 100,
      -                         na.rm = TRUE)$MAAT,
      -       na.rm = TRUE)
      -})
      -
      -# 90% of the time the mean MAAT values were within:
      -quantile(z, probs = c(0.05, 0.95))
      +
      # 10 replications of samples of n=100
      +z <- replicate(10, {
      +  mean(terra::spatSample(maat,
      +                         size = 100,
      +                         na.rm = TRUE)$MAAT,
      +       na.rm = TRUE)
      +})
      +
      +# 90% of the time the mean MAAT values were within:
      +quantile(z, probs = c(0.05, 0.95))

      Do the above routine 100 times: compute the mean MAAT from 100 randomly-located samples. Does it make a difference in your estimates?

      -
      # MLRA polygons in native coordinate system
      -plot(sf::st_geometry(mlra), main = 'MLRA 15 and 18')
      -box()
      -

      -
      # MAAT raster
      -plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)')
      -
      -# plot MAAT raster with MLRA polygons on top
      -# this requires transforming to CRS of MAAT
      -mlra.gcs <- sf::st_transform(mlra, sf::st_crs(maat))
      -plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)')
      -plot(sf::st_geometry(mlra.gcs), main = 'MLRA 15 and 18', add = TRUE)
      -

      +
      # MLRA polygons in native coordinate system
      +plot(sf::st_geometry(mlra), main = 'MLRA 15 and 18')
      +box()
      +

      +
      # MAAT raster
      +plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)')
      +
      +# plot MAAT raster with MLRA polygons on top
      +# this requires transforming to CRS of MAAT
      +mlra.gcs <- sf::st_transform(mlra, sf::st_crs(maat))
      +plot(maat, main = 'PRISM Mean Annual Air Temperature (deg C)')
      +plot(sf::st_geometry(mlra.gcs), main = 'MLRA 15 and 18', add = TRUE)
      +

      @@ -1462,29 +1462,29 @@

      4.17.1 Raster Summary By Point: N

      Extract PRISM data at the coordinates associated with NASIS pedons that have been correlated to the Loafercreek series.

      We will use the sample dataset loafercreek from the soilDB package to get NASIS data. This example can be easily adapted to your own pedon data extracted from NASIS using fetchNASIS(), but if your points are not in California, you will need to supply your own raster data.

      Get some NASIS data and upgrade the “site” data to a sf object.

      -
      data("loafercreek", package="soilDB")
      -
      -# result is a SoilProfileCollection object
      -pedons <- loafercreek
      -
      -## alternately, use fetchNASIS()
      -# pedons <- fetchNASIS()
      -
      -# extract site data
      -s <-  sf::st_as_sf(aqp::site(pedons),
      -                   coords = c("longstddecimaldegrees", "latstddecimaldegrees"),
      -                   crs = 4326,
      -                   na.fail = FALSE)
      +
      data("loafercreek", package="soilDB")
      +
      +# result is a SoilProfileCollection object
      +pedons <- loafercreek
      +
      +## alternately, use fetchNASIS()
      +# pedons <- fetchNASIS()
      +
      +# extract site data
      +s <-  sf::st_as_sf(aqp::site(pedons),
      +                   coords = c("longstddecimaldegrees", "latstddecimaldegrees"),
      +                   crs = 4326,
      +                   na.fail = FALSE)

      Extract PRISM data (the SpatRaster object we made earlier) at the Loafercreek pedon locations and summarize.

      -
      # convert sf object s to terra SpatVector
      -# and project to CRS of the raster
      -s2 <- project(terra::vect(s), rs)
      -
      -# pass to terra::extract()
      -e <- terra::extract(rs, s2, df = TRUE)
      -
      -# summarize: remove first (ID) column using [, -1] j index
      -summary(e[, -1])
      +
      # convert sf object s to terra SpatVector
      +# and project to CRS of the raster
      +s2 <- project(terra::vect(s), rs)
      +
      +# pass to terra::extract()
      +e <- terra::extract(rs, s2, df = TRUE)
      +
      +# summarize: remove first (ID) column using [, -1] j index
      +summary(e[, -1])
      ##       MAAT            MAP              FFD             GDD       rain_fraction   effective_precipitation
       ##  Min.   :13.15   Min.   : 432.0   Min.   :189.0   Min.   :2085   Min.   :96.00   Min.   :-433.14        
       ##  1st Qu.:15.59   1st Qu.: 576.0   1st Qu.:261.2   1st Qu.:2479   1st Qu.:99.00   1st Qu.:-263.46        
      @@ -1493,96 +1493,96 @@ 

      4.17.1 Raster Summary By Point: N ## 3rd Qu.:16.24 3rd Qu.: 771.0 3rd Qu.:307.8 3rd Qu.:2592 3rd Qu.:99.00 3rd Qu.: -36.87 ## Max. :16.58 Max. :1049.0 Max. :330.0 Max. :2654 Max. :99.00 Max. : 201.61

      Join the extracted PRISM data with the original SoilProfileCollection object.

      -
      # combine site data (sf) with extracted raster values (data.frame), row-order is identical, result is sf
      -res <- cbind(s, e)
      -
      -# extract unique IDs and PRISM data
      -# dplyr verbs work with sf data.frames
      -res2 <- dplyr::select(res, upedonid, MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation)
      -
      -# join with original SoilProfileCollection object via pedon_key
      -site(pedons) <- res2
      +
      # combine site data (sf) with extracted raster values (data.frame), row-order is identical, result is sf
      +res <- cbind(s, e)
      +
      +# extract unique IDs and PRISM data
      +# dplyr verbs work with sf data.frames
      +res2 <- dplyr::select(res, upedonid, MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation)
      +
      +# join with original SoilProfileCollection object via pedon_key
      +site(pedons) <- res2

      The extracted values are now part of the “pedons” SoilProfileCollection object via site(<SoilProfileCollection>) <- data.frame LEFT JOIN method.

      Let’s summarize the data we extracted using quantiles.

      -
      # define some custom functions for calculating range observed in site data
      -my_low_function <- function(x) quantile(x, probs = 0.05, na.rm = TRUE)
      -my_rv_function <- function(x) median(x, na.rm = TRUE)
      -my_high_function <- function(x) quantile(x, probs = 0.95, na.rm = TRUE)
      -
      -site(pedons) |> 
      -  dplyr::select(upedonid, MAAT, MAP, FFD, GDD,
      -                rain_fraction, effective_precipitation) |> 
      -  dplyr::summarize(dplyr::across(
      -    MAAT:effective_precipitation,
      -    list(low = my_low_function,
      -         rv = my_rv_function,
      -         high = my_high_function)
      -  ))
      -
      ##   MAAT_low  MAAT_rv MAAT_high MAP_low MAP_rv MAP_high FFD_low FFD_rv FFD_high GDD_low GDD_rv GDD_high rain_fraction_low rain_fraction_rv
      -## 1 14.33665 15.98908  16.51595   479.5  682.5      904     220    285      320 2274.75 2540.5  2638.75             97.25               99
      -##   rain_fraction_high effective_precipitation_low effective_precipitation_rv effective_precipitation_high
      -## 1                 99                   -369.3428                  -151.9985                     94.25339
      +
      # define some custom functions for calculating range observed in site data
      +my_low_function <- function(x) quantile(x, probs = 0.05, na.rm = TRUE)
      +my_rv_function <- function(x) median(x, na.rm = TRUE)
      +my_high_function <- function(x) quantile(x, probs = 0.95, na.rm = TRUE)
      +
      +site(pedons) |> 
      +  dplyr::select(upedonid, MAAT, MAP, FFD, GDD,
      +                rain_fraction, effective_precipitation) |> 
      +  dplyr::summarize(dplyr::across(
      +    MAAT:effective_precipitation,
      +    list(low = my_low_function,
      +         rv = my_rv_function,
      +         high = my_high_function)
      +  ))
      +
      ##   MAAT_low  MAAT_rv MAAT_high MAP_low MAP_rv MAP_high FFD_low FFD_rv FFD_high GDD_low GDD_rv GDD_high rain_fraction_low
      +## 1 14.33665 15.98908  16.51595   479.5  682.5      904     220    285      320 2274.75 2540.5  2638.75             97.25
      +##   rain_fraction_rv rain_fraction_high effective_precipitation_low effective_precipitation_rv effective_precipitation_high
      +## 1               99                 99                   -369.3428                  -151.9985                     94.25339

      4.17.2 Raster Summary By Polygon: Series Extent

      The seriesExtent() function from the soilDB package provides a simple interface to Series Extent Explorer data files. Note that these series extents have been generalized for rapid display at regional to continental scales. A more precise representation of “series extent” can be generated from SSURGO polygons and queried from SDA.

      Get an approximate extent for the Loafercreek soil series from SEE. See the seriesExtent tutorial and manual page for additional options and related functions.

      -
      # get (generalized) amador soil series extent from SoilWeb
      -x <- soilDB::seriesExtent(s = 'loafercreek')
      -
      -# convert to EPSG:5070 Albers Equal Area
      -x <- sf::st_transform(x, 5070)
      +
      # get (generalized) amador soil series extent from SoilWeb
      +x <- soilDB::seriesExtent(s = 'loafercreek')
      +
      +# convert to EPSG:5070 Albers Equal Area
      +x <- sf::st_transform(x, 5070)

      Generate 100 sampling points within the extent using a hexagonal grid. These point locations will be used to extract raster values from our SpatRaster of PRISM data. Note that using a “hexagonal” grid is not supported on geographic coordinates.

      -
      samples <- sf::st_sample(x, size = 100, type = 'hexagonal')
      +
      samples <- sf::st_sample(x, size = 100, type = 'hexagonal')

      For comparison, extract a single point from each SSURGO map unit delineation that contains Loafercreek as a major component. This will require a query to SDA for the set of matching map unit keys (mukey), followed by a second request to SDA for the geometry.

      The SDA_query function is used to send arbitrary queries written in SQL to SDA, the results may be a data.frame or list, depending on the complexity of the query. The fetchSDA_spatial function returns map unit geometry as either polygons, polygon envelopes, or a single point within each polygon as selected by mukey or nationalmusym.

      -
      # result is a data.frame
      -mukeys <- soilDB::SDA_query("SELECT DISTINCT mukey FROM component
      -                             WHERE compname = 'Loafercreek' AND majcompflag = 'Yes';")
      -
      -# result is a sf data.frame
      -loafercreek.pts <- soilDB::fetchSDA_spatial(
      -  mukeys$mukey,
      -  by.col = 'mukey',
      -  method = 'point',
      -  chunk.size = 35
      -)
      +
      # result is a data.frame
      +mukeys <- soilDB::SDA_query("SELECT DISTINCT mukey FROM component
      +                             WHERE compname = 'Loafercreek' AND majcompflag = 'Yes';")
      +
      +# result is a sf data.frame
      +loafercreek.pts <- soilDB::fetchSDA_spatial(
      +  mukeys$mukey,
      +  by.col = 'mukey',
      +  method = 'point',
      +  chunk.size = 35
      +)

      Graphically check both methods:

      -
      # prepare samples and mapunit points for viewing on PRISM data
      -hexagonal <- sf::st_transform(samples, sf::st_crs(maat))
      -x_gcs <- sf::st_transform(x, sf::st_crs(maat))
      -maatcrop <- terra::crop(maat, x_gcs)
      -
      # adjust margins and setup plot device for two columns
      -par(mar = c(1, 1, 3, 1), mfcol = c(1, 2))
      -
      -# first figure
      -plot(maatcrop,
      -     main = 'PRISM MAAT\n100 Sampling Points from Extent',
      -     axes = FALSE)
      -plot(sf::st_geometry(x_gcs), add = TRUE)
      -plot(hexagonal, cex = 0.25, add = T)
      -
      -plot(maatcrop,
      -     main = 'PRISM MAAT\n"Loafercreek" Polygon Centroids',
      -     axes = FALSE)
      -plot(loafercreek.pts, cex = 0.25, add = TRUE)
      -

      +
      # prepare samples and mapunit points for viewing on PRISM data
      +hexagonal <- sf::st_transform(samples, sf::st_crs(maat))
      +x_gcs <- sf::st_transform(x, sf::st_crs(maat))
      +maatcrop <- terra::crop(maat, x_gcs)
      +
      # adjust margins and setup plot device for two columns
      +par(mar = c(1, 1, 3, 1), mfcol = c(1, 2))
      +
      +# first figure
      +plot(maatcrop,
      +     main = 'PRISM MAAT\n100 Sampling Points from Extent',
      +     axes = FALSE)
      +plot(sf::st_geometry(x_gcs), add = TRUE)
      +plot(hexagonal, cex = 0.25, add = T)
      +
      +plot(maatcrop,
      +     main = 'PRISM MAAT\n"Loafercreek" Polygon Centroids',
      +     axes = FALSE)
      +plot(loafercreek.pts, cex = 0.25, add = TRUE)
      +

      Extract PRISM data (the SpatRaster object we made earlier) at the sampling locations (100 regularly-spaced and from MU polygon centroids) and summarize. Note that CRS transformations are automatic (when possible), with a warning.

      -
      # return the result as a data.frame object
      -e <- terra::extract(rs, terra::vect(hexagonal), df = TRUE)
      -e.pts <- terra::extract(rs, terra::vect(loafercreek.pts), df = TRUE)
      -
      -# check out the extracted data
      -summary(e[,-1])
      -
      ##       MAAT            MAP              FFD             GDD       rain_fraction  effective_precipitation
      -##  Min.   :13.48   Min.   : 338.0   Min.   :201.0   Min.   :2147   Min.   :96.0   Min.   :-553.46        
      -##  1st Qu.:15.72   1st Qu.: 514.0   1st Qu.:271.0   1st Qu.:2495   1st Qu.:99.0   1st Qu.:-341.91        
      -##  Median :16.16   Median : 620.5   Median :300.5   Median :2566   Median :99.0   Median :-206.74        
      -##  Mean   :15.98   Mean   : 646.8   Mean   :288.7   Mean   :2542   Mean   :98.8   Mean   :-187.58        
      -##  3rd Qu.:16.46   3rd Qu.: 763.8   3rd Qu.:313.8   3rd Qu.:2625   3rd Qu.:99.0   3rd Qu.: -45.42        
      -##  Max.   :16.95   Max.   :1212.0   Max.   :335.0   Max.   :2729   Max.   :99.0   Max.   : 354.69
      -
      # all pair-wise correlations
      -knitr::kable(cor(e[,-1]), digits = 2)
      +
      # return the result as a data.frame object
      +e <- terra::extract(rs, terra::vect(hexagonal), df = TRUE)
      +e.pts <- terra::extract(rs, terra::vect(loafercreek.pts), df = TRUE)
      +
      +# check out the extracted data
      +summary(e[,-1])
      +
      ##       MAAT            MAP              FFD             GDD       rain_fraction   effective_precipitation
      +##  Min.   :13.18   Min.   : 369.0   Min.   :191.0   Min.   :2077   Min.   :95.00   Min.   :-532.53        
      +##  1st Qu.:15.79   1st Qu.: 521.5   1st Qu.:268.8   1st Qu.:2505   1st Qu.:99.00   1st Qu.:-328.93        
      +##  Median :16.14   Median : 665.5   Median :298.5   Median :2564   Median :99.00   Median :-157.65        
      +##  Mean   :15.94   Mean   : 672.3   Mean   :288.5   Mean   :2534   Mean   :98.75   Mean   :-161.31        
      +##  3rd Qu.:16.43   3rd Qu.: 787.2   3rd Qu.:315.0   3rd Qu.:2614   3rd Qu.:99.00   3rd Qu.: -25.97        
      +##  Max.   :17.10   Max.   :1206.0   Max.   :334.0   Max.   :2751   Max.   :99.00   Max.   : 346.86
      +
      # all pair-wise correlations
      +knitr::kable(cor(e[,-1]), digits = 2)

  • Table 3.1: Short Description of Descriptive Statistics and R FunctionsTable 3.1: Short Description of Descriptive Statistics and R Functions
    @@ -1608,92 +1608,92 @@

    4.17.2 Raster Summary By Polygon:

    - - + + - - + + - + - - - + + + - - + + - - - + + + - - + + - - + + - - - - + + + + - + - + - - - + + +
    MAAT 1.00-0.600.96-0.530.95 0.990.83-0.700.86-0.65
    MAP-0.60-0.53 1.00-0.56-0.65-0.34-0.47-0.59-0.37 0.99
    FFD0.96-0.560.95-0.47 1.000.940.72-0.660.930.75-0.59
    GDD 0.99-0.650.94-0.590.93 1.000.80-0.750.84-0.70
    rain_fraction0.83-0.340.720.800.86-0.370.750.84 1.00-0.43-0.47
    effective_precipitation-0.70-0.65 0.99-0.66-0.75-0.43-0.59-0.70-0.47 1.00

    Quickly compare the two sets of samples.

    -
    # compile results into a list
    -maat.comparison <- list('regular samples' = e$MAAT,
    -                        'polygon centroids' = e.pts$MAAT)
    -
    -# number of samples per method
    -lapply(maat.comparison, length)
    +
    # compile results into a list
    +maat.comparison <- list('regular samples' = e$MAAT,
    +                        'polygon centroids' = e.pts$MAAT)
    +
    +# number of samples per method
    +lapply(maat.comparison, length)
    ## $`regular samples`
    -## [1] 98
    +## [1] 104
     ## 
     ## $`polygon centroids`
     ## [1] 2336
    -
    # summary() applied by group
    -lapply(maat.comparison, summary)
    +
    # summary() applied by group
    +lapply(maat.comparison, summary)
    ## $`regular samples`
     ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    -##   13.48   15.72   16.16   15.98   16.46   16.95 
    +##   13.18   15.79   16.14   15.94   16.43   17.10 
     ## 
     ## $`polygon centroids`
     ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     ##   12.70   15.82   16.19   16.02   16.44   17.41
    -
    # box-whisker plot
    -par(mar = c(4.5, 8, 3, 1), mfcol = c(1, 1))
    -boxplot(
    -  maat.comparison,
    -  horizontal = TRUE,
    -  las = 1,
    -  xlab = 'MAAT (deg C)',
    -  varwidth = TRUE,
    -  boxwex = 0.5,
    -  main = 'MAAT Comparison'
    -)
    -

    +
    # box-whisker plot
    +par(mar = c(4.5, 8, 3, 1), mfcol = c(1, 1))
    +boxplot(
    +  maat.comparison,
    +  horizontal = TRUE,
    +  las = 1,
    +  xlab = 'MAAT (deg C)',
    +  varwidth = TRUE,
    +  boxwex = 0.5,
    +  main = 'MAAT Comparison'
    +)
    +

    Basic climate summaries from a standardized source (e.g. PRISM) might be a useful addition to an OSD, or checking the ranges reported in mapunits.

    @@ -1707,82 +1707,82 @@

    4.17.3 Raster Summary By Polygon:
  • estimation of quantiles from collected raster samples
  • Back to our example data. The first step is to check the MLRA polygons (mlra); how many features per MLRA symbol? Note that some MLRA have more than one polygon.

    -
    table(mlra$MLRARSYM)
    +
    table(mlra$MLRARSYM)

    Convert polygon area from square meters to acres and summarize. Note that this will only make sense when using a projected CRS with units of meters (equal area)!

    -
    poly.area <- terra::expanse(terra::vect(mlra)) / 4046.86 
    -
    -sf::sf_use_s2(TRUE)
    -poly.area.s2 <- units::set_units(x = sf::st_area(mlra), value = "acre")
    -
    -sf::sf_use_s2(FALSE)
    -poly.area.sf <- units::set_units(x = sf::st_area(mlra), value = "acre")
    -
    -summary(poly.area)
    -
    -sum(poly.area)
    -sum(poly.area.s2)
    -sum(poly.area.sf)
    +
    poly.area <- terra::expanse(terra::vect(mlra)) / 4046.86 
    +
    +sf::sf_use_s2(TRUE)
    +poly.area.s2 <- units::set_units(x = sf::st_area(mlra), value = "acre")
    +
    +sf::sf_use_s2(FALSE)
    +poly.area.sf <- units::set_units(x = sf::st_area(mlra), value = "acre")
    +
    +summary(poly.area)
    +
    +sum(poly.area)
    +sum(poly.area.s2)
    +sum(poly.area.sf)

    Sample each polygon at a constant sampling density of 0.001 samples per acre (1 sample for every 1,000 ac.). At this sampling density we should expect approximately 16,700 samples–more than enough for our simple example.

    -
    library(sharpshootR)
    -
    -# the next function requires a polygon ID: 
    -#  each polygon gets a unique number 1--number of polygons
    -mlra$pID <- 1:nrow(mlra)
    -cds <- constantDensitySampling(mlra, n.pts.per.ac = 0.001)
    +
    library(sharpshootR)
    +
    +# the next function requires a polygon ID: 
    +#  each polygon gets a unique number 1--number of polygons
    +mlra$pID <- 1:nrow(mlra)
    +cds <- constantDensitySampling(mlra, n.pts.per.ac = 0.001)

    Extract MLRA symbol at sample points using the sf::st_intersection() function. The result will be a sf object with attributes from our MLRA polygons which intersect the sampling points (cds).

    -
    # spatial overlay: sampling points and MLRA polygons
    -res <- sf::st_intersection(sf::st_transform(sf::st_as_sf(cds), sf::st_crs(mlra)), mlra)
    -
    -# row / feature order is preserved, so we can directly copy
    -cds$mlra <- res$MLRARSYM
    -
    -# tabulate number of samples per MLRA
    -table(cds$mlra)
    +
    # spatial overlay: sampling points and MLRA polygons
    +res <- sf::st_intersection(sf::st_transform(sf::st_as_sf(cds), sf::st_crs(mlra)), mlra)
    +
    +# row / feature order is preserved, so we can directly copy
    +cds$mlra <- res$MLRARSYM
    +
    +# tabulate number of samples per MLRA
    +table(cds$mlra)
    ## 
     ##    15    18 
     ## 11658  5204

    Extract values from the SpatVector of PRISM data as a data.frame.

    -
    e <- terra::extract(rs, terra::project(cds, terra::crs(rs)))
    -
    -# join columns from extracted values and sampling points
    -s.df <- cbind(as(cds, 'data.frame'), e)
    -
    -# check results
    -head(s.df)
    -
    ##   MLRARSYM MLRA_ID                      MLRA_NAME LRRSYM                                                       LRR_NAME pID mlra ID     MAAT  MAP FFD
    -## 1       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15  1 15.19286 1149 306
    -## 2       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15  2 15.33926 1049 307
    -## 3       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15  3 15.42254 1041 313
    -## 4       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15  4 15.44636 1087 308
    -## 5       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15  5 15.39205 1116 316
    -## 6       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15  6 15.43280 1058 313
    -##    GDD rain_fraction effective_precipitation
    -## 1 2303            99                385.6023
    -## 2 2369            99                252.4252
    -## 3 2381            99                242.8284
    -## 4 2382            99                283.1933
    -## 5 2349            99                314.3419
    -## 6 2387            99                258.3234
    +
    e <- terra::extract(rs, terra::project(cds, terra::crs(rs)))
    +
    +# join columns from extracted values and sampling points
    +s.df <- cbind(as(cds, 'data.frame'), e)
    +
    +# check results
    +head(s.df)
    +
    ##   MLRARSYM MLRA_ID                      MLRA_NAME LRRSYM                                                       LRR_NAME pID mlra
    +## 1       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15
    +## 2       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15
    +## 3       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15
    +## 4       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15
    +## 5       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15
    +## 6       15      20 Central California Coast Range      C California Subtropical Fruit, Truck, and Specialty Crop Region   1   15
    +##   ID     MAAT  MAP FFD  GDD rain_fraction effective_precipitation
    +## 1  1 15.19286 1149 306 2303            99                385.6023
    +## 2  2 15.33926 1049 307 2369            99                252.4252
    +## 3  3 15.42254 1041 313 2381            99                242.8284
    +## 4  4 15.44636 1087 308 2382            99                283.1933
    +## 5  5 15.39205 1116 316 2349            99                314.3419
    +## 6  6 15.43280 1058 313 2387            99                258.3234

    Summarizing multivariate data by group (MLRA) is usually much simpler after reshaping data from “wide” to “long” format.

    -
    # reshape from wide to long format
    -m <- tidyr::pivot_longer(s.df, cols = c(MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation))
    -
    -# check "wide" format
    -head(m)
    +
    # reshape from wide to long format
    +m <- tidyr::pivot_longer(s.df, cols = c(MAAT, MAP, FFD, GDD, rain_fraction, effective_precipitation))
    +
    +# check "wide" format
    +head(m)
    ## # A tibble: 6 × 10
    -##   MLRARSYM MLRA_ID MLRA_NAME                      LRRSYM LRR_NAME                                                         pID mlra     ID name     value
    -##   <chr>      <int> <chr>                          <chr>  <chr>                                                          <int> <chr> <dbl> <chr>    <dbl>
    -## 1 15            20 Central California Coast Range C      California Subtropical Fruit, Truck, and Specialty Crop Region     1 15        1 MAAT      15.2
    -## 2 15            20 Central California Coast Range C      California Subtropical Fruit, Truck, and Specialty Crop Region     1 15        1 MAP     1149  
    -## 3 15            20 Central California Coast Range C      California Subtropical Fruit, Truck, and Specialty Crop Region     1 15        1 FFD      306  
    -## 4 15            20 Central California Coast Range C      California Subtropical Fruit, Truck, and Specialty Crop Region     1 15        1 GDD     2303  
    -## 5 15            20 Central California Coast Range C      California Subtropical Fruit, Truck, and Specialty Crop Region     1 15        1 rain_f…   99  
    -## 6 15            20 Central California Coast Range C      California Subtropical Fruit, Truck, and Specialty Crop Region     1 15        1 effect…  386.
    +## MLRARSYM MLRA_ID MLRA_NAME LRRSYM LRR_NAME pID mlra ID name value +## <chr> <int> <chr> <chr> <chr> <int> <chr> <dbl> <chr> <dbl> +## 1 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 MAAT 15.2 +## 2 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 MAP 1149 +## 3 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 FFD 306 +## 4 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 GDD 2303 +## 5 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 rain… 99 +## 6 15 20 Central California Coast Range C California Subtropical Fruit, Truck, and S… 1 15 1 effe… 386.

    A tabular summary of means by MLRA and PRISM variable using dplyr v.s. base tapply().

    -
    # tabular summary of mean values
    -dplyr::group_by(m, mlra, name) %>% 
    -  dplyr::summarize(mean(value)) %>%
    -  dplyr::arrange(name)
    +
    # tabular summary of mean values
    +dplyr::group_by(m, mlra, name) %>% 
    +  dplyr::summarize(mean(value)) %>%
    +  dplyr::arrange(name)
    ## # A tibble: 12 × 3
     ## # Groups:   mlra [2]
     ##    mlra  name                    `mean(value)`
    @@ -1799,114 +1799,169 @@ 

    4.17.3 Raster Summary By Polygon: ## 10 18 effective_precipitation -194. ## 11 15 rain_fraction NA ## 12 18 rain_fraction 97.2

    -
    # base R
    -tapply(m$value, list(m$mlra, m$name), mean, na.rm = TRUE)
    +
    # base R
    +tapply(m$value, list(m$mlra, m$name), mean, na.rm = TRUE)
    ##    effective_precipitation      FFD      GDD     MAAT      MAP rain_fraction
     ## 15               -195.9819 284.5447 2385.213 15.24708 588.6219      98.61088
     ## 18               -193.5583 273.2077 2496.876 15.66580 630.9076      97.23251
    -
    -

    4.17.4 Example: Faster with exactextractr

    +
    +

    4.17.4 Zonal Statistics with exactextractr

    This example shows how to determine the distribution of Frost-Free Days across a soil series extent.

    -

    The data are extracted from the raster data source very rapidly using the exactextractr package.

    -
    library(sf)
    -library(soilDB)
    -library(terra)
    -library(lattice)
    -library(exactextractr)
    -
    -# 5-10 seconds to download Series Extent Explorer data 
    -series <- c('holland', 'san joaquin')
    -
    -# make SpatialPolygonsDataFrame
    -s <- do.call('rbind', lapply(series, seriesExtent))
    -
    -# load pointer to PRISM data
    -r <- rast('C:/workspace2/chapter-4/FFD.tif')
    -
    -# transform extent to CRS of raster with sf
    -s <- st_transform(st_as_sf(s), crs = st_crs(r))
    -
    -# inspect
    -s
    -
    -# use `st_union(s)` to create a MULTI- POINT/LINE/POLYGON from single
    -# use `sf::st_cast(s, 'POLYGON')` to create other types
    -
    -system.time({ ex <- exactextractr::exact_extract(r, s) })
    -
    -# ex is a list(), with data.frame [value, coverage_fraction]
    -#  for each polygon in s (we have one MULTIPOLYGON per series)
    -
    -# combine all list elements `ex` into single data.frame `ex.all`
    -#  - use do.call('rbind', ...) to stack data.frames row-wise
    -#  - an anonymous function that iterates along length of `ex`
    -#  - adding the series name to as a new variable, calculated using `i`
    -ex.all <- do.call('rbind', lapply(seq_along(ex), function(i) {
    -  cbind(data.frame(group = series[i]), ex[[i]])
    -}))
    -
    -# simple summary
    -densityplot(~ value | group, data = ex.all, 
    -            plot.points = FALSE, bw = 2, lwd = 2,
    -            strip = strip.custom(bg = grey(0.85)),
    -            scales = list(alternating = 1),
    -            col = c('RoyalBlue'), layout = c(1, 2),
    -            ylab = 'Density', from = 0, to = 400,
    -            xlab = 'Frost-Free Days (50% chance)\n800m PRISM Data (1981-2010)', 
    -            main = 'FFD Estimate for Extent of San Joaquin and Holland Series'
    -)
    -

    +

    First, we load some sample data. We use soilDB::seriesExtent() to get some extent polygons for two series of interest. Then we load some PRISM-derived Frost Free Day estimates.

    +
    library(sf)
    +library(soilDB)
    +library(terra)
    +library(lattice)
    +library(exactextractr)
    +
    +series <- c('holland', 'san joaquin')
    +s <- do.call('rbind', lapply(series, seriesExtent))
    +
    +# load PRISM data
    +r <- rast('C:/workspace2/chapter-4/FFD.tif')
    +
    +# inspect
    +r
    +
    +# transform extent to CRS of raster 
    +s <- st_transform(s, crs = st_crs(r))
    +
    +# inspect
    +s
    +
    +

    4.17.4.1 Directly Returning Extracted Values

    +

    Data are extracted from the raster data source very rapidly using the exactextractr package.

    +
    # use `st_union(s)` to create a MULTI- POINT/LINE/POLYGON from single
    +# use `sf::st_cast(s, 'POLYGON')` to create other types
    +
    +system.time({ ex <- exactextractr::exact_extract(r, s) })
    +
    ##   |                                                                                                                                 |                                                                                                                         |   0%  |                                                                                                                                 |============================================================                                                             |  50%  |                                                                                                                                 |=========================================================================================================================| 100%
    +
    ##    user  system elapsed 
    +##    0.00    0.00    0.06
    +
    # ex is a list(), with data.frame [value, coverage_fraction]
    +#  for each polygon in s (we have one MULTIPOLYGON per series)
    +head(ex[[1]])
    +
    ##   value coverage_fraction
    +## 1   166               0.1
    +## 2   159               1.0
    +## 3   158               1.0
    +## 4   197               1.0
    +## 5   195               1.0
    +## 6   200               1.0
    +
    # combine all list elements `ex` into single data.frame `ex.all`
    +#  - use do.call('rbind', ...) to stack data.frames row-wise
    +#  - an anonymous function that iterates along length of `ex`
    +#  - adding the series name to as a new variable, calculated using `i`
    +ex.all <- do.call('rbind', lapply(seq_along(ex), function(i) {
    +  cbind(data.frame(group = series[i]), ex[[i]])
    +}))
    +
    +# simple summary
    +densityplot(~ value | group, data = ex.all, 
    +            plot.points = FALSE, bw = 2, lwd = 2,
    +            strip = strip.custom(bg = grey(0.85)),
    +            scales = list(alternating = 1),
    +            col = c('RoyalBlue'), layout = c(1, 2),
    +            ylab = 'Density', from = 0, to = 400,
    +            xlab = 'Frost-Free Days (50% chance)\n800m PRISM Data (1981-2010)', 
    +            main = 'FFD Estimate for Extent of San Joaquin and Holland Series'
    +)
    +

    +
    +
    +

    4.17.4.2 Predefined Summary Operations

    +

    In the previous example we extracted all values and their coverage fractions into memory so we could make a graph with them in R. This operation does not scale as well to very large rasters where all values would not fit in memory.

    +

    exactextractr::exact_extract() has multiple built-in summary statistics we can use. These summary statistics can be processed very efficiently as all pixels do not to be loaded into memory at once. The available methods include weighted variants that account for pixel coverage fraction. You can specify summary options using the fun argument. +For example, fun="quantile" calculates quantiles of cell values, weighted by coverage fraction. We used two MULTIPOLYGON geometries corresponding to two series extents, so we get two sets of 3 quantiles for the Frost Free Days (FFD) grid.

    +
    ex2 <- exactextractr::exact_extract(
    +  r,
    +  s,
    +  fun = "quantile",
    +  quantiles = c(0.05, 0.5, 0.95),
    +  full_colnames = TRUE,
    +  append_cols = "series"
    +)
    +
    ##   |                                                                                                                                 |                                                                                                                         |   0%  |                                                                                                                                 |============================================================                                                             |  50%  |                                                                                                                                 |=========================================================================================================================| 100%
    +
    ex2
    +
    ##                  series  q05.FFD  q50.FFD  q95.FFD
    +## HOLLAND         HOLLAND 125.6814 185.2306 262.3804
    +## SAN JOAQUIN SAN JOAQUIN 301.0902 322.9453 328.7454
    +

    The list of summary operations available for use in exact_extract() fun argument includes: "min", "max", "count", "sum", "mean", "median", "quantile", "mode", "majority", "minority", "variety", "variance", "stdev", "coefficient_of_variation", "weighted_mean", "weighted_sum", "weighted_stdev", "weighted_variance", "frac", and "weighted_frac."

    +

    Of interest beyond the typical summary statistics are compositional summaries: "frac" and "weighted_frac". These two methods calculate composition of unique levels of the raster for the input features.

    +

    For example, imagine an interpretation for crop suitability. One requirement of this hypothetical crop is a growing season length greater than 250 days. We will estimate the growing season length using Frost Free Days. First we create a classified raster based on our criteria, then we summarize the raster data using the polygon boundaries and fun="frac":

    +
    # calculate a binary raster
    +#   0: not suitable
    +#   1: suitable
    +r2 <- r > 250
    +levels(r2) <- data.frame(values = 0:1,
    +                         suitability = c("Not suitable", "Suitable"))
    +plot(r2)
    +

    +
    ex3 <- exactextractr::exact_extract(
    +  r2,
    +  s,
    +  fun = "frac",
    +  full_colnames = TRUE,
    +  append_cols = "series"
    +)
    +
    ##   |                                                                                                                                 |                                                                                                                         |   0%  |                                                                                                                                 |============================================================                                                             |  50%  |                                                                                                                                 |=========================================================================================================================| 100%
    +
    ex3
    +
    ##                  series frac_0.suitability frac_1.suitability
    +## HOLLAND         HOLLAND       0.9294924736         0.07050756
    +## SAN JOAQUIN SAN JOAQUIN       0.0002452183         0.99975479
    +

    From this output we can see that only about 0% of areas within the Holland series extent polygon have more than 250 Frost Free Days, whereas almost all of the San Joaquin soil extent polygon would meet the growing season requirement.

    +

    4.17.5 Example: Summarizing MLRA Raster Data with lattice graphics

    Lattice graphics are useful for summarizing grouped comparisons.

    The syntax is difficult to learn and remember, but there is a lot of documentation online.

    -
    library(lattice)
    -
    -tps <- list(
    -    box.rectangle = list(col = 'black'),
    -    box.umbrella = list(col = 'black', lty = 1),
    -    box.dot = list(cex = 0.75),
    -    plot.symbol = list(
    -      col = rgb(0.1, 0.1, 0.1, alpha = 0.25, maxColorValue = 1),
    -      cex = 0.25
    -    )
    -  )
    -
    -bwplot(mlra ~ value | name, data = m,                   # setup plot and data source
    -       as.table=TRUE,                                   # start panels in top/left corner
    -       varwidth=TRUE,                                   # scale width of box by number of obs
    -       scales=list(alternating=3, relation='free'),     # setup scales
    -       strip=strip.custom(bg=grey(0.9)),                # styling for strips
    -       par.settings=tps,                                # apply box/line/point styling
    -       panel=function(...) {                            # within in panel, do the following
    -          panel.grid(-1, -1)                            # make grid lines at all tick marks
    -          panel.bwplot(...)                             # make box-whisker plot
    -      }
    -)
    -

    +
    library(lattice)
    +
    +tps <- list(
    +    box.rectangle = list(col = 'black'),
    +    box.umbrella = list(col = 'black', lty = 1),
    +    box.dot = list(cex = 0.75),
    +    plot.symbol = list(
    +      col = rgb(0.1, 0.1, 0.1, alpha = 0.25, maxColorValue = 1),
    +      cex = 0.25
    +    )
    +  )
    +
    +bwplot(mlra ~ value | name, data = m,                   # setup plot and data source
    +       as.table=TRUE,                                   # start panels in top/left corner
    +       varwidth=TRUE,                                   # scale width of box by number of obs
    +       scales=list(alternating=3, relation='free'),     # setup scales
    +       strip=strip.custom(bg=grey(0.9)),                # styling for strips
    +       par.settings=tps,                                # apply box/line/point styling
    +       panel=function(...) {                            # within in panel, do the following
    +          panel.grid(-1, -1)                            # make grid lines at all tick marks
    +          panel.bwplot(...)                             # make box-whisker plot
    +      }
    +)
    +

    4.17.5.0.1 Interactive Summaries

    Static figures are a good start, but sometimes an interactive summary is more appropriate for EDA.

    The histboxp function from the Hmisc package creates interactive (HTML) chunks that can be used in RStudio, or embedded in RMarkdown documents (e.g. these notes or soilReports). Use the mouse to hover over, click, drag, etc. to interact with the data. Double-click to reset the plot.

    -
    library(Hmisc)
    -
    -# interactive exploration of the MAAT distributions by MLRA
    -histboxp(
    -  x = s.df$MAAT,
    -  group = s.df$mlra,
    -  bins = 100,
    -  xlab = 'Mean Annual Air Temperature (deg C)'
    -)
    -
    -# interactive exploration of the Effective PPT distributions by MLRA
    -histboxp(
    -  x = s.df$eff.PPT,
    -  group = s.df$mlra,
    -  bins = 100,
    -  xlab = 'Annual Sum of Monthly PPT - PET (mm)'
    -)
    +
    library(Hmisc)
    +
    +# interactive exploration of the MAAT distributions by MLRA
    +histboxp(
    +  x = s.df$MAAT,
    +  group = s.df$mlra,
    +  bins = 100,
    +  xlab = 'Mean Annual Air Temperature (deg C)'
    +)
    +
    +# interactive exploration of the Effective PPT distributions by MLRA
    +histboxp(
    +  x = s.df$eff.PPT,
    +  group = s.df$mlra,
    +  bins = 100,
    +  xlab = 'Annual Sum of Monthly PPT - PET (mm)'
    +)

    –>

    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 diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-111-2.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-113-2.png similarity index 100% rename from Part1/s4ssbook_files/figure-html/unnamed-chunk-111-2.png rename to Part1/s4ssbook_files/figure-html/unnamed-chunk-113-2.png diff --git a/Part1/s4ssbook_files/figure-html/unnamed-chunk-114-1.png b/Part1/s4ssbook_files/figure-html/unnamed-chunk-114-1.png index e7e0acb0188d8804729545553300267f40bd1c66..0efa6f26dce8967a6b67a4a449ea41f5f8b10cdc 100644 GIT binary patch literal 72162 zcmeFZcU03$^e<`&f^OlzO!e~?z87J+&^Pt$j7~n zd(E0Pd?!yFHC?lYleA_H#|y6YYu2o}_%u69a?Az`$pK zm>uv&Z`-y_O-&8>0xV|7{)YXs1KR=b0I(ez91s8w06sCs?3bIdak#OYo3R`4nQ9#V z)oy{D-NHyaJ2Cbk_A3DRXBPl`qU{1Oc4)L68u)Ah1_LA6quH-;xA0WA@UL#EJ?`vR zh`W2Ddq{|T2=H0xo>&(E76YaauoDZg11}K^KnI|KHzokx5`aMmU@!rg7GPM2dm?)r z`vv?@VMrqIt_vwF3@IE42iSE3-oR8}!&7_0zkUt>3VgEAc4BBdFggHu+o1y%sG@-v z2Ka}@0G}=B7BspAgKlX_1lU@bATco{5qK3ACKlEu77irV0dH2Sn{jHmTk6-I)Sj=Y zJ*>hI_rk=G!o{Zw>k8`z3J2;62UwT@Febnbg9hFJf(c;r2v7m|1t_(& z^rX7=d<|#w0?_DT0sneftbxLifx1LCBa5R4fENp(F~DLC4-d1xh66LPdQw?EUx7zi z19dFm>xKDQ00H1Z7RxCNwQ!$X#%tC{uQ_>C|GZb+2!>v` z%PcRN|6#xDrNfPkrM)Qs|Ihz#%7dnCl6Ik)KR54` zdYJ{Ki!W6e9aA9ep$`k))E7@SB-^B2h?>8@8DkrJCRYQ?oh~&8RO_9Ez*;mX7NjI^Y zj`8Gk=Fe&y9J=2~)e}xq>bJ6g9ep_?Y;g@P^|L>Ak5y*zHSeVL!`j^h3YA7F_|Z+x zBTVHyZx8Q*p`m1r+h|(VVD)R~%1s_pR+~#{nsTYCPZKLNGH+kebi|nlO-=77(|lYx zRfKC3-`6^qSjC)iQ3h05ML%Z`J+KiQW8ob8cBEumw8rs%i8uM>+C0pLoCgkkNhQyH z(HrZZ)o+&xU%=konPxJAIUUHeGkLlIpg0gGsEQ%d{T@U(5C|Ba8A_KGlYKb3CR zzw4OM(Gh9*A>2K<{|-Z#7`}IyWu6W3jVEo1wVrp`YH^!0L)pq$C${;)Z2P;LN04X% zl+=bvX2VZ&J``+MPQ2~U`)2!GL(_FmIY)SGVHD;zW;?w#YT4D)PB)6qiR(KNK$6|x zYWOn*5&5k~yVqZtU={z=RX)n!PtCz$L@=p zH&&~r(#J>McMX*oL*jK9S&h8PGNZ?hLtET@X02m!!&wl7PRe^QZKPNaPJ0?zcq^y> zI(d(&GUtnPu@5WSE4dqJtY&=t5XkC{b@pCn@G;w}S(xG{U&dSeuIOV>%;=k`g zZj6h;H`b}DobXuB$edX6OhiCdsp;%{g^;Z2WDSnWg4$>PN(rs=X4>WrC0;3WoIW%4 z4jF05kt#QRVoMHI9g6MXXSRDDlJ{t!6#Ngx9iu#Y8@jQVk}z*Rd$0Li4zyrP;TmzNdR?pP^u5ey+Th zCcdu^Q^rLn&rS6|nKJAQYzu?=n!*cd+5I{8hWHkQX--4-=o^hK7jiO3WqJ@lHrdl5 zZ)R*_p{DTkLxwn>thspC104#rjpd(?SIw5{kY^+1hJna7aElD-#kL9}bUxSxU6*UZ zH>e&Q-80>*AZHSKo&%=!Q{L%qPOh%ren36Emf@W*xbcSeRgfR(iW(bX#$ZP-BHOrg zs;18@-Nl6!``p9~a@ckFFy(_*+riW3L}vm22@$kj{=74DYRs~z3*HT#2&)e{Ql)J^ zUzr>lR>P^J`h1Xp-ia6Aq~IXxX}8NrBC#_3;X{@B7xp2nzJ1Q z-f53~z!c>`TL)#e?YMJpDqCkr>lk?LE0U(>cPw4kpOVdT)->u#^zjB4xwjv*W;y*3 z^uY7@GXoe+@z<4`-H)CQb(llHg6%AmpWA2Uxw%-fUx9XkFX`MAM>ZxS%(haWVz9q2 zc_8BY_pkF<`eVbquj#5sxkNZ*Xq|6u4tf+!_&Fop$BcC%qBQqgjW-Nl*pU-5a#VP` z8?5vg#o#*zeB1g;^NG-qkuNt|&$jx;WsocnoNr5Yvh_)M-mS@x~eMk)`xzf)?7bHHZ}arbsPUBjr5vj{n#ddD`@T7Ah5#VFu_5?Xw-P zNo^TTbgB&I5uefX2##gPI#K`SeAe{hthW+==2G=UYrC+N3o+v?|0Fqm>%m|Wr=eGi z(X7p*)@-fhRGiDYB5$}i_){3<1IJtvVkz?2hTSO3PDeQd@vQoO>X=W;!65aq zmvd(?OrU$fdI=qHkCsM(*uF-4o5?Tc6WxKpBNdrbq2D*##{%)yfKpwO0`N7?h|xQq z%ueI8;DNHtT1n|)n{ zQh_mU7yM4Bm$k|&iv077(3<4R;ht((ym0j3GhxG|-GU6!s#{q@2G3O`^#;^V?OgF> zi`k79zKH&Wy!v6Myw#KM6z%TY9d~ryO#^u7#!-mvweazglrZ17$$Q^a`9BvQMz1E0 zQr(){FqD7m;D!Qwqig=$1|FfdC>5Ajd&jeWQ9n?hA}!2U6} zx?NrkgsZ-sm*=fk4ce$z=%HNrbo3+G%OX00q$YUCOF#7FVfOpFAbS=6AOAUNE90zi z_fdf_r#LmGelkm{bv}_rWvjN^8LhK3LUl4v9HzL(8d6>WKe68+GA~Lh$4|b@T|?v^ z>WQps3QDwo4c=FN@9U|Cp!hs*5RUit_WNhIltgdfBAh-e^Cnqiq@-Gwc2&CfL}-e1 znfhUh%>!;^Bk&4Yf)6w^Ct%1@#(lvav{Y|Xm3i~dry^5uqf)) zky8-YpZ5VCDi2pY5;fBgz5Wjgvw4fDk5jQp`ymu`gK2olTW&j}^&s+_w-4*iiFnAFgPXTvMlwEgZ(cdo$Y9(fak{LK9sV%~)T1DzQ;3l{dRjF+EC2B3WfhzTwA(Sj zh5Wu!B8nE2Y6DNY%-`nCN5SarPJfvf|B-_T*#D}D*P=2m>)bJ<6z8avYSr|uJG(4% z#S4_4EmqRpOF9jF!)>!k8zq&p z%C4{`{eNZtB`WGbIEm9~g>2TMVE?TC4gMyF%EhGOzfE?P8#}xY({1^epusvV=c*;OCQ3@e?3& z7aac=5v~Wp%DiGE{^WiQo=2MYb#)wAmt^o)Nk=V)oL}yqsfD*hpDRqnNdHOq@*@;n zcoQn3b%mhUgH%wYM2%J69wJS9yK;7m=cEoCN>g-6c_-R*x`%=NH)`4v^HlRX#>ohl*%eF&fZpqTOHBl^a0nR$nD-OL@M(nB8H@1wq7< zRqOWB(fK<&@g2^83ujyepcC|RHJ|?{zquRscWQU5uX_F&bbv$xLJ6$SPViS+%eq_{ z=!|yKLR9?S{ry??MBh@!zSDHFZz=Zt?T(@?vM7?!p}b{#h(1n%A#8D^ImZr1Eb_D& zCEm=Xx!O{72bUy1kY`zGCqb;4dAcQmey%yDWy%zIXru{vXn)KS`={E3ssxvk5q>Ai z-^ZU-pn|!H7>~(LAdR_}kaSXirp4ykU73IZqh0_RVb!S3DF69q^YbeGU`$Ta z6gA#~*`Y)?!^1C}O$P=YJWSz|99cGtBtgdMUVZA^VTLfj8j)6+-NAahgI2S*;`ZbP zBhEtenyKAyXJ4%=UFlfShbbbsLfyHV2pp06;I@Nj5teno;$ytodG<=IrM*A`7nZY= zFc))_UKu&mi0+MX#zR>yjXnSI95QXV<1V?;z}>rVm^He-JlkNpX7AqNzO-nQBYaXn z51}|YmYLoyh?tJ^sjQJuQ^-2_%*XM5GiT>vcNyJKUV{gF_Ze&gN&+KU+C*7S->#by zYQw0gXWPzDM3I|BP0t62JqB9Zm)GHO4ZCRJFm@ySx zg`mAV#v@q_S^JBiCN(kN|Mh$517`@8BodT&GVV&KbqO{(pbx(TdVxZ8zeAkxRhHi zcEH{C5aViZe=e>2l z?8ZEw6cB5JXJwblxf?=^5Y6}Lf>;C@=sTp62;_s42gY4*e&Ol#-BY&v#R!oQB;YEE zFa9M3EpEciaDo-QnNE`W>c5G=2}_v0)a^&H+tOR$t*|%*S{w|-Z(HWFQmsI&_HTKp zTK)nmm{~Di>Nvw^NbIU=%?GT}6EFi{%@Zs^#^K+rJs^YxN$W~@Rhu5t_7QVoY%m_f zr^e%i5{XJ#RKi{+`8sX&s;w!I_WVm}=_58}R=JEb&6?QEN0ZaFZb?s2npKK#p~iAb zW|j*Q`!xF!-Dv<6rkC=jhW+PT0uN9TV;|lX?mxI(k><*^w7A{TZ0;Cum|@3>(Y^@1 zGrGMtgcd^F#qW7mHWn#4ZiELPHeQ=Fz-27ZI_NcQ$+;^RNpE~dS5salq=_fGXjf=9 z>rOjg^kIv26oTPpE28=H8$*Gi_L<6eh3b2kpXS7)^X6#*6=``I z6fys{^~2JmuU6 zj0fH)Y|N7Qp70?{*DN|hrXLO;S4Wy@yavo#RyCYk)!_unzntY+TmzI+<^=WZG%x)0 z%Y~7InRx0Mf1y+6hDYlh%D$B5c7#$mq04>j7BJ6& z9GTuD-6?37S;lv1DT4}B81$*kq6P95*ni?;w&!y;2eHbzkd|23H?7Bpl&mt1%~sd8 zb6=_KFBdG7+E#DImL;$s?YkBK6XZX3%l-5r6qx&fRbICcl+%f& z=>0|#quL7aFNqiFH8|y19V{=2uNAKh)9#NA-rRp~yXm4`<>|vi`B7l1EC{C{W$IIp z_y-_ZBqW*UJ_w%o)GX9^z0g-It&QKP z%$xFZ9B&r((rls*cq!zZfmAwHfJu>qc+N@Sb+%@l|6V@Mg(Psn8(fG^*`bv_i%k5C zOBYTgVN{#LNIJ1pb3kI+{Q|s!`beCK#*0|K3~f z%9+ER(JMzCKT8Sr&uMj^KG%0uun6XE&oLHcNbyMaTHou6`)TZ@;BQviceY6+WxYxF z^ww1)Pf}XW4V+eN{x0j)+||b&C(tFt81c^X@|bc30@N^6d4BE(Be!Ezt3^MMf~vR@ zw0SXcxqX*N+({b|n~L)5k#lBtl}$&OTZDI3-z+hcjNJ+Rb3BXUGWI| zzW?=r&-!d23vcQkP}DoFPpOT!N=t7!rR)2oqne9(?M$(@M2V~yM~@sm<-B2VF4k7` zY~40M-w-zvaL~Sp1-So6wA^t}l^X>%)42v^dG11ixBa}q4=i?D-c;(4ZE+ep!@9>~ z(6Kkpzc4nsZpoL|@wrATDFH*t`8z=Mt4}MrT)8`6Ix6gMuye{@%B%bF2 zHd{QhT!frR9)KW{7}NQY2u_^5lxgdmSvO$5Xx-&VKY7g4(K)IyK4nl6PgQZtcrh6Q z6m40{^@lW()4zVEzdp4wy90@SM>6}U%4q0_7W%b!l-5m|ftjSIBd^V~I=eN~FPQt^ zE^fZVNr)aUGxa-6;rmr-9WMA<6M8ExK7Z_;Qe*ed52KrJp19uMR~k7L_bRw$xx!d% z7>yE&uB>F^@>T{X!L@HMNa}pMA!Wm=70mik^rC@=u3xMOpl;il z@AMmsegL(v!*VtD!hllCnhkDZ-0wA`a1j#o3^};4p{w@Mf*j}$md%aXVj#@uz5e7l zxtfcUl;l)+dB+u-4S4!iYRU`OmF!D%F7)tL?DhW^Nl6 zw+A8wO{0Q)JZ+KhJsM$g$X*&FteThBP70>R%q;4D#Lx!}v{dmit27fU43njzm&xpuh0bpSPW2q5X}a{A>kmNB3tAjni^pA*;C0%s{H=Wa z@#sBd=ZhM*Yx|V_2OWvXXX$dj;1re5I2oDwCaH9VC zM3o>^`~lkk_T?ETY}HI*{$!!dJmU5~uhg3#n~D(g zM@ggqlI73Cgo;vvs_${=EVD-e zJ>i*FSj4B@BK;gvgBDDhrvL5QvJNz(-9F=>aWsc%xW|LDWipp-#Z*arEey!bM;&iV zAob5CM)q+dCnaeW8PA%l*)h{SR^ZS{b}! z|CicmCISp2^kxOT_F-gN8d)IEu^eOhF6}moc+wrZY$$osvGZTaLX2pD)UMuH+s%wl ziELO0TIW7V6R5moy{1vHk(x04OH$~K>@hO4J2$1$=I4c7O6c5~cdU;WzVvsgFI#}XN_=9Pthm~*CeI5) zJKF+|*)Wd~EUtn+K%&>1hN~^eE%|DAY@b$Sawy60YNq;Vy&wi|j__V0quwQe=s&DV-KciB!d*|bA`dk3vC4fHDO9nC-gCA8ULW8)Pm_wL zW`Rsa2_Fh{vIh_Jjnd&akz|O3gD2$DW0C#!AKaO zw?~=Z`F9~spJR{Rd=K+s5p4&Pl%0QOejT zUp`y1N7#7d(|=OUFUbPS+6^qrx$<^-)juwldSL@N+qA?)~S8Fd|mz`E~?AeGzQQ%|e!51KvciDsS&6fi`5 zuO7~Q(p-}pUcwfsWAo2>e}AeWo!&g}Q5@!32(%4DjStJbNfgUT?zBHZ#CdU}ay!m> zymSx8|n8VMmO_^6?96nD+%?;(BJz^iqhZlI5nJEXqW;_#IQKHPTq{c(zs7|GGHt!%z1hw45x9b0DB?yM z6$})PPCgzTs5>@8n~H3cuFsC>XG_s>&4yF{@Ji(T_RpI@IK|@HYbV|z(LOFn-(!=0 zkFyQ#ATH;PM%7e0A59eV)B?5V8|hpIl7KP39FpZbxBUb33Y_NHWcVXOnKq*B8Ee-P z(a19nsJ>JbdEDTX{k?ry|BtF4d}>srM4y)nN>rw@>EwahKZMEvbR@>>N87>*cw~nLF)ME-WMo?uNnHTTQ`1akR;+m} zz?;_m+Q)p4%8bttK) zfX0&#DFE%iF21uwPO0v_b9-I;$&0N~fLSLXdT*R1VDi0Y%sCxI`UMi(6e9(sN*^j? zqmNkFC@iMET|n9k){Ky*xr<2~bC9Fnb?%`>oBuE;3TJKgoM#l+I`mJJ^K3yx^tT*y z#hSa%qf{heFt#{f9?Hc*xVvDuXX+cIF zkgNe+p6=<;rIs+|M=b8~Krj`h!%jAdD^gcv;AANJP3axu6#99G5*jSSV z)p~n2R20W5(+{B^d}bclGatis)f9ott#N^**l6Pt3Uxli*vA1tms(z; zEfa|I?T82<_%dnLFgN%}8`8q$eVAxDZ1h=+wVQK+^$<3^w{b_WR+i{ht92TR^fE+o}HygyF$BzI$&j(OKrX^~le@T( zYnL~c+m%21j$LUtY)tpIr|-@i&Qv&pT{OlX*^62q%gB z^K0X#;{~)t1>|+(NFBVuX*IG`h_P;Y2lJDI6^YZ%@6w?e1KWvW(WVYcpgP%X1?hmc z$dOmjV_@zjBMsmUA=#QNiz>^9=0Q23*NaUA0cEd{PEHrX2Q3tI&2r~t5r7i7Z7aSQ z*p94(pGY=kdKL?`7M*inVF8Q%8BUG&jg(>yvgryDE@?*BQZ0Dfa3_>pvIg&Z{7feA1`$m+4=T!h)pU%+~y6`YRS7fpbf( z+hr)xGuvIo5e*2#KV@sE_Wm;M!}F-W%#luNdmxqSo&Tr)y2SwfU0Jr*MRiA9vqy^JxmGnv zzXC;efBe&vTl@7?9u$=esS~J2Sd!<-#lR{5>f?CM=OCg6V@-AJD1ok_`v=ywLkc&lg_bKk!4;!%?Kzpoliag)G|b!XK2s5!jE{ zu4No21n>CN!@$e7+T0u}vL{*=XkEXI6>^FSLVT$BiVMH}WC|1R!RwsMZV}t%` z01EKHfH32SGzzYT)Kql*%lJK;5xt^%7beqvV9HK^`Tp8w#C6(?NV;d_Y4Kf&>g0D+*$nW$*Q?t>fb2~1udZG9R_Ws7)25xJRMjcRHH^y(TCaN}P$U5`N#x9Po|#UjBs z=hquNa4$06fLiX%N_z=x=FuyuY2==3BAvhV$Cv6ndJPm4NHU*`%^%;L=g}JxJTyYX zynpE-BwseJA;xulDYXG>{;ovBHh*?3p>Y%067h=V1^wGy)q7Biy8`6Bc+z0e3B?C2Ack=XHP1z@$XM4qo~^VGL*JCPU~Fy!(G@Q!P?^#%ktJO zP^fYpfPjDfuTU4@e-R{j5cvYaL5~ULb+WUd#|Oac<8Tk za@<2RDK%V;J6S+QUgTz;xQUor4V_t7Rw_yD{Y`%gkI|8rH+v}TyR3L-=D!D;q-{!>cp@aDDeaz|XE2Q{u&>YScKNbb}5bpUdC8$L=i z=YYy1wW?dOpE&Tz8-77b0IWz<0SLw(#)E?J1#LFF9JF%*KD*E3*LZ1dJOC4+?^kI% zb{Rn0Vk=y``trZJ{esUvrt@PL0R}*U_&YrJoAogOtFi$7_ybEDcztXUShB6yDEDO9 zauNDFmN&ZZq-SArLv+HG=D0zPZ+T1YlRu_96!KRna5Qsa)A2uP?j3=Xb(k4R(W8|C zj3oUhBS$DLz$J)sD7%e>?Hp*^SMU1RcDeudJF0lM5TlJshPBuzP^ZRXZ?Tsc^q-WE zQpy43mTdnpy2D5wDC!5b-YvI@7S=ht1|O(=PZhuiZ3OUA%n*NCcRqy#T`RaU{hr=?@3i5dkZHi+K!C(fC?jV@;7n#N77*I%e7A6WLL2*}oo%D3vSS6mO z?ux9|)+u6CQ}tD?iETBnwSBi7e84_#;#aL{f0;G59mOff&YB|IKsdci{=`1hf+!6z z_Pk^+*m~9uoA0Jv{HXcH?rMFCYAZa{y^lZscE8{uE%w%^;0(|J%=DYA_Vw&Zh)=A= zJ|UX;q&4_EcUT3Qua`9?;}s2B5ZyX_#v6hZatsKzcoX~Deob6i@gZDvHL_JoUMbjN0 zi*~#%q+meVw~<}x^GKjrN5?HU+;Lkj3ombthUMB)l zDbZR+zydQMJhya=ebA7q#V{{TzrZ4&N}wQNwu)xj#2vpsJRrzmUD9jXEkZxdh1BM? zeRshsVA@QdawOE=b)O*nK(L{d!2vx~Hdesd6g;NlZ#%h12ZWQ}ka=DwGjq;K+DqnF zEp+?kQ3~15ljl;jR{v`~nDTg9{p)6hSaw zv{v|0T6Endi0pW~pyH}}Aw=9v^{gTJq|)oLuXATNcD5~J0sbM~71gEsMsHfOUrqA; z;k*YxBwo~V)r|={I~dQlaACzvU4WBVnd4+#DWHG!Nc8s0!xR-WDKqo!>E>v^tgVa& zfr8Gn+3u~H{ZbgY>W4eTCGk9}b7Qo9G7IwOK>4RB(Q?Tu0z;0JojM??WIqq)Bj383 z0j=~-p(4RVa=3snd%pyjkyo+(aNmsLoUDzAcp~tayRRMBbr12QOCu~ANxFvcHj`8iIFUF@lkdmrL4}S2eu)8)V|2_oTapOh)j*%_7GbU2pna-Jjw+T zIN)OE^MwKDxtLzm^q660RMYEW^wZ`=%`M$0K?jnmx2kN@r(m26DAyN6^j(J5-96&^ zfzFyb?GH8i29+*k{ot%J|1PpRh}0gVn3lhi_`+6PhJ<7i8;)`NTgt7q_B6gwqu;R}Pf)gxizOi+&C}1dpV8a%n z8Ej*+uksV$z}{A{r}!0rleZSRj5*125wbLZP4DjIsyNK-Y zaEn61SAxxpuK(m9dpkbrK}L7GAYd+kT}06{S(@xOO8Nt~4gN|;z_IqWnq_OaK(R)- zX>I~ACjX%eZ(|gA({^&h=Kq?6@ft<`lvU5!o&Mi6dQotkAOC;a!znyGwPifeeZlbm zz7ijNTZ(+D$H-G*{JZR-5KD0sM3^0BRxSo|l){D($&^LYHF!hW?zRr^`zyK1NqcGj z_qUKeULntP^+Z9$_k8%|`@avCrP+Xzn^IKVT)Fg&f4677jrc+UYxE!1t|x)F{EH=P zt2p`OT?cTYSSZBBbY||dAOf?>khGPrA(7ro510TCj0Ce|k7^&5Z#{b#TLAR&ietJ_ zTv&5@xT?=g3I40zv<&UiDh@p?O}scRvWb{OcJL57@BCwU^#bagbE8P^>dBOLW3H$J z@Ka){92eFG+Wsq;uzjNMlPHSZg0&Cj(tC@|%a)<3|MJ+X>p-_I%dcE?-lywkiw=rx zy-G82TMa0>Z9ruL%j)gN7UD7EC$ODH1qj5-lpgw0xaj{ekp zrnRCjWHUnumC^hMqfMI;ckMg*3u?NmXYLk^VxX@{-BNfXZ#M3I{{V=z;o_tE)wH>AeAk-(<|<{WW50&Ly%CqBh*y>;VvZy2m>9?fK={ z`AQ;owDeLZXs55Z-mOugBFi^yb&L`C0vDp_Ds{|Fm2`UOQ)E`l%3U9jFCZ&F4k?0a z#wE66w`0UNEX2`AA4$nqhTH8=mc_Q%>AS0Dw3W_$ruCY2m*{wJA>Xj3!b zf~A@BM3&;1F@2s9PNKuBQXSaQ22Kvr|7Az-A@BI{;(TEwCDj6I$>1Nddk@WzCpbf2 zRjPzX6=9rl`)kd}AzKikfU3d(RV9wK?^FDxs=H6zG|B$FlG)xY?sXx_JG}s4*Pr1{ z9R)F=lvS(>uRmmH#Zvyg22yiTP+x9*6dQO!`@jJnfr|h)R+2*&a` z&jjSdNXfwco^bER@KxFBBt;;7uT|h8c7ujQks&iNW$7O8TO-%2y*<(@0Tjh362#F4 zH=-*w_nnjYbpDnS0ACA!0>F=Wkg&@f_FhuUnay@9!$ZzIRY6i2iDZU10+%2J0pBp+ zL;Gr$GlcdLZ(hHg=BiNO>>2u4S3z-hXU0*A;d;@US~3?Q0zV%@(*4Yv^3apLwKz+O zse>u|>smJIq6GF3Qa)Fbfnz{&f|iYaGb>P4^Yby!75M^qT!oMc{2iB4s1O1;{~;9I zF$fLUb)VKj3A|h7YBF!Cs|$xE@bqaAK6d!uAbt1N1FX-*4i7o)V>o%}e6?Zq+2_O@ z6?Ka>LJR$59@>!YR4qleVRXTNr!t zfr~v$$$$K+n#v)skAe(;c+|Y#&BfCip&|(6xONtBCu*rS^O6GMY0muhYk+``Q6zQ6 zj!}{>2>wxHj6#aJZBoSWzEdDP&+ief4K0X3ciD3jbhm<}OjpI*95CNruMbWjGC>%Q zlchcU6~?O|AL;BnJQjI`8Y@i{xv>cNgp)U-qE0|FYlAl`JR#AmR!6s z!Lae*^c8h{uH}(crHDuiu>0+;l?-<~K=jLFdw>Qtd0TV^iFv)ZbFg`?=Wn=k$NH z^<52wKUHqaeG=&#LGtyiN|pb^xvO0B12~9H?WkH6w|w(sqpR4Z>WL{3Nz9>oEw;pXO$zyeI z7wS{MyD`t`zIu6=;%P>mbIwADvjo@tn!p>8#e7%qeALH4pOIt%fv7HqSIK9&SoiNe zO;RQu?^G8eZ8SL$Ckvk&WDxtwRRAK8&O5%Ik2Y0wwj$B9(gF3V@(xeJe6N|Q?K!Bdi ze22=vIJQ&ei+lfz<2dVlE-ZwdAWbOKGk`u5$zytAF(4)lCN8XIeIARQ2LP(yu(cTK zha^P+k2w}-31(S#njcuymH7`eaC<|U6&pf=wq?nUw0cC zsmbs;ZY$>#ryBm#zz#7*lmm~p?u}~R67|E8h_BUW!<>W=GnGNW-#oI?jOzUAtX0XH z^h`Hc3(RFsIjiIFrgaD4&m&p&5Io25nQXZTY zWc2NytDE$o@iPbKACQ`HR@67<;lP$PfrfNnY{e+DGTQQk-kAnekhz##_}F{j^N;(v zJD)y7>34wVMxh*oAL+lN%pEdEgv1WpM{)Q z+T_mqGf|o*ZbrffB)^flu>R%mrDa{tC2dSnPTlLy+m$r!d&T?pFaqGN9D)7B}?0;?jFY z@&msm2_zAAvz73n4Wf_i%NZ6-LnfPfE19RGCO(dqEnYja&f{WE6e=QtATew(qk_W- zBWBOd_b)Z5E;7-IUYyf##l4phI0EJ}X(SicWebp@!?W=qyTXIR2#=YVu#=DXvki6V%SlQwbk;CZZ@{5@(v+ey zxET>l6e_xx`$iDq$Tmg@C5N6`qZz?ln|y5pJC+|apa|rU@97{IWsRR8A1y<4!7>@v z6l);(>>xZlLWyUm0ew6V6p-2=@x*o^@H_!u6LU z4EEhz>m7dGt^8H|D0OUpzw$>9rdEee-#S!=iF)ZkejDU?x8KgiTTcC+>|0JE@hJaJ zd}OJITRJkYo?Oh$e3SM$9?QNiyW{|TJG?}cWW1shXmh%+NYn>IUlbJX*XKJe`q-DS zvu#n4O5H<>3#+oG1jC;QWNR~i6h3GpWgy?SjjiWlPFv=fSLrMqd@Mu*1!h!Q`=E0n zNy*^|MOioI1f|dusDl&931Bhc#+1DevdzrlP7OWvvFd_&UyVyJ2D86sc;B2a?v~m! zf_yqHqiMjyd^5iRntlrBRo0OwP%!9|XBG8ch#`uCYj5dlQ0`@ zuS04`joj;<_RI2bkzqL9p5=u2{PbIg7onDlgtB((l$Te`97K`N3!~rz_j8Gf+MDrF zY;SL4C6f@-s=XYuvBe?h3ao3jjLUf0#uC!xdeh(I<|HyE)p}GffRyaF)h}qC)?u5@ zZr&I`l7tya*MWri6UIWLx{kfdoww8MOk;$}#>zd0W8Ul(TL?(Xt-z%M`C)xLdABkl@PhY%6Y^*<550bDVCAF{J3~^l_nx#(+LC#gOvYQl8H+`mnzR z>*io{L?3Q+ETtlR{th*C_u@kDj_YeeT(JM(Mr0w?=P4}<*MGN7`cWq82+wvbYkVOj16{;g2&Fs;$Xhu__p}&_CQ7=x)=FAC?5SzF@Q!~1=2t8o^r=dE z6p-59<0mQo73ZdvqgrEzB~2;A=-d(IT;~h`{dVv}$WI8xm;dUvEubmj4@C$BMV)mB z>OPH2k(}?Cn{Ca$6otG{Gn-p@Up_{ky^%2sl|Vr!8S!!*Zg+vZy01wQMB0}!GH_zS zCRdOdo0osbnBwc!cwz4V(HDcF4&U#U9cflIpD5ElrcyG1D~D8B`cJ3TIs~$G(Z25w zkl|pQT>TeJ#M8196$?t<%f1g8Tb}5Y+W@;)NShF8_F)aI?^75EVfRAg^nt5N$KAQ4 z-hGU_7vI((lAH5{19xR1Ao0T@V;NV~{M^OE;|6!phQ8RKG_z5pQC)pX&Wc7vC#~RT zsvtrDubEz<#zUYrV)G?HF!HxgC>36*)Q_Rj@d_&o7ewXGypFgW2#$8(d}Zc&hh)2OGgm|z z1;gzEZk`D;5_Zy>M8@juxCpJ0dPqLzJa5rpN`R($1o9`PZ0IuS?Z(tBYqIWj${&v{k{eusqTTdH0;%{QbA^1;$|RPmL} zoN6kt|09RGH=!c@xTJDDxFp*b4nv|j{9AjdjYF+hc?h1out{~4locgALcyjSG0?~n zlNS%11_dod-95CfG>U5ptP9vN9H)FybEI<f}Yl8$9U~tNz zDF5-G#-XIv467^VPsnF(_-;Z`U4XN;7#^lpN~bKGA0H^Z5dTk7%o5qxb4MXu$a^yq zz+FxK6@oo-5UBQs)va{Q@tUWPUh-}3Qz{igM6`B!{vrTe<^v-KzL~sKF{UWB9o(q* ztW#m0I^qzQ4R)$IUt(;cUZ1@NSU!EV1ZS}8pE4v6#PAiStNwWZe zpubje5X7P-6ES`Ni?ufogu06!hiB|6Bt<2rQY2et-=C7CLM0^2R6^DXF(YF}3YD!= zmV`>#BV-?jgzQOn#vuDLW1V4U%zH;YPd(q?^ZUMkyzk%hnRD+w=iIZObE}d2P-P{} zQKy8_WsE~Eq+VP(^&$ss(Y)jf3qe2AW!veI#_os+O^>J#UoLWx92V08NsFbIO}Y1H zmAfqRgKa1MPU3At&tCB9+KVcSqBU5jwP?LuTRQr!S5p}ja2yScyh;57?pE~rp)xSU zITOwZ)zpMt1Eb@r)xh^h!1qd|D`@q=NXp0f-+usJ$G9Wkrf%v$SDm$AYZD5uFVp%v&yvCXjl(W@SUjW2GXJ)b7||(`Dn&gv~0D(@BE=wsO_tmCw{)x+1Z^> zlG8cxnTWYS)ogDNcQLo{kviqZBmUDNxJzvQY*r8yq0r`n_v6*MF&osdg9j7)^Rs^P z6U`7}6))>Ha1K_9^7<5th{aTOVJL#Qk*hPyhI>&(Q*5;MG`^~8>V_5nIdkIdJI7Ld zUOS0LXG>4pGOrL1!91ON1u*6J1JtX3?s37NTvpemU0g{cT9qzE7YYP(h1NGqw*(@^ z!~AtaATuBcdFXNmlADG;lF;FX-L(ECVyo7<4F!7wG{L5K0BvZatB#xtszX>?3J^v1 zQs3ZGi*1f7T|Vb->>-3}z1lzRH4#z{LWr6iy5~U(vyZWJ?Fo7QT(GN#O zQ5>+~^eXM-l^{a=+LYQ(%G#c_YY32rw+R$bLjPz1qJ&ie?7gqtb&TB7Q0CwY%$|Ka zMU`COQ~qU{+4nqhT3^F94kdpx!gf>qogq+EEP zgE@^D@V|9yx;)ZSM9b^ev_QCG3v3S_)QkSXjdx%!;j)ww4Iz}Jtau92Jh1hi0l3XwugISrih*V(g6{>od#GGv6 zryK?~_J>b}e3#$zy@&VmAs5?<=P&#}oqNp5{A5z7l`Blwn`VwC1An=fWAI(4(dsqa z?3r$&tEFE|>w&kc2RG{w?}Y+!g}9-8%u(tF)(=hZOm1c`(m?o|dK$hCE+kI3E9Ugm zlCZaK(Q@!knr25px4YLPfG+w>eU%&jax3V(^m;egWodr-=h9m_n8bzvbP)(wGzTJj zF{YRdWVMJt=%=|OZWfO{!R`$zCDurO3_qaH>h{HuH(LI_9zB7Gplu0M`2JNGZFh&U zg*=;Uz84G$*;s3FM=A_&wwitNkc{l$nP#19k`E#?ls(+O1r~KL^HfQIn>d9hEt7f# z17RVG&#!62GMhulG3!aq5P~q;=OopzTHojWBz`s1Pvtp!!7H+PW^*5yp9X*@UctPy z?Nwne&OC|88(w(-eFk(cQuB5R4XXlW>CH>X=xQcjUKj5fjF_zx3lr=1-uso0#q3I$ zt$nRG9|K|06}$DTGKcP_<;MP+%!!5k9PT3jb|t^r2ds9#-au6&1*Ky!-dNBabRmpC zU0G`GBa0DqRo((lV1L_HlkJ|tC=CdmS>q`zIH#4Q`hu`DIEhh9s_M=OtQ^+cjQPM? zi@JrmeI zfk>mk*6kRYhZVVYa=KGz8QvMC1M}K(U1C%%d8f@q+5nbr?%f;YCYYY}5w}m7c3*vO z!W)z0WK6egU+TF7O?(l{Rp-Lv-{qMcNO`xWI1Pk|kmFQ?yLjEKe1WlG{%B zCHpJ258p_qvp;l7UvFAtgK{8VrO%xE59udqA1YhgM2%{(^?(#%1=EmQVbr8n98SZsnywws+-y(KnaU5m*HLoa4)EwvBVg^g7%%;!VwaKDxZ0w_+tNKEA0DH2i>0?V7~m zEbL!EM<^Q2_Em4d_{0IXHSZ{mZBet~W_6pjS&TEo_bg*e-$z}CduUaQqL43Cgh4e@I+ppi`3OZEh(3$!Za)vM5Z$6$&ddA8Bx zE)xC#pdmjw6_$%$I++OP56{XvrYGZc6 z!qB36d*r8Caes4ZDI<$}8~;uEzCih8hIW(bv$j?E7BypxPT3BUF5WuzEe1!U9+e#U z0J|Gl01_h+9lVNnypMT~7k_E_Ymxe%_C#8_s%vmt={1`eB^$mCv`Q4f?Gb{-%bG3r zR*lo|7A=?JnFTr-oo;G}d5~V)WyNx}HCnMpR<2b97UiHX0~!fAEKS{D>182X0d0M< zVwHMV9 zs{?yr5^r|;sAd1k+3~!T(T-u%qxDB~<2`Y}Qz2X~^|bc2$+EuNdUb|95SeBCqCGX9 zWeyoB_3y>W`>_5Tkv@7sNnlp9VRwv0C>RKx3W_RaWy{qISGti$R-jdy=2FeM2XAD9 zra@!I?#!8@Y|)IGzTCHsxZ*GFTl+6I`VZV;gj#pva92R6x~xH9Xfx>DB`%JvzU9;v zszy>$2(*?>*4%b52N_h~3vN(gr{Q598F302da6$bw}UzCYiNq#9p$~Ei*nFl@OU7k;Yd9h^AZVT3ZHtM3cMTZrZ~FCr3RF?AHXXR(vY!OyNJO z*Tym?;bONFUxOhyRr{3Z{g0mL*-lU})dP(*<;9J=%W`7Fm&0>6bjpSK z*I1tJhR_7{ZSG7J5u{icnE4UWQNQTAD-OsSiN^y{W*7Y;j24TxR<&}uIIlu|@6j|G zd}MRB&wJ;F=$3+q13>KITMFe82g2XVs^GR?c1`~-U(Q1Fw`<||@-Ov!1BS^CEXqRO zXX%ck?PWQvqjJh$s#{9NEHsiSs6x z$mq@;ksVY1DOsjtoi^8>7Y&33sp3n-+7PsB>Vj28DUtn8+-1|_=FD+9$*$uIhb>ms!yrvQB%;*1dwJ>}!r?Hb3K6bYz zL=flppRj>Ia=(Wk9-=?=$!yduULSYh&{ZhRJYWRq#5lEBIb6+)A+pe_J(z?4?IZ+Q zl2cVvM@>fS=6SV4F|GmvweAV`>$C6W4&D^Myr;^Mx~%$#FGG-wf#o|=s^D?o`+n4_ z&j0mH#y)ZC*WLut5f&kT__&k)6lX7Njn0s;$C*SUFGMk{(CzU+v(}U znJ5nMzSB>$z<|uD!^^sBzlt)yA<6L)6#7(Yey1jDP7rnI0bmZZt(Va}RTPF2P6OO1 zZ^1~NKm4$<%!#g$xh`SV#sO<k#i?;mL66O8eDV_Qx% z_~3bxl}1aJD%a&t0>p8I*OqtvK^!neU>xy;ym3qlgUIY1vT%Z7rHKRyc~Y99fkU-*_tLV>DFZ-Glwr>CZDE6o{bw-@jE#ydg5!q0KW5K3h4!yc~FE z^g96hQrK(8_czf0GcF{E=4-z>VZpxfFKa#C^{X#B)aAyym;d0Wt@L{`>1EaOp7i^4tovYuA)&5<9%^4+j3=0(HW8?x({(->NTe z8%vh8fAimCTNS&LbV)Gs@MIMek6i@~@iZ9Yo6P82R_mwsBp4m4FZ+EDYFM*x^R=v% zG-#FTou}BWDh}+C=BYg*x2OF7I9s{AkGJV;my<$X8Fhfc*X8f4IUBCvDrv*YsCjd> z6>_KO?4#ChTiF@u94IjL)P+SF>szhwXuo%_KTab$?x%huxu^t#Zij(qtn^sX*cZjH zVr`CaqT5-u&&AV*D{&m&^#yi`9qRHE-x+^kN<&{)3RF%PQtOx)xi#jkM&t2mr!N1= z=Odx5S>xsK4NwmXwZG6lGVI%>2ZuetT?X|h5>yR&#vcKsCXpTn^|h2{kWL0M|K2k9 zBN!Ymx-QfQdt|rT)tSPq_~_pJL@F=G@BE@~n+)X>PX!@rL2*wp*iwmn$@mAh-zN$R z1iiOA)+=V8-!?%+bioft_9YS21~&k_N%yJWT%d7WTJ@%rzXiZ1 z4(7!gqG*rfU<0;92lO$3bu%(0&fjkI_vL_38?FlS_p|s+WFSB1_-|r>T3s_06;{6p z4!sO=QOX91$7RJnrPvin^EcN0yxPE-uS$C0#i9bdvx4i7Eg!2w7&qfFXMKNVo0^|E zs+m$w?pE`UVOhN_@dE+U>`Mtaudl4DO~@Z4h#@M*Ii^l${;auv_}air@5+UoQMc#P z26>kX8>%f2ztxBgdM_jRTc%8Gqr1fS{jkj>h+5zqvh~Q-v|dqPvxFFArt#6I@A7tt zw_Mz}vCzXm7J5$17ajAA!9S}YHro`+ejC?I(EjJ+RarNy&_6zoBIZZU*Tk*b2Eq(_ zFx}=o6*##6?kBR(-;-`dZ%S`*oYZb~{sZlgIFeTVy_{@V)!63t95ysN(ZAj|`d#W? zKdlwlrSBsTgJ-d*RY3jvuUf|-@hV3|OpmR`;Jg^fIc01?Op9OA?3_tUZ+~BPDXYT+ z7zq2THs6rxbzO-@KqrIJ@-x(y%=y^ zE|oi7GAtfg0Op17i`y~D^>=mB6%Hnn*1_HR-VMG3*M86ajiowI{8vq^D$hmdl$fh> zw;mC4HSnV~l_~`ukA6kpK&iQcy}~mY*l8MT6o9*R(hZS}F}2&U*F{*8G%D&yFYF-& zXilvZ;=6)9Z&?%;p0JMk1D7F0CIiFpTM=)4Bk!G>y;=HsQ9ZB1{hV-(eYS;Xx}Ej`F?cac z!?TdfwC?Hf)tTy-90=Q**DM8x;NADZ=%4W6>*M4enL*K*Hv5=AVDxf~l$w#h7J!1~nzpaD9{xX+!g7rd)>L(KbC514 zV0ZcY@Bb$<9=Zxl;aAymRCt}`^*-wT~K~*ajO_?w=4Pa zW6&Gnw4s%o;ABR6xQ2i8?CI9FuQ|QhRhEY>*WGUt1i=1mB2NsPZ~u)J*;8b_q-2u% zZWWiwtOBoFD$!ZS$CODmXpW?Q={u`i{|NnFjv$6qG-Z$9?9O_d`E9PM=Te?Vb2m<4 zQ4lvRC7ubGWBIUTmg#S~le?!%K*FcKrX~4W{?qI;<(zO*a=I^UOoBQRi%EJ&Ln>E?0WOm@rR`cjw1dKOr`E}>b-#fcY)O;q^MLNn!>Qn*q!-33P zi&h%l^(S;#6)XglM@gVI2mkel705AojoPz`kn0T^idZLB=;K%VtwR4Iiv_FlfiLQPsDd}z_fO+nO(INaboo)0WhEdQgZj7t0Nbxa`A(8BIr_qQbP-} z(Vv*&Aq&>%H--7#sM%&kM*L(_nPY*uo;RaZ$;}n`h|Gb37`;ia{+()o_NQ-4rU4-17$Nyfu!gOl6ij0!X z37xgtT}7GMXjAfZ=Ty_#be&bXhNJ@E<)j`Ktjc&Td>b-qYU74c)AClJxe^ zl4mgJ2)z41$!adpDQYh9kUITpD7-xCdRQ5<`qfVaoE9 zci)3XJU$uf)f!PhshU44haJmJ_EJyD@aPzu;8+=~&ke!CXrjgc*hHuxFoepu>((&> zYZ~5N7%Vzo70lUVQQqxxRfsg9TT}X9<=6*}c^JzsjaLNVdS|!UTroZbd%fe<>qnYj(N} zRKx7IuTtd^e^aY(sJidqR;}%OsY;h06W_JDOu6$Onv{Hd$~7MWih=(kvmU&NcMJ%6 z(lCA?zf0Yzeb-IOJHCM*+qJ{=m+(OkEp~jH+vqglA(Vr-we^jz)WTf(ylD$jk)C(I znj|Dplnod|b5?MAl!H=s6Dj7XAhU#J!)c^fOB(eE_bQCsjLr)K19URIUSG&xQ#vI%|03N;k8~?$? zYuh$1=UE~2tNnU^zoet>@=tQ}k7goJ`3U+Eu5FCx7Wt!1iN*Z?m==Gu25AM7EJXuD z=KrZ(|JAj$!NE5;1WNbT9sqm`hTgLpAAa>T7M}<+e4I^$UX?$m-Evm}JUw!6_S^rb zw$=Y1p1Hl@Tm@4;YP_^J>-Me1yR#lCSj4ioJgI;j z@I2MR@2{{U5-s|bI1o@R1{1qa|L%;89xWF(K37%UDZW*riRagYNp(9N=e}A3^F`p2 z@126PN7wj19g)l5L3g2f>$F)Dha2J6ChOf4+sVsCmE~`3bpCGF9t2HQgTRIV^iUer z-TQ85&AhO~gDaqoHmEs_)zT(+OTj4yjOzLMoDz#pNI6o$t?Qe_3w@+dITZ(~zd1#Q zXSZU2oA+|V&HG=$2ek=1)Vp%RhlY`T+@L5FRE7Sma#W$yYP_cj5fl}r=w2BoFmpUs z#!cRJChDDH_zEK$5pDa7IH3FLibV7ELg(H^&7z~}8o6=*bfH`++n#)+_mgbfUTQ(p zU>7xo0V=WTmZl{b(-jKut-5@y=TY952Qp1%6j~mi=@L;{sV^9N!-gM?eFQemw>2k5y9{(n{f(anlj%HZj_cSo#v%WH{+NUg^*Z^MB^Rfik@t zalHT9KGh$X^*tl~hS#2!jfuJ1A|UjO3y9pU80CNJF-$ z`#NC`$PdC1N8_Se7Im=k+I~x*k$~vNslg$*W>ET?l0Uw4+;~e=zcT6S;vIHk%v6Gl zM7fx=X*2se)rp208R}Ub>cIKA(tVp`GrnbrUzvkazf+fXZGH0a{a+z_PcTobE@A%j zh+|M}_?ckN0 zOT=xdV8gi=$Pd2dL;K3;gvjx#A-K?wUoUq&rVLC zpN!hOU&!h%|MC0lPuwRM5L{vS8SI<#dX#toERmCjHF>Prb?T1h_mo~PEyjZc>UPFN z_k94t^qszq?QDIUgxxWzcjF1{@!Hs>3xJ&SZ$yVS$miv!s|g^Kd0h|eFH!l{_gbYx zg&3!~Bt{Jhh(xs+Eo3@7IlpY%mhvPvEC#~g)cikSp>*$rPVMW{OGSqP!eP#HmbFbCa7ty87+JL18VRC?bd6Z zPHNYWSlIopgt`>pt!x>^y2@J0E`0YD1PLm*!$dDhhucNWm{DE4+G0~ZlpOTZae;t^ zklZ+kuTLxUQAK6T%2dDW_A_PHC`5@L{&qdek146aQVwp1UVj=2uQu62jvo6k78k`% z+^pU@k^ncK8vjMq6lg2+yI+wDV_ihSmNxf-5eb1*pim>XAhzE=K?S657uu=kmSB#( z{Yvmnx38qZ12orfyHXyNCB&9dAvo3D0g>mLCfq3k5b?Z+Lz-p&Y_H1~zga`E^9y>K z6>!WWU6p3f8f0d*?f^u5SdG6@&%=2ad0lU*D_Eh}cSuMS$84!y5?boBYnL^M z9^DdPvYWs1EF00p#!dl#)6MdzX9XkSRB6dyP7Ae5ZShnnA0a%7u$K**hc{Q%K|2#oH4AYO34-eJ|B zv^()d0oVO!JP1+D^?ndOxR8wa5*sBpc$+D+G7Uebws0L z=XoEK=mW|)CzNevS;!2%*}Es_lIOJtKPL9D&8BXttACfI4?*u5uP2NavXRd}Gv*<0 zA@C_miIWAZCaBl{>e0UNbcviYqz)yC=PjysjULg9I>=`0iak`a$59Xhul3D9E{GNA zxmdMBQE4I&M6BA6pkx_OY{a{`_<~-$eP^CZ;I2{Yp*m~3F%x_NF*8QBa_qM5ham#` zleZxza;vqY$L@H9@j5)n@gl_>Fhwns!vc^3J*)B4$1Kx-d@8OlvAWo+ds@EHa)ZSu zw7-AbEHMNY>#Bz&+Ag>?+RqH{+;I*DpCrf_UdHQ>{9Ox>LS7qMg}^3K%zHnF)lIsd zc4i(e(fYY*u1aoP{2f5zatNy0nYS_(5Mp*#S2AW?mc{=j+~}`m?v-1!0ocddYf*dELd=2pR?8oh*}Wc!y=z5=O?+)D#g4*F)G8RJkf#6+B1Hy>`l?obQ6BLD0y-zKWLxL- zV+Cy$TlLxj4G<_ZxuW0<2R`*~fm5-ZG43iA&O=gXuA80>Xr0gKWtf{?D_&UZ<8{nf z|GHZ;hIpz${`if_@4tA@h|RX6)9ZKjFGb!#mZ;)dZ1dYmYf!N5Jv@E6?}xOy&fH+k2bhY^A%0BHsT0ADP^%4d1`c4r#MDS0=0A!{ZxlTERV7uvchUv*61-Lr|U5d1qLK2{; zFOm>~AVfj!^dA1oKJP3D#H1%atdAX6_(YQg(Yhf7A@Kx=>^Z;>*h<435|9emeimxG zxTEAQ(wl`Uk^lIh8A^b-PVd0Wi2!}cMihgR1MhtX%wbcv2||7bP^MftO)I7Vu9XD) zhM=mB4+FN$w&R4L8i0t|Pjn*`B(SIt!AU@DZ#`B6oHuZOe*a%Z%0U?0-ZFn=&mURWX$@k+N=DCQAHv&Zler(fhzVwUUZcxIv+Iz^+y%6y! z?<)bY>_~#{%Csc@5x=!(<4l~4V=anin7eph*`}whkqu`hJC4Xs!4w!ApSWi2mDV}> z*TmPpAtzbJ!~HjpRq93Xk0<(HUcd4Egx~l(Q#P%lGn=jp8xT$|yspuNC=`0cKeUnu z05ZO>9N*gf;oAO>Wp9tE+m`)EJ9J59Htj=A++Z9-eaBTpd}7WYXmyF%irn1v13v{ys1yXQQjrpF zRh{Orz($nNUojZ?Y3BBCAvTALqAd70HyGgBJO{C{w(FyZ%g&B-wh;8&FY9T2X-iVQ z@nKNvE6V(-jBt<8qe|gG(hT!f#)RiMjdUK#h{Hjsr=Kt`6kV7!0Tx*i8x_nspS03)e1c1TxN;z(J-WBal3HPN0`Qx)YDsAd;hxk&3=0i%v<#N`bod2`K16| zAHIN)!)Z2^h^-Z6%7ZrV%Ty;3*|co_3m26rh1R}DO+MMg_uShb*w8MlFLtwoqt&E#a7Y67x%dAvkR(oz1YJF+Vy4I z{X;e?zbS0Nj_dD~CFrfR5kf@MRf3~!(he$brq1R0GwW$%*9j#CgZ?@se|ZwD?{w|+ zKBdnv<5}L(?Y%SpyG1>BY(kjY1(57#!s@kVjGOjb3x@j_JFBqtpg?(4>ZcW0olfdr zH8ikk&gVEl6|i3_s&pwg2QG{(DqkN}*|IM+KlQxvg2Vj0ztOfvAUhA*-q z6!3Q76)rkft)i*6+-lI@V7(l?5QCasm1%Lg1wrXNe4wHv?{>D~(BmNG)x38vuKaYo zoEQ%gg)TSHh^<$5f}7l-L>yfBJ~T)dT2`JCA!?Ir(vF=|2(yS}FoSppG1`veoDY{yq z(p4POt1gx0J5U?y-oGnJO-q;MRAsVA-x`iK;l}OU1l9r!**5KD862uPplDw1PGdGm zjmssERNly_madDxqzv9#HbCy>&r3j9r-H6mxl~H$wNc-kikZEA1l~?ynEdx zYZ^SdB*Q@nSl1=Pql(gm@_zOq2oQ?-0i??Ed#Jj#`FM9O_)E=oS1k|Mxv-l?(S|!; z7VI0x80H0AY*FB*O1~IyjJ5u?9|F8eWNB_pTVlUON>=9GE}{+2hNjVG?$_+xp#S#DwWBNzcAN>jdosWhfTGtXcM9BWBwUU_t z%>)O(@ytSKQp*3nV194$Z0oDieSWO(WgwU{aWSS&h%Y7Zr&&WgfIIg|tHfCagdDcD zl=(!TOZZ}=bC3L34EP917ym^8ZX)mE4;C|scwo3H_2i~*Lk4*`g7cb=*JSajNu7DB zj7Fi#aKAN7-lr!KTy4|QOt zYHUjmj%qY#-3hjqGK{cMLW7OgL%Zwzft{2(^ z6v9z!ySP09o?WSB9c3IzQ2lswip2@-Y+B2HnbBsp71EU&eIWuUffOMwoUgFecQvA4 zNyp=L;kCagwLgp-8eaX#_FZ290j^XIEkB?bfSJXP!*jWqqkX)6C=Jz01bg=DosU+7 z9CP&*Avi0(RYak{ZA91{HEY4Vc}gKi6;eS$41G5weXHjH&YJON^7`&9tNFN&9+h); z4x3EW3&0V3xp5Wye0m1FEbTW$jn8;rqOcJ#XNQ%z=*t2FdeaGmTtr6ApZ|fN7I}_k zHnDiTl|b9AICf)#H_YRJ7=$DZtQMx~ zn>s>U6V7coVv$xKBNfkS|K7}>fM?NN-`=FR6M~|619YdBlNhTo>wyV7EVU!uG+kj_ zm=P5@yHx4y-6$5%WHxE4Fi~B0Ni}kJu6q>nwa3PNGBtjm-@P9~&`O~JNBOjo+iDuPG4k_ekrqi;8JOSV} zhWv(&3(?d<5tDnN0fD7=;XS>x1lAefr8{=;QBy54RmHP=lFBqsqk2^#y1P@3Dh8## zyaEUV!TEB;nT@fSz|p6IbhGU{l&V&~kZNJ$Peh~`XJp*0)GfVI?s%VO1x5W|x2~u; zh}_uvGt6q+tQif?ESk$|BN&U3 zL!w#ajBLwU|6U@^TpRQeU7wZq=g;Aw%O<^{yt5j7zR=GLz4ZE?G*@K$b!pM(R($$B zn++SLw(r;oZ(8$^M{xpKyDAm$a}!n9u7xZPiVo3J2U74a4!`C-$+o`6NH!TrD*3pj z(&F+r(>iwYL(j}7-ya_^v`lz2Y$ySY=0-@xE6QDEd#n#v<>D0LYgx>+u2$|@)QTe2 z$^a`jEbNcEV7_bK&inX}c^tP-=N<7a`Q2}J^}mtAbRI0-XE?lY%*+)ow79noZi|q@ zgsykDze#5&3r<~LFJls2XVP@3+t=aib9MuD3ovFzBfX0`mu#U+Hefc<)nU0NZ8>xO z%=v;Lm?9U>$Hw@|SF^&U^C}%*EHhu!sBk~5p2l*ux>>ATvL8#=IuS)5UFNDZ*@AjO zhR|1psJbgEO!8D6vx||s(AWAS0r3UD4$rn_l+VsGGGSC1O6#ou-PQgdjuqValAG{> zb?R6iV@*|@2mi%gIG{_erOg5zz4yoYeI3Prua~K--|D82b$|a8<@#xboFXA^`p2S) z)w3wb`mjiq)EIn~PNsR$L@C;B*gI6?gvId_5G-STDAZX5&~>)=<;OIsEjuoT#}{N+ zx_WK6sxl=mi7a~WA=mkc0D2cqr@l7n!;Yd2F^>I$j6w9$hx%2oeF4n*WfQU0_25=c zDt{$AS$){0_mIP<9r77+^Jflivy8$4iKFRODNt&oK<9}{`_B#~Vf!(_UiljNl;A$dc3I14pEHxzGKXI6#ZxTw=(V8uj zV`(>xVHW?k5D{)I+uOR?M?Hd$RBt-zpJPxUB-A+E3GtyFyP0K36 zmaM9$*S1{gkS$a{y~kFVjES3Uo@eezZ9k-rf4H#nAfrcV7f~e5t;j?sX!WBiS-B*s zRD`OlEmkRjXk(tD=u-~@6L0GMk4?TkQ1S`U$#b!Jo}(?@+7|bI^ryX^y|5wh)AA)D zaOIHIk1@V&&C^VZF3cwqf<0kDw(Hd`4O8veVg21#4QAnSjRT5W+a?e&uDI`vv3rW{ zxsoqFK4DLjhtKpS1N+RqZQKhydf4{em((PE-)d>DwPA}YmQFIE376|pX(IFTcQBkW z6n=-T`M0BL355aJV^_arnKfUJ2fi#PwDpc4=2ReZ4M0K4B6Wk9Ly2p{ zq3*`~gF<;RUlk5c$6>n2jGi<%J~Odyk5a7!7z z?QC?#7zoO-lOw#`4a&S-`Sx$=0!4ZF-Pllg>c}e=O3M&p`uLfrAmjE?;j^g|&F=$@ zj^!7%oy4j+P_Fw<);R#fATs+_C?QVyxE;c(QdjJVQ)h-lZZj)FX4@}r$wGv6OG4)k zBbx=|#1jy7D%>4g$GC@O460yp>-jmZ*baZ@XfbR-SH$m30JD}ovt!DebQLW~v*1)xgFndKhxwVJq(92cT6-D#_Z570R@^s$yQSp`+ zuX2k3$+!GN@_$U)xR+(`Wq^1}dS$Ur(WTvs7=qENbMDaAM@c%JZHy7Pb|8}jf)Jk7 z6eM@4kmp!Yn4kcv!?;ZndVaWoQAb+YNK8G{b_;)R^oUL^IN2nzE`{WU;KO z`j&YN>AHUIQ2q;UzOW%DD~Rov&(cM&yMs<1s5$8J{>8Q8l-s<&<1Z}}{W6%g?|K1J zIzDGserBVj`G`5XtKE*%SR;3@@b%6C_S>ovOq`mlZ(myk^#R7u_4Bzy_@_}^j4*ZA zTRyavk1$AL>q*nfjNPdRCI4fMEmTjCBqbzj@NIZ`h`ed}K1vb}M2+ew6J?R(6ivjP zC0+4&Re?vc!)Gd{VPnHvASe|fGidnuU&GSXu++|o^cVKUZ*EKf-Z>YMkMJuQDN9s6 z?^x{L*3P^I$50WJ?tZ7oHix_BlpYCiS1QJRj`{eixcYnVQ8Pt8ff#wi8`!^t`>QW$ z&lO(W*-Db*F7mU2t0pfwffaq0qD@Wc7U}#}VG6|# zuGp)54s{PM8WpQ#MQP%9vWp(r8Obz+jsmQ|F(k=hzTxs;Zd9o2e*;C zlF+Vct=3lt7HEQ6bf;26<~vo14pcTirF>!0)pnIMOL^DXtM@H3U3&vr(#HgfO0!a#Uc zVLSPU5VRgpsZ-7JmGv=*Eh-iqU<IWIHdZ<38!uW$lM__K4@%9eW5i z;SrKvV3*;rTU_4e>F==n%v=aiwLZwDX#6U{}{2O#kuW5BsKiV}h?I&{2{qpieM#3x>pw#bO) zBu@M2ThH4(c5@CK>uVQwd~?7Y*r1J2afQ;hO#!XMml=NG&JfD)Z}2ne4Xiw|v-~uy zg42;5)e-8xX{+t%ix;ON?&=1va8wE??h?7&BOhe>R$cjJ6pNFuso9je{ud|f>*_OK z`|T-T>|=ByJIey`($Mt|?#LKQuWAo4%bYpN#R7C4hNJ%{II}-Psx3cW%A#5N^^kD` zsmcQT#Ta90^Sx}MwN+2RYV-6eMmYCu=Jhz(n9`9~1}OD7$6q#7(snW}_jvUoFLyPm z_hP2X%eOuy`G@_Oy#$4~Xxi~r>Is4%lUOyyVwRxi(~?tvl=ShPanD=(5}u(gyC7t4 zy&~re&&;F>V;cN9?@Ml2fvvL%xgc@NqwE)2VMmRa5}OtaM&h}dx0njmq$)q_5Bpzp z49S8&`&FNZ8Qr%KIW;aG&{g;|IzR4VOsTjzwYyRixjE|ZYLuRknYF>t@@WPW-1qQ0 zvP+*xcg2bgQyF>BZqe8hqEr7fY4p=E*St^}v)E$UxB}5SnPF2&v6%Fmb?=00q6zC$ z^U8%INsnM+@yG@?vLUeJz+lFM$mYeEuJ{*Q8rv-IAq2ECpMPKIE0a~;LJh4(H1{u) zkX8`^x^uW0MrZ$gH|{xifQje7Y%lBErgM=VM2tA+aMVX|LymSSv#Qz=Q zDHz)9zLtPrJi_2$to#Qk2vr3{1fE^4#4=`SQWJyZl6pvzV~G3sCTZaX_Vs%Qd= zda#|FDisWW>Zc09izZ=}If!+_k5s_PSl&W;$V_aDh>`ZpK>a3xp5x^^D|H7v7%R-7 zZ&T5OxR0w{eh?HbtIbFPf^mI)Qv#CogJnsxYjsiIq|4wU7ui5~UWr(yI)EGU>a*yx z#@?=}AUgQ4a`aEZZd$oPHdc}VJUSk(I4fO#Wp5PK95vw^*IbB?YEX1~u>9r9WXDt| zC&c#d{mT7w9yP}vLa0~KW}?Wro$+V?>BS-7bi1LkEIH*#^YPw^QK)SXu6s@U|vh+S)No#i#3fBCFvV(<{YH3HaYG8=!m3DJo>VQ?+;>=#jp0!YO!T2}=% zHBd`o04(`ah57b3I_Z51{xt z<(fN$eq5K9A8A{@b~h5Me3M!Y+-1>$Zi|WqZi^gShAMWxwZv0aYB$*=XYDLij;Ja^ zW-NoE4OT|&W^&ZSJm1`AiNQQ@)Pfz8BnH8^E9hdqQw7$;T~|Xh z<%w~*IaquA>J)5U%d50UpS^-MMUx}VL78~;>_sx0ctB**DHU#~WGGc@lUUGu`F#io z?grwRtqL&&cso{%;be=*HJSPa3+xnI;x1Z462A&_ZZM`^Gd|X$!#%rKRfIIKc~*l{ z=Pox<=s(eBnsByRffXJ~h4b&49lQ&hut-Ak#pdF7FZkGZV0TJK7PD^?lzf_jFyboZI!ATci(RF2ROXS2E zek7%^iXYDHso-ISlge1(1zz%XN@z+pH{DX@Zzx0LO|;aRgY;>ph=)MZE?Vfmc3LKS zK8jKAtq~Bz3+peBS5A4CxY;evZ$w%|(^K=#-2f!~aO3khm&5rs$2P-KKeVGa9oP_# zed$mTBnT*|#eBT+_UDKX_N@; z`s0dz0wIw(GUtqjpnPVS6uke;#Ep~y{Q7IZo8?iy{ShkzAfx<#>|V_ZSp;#+^XXO< z+UtZ5FJE{b&*h&ADR>W75= z0~bLV;sGrPwrvE7GO3VIpWjDU&|SNWr>+KVMs;-0wJ`R;^4N)#D0|#q1G$I;gCjfw zl~N8TR9SFxTi&qXK*{qhefU6-%J+OcFcJ%)%U~H^gIAObv9;N=noFS-`Y_G2Tv40> zt-|5~+{6(&D_?$K{BAUG@@D;$4nRn7cw<+e-CLR3^~OQ}OLS*{(JKpjK5h9w)GUBs z3~GoVIxVautFec;vn9)w<0&~mw^e*I3OTc`jBLh-i3f;`Z-OMrv2JwTDy!5g9Yk)l zUEhBke8*c!E9w~No3mRDh^d`}Fb&=>iUq`^{`+$Xt_su?P9M{XJHxgvLPNF{MWDpV zUAl~jxsuX8;f0JV?Xv3Uc0hEjP!Mpv7g_mvp_kmE<}Bargg%s+%UnuY$4Sw-9jV*> zLnurX+GjoDAiX=xDSA)Jzt?(bLFOzEc@ITpo?*jeVnMZ&CKq`?;8O@*jJwjH7)sRN ztS<_sazM!!TB`X#NTABE>7u=JviGjUbKBp_3G_(UuE1(k87ZP%z?m)`d_o&LmE>DC z%su2ZsK|=pL@A>;vs4;{sy03p%<@XRCPMBFIx)+K;Zf7erfYo2S)kVxW4Q2a%+JAO zlKPHHm<2rWOC2&iLY7nY=?NV=1A_LHysjzB{x(^SqUqv6L|O3=9p6{jnM%FB)N{$o zJ%=4d$%qGW8RPX(cO|=cY>XJta|R-_@pyM_zRE^5^FcR}{>!MLS#DyK;?b4L-aH%6 z>^S@4alU{gTbt^XmgAXuC58RA+~fv}j=AlN8NFY}*Z3Y_q6QerE-TH;Xrd_!u(9ch zqCI>&E;kj(l;7uMm&0vrtXBN8RpHqd<#qu{oE!&vo|V$~_~@ly_bA1Efsg<%*2m_S zV|AzjFITH#6CS|gU)NTw=j$?)*6)gSBo-sv1Rl=OOROuoLErU7g$q>yo3Xl(q!$l! zxjUn0pL#W4s=oYFWJh>sJ6W+fZs#OM-bZSnwWd_}ux_i>lGG+@<;859Df`0{=&kN8 zQ0k9!VcH)GU1O~KkDU6YpEd>PR_~y{3SS9A9S)zI&g*%?j&g8i(vGo{nQxX!^&UkN zh}AFit&Z{uwT|Sw2QABPgmfZD^Gs%d*#8@49@RU4T62Ad5Zm^GH|g8#GprUBS9Cn<;|~+DL4nZlEJ%P+N^T$G|6Den0nYmA`VjKQ`L`IzU(KFLZ^9 z)*kv95{?!?*|!1`aN{Or6^jQlz)$h$Q-LJh*YmuVZ0|B*E58aXZrkQ@7COv`1E3Y@G%D~&I`i5 zpf%PvXG$07JvAO>?VF8*&#hrsLQPhS~-3rk*c6-2^{53(bXfm_BUn=jfh2OoW+;dc zDl`g6;@;T27yzK+@9(nNsLoK7yFZ@=(3ldFf#vdKJDHF=fGLj?mW6l{cON^45Ar}V z5vVJpd+IX_ulm@q5hS~&o0w+G_l|q^HP3mpUGuseOvJmXf4p?pfv4G*{%oy?PxhC- z##LoR9Dzk4Ge}&E_4Jz_s?DI~i-Ln|F_7#YtmH>CF44nj-&($UAomm8DnozgGQjZt zCHDq4wgLmYVk>f1Vm}U}CZzSEQ67*UdgD&Vmfi}+O}|XeWsm9@s|UU6Py`p zU#GNiNF8#WL}2`wOjg4pO=&nGNy3Rvq&?meL9EZJc27PBDck|4zZ%)17VN>6Y{><# zP5Q;BBqQYiLhEoAJw0r5Ef?}weJQhpyWo=S-8j`{{o^1;h%;^$slm&7l>eY;G2P*a zU7O)dBa2x5JZU1fj0WW+>*+j*$4htSQdr`ep+v$_4Wm;M&*vLjlPS?{y#s}puGq3t zTx<9p668{sUPPrW-b7>-t0Qerlud$;!h;=Um8DqPYp0DNJj49RTB;VSuQS4$Hr7^HKQK@kTu+9 zb=iV(M9(R$w@E z?tm485XByP&aisnS}PSwg2vB_Jon1SiwJalG+1@uvBeZQRSHlOE&chlR&o;K7^(C9rRdgsJX=qgX%rtn*}U55T8X1iK_} zZ4qt#=ul>Sj^Hg$3foE{2ruVf0}29M6iwn)o5@H!S~UvV8=;z}3LvY`$XaqOuoR;V^H2ZEnWv#+bSv10{At#vkSc zB#mm^rN*k%>J=QoXfJ?zmj_f))9XJ}ro&n-*=zC)Ffz2m9Hh?+Se+GxWFahKYh3(KWnQVomGs;qWhLW2v`b{+0 zHSC}32fR<&gH3MX(EI0VHJQ+vGQQ#S%>tbO{d>)jN@GnkkJO>c0g9i86m@bXZXc0#ON-i5sWs2Yo3|9`j+Pqgix74rQcCH*ZDq&l zpIP6bIu(F8= zSvPR+(e830SoPJ_dN$Y%`-{c1gZ6@io&9C3;k32D=qrRmW^77O=iS3m*OTedHvVip zb_2n@=kA$&cCpa9EWeP>U_cX$%cMqRoh>yzks!_2W8&7V*mb6mHwkeGXs;#>amM?_ zq;t%X$8_#IZ-bL04Bp(ir-mRj_wZ-blIR8||M)dE+Fc|g@h#Vv#4;YWd$7mun{)`8 zOE3FjLr1F_EQ5*U0XZk6xD?mD5;+!eJn5fUGv>tSPt zzxBoMAPvKe@X}L-}!`^l9?rK=hkXnOA ziTy@DH&*_yA0Nc>Ozp+;xevsI0bCLlR>n3fkAsq64M0@J$$e1~)O)r@mnEq1AuTPG z1oqNZzEenF zWnZwymQ0scyo?opqV$682HHEmfop%xo2?%zNZmjTDiGiKB<(=Akh7|)`*HKM-q!aN z1apS8y>K2hzqOcNQOBkMlbmO2S?8_F8B><|RO~T#M!l9K_Lmp?P|4_yYF;f5FFljh z`y7Q@%vIwNBg!ZKb~@x(8^I>SPXHIX4s z$|K2e=@F|_N#dOYPv1k{53C;Wo+UdGHUsfIsQn-$jj<&uMY}2@*5rl$nyr+$?Y-po zo9FogA>viKqW&Ra_dBP{>pTUyZjg^gUFy;{1psFNE(BSP0r>1y;LA_GG%>FXQ{HM& z;3>E8E=^TmpT1w?UbaA8C7+Zx*$A^t^#}l`0kv4cs_$VGczpyxzlxG@ZP#~9#jF<7 z{4LFW7%M8Q6$2AiW!LYSqV%$hi%P$T%r%MlJvk)H56Rp9eIDOrCV0(3zzZ+>y)V)s zV)`J0c$yrt7%E{)c(8Glgi~-y_SRMW%m9_Y7R% zh?E1Vr054=7wb}NuDprfyU}i;<-cA7= z`U7!IXjIppVyk`lrj;G?*78DZ-~NZ>3zQB=-GoXnZR$p=rGOv*)EN2m;}*G#6}j4) zH}eYhg}#CWM(=TYO@0V>6o&u*K7n7;l!|qcKT;3toqGVuNDVt0{Jmh`16!FPg|A7W zCM!b0Ud6V37)ii?;xz461~mv^coGppEn;K^{Jj#g&r3e=`00t*E98B3&+y56YrsAL z*xH~hyWQk_4u|l|_SJ<;sT=*vqE6zg+UQAN^h62n zGDGSeY{d!{EkQ^julM2FneCqkt^E1_?InS>+6j&~0rT+E&;h`Lg@Lbr723Q#Zs>*O z1`f`AE#JJSO{Er>ml}+Dp#+NYnzGa~oV-a$WoS?zd6Stw(1`P{D0sBZXIhG$DdDWF z2$BPi%}|K;;70qC7^%$2zphKsXeGlmflOlSEN~y3lp>W3NH(!lE=jg z8Pbz9c=bQdh9NuFmX93*rKm1tOI6>f8^E*4HW}di)myd0VH+;1zB&IT?!rq@#kmC1 zK*Q$;Io}u^?lM-k;-f`xc`H(qwls;*Y>Y*<{FICTSy=SMYIcOL<)F7m<3tLrj3Y4x z5%(&h6+DwngKiTzPZs~zD0=Y}7sSq#&#$u8R(YJDYdCROM_F6*r#~@sOTiBUL_81(lC zfH~YQ2yf@I^3t8ml8s{$lpUwx^Y z?Q09b3Zy&cTr6q_@Nu`vfW>!!Qq!7!s+lasIHzbSS?-*`rGh1Zv?nn}D)$?8?(&W; z5$L%~u7jfgcmRkU*u@{@Xp_wsp96L}OfVLw!@AS6#m4g-fmN_B`FU*ACuTny{E0GB z`W<~|ui*4<`F3&7CINL%0u$oZ8nlDYB%T%m93uJt&3cVIrn_~rr2_l@loW;Nzueue zB!Uox$M{3VI(}YBavqtpSP{)kEMO!*`B5Wppd?_+EBxsHNI|zmD3sF8iO9B;OdyC+ zz_k3eTcc$@w|2&3;#{^4_KUJ6RJ0J_<6MOiEY!#oZB1SVfiWSH8tzav95 z4T7QFkpWgB7$!JdWBJrf{{8>bf*klXz_*?#`<=O*ujKaO2U@V}FEU}fXu&xQ(AcK{ zbYWMN)92|mQ`)FNc2`HzLlZV&kHKLC5#iFsJ!9YZXC78!>e6h|e6#kUOH;#F-*j<8 z6*qv#lF=kAmI$Gta;^W+Pm(Via~?nMoGo6}MJ4Mc7{2_k&uMWIl*xAar<7u}79&Pz z#KRS6_U=KFg8*Ebl;{)s-71rDz{%3_xus`6NL?TR|Nl51XRsA2zw|kgGk6j|$ zw0~PXbI)G!laPr3`3&H+y4ObHu?w}hU*>%8n`eYo+`s1%ySRAf(cFL-I*{gZOE||um>^T#f zzkfWoa_Mzt9@qG09s89yI>-Y@fIO0Rp8>RKKxCy;ystmkBcUAg9`eYL0;l$ZB|Q_? zs2QENu)AG1GVRUV+4o_)0w}R>1dz4=Ukdxv^n<^b|DVsYBajAf zAfkaIM9dkzTS-ZH{xp6!Q2`P4-2s-Nw{p+!Hx**$##o&@w3}U_#950T^p%oRJSCKZ#l438WQC5S`Nuq0$jujA|x&_ zAJ|c=xfp494F%kw3qS^G4U*=>Y9g~=94+4YbJGMphUsVY^YH+@YN>7SPkT8hV^v@= z$+8jkrNN8dHPiY!A(#NtLAOC2A3h(u3g*q~0Y^Chf8SWcHG2ta;Ny@587(3U#hqbx zHd98i#~=uZUHe{A5X1&~G?BjKx5M0+mN0*5k%W@x%@7d-+Md8Zf^lyx9aKL0e@qqu zG|K#c9j4;Diw4h@$Z{hS!yYUrY+bj?(ur9)lmyrFB78~TvvV1EB|%P%6JTeIcUC?W zLE97(o`yTBMX!q7q`bls|-L z_3U0?1a9n|e<%(uj*X6ZaLze6l9s`zkSt%C3o>om6BP40AwWmPXYI@zib#VFmvOR^ z2c;^V0xdVln;)0Z+)U40d~vfqfd(&~hzi$pa)Q|i5b@qzc$?+pzI^-A`=K;=Ly|3< zy9PRQ05txepQux8-uJO&guwSWcbLFDeZQ`A%{?zhbfNSuS|rV%zp(vuPOiD=1CcjR zj%$bOytQ<7*#CVV&4`se1WeBf@3Di6-Qo+>-;jui!p}}kL1ub3D4ODkv+=KT1!m8+ z&{JG6o=p(I`JVd_pCEZ4X;g}i+9NhfIUFVByd_YQk@-^co-9;2v1n1rH--wr$!|wb zq$@mkvQ-xhwDbzZrC3;H2xjJoeOAh{G50>2AP~^TMSk(?CT3IXi_%MlGJ7yBp|sJ5 z3-Qz(H5u)*E?pS{MY2(n_J0=3aJ-IGMjGPC(bJC>nZ$JqiDjx*d#<+LHa)W+aEWeVV4EVYV4|Yd|(7K%d z8BxR8BXxZ2Tso&TnjBAKO)KK4Wj9o1Jq01caJT#5rjgwXP8=&Fug+^^#&zy-5XVpY zSD{~L8txv1vTnL!TL|N3x;|AZu;ElhY!{X2rJ+K$s})@e7G5<4bIR8<{C+7$)-TGf z4U=E<$&WH%C4U+BDx297#c03*aR*X331}aJLPftm5Bl^G3U+0F`+(h{n77SF(MG`2 zwGj^iaYDZRhXQJCXIPeFta4D?O%t1r`N|Sy+)=A}wQt-QrjxbV$A6x_Ak8L!X^(%y zXlpv6BAu;YY!*ysV@r^Qr#r@zL9CX#xrbAU z?@cob@;aCNDki`9Ge|oAo|%I1t@=xvO;Z>frm&8b5Z@03u}HEwVE9k$ubFz?vkWmdJ>h`)n8i6)+MG!y!Nw~v3xqu*?_@MzcE)K$0+OJvSRvq`o zSIQxN0OwV+vKrYJ%7OE5xpF|6l3;YpRseO}?{|=KgX#RYim?MmoxlK(bbgnmfJKSe z`I^`<6%^OIz0tj)mu4tWft_x0cTvs~P8noY=>NtkZ;8&uNOn2#yB&tI>|y%9_R`U= zO(@1ZJlHT ze}xdej_|(+;UM(euO(2#VY@cy%S#*vaPP?#Z0hvI_I3lDsLFM8m&8RjNM4)wM7IHc zQzMd{kaWusj(|a}-QB8L$(}Q^9iUf-gcT&5w;p{#etSYRVIXvMx~C%rrw3Sbnssyx zT@$JL7_{;IQvCFQ%c-g~)UQ%{R@$%x1y{kjG1^Pbv4K4j=TjQ^Bw4dw#VjOHiNbjOW(tWuYds$7qdVu>54 z!8-P$Ic;B$**SH(%)y93xoaAk)z5(bQ$i!4IF`^sIA5W>dx?Nx1KL08p@I*+;L2&qr;T7_aS9==|mcrKssYP^`*Y^r=c+p$_i7sOS5?z#erGRYt(Ls9O1ZN|OA z+i|{UQLl5jZU#dCC15_tyz#_^ZT~fmc0D2I4EhgKn|DvLaH^0Gp3eYrRPA-J<*jU_ zR;3B(rx!xM^LdWgGRTjFAAZEBwitHr9*UY);EHF}e@?wt^s}Qx#anCVMSqa^;#6@f zxJHO1MpW@%gGHnAbLrq_K|s92Z7aGsu|4ptRCFO{O|FO(t@p(ArjJh;OR?qKTj(^E zhShw1;`_yrzgfeJX`A@Uz=mn-H4!LVn4U>--9HCo#76g&Ey8J(|78?L=fHAt>|)ns z|M*P$acr&%KzGso8o zJ9#_942~UAz}IpT2ZQM3p|}^cdIMivH2Ev-4~B{kZM7qK&bD<%eTt_xQ19ONSl!(! zAl)#MYFR6^?4tj1|E;fyTXWU&sMVPeZ6+c^>%fA~a9ox42=Y0KAxupDqb_>$uMjV4 zT7XroyWCnEq49ZNNP(Z>d+Qry3PA=)Xm_w?9@%=-dA+~~4l_FM>O&rM@tA&3ZHHCM z=-Ie0JWrD4tn6lk=36RIs9&fzgnrJc$mmtoT;TD+8J6qhiV(@*>%X~+AP798a9QOo z8Q9F|0AzAI{g(2|Ojdk9&7_3h(r&iwX&FYFLbm9K=?g=hq?auyNd9N-GmXy&nU~)f zyq`J*&M$LpTzpTSq2;^$ux}?o#;w2c94!WUX-`&(WOskJxz}Pvi~M&Vuj|;2frk|? z9xQSjCE2vOPfVs5&UI>@VA1tue13p(@EeGlwW-mWwdV)AL#9V>!Y6Fwwpa&mzY}Ff zq8<5YtWOR{y{ZQ4$m5m9;^*3`>9=GhnBg$9?IDJSJ-}0-TpuGhAe39d7JXI6ElBuN z#48>X#n&$>&8sh>$&H1K$@Q(>Gv>05KA-AWjeCbn^N02#b9y&TcPO1Wzb`7B)T1J_ zhc5h1*Hwq8eLPd9eE60|15*~J@#iBEv!kWmAViErn9T4BNbCRiQ85D*-yN9NCjr#@ zNz@P9CseghHVOMaK0k8!1OVwAImw9RCfqgE<=h4E?D`|e#38SBsme4P$(=55A`bjv z9(Gj+l6MDrtX(k6pI3l3mmKTa`egw(f1KzIc?e)>{vMo%u#lz;p$ACWydH^tDf2)b zvRM4~Y__Fs&lk^_FZEl2;JrduKtUFo(?8vF>kvW2;m51c-|&5s6LC5b(9F5PL$f05 zC&slWMbRkFPmqbx`W9#xejL4FZh*?+t{DSewB$*brxJx)4WBuymn@YV4nH} z?5-`rb%r+N8ew*REz2}&)7Hr`AT_1r0=@RuchKgr>A(S8H8@f)FlROwtZ$5osr=<` zUaNvk206)zqySVwZI6Un3Ogs?Sxa6qdYpmdUs&(qM;(9ZR7~({T@#l(@qkMxOX|_` zvwg_R5X2Kht7moMv9a^|Isav?-Lm993Sa~>24e(r3WBcN*iFNMe?(S8koa1fO~N4^ z9j4jgL_;H|`fN(Wv!%3%N2BMYI54YI7FRxf9~$=L9^=gwA1#xFVzY2xA%(Bjwi$BL z0i(@v2|W@4DUNm21PP`0mMkoYUN_oo`AP6yRv`MD-(I4njLpjRulT~v z6gsSZ(ud3whqw2)JN?&zu7719&KC(AX;fONr1U*?zR{~JB0gIWFY_<#&h)_cFUi$? zUp!keg<+DPiGEcypkqfv_1mA9zHoy&sWgJ80LIN<*V1Aotw;r4k)ncy)gd^7nGF-X zcuP((;E5zdoE+Xqfcq3*oJMzO8z}oTV7lB;TE0Q~gG;Ahm)sAw={=oPd*m=FeWVap z%FBn?PTzZnVgDJ>0@Py`!{mZ~`}Vyg`zxId_*p$SREuvQUDMjNv#4V<_MA2CpNC;* z7=ibDHO@uCA_zsi?Sbhar9VpCB_M+G?yd$FvuOsQ%K~ zF^`XM^I7R*+d}`Ig&M+rjEMX$jJB=0=Beo*G#ivpiWohg{t<=N7silKaIe*5Lka*N zP-FSaN~|a$JzS*g5TOwQ#R8kODN; zGt;t5zUaL*lGlU^9%(1#CSK$E+Y%38-+1Z@KnkvJ50H7LqXR*d_}AvN(Et7*6-M&6 z{wu@8?(aesLfnKO(<1geu1C#}D&N?2vVC&4)SB3b;MvSaC=`tpgoLUq0EEE#<|Y?I`c&Pgtr`!f+H6s@9nC7EcUsnUC{TZh4er-C@XZYUfAvYSyZ|4*)t}; z{JlsKAMog}X$ASi(S7c1tTrz@;Y4WZmmg)9;(vNs+I4iOCjkkYCp}2UUqwI12Ip^XCRVu7Dr_~osi%whhf{WAp{q9-f z;_iL%AsXjC&R>r@l@=4+;A(a4Lxo4tAZuB}#%I@}vXYhXwo?ET3Y=?eQu?*GA;vbF zP8^Ek1DUa7(roIkKYFGjxJa!UIo<08lTj_@r?4Aeey1B}K-Yze>*S0T>s9Wh9~XFO zusQ&ub_Ow5Fn0seHvN-u1CCx-4II|e;F(rr$b=0Jmj`HRIdC~h;!oiymEmF`zDd-w>1bG0QM_fkPaN{|bNt!`lKCrS3WL-<}an;cnF z3QEHhU1Yn=93hh7x%F4`5BtM+)EF_VfHk3um~&~2T;`)9a#hqH64m6SM#6;yBiD?; znR*GQM7YnSnbx_F2L`H|>9=_J-UNUQXqa=COzY5m(gLO{PEggJ9{6h7>@=7Ve&n76 zkRwKS0*8p1+M^iO-{?IauYf3gQV;~4T4`(0z$g9lFGl6KYsYCAlJmR^JK9t8Y^8Hf zW)CL#>QR-JUrepMKfCFC^p}QX=g(K7AK9^?en`0uK%RLKFZ@=jb9$dtR~;Scik5;$H+1F!6|1#xDR?ZIMIeEO}RK& zErl9!f#my?Goj7|V=g?HxdqJpu#HbbL7mG+<25J=Nb6%aoQ0+MSui|IPAJRc>1Jz3 zRpRLJ_Eh_LYl{*JDG6UBa#%ib&-{Q)%Y-k-_jDiD3i=4a28@b0j{6t#w=mSgU`bsh z1NuplDg=+=4}m~S|7GEoB-KvRSw)KNS(X$@r?~32aSCW|b`Rc%REwa6`}5J@DK8Bz zh}OKXy+PaN#6^eK0}$b*+m(x30(Z>i!Z2O&Z)#!nJN!HM=Dm>pUf$XI zVbh$#%B1?{DN+`0Rtu89M=CV{lnUt3E5HAgpn@Tn8R@lK6)aZ2o?6kDSvR^RjDH={ zS|Ss)<>*O4XwE}a zJ=nigf7WWd1BjNK-TQ8Z6zF69Osj=;uqr8wZ(EO8yrdxXb`5CkCE8B=%&spu^x6t} zm@SUGS1cWu36Pp5k#JI(sWD6iFEcR9_Yi0a&X}0{f>UqC-(6^7@4v+Q6j9M8iqc+Y z-?TL)Aa)iMOBmk74f!6hlJom(I?&-(W#FP;qpI|B?YyG@tK;fstsamNOZ~uMt>@F? z?7T+2>KkMSLSP?Zd0_l{U(uZ0chesCx)eoIGKLhq18_*j; zO*C$S((Pcf$`dYBBjHW=MERWwbLgefA1E_`dSx@F^`tDz%&Bmvt|4hP2 zFrrFV={=7hF4YsF2Z5DUg425Sn3cccb5guKqO-(PT-PeY=gGFEuGfitI9qMn`))gw zRBLA#9H^x?w^hsRm<@Jz$wH>J9pm$spEvXcoZE-IMvp$uBpiL9JL!9H_Ss-1uM+d* zzFY1JOIAE5TtN?>ZcZ~q=~Oz0y)_dd)7joDT&kL+cnKTan*gm^HhIazXLI?)hNoZ1 z=n+Tp*Wq1NtSyy=<960B2kU};Q?8!5&U0XbQ!~6eUK$a5W`8&6Gn>l1{rP=OebnJ* z^oJM`@j=FKojYX;(|fxOPvRrDZ?&{4Lp*K!J4?p@dU#XX@cd?-zl(%TqnemOT->o> z1(FT^iXZ?m^+u_H`-thH%WO^ijlvu^xhAy%6nygO1RAo?DS9>r` zbLlg$vjEE`jjS)qtwG;6+lHFpMruwE8Ze<(CBZ}Z)`tP^u43_{?*}kLks(Bk0_O~~SN*K*o14fNLU=k#z^?BvAyf%$a#6g}+xX1!dLye)JzZng`m^$b{I|t0HhEpn_;y6ZvKC%Yadq&|Jl`*ML{k zAQ==?^Vyltr?ysS>9Du?eXi(J7B}8~>~pxQoo);+3~zp38&-5In6t8^A_XUXKs8k` z<;wMxAvEboZl;I4&E>9Y6I;!f!3_vw)ab;avot|0AI}yVb|13kJmLOaCqd+{{j>3B zgjr-NO6$t2RQ0njZ=_1$$l6z;)Utihg8_>YO7)yumF${oG1W(Abt2z#;7{;_fll*- zfmm#LPDDR<{`Y}e&IbKG5VX0RRpHs#f-iZ~*^k<^LLs-GAcXERP#u~$UMSP|`XiG8 zMfVl%JvR)cIfvYj1A$M)FlT?5%27M8a&TN?DadHK`)l>&*VbN--N4xxc3hpu$OH_iQ{(0Uigz6Sg;84^R%Vf&a&kN$2@x71uTshG z8BFDw)w-cDYFX0I?VC;hcza>Td%Xkp*WbgL@!741$ZeO^C;c-ag_Oi2-<~E<(3sh# zMg+A_adEJ4M6ag6FWJ$&&w+-RSqRYs!#ugRmgs{f!yu{ z?fX;;(kpULVHJKT*rC9J)-+u%xVEW@_&?1*f>E(R zf-{LDB@=UVk=s{x$k~t!Sf;tUxqGoof^I?eue-ZzGlxrWy|_@FF?S=69b4zR+RQZc!CxkXY&@!< za`%V*V>|0?eRdZWMgtv+o0j{<-Bv{jt1~S%##txC&;_r5RgNS?PaBG*| ziaCyh8wEr`fo%^cuz7=(%1!W5c+?S=M`tx%21;^p-YdAW{=YF=JPc?T$6&A4blH%# zpO31as~mJzW)N4zIxk-@IBQ>F#eHH_+7>h(Gc?AQu*68>{THhS4xyq;KL!5A0&pM* z;#D9iyGHLtL)@-fO&L%cXanG`4!2dUk{HI2UaA%)W6iZ1Y03f0ooj+EmeWS48EtUh zeYw8QCZw2AEAG!x55nY(v-q-rW)4F2+WX!ce83ZZO(U-b*OvV}0=8Q_rsV2&qPYlc z1Km}d3pyK`LJA}H`(gu&qZVvM$)Zq4H5-sxE2y~hH8b@mT_^$#ALIzv7RaiMs(>my zpODLAK`=r>vbkl!^!XfJ zCvA>`27Qu{e2TJYv9`Z`|rHxaS(@1k=T z>XktCfxo08nOg2W~R9pGnN>~9JUcW!yuRg{Ih z&H{i%g9Rzz|EFl>33pat(eA@m3|1jPR+w7HOo2xxqbw67 zak@=Zd<}wZ4~oAa;nsL&Vx$xvL{E)m+9#}I{U%}5#S6?%SH)I0a+c-s#t*3F+_xm% zzJj=r*dAQA=XqqW17st~s z&H4~@CWW<^2E!Am-#D6&i^do@d;d_&jchcD-Bd(ICA>LH0o>XN<>C0WHfsD4X%H!o~`b*PGOoc~^V)4Eq2(9U^2FPnX+;FKf5_(y~$rLylg$6@^ zVfX-TUoUzQ|`I7%{W~#Aa`Xal5zQwBs|CV7FyTZ+7!&u z_sbrh;{wGr8lGcOCqP<5aVKY4YU2%Ona{Urm}n=)Cj@W}cXOkT0<*9z$9WQ#hA3$N z5|{(HG9*l7ut zdhp8XEsWiySB{JKez38$$*lN6=Cc9-gA52szSc9EX8*5afJSmK_UK2hVli1Ikb<2k z?d~HuQ`A-~^M)KzYl(hJ*;dci;WZlzVe&50>79a`#ADab0)X1*dPXV#SgNa+(D6V? zZq_#OOVFm);MfSj94SdQZp_2V*4m!ySxz2#75TYnIJ<7!e3fH;R??iu9sk2-ITPtM zT@8pE%}2+AlD^E_P`z5nEqpG?CC7X$h+z;Ey2m~o>VEop>_D0DQn>orOj`goFMIs0 zfga6w)O_ZyQjFg3St{XKn$v7H^t#tBB>MewTXUY`0=cW8GO>R?i2#Z!wrm$C0yHdm z!`7*#+*1Uj-FDCaVc`KYWxADPJOyG2%7(`eIVq$}$ooboPs~bPv@mfEacRwXes$UD zBgF;fuaV-q{5q-~qg*Oy4c~5&{Ndpp?#a`?HRU*jW@=H&m??QykIZl z*>O7}4tX#WaW5!NJA+h6>rvN1g;0%2 z!Yi7~3j*s`S5j2s+)$ES0NLuX8W|}+)vHm`5ZZUM!B{5sV!$skoqTe)tQI_LnUvZ< z(M@D4u-_m*Xwxvgjh?+$;xgzLZRgz8gcFmUpU|cu_)3I&HF`H5In`T~#QgWYCyI;r zrO#91Xb-PSy(mD|Kyj&Fk1w)NVfpXsuQ$kfqOB6FXOsG&zhvBwm%0)!Lp(=4p4R;| zvyjmbGfR$4-Mwk-cIIgna1j$?8E0M$I)lrIeDzv+v{Sy*x7EP3wK5EO@HI7R&rVj! zaB7CKfz)!trGW4Nd)_0zktHD27@G?&U*qTKj_Z+^-Z9$I*y5~Uz*B`T$deD}vVEqYo#r?7j%K8=F=NtVE?pW1d699 z-Hm;O{+PAdsIrZ3k%k-7YuIGq%nG|>L)ai#c0~}r3gnoQEX*8$7{*SUg(iS9F6c-k zwTC!Q4ViS*e$-`w9W#ne>R($-)$(O!(iLmY;aRDgnJJOfBlT6WbdWr$%NI{Vo=(Vt zzf}M61G0}FfB}d2RXgG&Sk9Ut(a3s$E4Bb;&LUD`L%ce!i0Y=f^l%^V9|L7p< zdFW+>2(D4~{);-kzehq~Wem^5RnZptZqkr>G9K`&(Go%&6ao~kVK>w4b$hPV^!2u2>ol^tlhk-`GQkOYbhSc@Jg(tys6HOH0m3KCT1T1SFVQUarDtu)sbo zY80nny!wC;4Mg<)9Nu45^H8lR#fQ5)c%Qx#Ow6zL=5;X%!L6Gb9;)s%DBnze+b4d( zPebrG^aXjoc@H}0*4D1o$hAJ6z8g7M^3_VWUD2GXx|7U6 ze8yw*)1fV;{8Ad27KBU8G!rPw6< zrmkrYF@}TQbiHk1#@MS8wPxlB>WH zdRXRf_a$F8ck{yS%mGtlSQucKwjRw2o4zYF zw!6!Kh#V796MIUV{aDw9jDz#O(FdBLHR>BUOWEA15CBoRcWyku009y zZ-WDMc7*(eees)k%M3HZCrh^xN6^FU)pUml^?*u+?_f*_vK}e2(;<& z{NWyuPG2+^JE6g7oV>CU93p>r^D>}LD#p=gwCmG~zvrsqz5rFQv{Iv(ApnJKFFxqF zuddn}E^>SY-E-#H=8UttDi#~qm<%&Bn2KQ>S~gG@>zap=+zE%xoa-xYRi%FvwSlh| zo5o~;D>RJNX;|u=cp-w!fsO|ft<6P(Pp+eSGqvPWXLeVlfWVt>R6ZIFK}V-!^eR$s zUYd>&@n@W2;N}5agpr7iwoB2H@^%i&k?2pMojE!C9YHL6W)LhX(j3VR50jCL8yJ8*Y9@W10lmzz!`CLdCPy5^ew7N2Iw1kMW z4x8Z856bm9WBn`uGx6$$GqIi`!ole&pH8aS%=P!n3O`%<5IgXweOLq-f7xI{h$C_3@&B=#*Upef2DLjN2Y{X4L3@KJFmSzh6U~stLXDk=p z9uNHYgr0Z0gfniI5pycK;%&m0trHZxr8#wXFH3`+hD{omB^<4EreL4Y(nnuf>F4x$ zxTnCC-~BQ@G@Do5u@&n_Hvmo!_rBOUQTmM2$qOHayJNYUD8UTQ%Zce>;O!S*OUeG@ z?Z5V|-Dw=Wbbj&xTNjI~%rz0M!R@z2`qoVV(f{!w6*%FnOaKG4L}@_Id^L0&==Gf2 zfKGZg>f@~Rz}rL82anu{u+wIQ%2m&#S#pf=JEBj^SS9TGDWH2F2zJ5tpnzi)ek=+# zw$ZyB&A$dWj5#H_eQsM*WsUZmsYMKn1f4Ga`}9)vS-y;VpKnH~()?pD9*oxC5*v8^ z!}Y_p_g+>fb>Fl$7wv4uoUsr=^_S66n-YjXKn^92FUjG zB}QcpF{tfPdtn=1F2_SN18-_mD>0Qt4AY7cN9OLZJ&GlVd_T?Jp%uRfjCROwL<5t z@?&*}t9&78FW&GHl`&gP$8i>^r3=Q{HWB(G^J79Cb}X(pik&RZMa`*A|2@Xyc`ybW z12K56Wc4Ql=tDF6$ZhUwzq3j5HP>OIk%RpvT>)~^;DRG&aM?!Us~r3l%VhFBUQ+2V zoohZzaOdcF#`QakgKL(WgWeEC964YoA{VjQ#Prgm0$*`(?ntV8^R(Dmf_gCB~F{^+Q+v86oo%J29$8?%hvfLd{(|M;4IQw~Fd-0OE#{60JQ1X6m{@%a8DROrK&yY>EGaUFbWSuf6P~;mQ{Fuutc)R){9=AE;qtD$qvTwX7LM+%1Sj-pew6; z#awER|LlHu;bKcY1-e!lrhq+AsJ?%`mb~{r$9-wr=W!n3#@3*nBjdfZRReK@0|x3H z?J=~+f@%$EtX}t-3`AU5AEhj}Q7jcGzEl2WtHC&7$ilf^Q`DH`*=V|2kAJyVm8Q`x zI(YW8|D{ibst+--t$5Mdixv6bB+8RaM1M#W#-p-h#U}S|Uv8 zC5s!df53Li-hHig40Eq3`jjFDEz#lt; zFi{~!NWuJ+stO z_+>!92S4(}4=q1A?1kcHj+O8MaP?fo_OD*OLXRue?su@LtQJ^mv*23px zQK9&&>tBizt%W2l(M}M-v7>9|8s9K?(4VQe2ro%f$qQjibR(GX9lzZjfY_g~S<0 zi;Q6;^v|Gq2wTpmGC_bMoPJX$7vpMA^IT$rW;{HptS@4)0fDX4H7&GK!#ZaUe_e`C zjwDglKuE>+GJIp6@DR55n@sA5z&F>xpiJ%+t}O<&c~TGbzvqK?y9qgtsc-&OAv-(y zHBGe3knQh*J4|w0UOaaf8}icZIyvql8aQE{L?Q?bY-KIHQ*Kt&l#XM^$DI923pioB zF2V$)FyA#YG(uYH!!fsMu7j1-)$o}EpAvo{S};tg*ni{RT^9_WrM53= z_W`;{*BnpzN0%P9{wqyFAt*+Xspt6xt|Jy|hV?TneKT6YR21d6qrZA|ol-pV`ICZ? zxF%Hg&t-Q}%69yiPil7m{;c7? zO5t(4b%5sl`jN5I?1=}$$tB10n7I*_rk{vn{E8gHPboEtKJ*l)t_%4B)Dg>dDV1iH z(TNOme)Z>^$R8$OY|GO2B{X@?krYfxr1~2_InYqqQ+gAI{PBx_y>^}gU!+lL#x8S_ zt*@L9|LL!eusb;x3610{B4YbAc*g6C;=x8p4Z1cR;8ZW1yQ`$2H*4JHlHBTM36`m* zc^_f6+b(Pe&o3(XE0*Pqa>459oRg&6mJsrRL?-q4+Bd0D5*opFH+G5CI);%aj!3UY zt6k_i6y&7z+*!gkkT$gVM@g#ix1u8ry6Gg?_=|iagMW}wKM=>aW83br8jppq+o=(`O9fGh zw^YEHlEEMT{}gwfQB7^zT1CPUA~}fkCQ3(;-ism-IwHL{1!*F^*NA`=Y0?8yLlKbP z!AO@9A@mxWbO^l#cpL9|W8C}xz4zz+T4Q8neRIvZX8G10YwyVjOZ^OXp>)0%cr}c* zb9Mw_P*s8IM2x_9*13Ee33{br&``MhL+<~FXyqND9GJv*b%;)jxAx1|GHTRbX8;R9IJLpP_*#c zcMU(fxT^Kw7I&wGQXg$fOfvke!rhYpl*?FKxli*VPW49`)ydt*QMH!evEW~cs?vex zG+YM1&jh;h2Uk7PG*@)I!own)baY0qxR~6vt=cnV^$##A_L066SM^1_-REH#OiLQMSkB><$}Zc$3NBD2n^Ycqf=rthbPjVoC{^z- z9PK@*(vGmi1EKuN((f5*7hs1;OPZ1(D$;UnZssyW=fWonp*!QAhRYMbI*6O=N8{0fR09T7gvlFKyp!m<%X;{Fj#79(63)(Q}(K_UCK48}F4K zuV}esRE|#CWQ)0_g?edi9kg6nV6XPjfvq04*ny`r)ziE!W-i_ri9b7de?Sk8For50 zAbBBg5~%X07vIP@qo2pQ6p2wkS_t3Dp?2JOwra%PFTeuV-J|6dU2P z0Nx#Nu?%H}U46<72~dwVA@ZYYYD{SCq>xZAYc*~Z0r7ZRW8JKSVC0L{Lm#qe$bD&5 zpE}5^II9UlEmb7SFAhwXpS}z(=2#ZaR@$^L^pB+*RH*G?OR}PlAKkFwKjsWI(_@QF|dL_08A|)2_Kj9?wI)d%?xFasn^yi!PYN z9i)X~+^=CKqPwG;?5W)VnD3az+aPr{%d~}1wpMV9(9~GxBg6a_0^4~_-divMC62VE*YJ<}_@-M_n>I>g*Z%SR0qfuz5`F|Y zi#spi6>Ci|zmuFIDO7WSL`WZkgzPejdpI4xSDK{<&GkMe*I0})nR^CqBk9Y$C5rf% z!^@Eo&VOsDD-PzfRcnq-K_|PKu+N9#RwMEU-2n62VS&a^M6J@4JjK*>H*Sz`E6P68 z!j%zUt;}_x?QVj~WSJfREH9#9SH5iL!H4<3eyaziYjzA$lA+qEZh|v3s_|jEdcIwq zQydTnY%2~Ri%kaJT;DOD3zoLbv6B53`P3E%>)c2MCPMt(7?&au>YN3ty61sN{-PRl z?6c4n^fxjiXA!}@7|@k;LMsufF>CA=*d+XqN@I`Zi|-6WrzH98t%RwZ)ySZhT1`}r zU>;BT5qYqbD=*>a&XQowXt_{LM#!-b_Wq{u?twudl2fB+stt3VDn}^+&d|Y!jSUO6 z5KSnu1t)cK1rlVkrLX-!;(|P`WjUidPdD3V9is5;+jfVt4HU_;kE4K(!-_Ehe`(Mj(U)I@{BBKbXv51mzwvhtaU` zZENX9rm%z2oPR*&=whGTK1>XIvpJv=T=Skg!e15wa}1Tw6m9l5U0w)8CgFqB2MT|` zi3}HByh{f{txhH&_v4qygE*5YW%Iadx+*9pF1B^ASgFOpEnG(j-cwsQ_ag8>bCG&T zHJ4JKH))zLxQ%`uknqe4Kp&w+zsWacK`DK4`27UIBpvhvH8J|Kzcq}SA$7ZCA}tjbcLJeL}kz79>A9)N@9(;qDNabtoPTrTQqb z)-0nNSc4gs(=5Zp3Q{?t4|q|jQxT(J&gIto@ILa0zq$RXOG?kawv&)>>6np%P|%m@ zT4h_V_|Z@%wjM zc`1V8*Q?>BU)&uQ8>@son>*StN#CjS8{>34B%1r^ttu-;%&^9bTF=oc;|wWW z^x9Cb%~f}==-ukZsPsvw}C|&Q@N`-b|a-nFYBih%eF38Eal0&L1@m5HeAyYYh%d@5q@Yo z$+8CuTv}~$FN)>J5~Y~WaiRgWLLM`&H%Qoczn8e_G-#}2i)Ap`vk|u;2YQFM#fLCH_j{_-%_pTX{)&YN^Hd z3xVD!M*B{G{V&=m#g)&%4d|AF(C-+$>1}uQ7Vq;D>=trf+I(_2HJz8oHrs%eS(87U z4DI<=?}ZB25J&!Fk=D#RPcPtiXw>+lRIII93Qf8)I_}QeSMtGXFN2Y~ii?TG;GYsU zi~0y;YvaV03Eh=jz`L`#Us2R5{cN{&7314K+DHh0Wkyi032G*$&!YOMk3CpaL}moy z;3=m^V#W>RLY~4RgR$L+sU_Pd_Sk_ro)cS}>A31p3b{4oJmg&e&J<*4ITIZvmX?@t zhx?r6Ukg-@))A~cl_1QwYGOTq7CggWO3V3|sPwvxRwus`sEGx}njN9KkS!k2hAGZ> z>g`P68LtsY7!{<(0iQ#5#C&p`4^S~xY}HHARp<=nPD;+Oml+rWq25v9YYH5_zDdSB zP6uioqiHIAsa6amK$5}d4soRSJZ`*u{XmGyB`Zb#aA^{Lui?NFTkkbZ^%(!NT@>hQ zz5`d^bn2K!PDb}ZZZszzKwbANVrPT*vhfusjvG6fOq9)H+)M>s{FYwUm*}{rrPs=x zpFaJacmJnoju^8mRTrj2V!O(dA1SQqYM2MuG^GqKJl8+fu49c3izwHy@UAF?<>Y^H z<<9B;YGC2v1d5{Gn6$|e6!t_k7ZEl9sAkwAn@D)23*tRDjM~?p-h=w0uu?Avna0p7 z4!SDiPb7cvXw;{?J%Wvp!^$J<;YjM|nVE|zCINyoc`eR>_#zERRv$^v>vxy8Ez4iR zGIydX%PL?<1mpFjUIoHCzmNZVco_GuNg@R6@{)DV$QM1YZ&;Sg!&+g;B>At$7U4;; z_wV)XkjVbP6#t!$=axfnRBu+W#1~i|h=ehGMPZUsU$R#|;FJGW(byP}a~tv94i83Q z7*tN#hq>Fwd3U;cD=-4vZYNI7oX?upIGX$UscBJ@^tocvz>E3_hYl)Bs;!6OBV5}J zL-i%2{;}{Dus)hn+NQsIvHPpa zpO4!x)#!pq)|zWxMWK#%$*885@E~gr5>)YU3MEdBBGF@VxQC7}F<1$rRpK%zT=2hq zFkI*o`g7WyBAGXO7d%@pm?5hxh9Eorl6J7tbuy?N^04ODYbF_Z?_V&KB7mq(jccUo z#gIW7NKm_37mK7u%&OOrhW|hg`OiNXF4+Gd)2HnqQQ;6J8L-mGsjja(hi|P zrEXtlU%&~UAq17Bc8-gRdnm2mg3WzIvPwkwqcWPCFXY>rCw^{pZ0++IUCsxrCMo$- z8U`e9zL&RU0pQ+~j|fMqMSo$d*Jm?)YE(dz)F}%2)<0}NjH%A!H-y8^>B3*^rj0vN zycE_q45kRyqp8g2bsu=;_Y$Z~I^fw;LDAm?^S#3Yl}-3)YoMoX^TSqW>a;p7wYp%W zQp8j#QkPiD#C1!6rQ`*rZ?VLNz{%P%#+3dl??UoqDb)%nS>BYsjLd^S9=4HzK`=^LXsbDhAV{qO*C$sq}r;-vh?K za^45caiEm$UbaQdglsIkbHBDt)t?PsGslJ`$Pz_>b$KYkQop2%cFo9*gc|@3uEPdy z(a!ixjaxi_GH`i$AUKw*qRQWE$Ri1EiHUn-9y?D6f*}bep@Q^%!5i{pYL-KUA;{XF zl{&BhU(fwz+PgtdMRwcGt(U9~i@B z{SqWA=JM9vAxCy;<=P)C4dl8;#v_BHT+3EDwFX&HdtjmT)bE(smK@yU8N#$x16nZs zAk?KD`9YJEQewy>Av4d=oYXi1hJ1APCR$|to$W0c^elR>(v{Ob+s=u{Q#0-=Yz`*l>#}gRLo|<8S;d|hB%*`7&0&fQW`48SL7y> z@@;tStyefGO5Q*I%{UiZ7g{FisGtQc`Iyqj7=c{wE5iDdSyfmof6OS9e1&zI+$dFE z;OWm4WmoO5B-KBmZnJ@^U&noQ48xUI_}8RUJEm7k{4|eat15_v0v5$$l0!$fKeLwC z(|=S%9meb^r0X~K4UrTFPp1gHa==#Yb7+J(4~-0JRy9g3wtqsKco>6-(N!sr-nh6w zBr>%W*;?(vI70Ao>syO$wV_J>LywCugc`D9j?q6-G)WaV*5B;*G?+Ki9 z;;ygFwcYH_qT7v$+`n3wtl_lHS9+)`?imiK+BP&3-wY=wb7Xny<=X zfMrUN*85Jl?lACk4b_nHHRGlwg|kT&?bfk-PqYZg_X})ae7a5SoPj%z=(YLs$O+w8 z6p_#-p`Mw>QoOH=-~7a;`{g??#I0;XS1i+-#ew~n4)vJPLY1ybQoFgq+XGMuN=<&= z4vb*Dpu~kzi0=pI>0~;e6&m~{ntnf{MTmkWwkn_a$(4-T3#Y`1s0`9jm#JcXdFVpe z4mf^9F{(23vHMT1?2~?*8rM^w2@9gYlR&ALK5cGZqG`hl=(9~% zWFw|^bvlFSyj#NczUjPnEse9yEIe1x&GVF^2=;M5)M;i_)cM7JxD(ccX?x&mfals^ zgttd-CwXu@C^ExG#dFJ}M&GvY=5^RO)^R@(WEb>~@3dyE#0q{u$M}OyE}QDCCJ{;J z>}6wN0{1LlJ&YS2Gq=*KAm&Tj(Dxa1Su)!S-S4%>(uIrr+k5+hx(^c)z7Cj@jkYu~ zDkGQSgkc=_6Ru_W&nJ3Qksz998k$VpO>7TXqEKp9e+*?zg=Nbr26at!nh26vPy!*^LcBsf z-m(6`xp_8^R1!J>oZB$s_dL2UBTgr1w=W2s)^Xar@sh9D>zXtvrb}e>*L;CpccEPH z2^87tA6@p?^tdbO;5i5^?AQ%mWJr|vOdSNp{HrR;KXBKBCTTB%YNhmS1b1CaO zbb4*VLfwS^p!xLSzP-ZNk15lCB9gFxBO#s}iW+(Qo)MR;4$Fj~WpZlY__$XP0`bo^ z(SS@#mrj|;MWzXq!M?jLh?uINLo$?);>$ejunes&myN>{zs|qcEyb*<=Lm{Z6>#+3 z=k*k7Q2cnr-+pnp(tknKA*FG3Ex7Ao=mfNa~#|AsBDf^JFc47Lh zp(^Tk3^A24Xk0a^#T>y7OG(*tp_66SrAE4AI}swT7}8O<>c*MnEPTH(7b)|{BA>S> zN>*bcXe2a3Qta0(Tq9noW2D%k(X$rDlc9xjlCUyio+DC#%8(<(Bg(E!x-q8J_bp79 zeqST=oaDQiB}Wd|;oCS#Qn0~xG$R{ai8UjJ2bHy?#CJ1)jZvw+KI1)ko$*^$qNExgvz#HfBWGMiED$h00i7K3 zE`0%-ixSzRGA&$hx29Sl)(3M-%jpN5_n^TWc;tV+^Jir7#K5^fH}eq$qHven_9FZTYw zNeL?Wp>kxeIJjRet)$)vR5dT-vrwDZLGdaHanb9-oap)r+vTI4(d_4Y;y#Au`ep96 znV|;ZI9u#LJk;l8+!pqFJ2WZQhf^L63iSQi73}?{54CwlB0RF)Q@NuKF&EuX{JX)-UwbE5e*UB*M)jb!HMFoN{#K9B<2tSvbsMKNV&Y~T7ix34>X!ONLM4YrQ?cWQ5rIQFiog0dBYO@ literal 54382 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