Summary statistics and Exploratory analysis of Spur Afrika Clinic activity in Kibera, January 2018.
Data collected by Spur Afrika medical team, local Kenyan medical staff and Australian guests, working in Kibera, Nairobi, Kenya.
Data imported from Airtable, ‘cloud database’
Redundant grade names consolidated
Age data corrected where simple and correctible errors have been made
# create 'corrected' version of age data
rownames(CorrectedPatientData) <- CorrectedPatientData$id
# correct dates which have been swapped or entered into wrong column
# in many cases, the Data.collection.date was set to the Date.of.birth
CorrectedPatientData['recAtRcqyfpMuLF5r', 'Data.collection.date'] <- '2018-01-05'
CorrectedPatientData['recLsoktJir05A6Sp', 'Data.collection.date'] <- '2018-01-11'
CorrectedPatientData['recNNUJ3D0HbVCy7P', 'Data.collection.date'] <- '2018-01-11'
CorrectedPatientData['recR7eMWKtI2ShfOp', 'Data.collection.date'] <- '2018-01-11'
CorrectedPatientData['recWqX7skBGuBxg5O', 'Date.of.birth'] <- '2015-11-14'
CorrectedPatientData['recWqX7skBGuBxg5O', 'Data.collection.date'] <- '2018-01-11'
CorrectedPatientData['recyMv0vRHJ33JAZF', 'Data.collection.date'] <- '2018-01-11'
# remove some unlikely dates of birth
CorrectedPatientData['recWqX7skBGuBxg5O', 'Date.of.birth'] <- NA
# born 2015-11-14, but in 2018 already 29 kg and 145 cm tall, and Grade 7
CorrectedPatientData['recfCemBktJieY9tO', 'Date.of.birth'] <- NA
# born 2016-01-31, but in 2018 already 35 kg and 148 cm tall, and Grade 6
CorrectedPatientData['recvU9arOYkcoBw7H', 'Date.of.birth'] <- NA
# born 2015-01-01, but in 2018 already 40 kg and 151 cm tall, and Class 4
# Remove some unlikely height recordings.
# some impossible or unlikely heights
CorrectedPatientData['recQBdegQTVTI1vql', 'Height'] <- NA
# contact above had a height recording of 1236 cm
CorrectedPatientData['recZcyQJKTRz5ldph', 'Height'] <- NA
# contact above had a height recording of 77 cm, weight 23 kg, age 7 years, female
CorrectedPatientData['receHuzCheQwGEzAv', 'Height'] <- NA
# contact above had a height recording of 71 cm, weight 20 kg, age 7 years, male
CorrectedPatientData['recdQJEnAkpwFJoXO', 'Height'] <- NA
# contact above had a height recording of 98 cm, weight 28 kg, age 10 years, female
CorrectedPatientData['recqtBsxk3BTILa85', 'Height'] <- NA
# contact above had a height recording of 166 cm, weight 18 kg, age 6 years, female
CorrectedPatientData['recdQJEnAkpwFJoXO', 'Height'] <- NA
# contact above had a height recording of 98 cm, weight 28 kg, age 10 years, female
p <- CorrectedPatientData %>%
filter(!is.na(Height)) %>%
plot_ly(y = ~Height, color = ~Gender, type = "box") %>%
layout (title = 'Recorded heights, unlikely data removed',
yaxis = list(title = 'Height (cm)'))
suppressWarnings(p) # necessary, because ColorBrewer complains that minimum 3 colours required
Analyze clinical findings of children (by age Age.in.years). If no age is available, assume that all patients attending school Form.grade are children.
Finding types rationalized
# 'rationalize' some finding names
ChildFindingsData[ChildFindingsData$Finding == 'Caries',]$Finding <- 'Dental decay'
ChildFindingsData[ChildFindingsData$Finding == 'Tooth decay',]$Finding <- 'Dental decay'
ChildFindingsData[ChildFindingsData$Finding == 'Difficulty hearing',]$Finding <- 'Hearing loss'
ChildFindingsData[ChildFindingsData$Finding == 'Poor hearing',]$Finding <- 'Hearing loss'
ChildFindingsData[ChildFindingsData$Finding == 'Itchy eyes',]$Finding <- 'Eye irritation'
ChildFindingsData[ChildFindingsData$Finding == 'Mittleschmerz pain',]$Finding <- 'Mittelschmerz pain'
FindingCategories <- tibble(Category = character(), Finding = character())
FindingCategories <- FindingCategories %>%
add_row(Category = 'Respiratory',
Finding = c('Atypical pneumonia', 'Pneumonia', 'Bronchitis',
'Tuberculosis', 'Productive cough', 'Cough',
'Lower respiratory tract infection',
'Upper respiratory tract infection','Dyspnoea',
'Asthma', 'Bronchiectasis', 'Rhonchi', 'Runny nose',
'Short of breath', 'Viral illness')) %>%
add_row(Category = 'Cardiovascular',
Finding = c('Congenital heart disease', 'Palpitations',
'Heart murmur', 'Tachycardia', 'Valvular heart disease')) %>%
add_row(Category = 'Gastrointestinal',
Finding = c('Heartburn', 'Vomiting', 'Rectal bleeding', 'Gastritis',
'Constipation', 'Odynophagia', 'Dysphagia',
'Chronic diarrhoea', 'Diarrhoea', 'Gastro-oesophageal reflux',
'Gastroenteritis', 'Adenitis')) %>%
add_row(Category = 'Genito-urinary',
Finding = c('Urinary tract infection', 'Pyelonephritis', 'Dysuria',
'Acute cystitis')) %>%
add_row(Category = 'Surgical',
Finding = c('Burn', 'Discharging wound', 'Wound', 'Abdominal pain',
'Soft-tissue injury', 'Congenital abnormality')) %>%
add_row(Category = 'Musculoskeletal',
Finding = c('Chest pain : trauma', 'Fracture', 'Knee pain',
'Pleuritic chest pain', 'Chest pain : non-traumatic',
'Chest pain', 'Orthopaedic deformity', 'Joint pain',
'Musculoskeletal pain', 'Back pain', 'Elbow pain',
'Foot pain', 'Jaw pain', 'Neck pain', 'Trauma',
'Prosthetic limb', 'Repetitive strain injury')) %>%
add_row(Category = 'Allergy',
Finding = c('Allergy', 'Environmental irritant', 'Food intolerance')) %>%
add_row(Category = 'Gynaecology',
Finding = c('Menstruation not yet started', 'Menstrual period missed',
'Sexual development variation', 'Dysmenorrhoea',
'Mittelschmerz pain', 'Pre-menstrual pain')) %>%
add_row(Category = 'Oral health',
Finding = c('Periodontal infection', 'Dental overcrowding',
'Dental calculus', 'Dental plaque', 'Dental decay',
'Dental pain', 'Oral health poor', 'Gingivitis',
'Caries', 'Jaw and temperomandibular joint pain',
'Bleeding gums', 'Gum pain', 'Tooth broken',
'Tooth loose', 'Tooth hypomineralization',
'Tooth fissures', 'Angular stomatitis',
'Geographical tongue', 'Gum disease', 'Halitosis',
'Poor oral hygiene', 'Sore tongue', 'Tongue blisters',
'Tooth eruption', 'Toothache', 'Toothache - cold drink or food',
'Toothache - eating', 'Staining')) %>%
add_row(Category = 'Dermatology',
Finding = c('Pruritus', 'Skin lesion', 'Chronic candidiasis - PV',
'Apthous ulcer', 'Cold Sore', 'Acne', 'Tinea', 'Tinea capitis',
'Molluscum contagiosum', 'Thrush-oral', 'Folliculitis', 'Scabies',
'Cellulitis', 'Scar-skin', 'Dermatitis-contact', 'Dermatitis',
'Dry eyelid', 'Eczema', 'Facial blemish', 'Scurvy',
'Rash', 'Sebaceous cyst')) %>%
add_row(Category = 'Non-specific',
Finding = c('Fever', 'Unconscious', 'Collapse', 'Unwell', 'Dizziness',
'Weakness', 'Dehydration', 'Food lack', 'Tiredness', 'Nausea',
'Syncope')) %>%
add_row(Category = 'Infectious',
Finding = c('Worms', 'Parasitic infection', 'Malaria', 'Amoebiasis',
'Malaria-history of')) %>%
add_row(Category = 'Ear-Nose-Throat',
Finding = c('Sinusitis-allergic', 'Sinusitis-infective', 'Sinusitis',
'Sore throat', 'Throat pain', 'Tonsillitis', 'Hearing loss',
'Ear wax', 'Ear pain', 'Otitis media - chronic suppurative',
'Otitis media-serous', 'Otitis media - acute', 'Otitis externa',
'Throat dryness', 'Hayfever', 'Epistaxis', 'Rhinitis',
'Dry nasal mucosa', 'Foreign body in ear',
'Nose bridge pain')) %>%
add_row(Category = 'Opthalmology',
Finding = c('Conjunctivitis', 'Lacrimation', 'Conjunctivitis - allergic',
'Corneal abrasion', 'Diplopia', 'Blindness', 'Astigmatism',
'Myopia', 'Eye pain', 'Eye irritation', 'Eye discharge',
'Eyes dry', 'Eyesight poor', 'Iritis', 'Photophobia',
'Strabismus')) %>%
add_row(Category = 'Haematology',
Finding = c('Lymphadenopathy - cervical', 'Lymphadenopathy',
'Coagulation disorder', 'Iron-deficiency anaemia')) %>%
add_row(Category = 'Social spiritual psychological',
Finding = c('Spiritual issue', 'Depression',
'Assault', 'Social situation risk', 'Hunger pains')) %>%
add_row(Category = 'Neurology',
Finding = c('Headache', 'Tension headache'))
ChildFindingsData <- ChildFindingsData %>%
left_join(FindingCategories, by = 'Finding') %>%
rename(Finding.Category = Category)
Analyze management of children in ChildPatientData
Management names rationalized
ChildManagementData[ChildManagementData$Manage == 'F/U Dr in 3/7 for stool sample and ABx if ongoing diarrhoea',]$Manage <-
'Doctor review'
ChildManagementData[ChildManagementData$Manage == 'GP Follow-up',]$Manage <- 'Doctor review'
ChildManagementData[ChildManagementData$Manage == 'GP follow-up PRN',]$Manage <- 'Doctor review'
ChildManagementData[ChildManagementData$Manage == 'Ventolin',]$Manage <- 'Salbutamol inhaler (Ventolin)'
ChildManagementData[ChildManagementData$Manage == 'X-ray',]$Manage <- 'Radiology - XR'
# Add *Management.Category* to *ChildManagementData*
ManageCategories <- tibble(Category = character(), Manage = character())
ManageCategories <- ManageCategories %>%
add_row(Category = 'Oral anti-infective',
Manage = c('Amoxycillin', 'Cephalexin', 'Griseofulvin oral',
'Ketoconazole oral', 'Metronidazole', 'Flucloxacillin',
'Antimalarials', 'Doxycycline', 'Albendazole', 'Nystatin oral',
'Antibiotics', 'Terbinafine')) %>%
add_row(Category = 'Topical cream',
Manage = c('Clotrimazole cream (clotrimoxazole)', 'Clotrimazole/betamethasone cream',
'Clotrimazole/beclothemasone/gentamicin cream (bulkot mixi cream)',
'Benzoyl benzoate topical', 'Antifungal cream', 'Iodine wash',
'Facial cleanser hypoallergenic', 'Moisturiser topical', 'Vaseline topical',
'Topical cream', 'Hydrocortisone cream', 'Permethrin')) %>%
add_row(Category = 'Simple analgesia',
Manage = c('Paracetamol oral', 'Ibuprofen oral')) %>%
add_row(Category = 'Systemic steroids',
Manage = c('Prednisolone oral')) %>%
add_row(Category = 'Asthma medication',
Manage = c('Salbutamol inhaler (Ventolin)', 'Salbutamol syrup', 'Fluticasone inhaler',
'Spacer device for metered-dose-inhaler')) %>%
add_row(Category = 'Topical ocular',
Manage = c('Gentamicin eye drops', 'Dexamethasone eye drops',
'Chloromycetin eye drops', 'Dexamethasone/gentamicin (Dexagenta) eye drops',
'Ocular lubricant topical', 'Sunglasses', 'Spectacle frames supplied',
'Hydrocortisone eye drops')) %>%
add_row(Category = 'Topical otic',
Manage = c('Ear drops (not otherwise specified)', 'Antibiotic ear drops',
'Ciprofloxacin ear drops', 'Ear cleaning',
'Otorex (Paradichlorobenzene, Benzocaine, Chlorbuto')) %>%
add_row(Category = 'Gastrointestinal',
Manage = c('Antacid oral', 'H2 antagonist', 'Proton pump inhibitor',
"Laxatives, aperients", 'Buscopan', 'Metoclopramide',
'Ondansetron')) %>%
add_row(Category = 'Allergy',
Manage = c('Antihistamine oral', 'Cetirizine')) %>%
add_row(Category = 'Instruction',
Manage = c('Hand hygiene education', 'Water intake increase', 'Fibre intake increase',
'Dietary advice', 'Education - epistaxis', 'Physical therapy',
'Dental hygiene encouragement', 'Oral hygiene demo', 'Oral intake increase',
'Postural adjustment', 'Brush teeth', 'Back exercises',
'Food preparation advice', 'Salt water gargle', 'Wash eyes')) %>%
add_row(Category = 'Investigation',
Manage = c('Stool analysis', 'Helicobacter pylori testing', 'Sputum for acid fast bacilli',
'Radiology - XR','Radiology - CT', 'Typhoid test', 'Malaria test',
'Urine culture', 'Ultrasound', 'Coagulation profile', 'Echo',
'Full blood count', 'MRI')) %>%
add_row(Category = 'Rehydration',
Manage = c('Oral rehydration')) %>%
add_row(Category = 'Immunisation',
Manage = c('Immunisation - tetanus', 'Immunisation review')) %>%
add_row(Category = 'Oral supplement',
Manage = c('Iron folate syrup (Hifer)', 'Iron supplement', 'Vitamin C oral',
'Vitamin B12 syrup', 'Folic acid', 'Multivitamin')) %>%
add_row(Category = 'Dental',
Manage = c('Extraction', 'Filling', 'Scaling', 'Mouthwash')) %>%
add_row(Category = 'Review',
Manage = c('Eye review', 'Doctor review', 'Dental review', 'Social review',
'Optometrist review', 'Physiotherapy review', 'Counselling or psychology review',
'ENT or audiology', 'Speech therapy', 'Follow-Up', 'Specialist Follow-up')) %>%
add_row(Category = 'Wound care',
Manage = c('Wound dressing', 'Cyst removal', 'Elbow support', 'Irritant removal'))
ChildManagementData <- ChildManagementData %>%
left_join(ManageCategories, by = 'Manage') %>%
rename(Management.Category = Category)
| DentalManage | n |
|---|---|
| Filling | 10 |
| Dental review | 7 |
| Oral hygiene demo | 7 |
| Extraction | 6 |
| Scaling | 4 |
| Brush teeth | 1 |
| Paracetamol oral | 1 |