ZiBFUS notebook

Kodi Arfer
Created 21 Aug 2016 • Last modified 9 Mar 2017

Death

(valcounts ($ feeding reported_dead))
I reported_dead
False 470

No mothers died.

(wc feeding (valcounts
  (np.where (>= $age 18) "Adult" "Adolescent")
  (np.where $kid_reported_dead "Death" "No deaths")))
row_0 Death No deaths
Adolescent 1 77
Adult 11 381

12 mothers had at least one child die.

Depression

Karl le Roux: "The way we set up the survey, we didn't ask any of the EPDS questions if the child's mother wasn't there at the time or if the child was being looked after by someone else. So the data we have refers specifically to MATERNAL depression rather than caregiver depression. (In retrospect, it may have been useful to get the depression data on the caregiver, but we didn't want to muddy the waters too much.)"

I use 12 as the threshold score for depression.

(setv x (.unstack (.apply (.groupby depress "months")
  (λ (valcounts ($ it class))))))
(setv x (.fillna x 0))
(setv ($ x "prop.") (.round (wc x (/ $Depressed (+ $Okay $Depressed))) 2))
(setv x (getl x : (qw Depressed Okay prop. N/A)))
(setv x.index.name "timepont")
(setv x (kwc .rename x :index (λ
  (if (= it 0) "antenatal" (.format "{} months" it)))))
x
timepont Depressed Okay prop. N/A
antenatal 117 361 0.24 0
3 months 83 281 0.23 26
6 months 64 297 0.18 58
9 months 58 281 0.17 62
12 months 68 245 0.22 98
24 months 29 233 0.11 134

"Okay" here means "not depressed". Notice that 24% of mothers were depressed antenatally, and 23% were depressed at 3 months after birth.

(setv x (.dropna (kwc .pivot (ss depress (.isin $months [0 3]))
  :index "s" :columns "months" :values "class")))
(setv x.columns (qw m0 m3))
(setv sad-both (.sum (wc x
  (& (= $m0 "Depressed") (= $m3 "Depressed")))))
[
  ["Count of mothers missing at neither timepoints 0 nor 3" (len x)]
  ["Count depressed at both timepoints" sad-both]
  ["Proportion" (rd 2 (/ sad-both (len x)))]]
Count of mothers missing at neither timepoints 0 nor 3 363.00
Count depressed at both timepoints 41.00
Proportion 0.11
(setv x (kwc .pivot depress
  :index "s" :columns "months" :values "class"))
(setv x.columns (amap (.format "m{}" it) x.columns))
(setv sad-never (sum (rmap [[_ row] (.iterrows x)]
  (.all (= (.dropna row) "Okay")))))
(setv sad-always (sum (rmap [[_ row] (.iterrows x)]
  (.all (= (.dropna row) "Depressed")))))
[
  ["Total count of mothers" (len x)]
  ["Count depressed at every non-missing timepoint" sad-always]
  ["Proportion" (rd 2 (/ sad-always (len x)))]
  ["Count not depressed at every non-missing timepoint" sad-never]
  ["Proportion" (rd 2 (/ sad-never (len x)))]]
Total count of mothers 480.00
Count depressed at every non-missing timepoint 26.00
Proportion 0.05
Count not depressed at every non-missing timepoint 254.00
Proportion 0.53
(setv x (.dropna (kwc .pivot depress
  :index "s" :columns "months" :values "class")))
(setv s (set x.index))
(setv cum-sad 0)
(setv d (pd.concat (rmap [timepoint x.columns]
  (setv v (getl x s timepoint))
  (setv vd (get v (= v "Depressed")))
  (global cum-sad)
  (+= cum-sad (len vd))
  (.difference-update s vd.index)
  (cbind
    :months timepoint
    :First_depressed (len vd)
    :Cumulative_first_depressed cum-sad
    :Prop. (rd 2 (/ cum-sad (len x)))))))
(.set-index d "months")
months First_depressed Cumulative_first_depressed Prop.
0 35 35 0.21
3 15 50 0.30
6 7 57 0.34
9 8 65 0.39
12 14 79 0.47
24 2 81 0.49

This table considers only mothers who were never missing for any of the timepoints. The last column is cumulative first depressed divided by total never-missing mothers.

