From 4a303d40a3e3d6bb6264e71c78dff1a2e75a2cf7 Mon Sep 17 00:00:00 2001 From: Dirk Schumacher Date: Thu, 5 Sep 2024 12:03:59 +0200 Subject: [PATCH 1/3] Support age = 60 months The package now supports observations with 60 months. --- NEWS.md | 3 ++ R/prevalence.R | 24 +++++++------- R/sysdata.rda | Bin 11908 -> 11974 bytes R/zscores.R | 8 ++--- data-raw/growthstandards/bfawho2007.txt | 2 ++ data-raw/growthstandards/hfawho2007.txt | 2 ++ data-raw/growthstandards/package.R | 2 +- data-raw/growthstandards/wfawho2007.txt | 2 ++ tests/testthat/test-prevalence.R | 11 +++++-- tests/testthat/test-zscores.R | 42 +++++++++++++++++++++++- 10 files changed, 76 insertions(+), 20 deletions(-) diff --git a/NEWS.md b/NEWS.md index aeccc82..1c93db2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # anthroplus (development version) +* The package now supports observations with age = 60 months. Previously there + was a cutoff at 61 months excluding observations with 60 months. + # anthroplus 0.9.0 * Initial release diff --git a/R/prevalence.R b/R/prevalence.R index f5416b7..76d7514 100644 --- a/R/prevalence.R +++ b/R/prevalence.R @@ -20,7 +20,7 @@ #' If not all parameter values have equal length, parameter values will be #' repeated to match the maximum length. #' -#' Only cases with age_in_months between 61 (including) and 228 months +#' Only cases with age_in_months between 60 (including) and 228 months #' (including) are used for the analysis. The rest will be ignored. #' #' @inheritParams anthroplus_zscores @@ -88,7 +88,7 @@ #' #' Note that weight-for-age results are NA for the groups "All" and the two #' "Sex" groups, as the indicator is only defined for age in months -#' between 61 and 120. +#' between 60 and 120. #' #' @examples #' set.seed(1) @@ -132,18 +132,18 @@ anthroplus_prevalence <- function(sex, } old_rows <- nrow(input) input <- input[!is.na(input$age_in_months) & - input$age_in_months >= 61 & + input$age_in_months >= 60 & input$age_in_months <= 228, , drop = FALSE] if (nrow(input) == 0) { stop( - "All age values are either NA or < 61 or > 228, which excludes all", + "All age values are either NA or < 60 or > 228, which excludes all", " cases from the analysis.", call. = FALSE ) } else if (nrow(input) < old_rows) { warning( old_rows - nrow(input), - " row(s) with age NA or age < 61 months or > 228 months were excluded", + " row(s) with age NA or age < 60 months or > 228 months were excluded", " from the computation." ) } @@ -246,8 +246,8 @@ cbind_year_month_columns <- function(prev_results) { "Total (15-19)", "Total (15-19)" # female/male 3 ), `Months` = c( - "(61-228)", - "(61-228)", "(61-228)", + "(60-228)", + "(60-228)", "(60-228)", paste0("(", gsub(" mo", "", prev_age_group_labels, fixed = TRUE), ")"), wider_labels, c(wider_labels[1], wider_labels[1]), @@ -265,7 +265,7 @@ cbind_year_month_columns <- function(prev_results) { } prev_age_group_labels <- c( - "61-71 mo", + "60-71 mo", "72-83 mo", "84-95 mo", "96-107 mo", @@ -281,10 +281,11 @@ prev_age_group_labels <- c( "216-227 mo", "228-228 mo" ) + prev_age_groups <- function(age_in_months) { stopifnot(is.numeric(age_in_months), all(age_in_months <= 228, na.rm = TRUE)) cut_breaks <- c( - 61, 72, 84, 96, 108, 120, 132, + 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, 192, 204, 216, 228, 229 ) cut(age_in_months, @@ -295,13 +296,14 @@ prev_age_groups <- function(age_in_months) { } prev_wider_age_group_labels <- c( - "61-119 mo", + "60-119 mo", "120-179 mo", "180-228 mo" ) + prev_wider_age_groups <- function(age_in_months) { stopifnot(is.numeric(age_in_months), all(age_in_months <= 228, na.rm = TRUE)) - cut_breaks <- c(61, 120, 180, 229) + cut_breaks <- c(60, 120, 180, 229) cut(age_in_months, breaks = cut_breaks, labels = prev_wider_age_group_labels, diff --git a/R/sysdata.rda b/R/sysdata.rda index 5a5adbfd8341c7010921ea86f814be09b762bc62..8464fb65353edad6b3c7ff1c91cd3ae42d91850c 100644 GIT binary patch literal 11974 zcmV;%E;-RcT4*^jL0KkKS@V`%`T!cofB*mg|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0 z|NsC0|Nr16UiZxagxfx@&tC1ii?h?-+uMQAIGcD6fB*^=KJRPk;`gPkkuPgh_a2?v zgqu%M>QBm^o}}^~r>MqB>S9k*)I3p-Q&aU#4G+{$ z)gGqQdTKp2H=>@WsMGQqNZzRRKUDoD)bW!s6cHb)ey6H$Q8fKVWihH9M$xI7C!m>4 z=ru4CCPopo0BU1XG@4||lT+F!spuL79wusGshVhL6Eux513?WLpqOZk3VARmshR~g zn9(w3so(`XDf&$qP-!7gLTRG{GH7CIV4GC-ni&%VQht>5^%{qy+M0TrdT5$x@|iYJ z^)d}IV3;OPCQ0f&6Ui{p(rqRaBhYGkhK$tFk%oz|P}9`(C#i->rqE3SQ4k0wflpJ( zsU8GlRPBha3wnGru!5-5ZwMFvNS283@^@}8MZsraKN)gDogRN6Gq zOw&V2vS`qo2BSuV)6q7X8jsXW(?r3j(UG+tAs(ls^*te=(8E(`$+bN)Z3ImwM#w`Z z@|v0nB!~h4n3`nJrVOW}CYWd@m@0TRKSeQuU=vf?jFZAlO|(hm6V*Qi%6bhn$xqQe zsM0-5(@m%}YCMKh)WFo+L75}aMu-HSnx545LVA>z^ZiFDDg+^n5D3vUAtgCr(^AzS zkcg0iDxe}EOpZ)+N~C=pXqK0RxOj{hbT{o*r)}HP!y-VeM^NVA6Nh3h$X%GRBK-oI z6)>?v#f$Wdv=?eF*jT}1MUECcSpjz9$crQ_n6iS(ihx;RWyP2ma4g8WF?52>3#AuK zE}UOnT|l#9&I>v$@U!By7g8>$S^;)CQzAL8}iKHG!=U;2PlZ!^jULJfPQymKy-d2bdcW*$0{* z_!}_ugU=7*8$hWKKs^xJhom3KKbUQU`Uj>Spl!p|4ZwQAxeB25!`KgGJ)qqOwjSVa z!}^Ez4d8D>-4A#@@ZSdfKe%uM{0G1v2z){DhsYl&a6|lu%p4%A4j6F*iX3393eb=e zLby2L$O%DS76D=wLCFqKRRx%G!zG#PC8%C9P=@U7GCIT(!z%69U*Yk1zz%OM$O|gC@lc)CJlmAWF+N5EEb|vDleX zA|{#;mZ5?XxnO|q*ax7%0_}n~qXxhOj$j;*AH{eqBnH7Cg_Lp<5=8SL(5-Lgr}Two zy_|s@i3ZJwoeA*}nFaxDbNe3HzjK{^VL_HR1n8p(5GECfus`zE?TZFhmQO9El4P%T zh?I%mK+4B7e4k7XG^fL*6*NJn)qYqpl9bfbvDj1FYj20b^{XH60_cU-6T~T)E=}Zh zmb11Kq!#XZEku_GpNq~1d7$Roe0Fe5S4+75p5bvu5`@OEsj14S(0tgMnRWK_dsom$ zFO9gF_emu$!r&k19rnBT)OtWs`$p<4J%`w#d=MPWLcc)ld;QluO8Jo|cOo>j6b{e1 zlG7eSL!J}Tp{FB%Zn;)(gj&XyVJaN4*M;sL1i*1l>tp3-It+pvZaTd=ATAqRwlUza>-{+Vc_=e1c@u%x!KbDf0zz$*_NDVDLta##;Sj? z=v@0r(>1+IWr{_Iue1mZTjO_L1K>^GJKfJZ_4_yB!xT!ziTh5ZMho-Q9~*$FBD(OW zK0CC4CqA+qHpkT&G!r0oQ-x~e5A$@i%eW|=t0!%%Biwj*bW@q1GlOHaP2P!ZXP(f#r%5UtrTJ+{VLkgl9uJ-yWW*?Nlx-AD_zXzSb>@=IGmJ~3)>^c#W0Uc$yH>dltLiS$7R(p^I!g(pFZtX zB>k8-BS#v`Im|NmDx9yllD)mr#EYqR93RHHYs4~fva8c&{cN1cbay`2cpP&j$97)= z1`P12)cBS%|x#uUN}wj#|PNa#1fT{JuLmX?gp0 z>W)(}oXykKZg!%K(1J0LsBY_reqJ%9hUnbr>~XfPx+KXCKyk|YKR47NhSc#$G(V_F zAV-Lk?%4ySiBQn1u~+@FQR6;IMPwW*2E%!t zIuJID@B>sRPt9Y&5_^`~`WZY`fE3xiH;n;mg2T|kT75QJ8pNIh^@F< z*O1|`yWOHgR;$#fP6%CvystMT`&$A;XnZ&a8E>E}+=?b)>NuN58eiENxk>GeI?Kj! z)K0h_%31x%sE>JOOCWQ-dk_f17zPXlrjP{g<{ffsFb4b$T5uZUE$2rHkN=slf4K@+}Q2Xbf4OSRH^*xo=bF_vM(TWSUF=-j8_am{mMmz>DzImX(xpNj)7 z!b^?;n_VfaX;7f;`Oi|{Qph6ww=vfFo_T{CK#(wAJf(+pE;j?8g`Hf0 z`zMRY5@fmx)-A04iX&&;NYH5{2%(t^cEpTifNd@#5WDW>#293P(+W@Eu9v$i#AeiZ z&DY@V3gKTiE=*OwV|2ae&E)3faCmTwKurH^=-Xf zSS+%{2rMvzd86oK{!8&xfK98*ZQ#g_;D3KT4UAiA>k zpqAgac088xO0{i);$WA-mR+EOBAP*Vgu-(d1kv&^Jvx`{*L~QcRXMBM$VgGWBBWt@ zGWA(Bpp0FtEOgLRN<8dU==?WBt2OzUDHY(+q+wdtHyq$^^rp7W8|P0-zE~6jW3_4s zykUxAaMmS-_mZ)>7Xw5U-sJB0&!{C2u_j~S~iFR5M2zzIXByn$4n<%g*B)zCEq#4y}v ze>@1bgZtD@_BFo24UF^HpiDGavk0U?0IF!~a&SfP(OEG0IHSA)q+v9$7D=S54=cEW zD9s7(WUrbF=VsAed_crA+g!HWw=S;^-L)(u0zWz`S9A6Lgdu|meZJ1&;3$RI zNM+4)E<}?4iu=EKrot$gC-*1=r4^)?Na?}uwy5E*tLMAZAVE79E*ia~vQGAw+UeGE zAbksK{a(6t{@Le#4<$hT?f8k_!KlY5Uj_ViVy6_sQe|H<&GM6qpiMEv+ATq5z6CN(1HKA-8KAQ1(+n7Q3vr{woiki(L`!E|yzzWEM5A{kgGg9;*>>N;1B;7TDldxjWqTt=S?LUrCyl^4;C|vV-nw&w~>&2pjPq?BxReIFp?~zppMS6Y?+jn z{jzDM4kTJN??N+eQDrB5izH)^eurd>p(@19tf<0CPh ztBBZk+`57!B&|KjMu2^=mcC!ukuOzQ-OaDOEdG}PHl{CuDXuM=6L4~fa|nN4AH5{r z4yM9pNCV*rDb}UF`%PZq;w%)*I{2E7E z=;G}&p%?tBl=!l>zn9f!u#+(1Ub9$o9I(nsSgErEEOyY{%D}7FIQ}bd)-IDQ z05$+KY9E*Y0OsHv!vYZ{_o$-G`TKG(aU@JGLCBVAT73kvm*1moBf7Ba&)do2QC(yA zxJ^SLmp$Ow!pi4<#46X%yPG;W@N?e5~jIEgOvhs^)oHH zuTGN^Yg+{%S;)!yxNmWxhFM(4cL9M!j?z4xibM{ncLInt*%MAbu7n(Dy#mKiS)qN%7VFO;8Sx1mL#KeIl?o? z*%}`aDAKn!JVwM!IWOt~qlT zY~5XMaw+aVE_Mp60I6`5>}b9I>&G zlrWxCL<6eplfgcJ>pW1Ibroh9o$LV<+$e5H_P)!Kqude|xznWj;kJMDb!nPxGMx1? zLDFC`s5}rFT?mdhHL-An=+Ti|v(Lm;S9YZ+P-^4HXRcn3K>B^BIv&=q*nOGj-By*G zX$C1NHS(h7n7mbOH6L1v_{0bOYjq&~S55cyYjAY8 z-G@I5EX0)#@_J3*O|!JK8HP=}vJpeQS7g(M&e7F#wS6Ra+Q{Rw|3FyA)+Kn(>o97g zUj~Dv);|?eDW{Zb5jcF`p^%=an~ipux!DKH!?u0uChs0Ct9Xh`9ag)8XHMVBW7XU& zJP@hTSRYmjqrPIjnbklaP^C76+oKJw{sEA9HjZ+bPEZ6BT8i3*0av?$!{(kt35eHb#^NapqT1GB5er4UVplv+Q_k(gB+3BEAs1uK%D{Jg_dG10JKZFn+T(l9m zJIQ7sb(-Jdp!RG6Dbm_*r^Pe)azCMDZ=u+ejf zGNA45EsNXhJAymgJPy_f^D{m&#Jd{s1sHmhV*5TNP+w;_Z@R7m z{Mq;dpV13f?GNr}Gr`&-tXcn02=fA{geUxD_rV@-Hx#`tHxgX(1N_HwtC|S$Iv#S_ z-e<)q$QWy^s}#9fNYTD&m@p4fPvoY*xSr)2c%PqjoXt5Y@qZg=+h`7BZA8bsWf?7* z$q4nittaR0Yb`{+}{}ck|9d}p|)bs~{f^ZHsGUCzgNR|i0P0-L=dB!?_^;QaB z5oSPQ$3Ey)H0mx=dJ|pq+n9hzwVdY19E`O#v=&xs1YQOJtHDM0Ih7sAi_%K*cXzh2-9|%Um_YW|$68cU;0E>>3vE-36W|fwO zfSnbuVK2g3TgE=<$SddVawZ?d&HUkVVSS-YC3ZP=07x$$_@H)9#VO}*6hYcAiAK9_F;$ZQbu6^QQQ#0Rv`c6}d&1J!&y_!kP~ z8^kpDMhTeCq!}7#sgTd${hvkC9D6P>m7Q5jO(iaxw2G%BD-1zAEN{j_WTfS` zO)r;%1VW>!OS|m)z|DK{%Vl=OiV?q?2W2}sC5a$2YXh4+!Ay4ZpRt>T$5n|0s+!Jn zGN?*hFMCMcj_H76BjL=D=;!*?HPKbNA1mVW8LlC$X)JtVnUjp?MEp_71%im_g;L+~jnx3YN*~ z^}{i{HWjLNp2>CJT(n1TLNCP~9`VChO+al$1(2=rlyMHjCbjKE@tqIB9rdJAC2gmo zI$&3ZwL)__CX(nd?cm-q0^XK6E_h2WIEq(TbT;fQ^a>*jNMcr&n^_Gigj;io%ybgE z*HC&x6*E&$NM*26_q<$tASje0-D5Rc=}<>}hk);?35f)~2%az4cLm9mc7`7NHS0&3 z`*jcn+(SP!fyzrwF`8ske%t$j35-OCckW5^pgOrvd#&#kk0kq@n zA&9JS7=_%pr^2}6124*DGf+fYqeqsIEHI5g!Un@?M646qiJ$W$v_gqVld37{eivVA zvOOCz3Y+C($Ws`dPLYBQ5Q!FkEm%IJ^0~okL4{bcyEvS)Q}Pf?c+sWaQQt~Zt{zeV zs4;Rm{}#|e#S{}5pOF}dk%l=LzgV&njXB~oZuU{xRP`UO=>p1W|EWSQDe%J3u0coW zI_`=Gu2;Qt2-0TXWI*|jk>x03*`t3BLrVmRqv0y*qPQ2+3^_*HTaTys*og2#mK^ZK zk1+wxxqP@Wz6{K=U>UT~mBlQd=aV4BJ*sKem_PI|UaCD4oB94#pa1HGTg+q$$ zOiIrnxdgS82M+W^tsJ-(6C9NI!SmBLfM;|-YTIRyav(z(Ztr35&WlF7u0gtBIT4)4 zWu200xh@rSq7+{KxUgR*Pn;u-dq!H1}-ooC@^_lEkLF z$AIrDaNHP!n(!Cqg_~QEI--bxX%1;?s9>Y`-)trW{X{TVPLqkD!nq<;NV17>W=dH? z&lF#S(T)_(y4Xb2%+*R~#Lfp~rELxcvRVr8Va$EwT4?G-=H1O|}Osa;Q*_qx}egWz*8u2fR8%!axNa zNBMUCjb>mG3>JOlF?tC!cq1VH!o|7u97IYlJyM;1k%wk+>4eK=<#!yn74%49!NDYh zP4zYXeA>=tbxPRW2ZfK_L?$tG8PEujCeb4YIlHOQ%0A*Gud{BC%#_+t7PB2Ce-RgivtPZ0!P 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 K6eK+Wkcj}#ezZaW diff --git a/R/zscores.R b/R/zscores.R index 1da664c..2c87484 100644 --- a/R/zscores.R +++ b/R/zscores.R @@ -30,9 +30,9 @@ #' @details #' The following age cutoffs are used: #' \itemize{ -#' \item{Height-for-age} age between 61 and 228 months inclusive -#' \item{Weight-for-age} age between 61 and 120 months inclusive -#' \item{BMI-for-age} age between 61 and 228 months inclusive +#' \item{Height-for-age} age between 60 and 228 months inclusive +#' \item{Weight-for-age} age between 60 and 120 months inclusive +#' \item{BMI-for-age} age between 60 and 228 months inclusive #' } #' #' @return A data.frame with three types of columns. Columns starting with a @@ -215,7 +215,7 @@ zscore_indicator <- function(sex, } zscores <- zscore_fun(measure, m, l, s) has_invalid_valid_age <- is.na(age_in_months) | - !(age_in_months >= 61 & age_in_months <= age_upper_bound) + !(age_in_months >= 60 & age_in_months <= age_upper_bound) zscores[has_invalid_valid_age] <- NA_real_ zscores } diff --git a/data-raw/growthstandards/bfawho2007.txt b/data-raw/growthstandards/bfawho2007.txt index 3d07781..f0dbe1a 100644 --- a/data-raw/growthstandards/bfawho2007.txt +++ b/data-raw/growthstandards/bfawho2007.txt @@ -1,4 +1,5 @@ sex age l m s +1 60 -0.7151 15.2679 0.08366 1 61 -0.7387 15.2641 0.08390 1 62 -0.7621 15.2616 0.08414 1 63 -0.7856 15.2604 0.08439 @@ -168,6 +169,7 @@ sex age l m s 1 227 -0.8578 22.1514 0.12939 1 228 -0.8419 22.1883 0.12948 1 229 -0.8419 22.1883 0.12948 +2 60 -0.8702 15.2453 0.09646 2 61 -0.8886 15.2441 0.09692 2 62 -0.9068 15.2434 0.09738 2 63 -0.9248 15.2433 0.09783 diff --git a/data-raw/growthstandards/hfawho2007.txt b/data-raw/growthstandards/hfawho2007.txt index fa79dae..a8b2704 100644 --- a/data-raw/growthstandards/hfawho2007.txt +++ b/data-raw/growthstandards/hfawho2007.txt @@ -1,4 +1,5 @@ sex age l m s +1 60 1 109.7265 0.04156 1 61 1 110.2647 0.04164 1 62 1 110.8006 0.04172 1 63 1 111.3338 0.04180 @@ -168,6 +169,7 @@ sex age l m s 1 227 1 176.5211 0.04142 1 228 1 176.5432 0.04134 1 229 1 176.5432 0.04134 +2 60 1 109.0725 0.04346 2 61 1 109.6016 0.04355 2 62 1 110.1258 0.04364 2 63 1 110.6451 0.04373 diff --git a/data-raw/growthstandards/package.R b/data-raw/growthstandards/package.R index d2e4681..af2bf49 100644 --- a/data-raw/growthstandards/package.R +++ b/data-raw/growthstandards/package.R @@ -2,7 +2,7 @@ check_df <- function(df) { stopifnot(all(colnames(df) == c("sex", "age", "l", "m", "s"))) stopifnot(all(apply(df, 2, is.numeric))) stopifnot(all(df[["sex"]] %in% c(1, 2))) - stopifnot(all(df[["age"]] > 60)) + stopifnot(all(df[["age"]] >= 60)) } bfa_growth_standards <- read.csv("data-raw/growthstandards/bfawho2007.txt", sep = "\t") diff --git a/data-raw/growthstandards/wfawho2007.txt b/data-raw/growthstandards/wfawho2007.txt index 79c4e56..f2893b6 100644 --- a/data-raw/growthstandards/wfawho2007.txt +++ b/data-raw/growthstandards/wfawho2007.txt @@ -1,4 +1,5 @@ sex age l m s +1 60 -0.1922 18.3328 0.12947 1 61 -0.2026 18.5057 0.12988 1 62 -0.2130 18.6802 0.13028 1 63 -0.2234 18.8563 0.13067 @@ -60,6 +61,7 @@ sex age l m s 1 119 -0.6752 30.8854 0.16213 1 120 -0.6764 31.1586 0.16305 1 121 -0.6764 31.1586 0.16305 +2 60 -0.4650 18.0823 0.14240 2 61 -0.4681 18.2579 0.14295 2 62 -0.4711 18.4329 0.14350 2 63 -0.4742 18.6073 0.14404 diff --git a/tests/testthat/test-prevalence.R b/tests/testthat/test-prevalence.R index 85214c2..06a2975 100644 --- a/tests/testthat/test-prevalence.R +++ b/tests/testthat/test-prevalence.R @@ -32,10 +32,10 @@ test_that("strata are considered correctly", { check_with_survey(input, strata = strata) }) -test_that("age only between 61 and 229 is considered", { +test_that("age only between 60 and 229 is considered", { input <- readRDS("test_dataset_who2007.rds") input$agemons <- input$agemons * 2 - input_filtered <- input[input$agemons >= 61 & input$agemons <= 228, ] + input_filtered <- input[input$agemons >= 60 & input$agemons <= 228, ] expect_warning( res1 <- anthroplus_prevalence( input$sex, @@ -88,7 +88,7 @@ test_that("it fails if all values are filtered out", { expect_error( anthroplus_prevalence( 1, - 60, + 59, "n", 100, 35, @@ -212,3 +212,8 @@ test_that("age in months = 228 is part of the age group", { expect_false(is.na(prev_wider_age_groups(228))) expect_false(is.na(prev_age_groups(228))) }) + +test_that("age in months = 60 is part of the age group", { + expect_false(is.na(prev_wider_age_groups(60))) + expect_false(is.na(prev_age_groups(60))) +}) diff --git a/tests/testthat/test-zscores.R b/tests/testthat/test-zscores.R index dc27bfd..1f4266f 100644 --- a/tests/testthat/test-zscores.R +++ b/tests/testthat/test-zscores.R @@ -24,6 +24,21 @@ test_that("zscore references match from previous implementation", { expect_equal(result$age_in_months, data$agemons) }) +test_that("computes correct value for age ~ 60 months", { + res <- anthroplus_zscores( + sex = c(2, 2), + age_in_months = c(60.32, 60.911701), + height_in_cm = c(113.8, 113.6), + weight_in_kg = c(18.7, 20.5) + ) + expect_equal(res$zwfa, c(0.21, 0.79)) + expect_equal(res$fwfa, c(0, 0)) + expect_equal(res$zbfa, c(-0.58, 0.42)) + expect_equal(res$fbfa, c(0, 0)) + expect_equal(res$zhfa, c(0.96, 0.85)) + expect_equal(res$fhfa, c(0, 0)) +}) + test_that("different sex encodings work", { expect_equal( anthroplus_zscores(1, 120, height_in_cm = 60, weight_in_kg = 30), @@ -104,7 +119,7 @@ test_that("oedema = y implies NA for weight-for-age and bmi-for-age", { expect_false(is.na(res2$fbfa)) }) -test_that("Age upper bounds are inclusive", { +test_that("age upper bounds are inclusive", { res <- anthroplus_zscores( 1, c(120, 228, 120.1, 228.1), height_in_cm = 60, @@ -114,3 +129,28 @@ test_that("Age upper bounds are inclusive", { expect_equal(is.na(res$zwfa), c(FALSE, TRUE, TRUE, TRUE)) expect_equal(is.na(res$zbfa), c(FALSE, FALSE, FALSE, TRUE)) }) + +test_that("age >= 60 months is supported", { + res <- anthroplus_zscores( + 1, 60, + height_in_cm = 60, + weight_in_kg = 30 + ) + expect_false(is.na(res$zhfa)) + expect_false(is.na(res$zwfa)) + expect_false(is.na(res$zbfa)) +}) + +test_that("age < 60 months results in all NA scores and flags", { + res <- anthroplus_zscores( + 1, 59, + height_in_cm = 60, + weight_in_kg = 30 + ) + expect_true(is.na(res$zhfa)) + expect_true(is.na(res$zwfa)) + expect_true(is.na(res$zbfa)) + expect_true(is.na(res$fhfa)) + expect_true(is.na(res$fwfa)) + expect_true(is.na(res$fbfa)) +}) From 9abe7d7c0958b3af759d9c37018a152b32d156d0 Mon Sep 17 00:00:00 2001 From: Dirk Schumacher Date: Thu, 5 Sep 2024 12:05:50 +0200 Subject: [PATCH 2/3] Update CI check workflow and housekeeping In addition to the upgrades of the external actions we also removed an unused file from `data-raw`. --- .github/workflows/R-CMD-check.yaml | 21 +++++++++------------ data-raw/test-data.R | 8 -------- 2 files changed, 9 insertions(+), 20 deletions(-) delete mode 100644 data-raw/test-data.R diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 271d466..8410326 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -2,9 +2,9 @@ # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: - branches: [main, master] + branches: [main] pull_request: - branches: [main, master] + branches: [main] name: R-CMD-check @@ -29,18 +29,15 @@ jobs: R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v2 - - - uses: r-lib/actions/setup-pandoc@v1 - - - uses: r-lib/actions/setup-r@v1 + - uses: actions/checkout@v4 + - uses: r-lib/actions/setup-pandoc@v2 + - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v1 + - uses: r-lib/actions/setup-r-dependencies@v2 with: - extra-packages: rcmdcheck - - - uses: r-lib/actions/check-r-package@v1 + extra-packages: any::rcmdcheck + needs: check + - uses: r-lib/actions/check-r-package@v2 diff --git a/data-raw/test-data.R b/data-raw/test-data.R deleted file mode 100644 index 9c353fa..0000000 --- a/data-raw/test-data.R +++ /dev/null @@ -1,8 +0,0 @@ -test_dataset_who2007 <- read.csv("data-raw/survey_who2007_z.csv") -test_dataset_who2007$dob <- NULL -test_dataset_who2007$dov <- NULL -saveRDS( - test_dataset_who2007, - "inst/testdata/test_dataset_who2007.rds", - version = 3 -) From 6be800e52da9fb5013e3cd149a97dc6e2d00bf41 Mon Sep 17 00:00:00 2001 From: Dirk Schumacher Date: Thu, 5 Sep 2024 12:11:06 +0200 Subject: [PATCH 3/3] Update documentation --- DESCRIPTION | 2 +- NEWS.md | 2 +- man/anthroplus_prevalence.Rd | 4 ++-- man/anthroplus_zscores.Rd | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 14f66e8..90634b6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -18,7 +18,7 @@ Description: Provides WHO 2007 References for School-age Children and License: GPL (>= 3) Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.1.2 +RoxygenNote: 7.3.2 Depends: R (>= 3.5.0) Imports: diff --git a/NEWS.md b/NEWS.md index 1c93db2..394a0c1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,6 @@ # anthroplus (development version) -* The package now supports observations with age = 60 months. Previously there +* The package now supports observations with age >= 60 months. Previously there was a cutoff at 61 months excluding observations with 60 months. # anthroplus 0.9.0 diff --git a/man/anthroplus_prevalence.Rd b/man/anthroplus_prevalence.Rd index 4c67314..0541430 100644 --- a/man/anthroplus_prevalence.Rd +++ b/man/anthroplus_prevalence.Rd @@ -110,7 +110,7 @@ interval limit} Note that weight-for-age results are NA for the groups "All" and the two "Sex" groups, as the indicator is only defined for age in months -between 61 and 120. +between 60 and 120. } \description{ Prevalence estimates according to the WHO recommended standard analysis: @@ -133,7 +133,7 @@ estimates for the different groups (e.g. by age or sex). If not all parameter values have equal length, parameter values will be repeated to match the maximum length. -Only cases with age_in_months between 61 (including) and 228 months +Only cases with age_in_months between 60 (including) and 228 months (including) are used for the analysis. The rest will be ignored. } \examples{ diff --git a/man/anthroplus_zscores.Rd b/man/anthroplus_zscores.Rd index 852ff47..238eec9 100644 --- a/man/anthroplus_zscores.Rd +++ b/man/anthroplus_zscores.Rd @@ -76,9 +76,9 @@ Compute z-scores for age 5 to 19 \details{ The following age cutoffs are used: \itemize{ -\item{Height-for-age} age between 61 and 228 months inclusive -\item{Weight-for-age} age between 61 and 120 months inclusive -\item{BMI-for-age} age between 61 and 228 months inclusive +\item{Height-for-age} age between 60 and 228 months inclusive +\item{Weight-for-age} age between 60 and 120 months inclusive +\item{BMI-for-age} age between 60 and 228 months inclusive } } \examples{