Development-for-Age Z-scores, more commonly known as DAZ scores, are a way to control for the “age effect” when analyzing D-scores. Children develop naturally over time and so comparisons on the D-score scale are difficult when there is variation in age. Older children will almost always have higher D-scores than younger children. This can create analytical difficulties when attempting to understand changes over time or compare groups of children that contain multiple ages.

DAZ is the conceptually very similar to anthropometric outcomes such as Height-for-Age Z-scores (HAZ) and Weight-for-Age Z-scores (WAZ), and Weight-for-Height Z-scores (WHZ) which are commonly used in public health research (https://www.who.int/tools/child-growth-standards).

DAZ is estimated *after* calculating the D-scores for each
child. The D-scores per child are compared to a **reference
sample**. The DAZ is reported in standard deviation units and
represents how close the scored child’s D-score is to the D-scores of
**same-aged** children in the reference sample. DAZ scores
are reported in standard Z-score units, with a mean of 0 and a standard
deviation of 1. This means that:

- If the D-score of the scored child is
*higher*than those in the reference, then the DAZ will be*positive*. - If the D-score is
*lower*than same-aged children in the reference sample, then the DAZ will be*negative* - If the D-score of the child is
*the same*as the average of the reference sample, then the DAZ will be 0.

Before version 1.9.0, DAZ scores were calculated using the entire
Phase I validation sample of GSED data, consisting of 4,374 children
from Bangladesh, Pakistan, and Tanzania. This data included children
that were both very advantaged and those with significant constraints on
their development. In `dscore 1.9.0`

, the reference group has
been refined to a sub-sample of 2,295 children with *minimal*
constraints on their early development.

The default reference group includes children who:

- were of normal birth weight (above 2500 g)
- were born term (between 37 and 42 weeks)
- were not undernourished (according to weight-for-age, height-for-age, or weight-for-height Z-scores)
- had no known severe birth defects or chronic health problems
- had a mother who had completed at least a secondary level of education

In the future, the DAZ reference group will be updated with a larger and more representative sample both through the inclusion of additional countries in validation studies as well as a dedicated Norms & Standards study (https://bmjopen.bmj.com/content/13/1/e062562).

Many anthropometric measures use a -2 SD benchmark to describe the
percentage of children with low height for age (stunting) weight for age
(underweight) or weight for height (wasting). DAZ scores *can* be
used with a benchmark for monitoring purposes, but this should be done
with extreme caution. This is because, unlike HAZ, WAZ, and WHZ, DAZ
scores are calculated using a relatively small and globally
unrepresentative reference sample.

Further guidance and a more concrete benchmark will be analyzed after
the completion of an ongoing Norms & Standards study. For now, if a
benchmark for use is required to determine the proportion of children
that are developmentally on track, we recommend using a
**transitional benchmark** -1.5 SD. This is slightly higher
than -2 SD but was determined to give reasonable alignment with
inferences from the ECDI2030 (https://www.sciencedirect.com/science/article/abs/pii/S0885200623001588).

Below we show some illustrative examples of what DAZ can look like in practice and how to interpret results.

```
# Create a dataset of five 13-month old children scoring 5 GSED items
dm <- matrix(
c(
13, 0, 0, 0, 0, 0,
13, 1, 0, 0, 0, 0,
13, 1, 1, 1, 0, 0,
13, 1, 1, 1, 1, 0,
13, 1, 1, 1, 1, 1
),
ncol = 6, byrow = TRUE)
colnames(dm) <- c("age", "gs1moc060", "gs1moc061", "gs1lgc062", "gs1sec063", "gs1moc064")
# Score the data using dscore function
output <- dscore(dm, xunit = "months")
# Add centile rankings to the output
output$centile <- round(100 * pnorm(output$daz), 1)
# View the scored data
head(output)
#> a n p d sem daz centile
#> 1 1.0833 5 0.0 41.16 3.214928 -2.688 0.4
#> 2 1.0833 5 0.2 43.59 3.088891 -2.131 1.7
#> 3 1.0833 5 0.6 48.37 3.226621 -0.862 19.4
#> 4 1.0833 5 0.8 51.13 3.499976 -0.043 48.3
#> 5 1.0833 5 1.0 54.49 3.906372 0.998 84.1
```

In the above example, we can see that for 13-month-old children, failing each of these 5 milestones will result in a D-score estimate of 41.16. The DAZ for this first child is calculated as -2.688, meaning that the D-score of the child is -2.688 standard deviations below the mean of 13-month-old children in the reference group. Converting this to percentiles, we see that this child would score well below the first percentile.

In contrast, the fourth child in the example (who passed 4/5 milestones) has a DAZ estimate of -0.043. This child is very close (just below) the average score of 13-month-old children in the reference group. And the final child in the example, who passed all 5 milestones, has an estimated DAZ of 0.998, nearly a full standard deviation above the mean and higher than 84 percent of same-aged children in the reference group.

`NA`

values for DAZ
When scoring DAZ, `dscore`

can return `NA`

values. Let’s take a look at why this happens.

`NA`

values occur when a child’s age is missing or out of
range. D-scores can be generated even with missing age values, but DAZ
is not possible to be calculated because the calculation of DAZ compares
the child’s D-score with D-scores of same-aged children. We can see this
happen with the below data, where we try to score the same responses
patterns with children aged `NA`

, 12, 18, 48, and -1 months
old.

```
# Create a dataset of five children of different ages with the same scores
dm <- matrix(
c(
NA, 1, 1, 1, 1, 1,
12, 1, 1, 1, 1, 1,
18, 1, 1, 1, 1, 1,
48, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1
),
ncol = 6, byrow = TRUE)
colnames(dm) <- c("age", "gs1moc060", "gs1moc061", "gs1lgc062", "gs1sec063", "gs1moc064")
dscore(dm, xunit = "months")
#> a n p d sem daz
#> 1 NA 5 1 NA NA NA
#> 2 1.0000 5 1 53.41 3.773782 1.283
#> 3 1.5000 5 1 59.95 4.479957 0.300
#> 4 4.0000 5 1 78.64 4.989951 NA
#> 5 -0.0833 5 1 31.67 4.271534 NA
```

The children with ages `NA`

, 48, and -0.0833 have DAZ that
are returned as `NA`

. DAZ must be relative to age and the
reference group is for children 0-36 months old. When scoring data,
ensure that ages have been accurately recorded.

Children aged 12 and 18 months have no problem with the estimation of the D-scores and DAZ. There are two additional notes:

- While all children have an identical response pattern, the estimate of the D-score differs. This is because there is an age prior that is used in calculating the D-score that assumes children of higher ages have higher D-scores. With just 5 items responded to, the prior has a big influence on the estimated D-score.
- While the 18-month-old child has a higher D-score estimate than the
12-month old child, that DAZ estimate is lower. This is because DAZ is
calculated
**relative to the reference group**. For the 12-month-old child, 53.41 is about 1.283 SD higher than the mean of D-scores for 12-month-old children in the reference group. For the 18-month-old child, 59.95 is 0.300 higher than 18-month-old children in the reference group.

While rare, it is also possible that the `dscore()`

functions returns an `NA`

value for DAZ in extreme cases,
e.g. when a three-month-old child is marked as many advanced age items
correct such as those related to jumping, talking, and reading. We can
illustrate this below:

```
### Get a list of all GSED item names
gsed_names <- get_itemnames(instrument = "gs1")
### Create a sample dataframe where all responses are 1
df <- as.data.frame(setNames(as.list(rep(1, length(gsed_names))), gsed_names))
### Add an age (in months) of 3
df$age <- 3
dscore(df, xunit = "months")
#> a n p d sem daz
#> 1 0.25 138 1 75.96 1.645728 NA
```

If DAZ is estimated `NA`

, age may not be recorded
properly. Recheck the data of any DAZ estimate that is estimated as
`NA`

.