Breastfeeding

I exclude all mothers from analysis for whom the death of a baby was reported. (No exclusions for mother deaths were necessary because no mothers died.)

Among mothers of twins, I consider only the primary baby.

I determine the mother's intervention condition (Mentor Mother or control) using the mother's answer to the question "Were you visited by a Mentor Mother during this pregnancy?"

I code the mothers as adults if they were 18 or older at the time of the antenatal interview, and as adolescents otherwise.

(setv breastfed-counts (cbind
  (pd.concat :axis 1 (rmap [grouper (qw condition agecat)]
    (setv gb (.groupby feeding-g grouper))
    (. (.apply gb (λ (valcounts ($ it months_breastfed)))) T)))
  :all (valcounts ($ feeding-g months_breastfed))))
breastfed-counts
months_breastfed Control MM Adolescent Adult all
0 78 39 21 96 117
3 62 23 13 71 85
6 29 10 3 36 39
9 24 9 7 26 33
12 76 52 25 103 128
21 17 12 6 23 29
24 21 6 1 26 27

This table has the count of mothers in each condition and age group who breastfed their child up to the given number of months.

How I've handled missing data and the irregular timepoints here is complicated. The basic idea is to score each mother with a number of months such that she breastfed her baby continuously, but not necessarily exclusively, for at least that number of months after birth. If a mother ever said she was no longer breastfeeding, she wasn't credited for resuming breastfeeding at any later timepoints.

(cut (.cumsum (cut breastfed-counts None None -1) :axis 0) None None -1)
months_breastfed Control MM Adolescent Adult all
0 307 151 76 381 458
3 229 112 55 285 341
6 167 89 42 214 256
9 138 79 39 178 217
12 114 70 32 152 184
21 38 18 7 49 56
24 21 6 1 26 27

This is a cumulative version of the previous table.

(defn f [df]
  (setv v ($ df months_breastfed))
  (pds-from-pairs (pairs
    :Mean (.mean v)
    :Median (.median v)
    :SD (kwc .std v :ddof 0))))
(rd (cbind
  (kwc pd.concat :axis 1 (rmap [grouper (qw condition agecat)]
    (setv gb (.groupby feeding-g grouper))
    (setv x (.apply gb f))
    x.T))
  :all (. (f feeding-g) T)))
I Control MM Adolescent Adult all
Mean 7.651 8.146 7.500 7.890 7.814
Median 6.000 9.000 9.000 6.000 6.000
SD 7.244 7.054 6.628 7.295 7.186

This table summarizes the number of months breastfed (as presented in detail in the previous table).

(kwc pd.concat :axis 1 (rmap [grouper (qw condition agecat)]
  (pd.crosstab
    (.map (.fillna ($ feeding-g breastfed_some_at_6mon) 2)
      {0 "No" 1 "Yes" 2 "missing"})
    (getl feeding-g : grouper))))
breastfed_some_at_6mon Control MM Adolescent Adult
No 140 63 34 168
Yes 151 77 41 187
missing 16 11 1 26

Here we see the number of subjects in each condition and age group who were still breastfeeding their babies at 6 months.

Exclusive breastfeeding and age

N.B. The significance tests below are with all missing values thrown out.

(setv d (wc feeding-g (valcounts
  (.map (.fillna $breastfed_exclusively_at_3mon 2)
    {0 "No" 1 "Yes" 2 "missing"})
  $agecat)))
d
breastfed_exclusively_at_3mon Adolescent Adult ~N/A
No 58 216 0
Yes 13 84 1
missing 5 81 0
["p from Fisher's exact test"
  (second (scist.fisher-exact (.as-matrix (geti d [0 1] [0 1]))))]
p from Fisher's exact test 0.100755523415
(setv d (wc feeding-g (valcounts
  (.map (.fillna $breastfed_exclusively_at_6mon 2)
    {0 "No" 1 "Yes" 2 "missing"})
  $agecat)))
d
breastfed_exclusively_at_6mon Adolescent Adult ~N/A
No 71 323 1
Yes 4 32 0
missing 1 26 0
["p from Fisher's exact test"
  (second (scist.fisher-exact (.as-matrix (geti d [0 1] [0 1]))))]
p from Fisher's exact test 0.365236988082