Monday, 30 September 2013

Coursera: Introduction to Data Science (Course Review)

I finished this a few months ago, but it will probably be offered again, so here's a review. This course was taught by Bill Howe at University of Washington and offered as a MOOC on Coursera.

Course Description: 
The Coursera description promises newbie to data ninja in 8 weeks. Workload 8-10 hours/ week. Those of us who have finished our statistical mechanics homework at 2 AM know that such promises are not only empty, but rather a guarantee of a course that is over-ambitious. As the description implies, this is an overview course that tries to do too much. Every student should realise this at the outset: an introductory course that claims to cover everything is certain to be a rough ride. (I know. I've taught some.)

Lectures: 
The lectures covered some really interesting content, and the lecturer appears to know the industry very well, particularly the Microsoft perspective and tools. I assume that many of his continuing education students are Microsoft employees who want to update particular skills. Such students are not the run-of-the mill for UW.

When I was a TA at UW, the undergraduates needed slow feeding with very small spoons. Lecture halls were filled with slumped bodies under baseball caps. The evening courses, in contrast, were filled with lively, interested, adults who learned independently and came to class with lists of questions. This course is aimed at those active, interested adult learners. That said, the number of hours listed for this class is a gross underestimate for the material covered and the assignments given.

Professor Howe's lecture style is not always engaging, and a lot of material is covered. There were often over 3 hours worth of lecture material to review during the week. Along with following links and reading supporting papers, this left very little time for the assignments themselves. Prof. Howe did a good job of introducing and comparing a range of current technology choices (particularly the comparison of different database technologies). As a data science newbie, I would have liked a bit more information and emphasis on use cases for different types of databases.

The database parts of the course were well presented, and this covered subjects that I hadn't seen in my other work. The data analysis elements were not so clearly taught, though, and there are better (slower) ways to learn this material on Coursera. If you have time, Jeff Leek's course 'Data Analysis' covers this much more thoroughly. Andrew Ng's now legendary Machine Learning course is also good, although more mathematically oriented, with less emphasis on organisation, data munging techniques, and communicating results.

Later lectures in this Intro. to Data Science course appeared to have incorrect answers in the in-lecture questions. I got bored of trying to keep track of the errors and inconsistencies in the course. The material needs a thorough editing before the next showing.

Assignments:  
The lectures were not particularly good preparation for the homework assignments. A lot of independent learning was required to make progress in the course. The assignments were also relatively difficult compared to what I expected from the course description. The first assignment was a sentiment analysis of a Tweet stream written in Python. I have a pretty good programming background, having started with Basic back in 1983, visiting Fortran, MatLab, Igor, Unix utilities, C, Ruby and continuing to objective-C, R and Functional programming in Scala. I pick things up quickly. The course description did not require a programming background, yet I had to spend several hours learning the ins and outs of Python from Code Academy before I could get a handle on the assignments.

The level of the first assignments was not commensurate with expectations from the course description. I learned a lot, more than I expected, in fact, and I can now implement a matrix multiplication in Python, SQL, or MapReduce based on the homework assignments. The auto-grader for the 1st assignment never did accept my answer for the final part. It also didn't give sufficient feedback for me to solve the problem, which probably had something to do with text encoding, but was very frustrating none-the-less. This sort of issue doesn't teach much. Save your perseverance for things that matter.

Overall, the assignments were challenging. I learned a lot, but not always what the point of the assignment was. I think there were a lot of complaints (more than normal) about the difficulty of the assignments, and later assignments were quite a bit easier than earlier ones. Assignments covered:

  • Python:   Tweet stream sentiment analysis
  • SQL:   Queries, tables and matrix multiplication
  • Tableau Visualization:    FAA Bird Strike Data 
    • write-up and peer assessment
    • note: I had to use Tableau via Amazon web services as it only runs on Windows.
  • MapReduce:   data joins, basic network analysis, matrix multiplication
  • Kaggle: Take part in a competition (I did facial keypoints detection)
    • write-up and peer assessment: ranking on the leaderboard did not matter.
A couple of the assignment deadlines were changed after the deadline had passed. This is very unfair to people who have worked hard to make the deadline, although it was reasonable in the case of the MapReduce homework where we were using a new web system that was supposed to be able to handle the volume of students. This is a continuing problem with MOOCs that have > 100k students enrolled. Any time the professor makes an assignment that will run on new technology, be prepared for a very frustrating experience. In my opinion, new web-based technology should not be used for graded assignments in MOOCs. They should be tested first as an optional assignment or a staged assignment so that 100k students are not accessing it in the same week.

Overall Recommendation:
Students:  I hope that the professor will offer this course in a pared-down form. As it is, if you're already awesome at Python and SQL, go ahead and dive in. Everyone else should consider this a taster course and audit only, at least with the current assignments. Be selective about which parts you choose to look at. If you experience slowdowns or poor behaviour with particular technologies in the assignments, put it aside and try again when the course is over or the deadline is passed. It seems like a class, but it's a free platform and you get what you pay for. A lot of professors are using this to try out new technologies, so don't expect it to all work as advertised.

Sunday, 7 July 2013

Biking with Children

Spurred by some recent twitter discussions linking to this StackExchange discussion, it's time to finally write this post. I've been thinking about it for an age.

My son was born in Amsterdam, and my daughter in London. We have been, well, not serious bicyclists, but commuters and heavy bicycle users for many years. This didn't stop when we had kids. In Amsterdam, we lived in the center and did everything by bicycle. We had no car, and didn't really miss it. Over our 8 years in London, we've spent 2 years car free, doing the shopping, day trips, etc. by bicycle or by public transit. We aren't sport bicyclists, bent on training and performance, but, well, maybe we're some shade of green.

Early days: < 6 months
Since bicycling is such an integral part of life in Amsterdam, within a couple days of birth, I found myself carrying my baby in a sling while riding my very stable Dutch bike around Amsterdam at slow speeds. This got us to the first health appointments at the GGD, but wasn't really a safe solution. My knees bumped the sling, too, so it wasn't very comfortable. Every time I got back home, I felt like I'd 'gotten away with it' again.

We needed to be able to get around, and a car just wasn't a useful solution, so we got a baby-mee. Baby G's nice, safe carseat clicked into a somewhat springy metal rack attached to my bike rack. Now we could put him in his car seat and continue our bicycle explorations. We got to see some nice places that way.

This was a great way to travel. I could get out of the house really easily with the new baby. He  wasn't heavy yet, so didn't add any instability to the bicycle, and he was strapped into a car seat with decent side impact protection. A low speed fall to the side would be safe. We had a rain cover that zipped over the top when needed. It could also be moved from one bike to another fairly easily, which was great for when my husband was in charge. Mostly it lived on my bike, though, and it was brilliant for trips to the doctor, the zoo, the park.

 But eventually, it was time to move on. For one thing, we needed to carry the shopping, too. And a full shopping bag goes on the back. Yes, Dutch people frequently can be seen with two or more large shopping bags dangling from the handlebars, but I learned early: never follow a Dutch person on a bicycle. The frailest of old ladies will turn across the path of an oncoming tram or down a tricky cobblestone alley full of pedestrians. We won't talk about traffic signals. I'm just not at that level; I know myself, and I don't bike well with shopping on the front.

young, but able:  6 - 15 months
From the time a baby can sit up, the Dutch tend to put them in a 'voorzitje', or front seat. Ours hung on the handlebars with two hooks and had a clamp around the stem. Most newer models have an updated attachment that clamps directly onto the stem. The hooks had a disadvantage in that as the child got heavier, so did the steering, but it was fabulous for several months. As far as I could tell, the babies all love these. It was always exciting, and G would stay awake for at least 30 minutes before starting to nod off, which was fine for dashing about town. We also had plenty of room on the back for groceries.The baby's feet are in foot rests, and you can get a good windscreen to keep out the rain and weather. Our model didn't work with drop handlebars, and if the child fell asleep on the way home from the zoo, it wasn't very comfortable; we were constantly trying to support a lolling head with an elbow while riding. This also made it less useful for longer rides.

For this age, it can also be convenient to have a rack attachment that takes a small folding stroller or pushchair. That way you have something to push around at your destination, which can be a lifesaver if you're headed to a garden, shopping mall, museum or similar walking-heavy destination. I didn't have problems with my knees hitting the voorzitje (pronounced for-zit-ya), but my husband had to spread his knees around it, which isn't the best riding position. If you can, try it out before you buy it.

toddlers:  15 months - 3 years
But after about 15 mo, baby G just grew to be too big. The mini front seats are quite close to the handlebars, so there just isn't room for a larger child. We moved him to a seat on the back. Why not a trailer? Well... we did try out a trailer in Amsterdam once; it was hell. It wasn't the trailer's fault, it was just the nature of Dutch bicycle traffic and Dutch bike infrastructure. The trailer was a bit too wide, a bit too long, and a bit too unexpected to be a comfortable riding experience. One thing that makes a bicycle so useful in Amsterdam is that it is narrow. In a town of narrow, medieval streets, this is essential. Cars generally allowed us about 2 inches of space, because that's how much space a Dutch bicyclist needs, and that's how much room there was on the streets. There were constant obstructions: delivery vans or moving vans or just something going on along a canal.  To get anywhere, the bicyclist has to swerve through the bollards, through a few parking places or along the sidewalks to pass by the obstruction. Then through the bollards again to regain the street. The trailer just didn't have the manoeuvrability we needed.

The Bobike seat, after 5 years in the shed.
It was worse at intersections. Bicycle traffic is chaotic. There is no lane control, no signalling, and if anyone can help it, no braking. Pulling a long, slow load into the midst of 10 or 20 bicyclists all trying to go their separate ways just wasn't a pleasant experience. It didn't feel socially responsible. Everyone else was carrying multiple children on the nice small footprint of their own bicycle, while we had an extraordinary, traffic clogging load. I wanted a lead bike out front warning everyone we were coming through.

But that was Amsterdam, our later trailer experiences were different (see below). In Amsterdam, G sat in a Bobike seat on the back, attached to the rear stays, not the rack. This, again, constricted the room available for groceries, but I put a small basket on the front and did most of my grocery shopping by foot. If I leant forward, I could wear a backpack, but if it sat upright, it was right in the baby's face.

From 15 months  to 3 years old, this was fine, but this guy grew a bit fast, and by 3 years, the seat wasn't working out any more. The clamps holding it to the stays would slip and *bump* he would come down on my fender, providing a very effective brake. I would get off, unload, move the clamps back into place, screw them down as hard as I could and a bit later, *bump*, down they would come again.

Another child seat option that remains useful.
One cause of this difficulty was that we moved to London shortly after G turned 2. He was riding in the same Dutch seat, but the surface was different. When we took the Thames Path to Kew Gardens, it was just too bumpy, with gravel and potholes and rough edges. He was too heavy, and the seat design wasn't up to it. We considered other seats, but none of them really seemed to solve all the problems. A rack-mounted seat certainly would have been better, but we also wanted to go for some longer rides and have something comfortable for G to nap in; we wanted to swap it between bikes; we wanted it to be a bit safer.


small child:  3 - 6 years
So when we saw a second-hand trailer at a boot sale, we got it. (boot sale in British is equivalent to flea market in American English). It wasn't a high end trailer, but it was functional. It had a clamp that tightened onto the bottom stay, with a safety backup strap and a flexible connector to the trailer towing bar. We could lay the bike down and pick it up again without upsetting the trailer. G could nap in it. It was built for two, so he could take a friend. We could swap it between bicycles. (It was more or less equivalent to this one). I put a mirror on my helmet so I could see the traffic behind and keep an eye on the little one.

At 3 yrs old, G started going to nursery 3 days a week. The nursery was 4 miles away, so I biked it with him in the trailer. He could stay cosy and dry while I battled the hill and got a bit of exercise back into my life. We could stop in the park on the way home if the weather was nice. The trailer was very useful, but it lagged: it didn't start smoothly from a stop, but would pull behind in an uncomfortable oscillation. It wasn't dangerous, just unpleasant. My husband liked the functionality of the trailer, but not the execution: too heavy for longer rides.

The response of traffic is mixed, but most people will give you a lot of room. When people see the trailer, they generally say 'Awww, or 'Wow' or 'what a way to travel'... we get a lot of comments. There is a real feeling of support for this approach. London traffic treats you differently as a bicyclist or as a bicyclist with a trailer. On most roads, I didn't feel pressured to move out of the way or to get a move on. Sometimes the white van guys will even wave at my passenger. There is (slightly) more understanding that you are carrying a load, and the load is precious.

We were wanting some longer rides. We organised a trip to Southern France with some friends, and we bought a Burley. The first several times I pulled it, I kept checking to see that it was actually behind me. It felt extremely smooth and light compared to the other trailer.

G was comfortable and very happy with his space in the trailer. On a long ride, there wasn't so much for him to do, but we took frequent breaks and found a lot of waterfalls. He got more chocolate croissants than any child should expect. We could hand him long pieces of grass and things to look at and hold out into the breeze. He would nap and re-arrange his environment. This is the kind of biking that you cannot do with a child in a seat.

The Burley folded flat and fit into a luggage rack on the Eurostar and TGV trains. It was easy enough to convert that we rode it across Paris from Gare du Nord to Gare d' Est and folded it again for the second train.

second time around:
And then came P. We live near a busy train track, and the crossing bars are down a lot. During the week it's easily 40 minutes out of the hour. Since G's school and the local shops are on the other side, most of our daily trips involve stairs. I walked everywhere when P was small. I could carry her lightweight pushchair over the stairs, where I wouldn't have been able to manage either a bike with seat or a trailer. I didn't have the baby-mee, but I occasionally put her carseat in the trailer to ride somewhere. There wasn't a very good attachment for this, but I could strap it in for stability, and she was reasonably well-protected. She would eventually complain if the road was bumpy, so we took the speed bumps very slowly and tried to stay off of the Thames Path.

She has missed out on the fun of the voorzitje, but she enjoys going for bike rides. She has her own space in the trailer, and often doesn't want to get out when we arrive. She brings along a stuffed animal and can often be heard making up a song or game while we travel. We haven't considered getting a bike seat for her. Actually, I just cleared out the old rear seat from the shed.


Minimalist child seat.
As a sturdy 4 1/2 year old, P is now going to nursery about 1/2 mile away. We have tried out all the possible methods of transit; some days we even seem to crawl. On the bike, there are three possibilities: the trailer, the back rack or the top tube. One boy at her nursery arrives on a seat on his father's top tube (pictured). When she's in front of me, my knees have to go wide around her, and neither of us is comfortable for longer rides. On the touring bike, I am leaned forward over her, and this riding position is quite cosy. She is forced to lean over as well, just to fit into the available space. On the other hand, being up high and in front is exciting. She has to face the weather. For the past couple of weeks, though, the trailer has been the method of choice.

more than one:
typical scene in Amsterdam, shamelessly borrowed from this blog. 
Since G was already nearly 6 when P was born, we didn't have to do a lot of riding while carrying two children. I did hand on our 1st trailer to a nearby family who used it happily for the school run. This can be a tricky time - when the younger child is in nursery, there is about a year with three school runs a day, and many young children just aren't up to that much walking. A two seat trailer is a good solution, and generally cheaper and more flexible than a box-bike or tricycle.

Although Dutch town are filled with scenes of whole families riding on one bike, it can be difficult to manage. The front-seat + back-seat combination is the most common. This works reasonably well when the children are small, but the problem is always how to load it safely. Basically, a toddler's weight on a leaning bike is already half-way to an accident. The best solution seems to be to load the baby in front first, stabilize the bicycle, and have the toddler climb into their seat. Invest in a really solid kick stand that will give more than one point of support, and hold the brakes tightly on to keep the bike from rolling while they climb up. A stop or velcro strap that keeps the front wheel from turning can also help. Even when the children are in place, however, you still have to clip the toddler's straps, which requires an extra hand. I witnessed more than one fall, and more than one utterly frazzled mother. If you're just headed to the park with your partner, distribute the weight and put a seat on each bike.

If you have to lean the bike to get your leg over the top bar, be extremely cautious. Having all the children's weight at the top of the bike makes it very unstable. Holding onto a brake will keep it from rolling, but... it's just a tippy machine at this point.

Summary:
There are many options for riding with your children. Which one(s) you choose will depend on the children's ages and your own bicycling style and needs. We found that seats worked very well in the confines of medieval streets in Amsterdam and also for errands and short trips in London. They work better with a step-through frame (no or low top-tube) and an upright riding position. Outside of Amsterdam, the trailer was the way to go for us. It requires more storage space and actual, normal sized roads. It can carry a heavy load without any instability. We take it on and off the bicycle for each trip, which requires some attention to detail -- never leave off the safety strap! This takes less than 1 minute after a bit of practice. Since we use the trailer for vacations and daily errands, including shopping runs, it has definitely been worth the price.

Right now we are packing to move back to the US, and we'll be taking the Burley with us.










Saturday, 6 July 2013

Idiom in R: results you can C

Computing for Data Analysis was a pretty good introduction to R, but did not really talk about R idiom, which can make the difference between code that runs and code that runs quickly. Here is a basic example.

Using sprintf statements for formatting filenames: Consider a series of files. The goal is to read them all into R, but the filenames include a constant width variable: we're looking to load filenames such as ./data/001.csv and ./data/011.csv up to ./data/999.csv. How do we construct the name strings in R?

The numbers in the file names need to be padded and converted to the appropriate strings. Here are three ways of doing the padding.

The R way:

# setup
directory <- "data"
id = 1:999

# method 1
pad.R <- function(id) {
    num <- sprintf("%03d", as.integer(id))
    path <- paste("./", directory, "/", num, ".csv", sep = "")
    return(path)
}

A brute-force method:

# method 2
pad.brute <- function(id) {
    num <- rep("", length(id))
    for (n in 1:length(id)) {
        if (id[n] < 10)  num[n] <- paste("00", id[n], sep = "") 
  else if (id[n] < 100)  num[n] <- paste("0", id[n], sep = "") 
  else num[n] <- as.character(id[n])
    }

    path <- paste("./", directory, "/", num, ".csv", sep = "")
    return(path)
}

… but we know that for-loops are notoriously slow in R, so we could take a hybrid approach and define a function to take a single number as input and convert it. Then that function could be used with one of R's apply methods to convert the vector in one go.

A hybrid method:

# method 3
padder <- function(num) {
    if (num < 10) return(paste("00", num, sep = "")) 
 else if (num < 100) return(paste("0", num, sep = "")) 
 else return(as.character(num))
}

pad.hybrid <- function(id) {
    num <- sapply(id, padder)
    path <- paste("./", directory, "/", num, ".csv", sep = "")
    return(path)
}

Comparison

These approaches all give the same results, but they are noticeably different.

system.time(path <- pad.R(id))
##    user  system elapsed 
##   0.001   0.000   0.001
system.time(path <- pad.brute(id))
##    user  system elapsed 
##   0.007   0.000   0.008
system.time(path <- pad.hybrid(id))
##    user  system elapsed 
##   0.004   0.000   0.004
path[c(3, 13, 103)]
## [1] "./data/003.csv" "./data/013.csv" "./data/103.csv"

For speed, they are equivalent when run on 1 or two elements at a time. However, when run on the full 999 element vector as shown here, both the 'brute force' and 'hybrid' methods are significantly slower than sprintf.

The discussions on the course forums did give a different perspective. Several self-identified 'professional programmers' preferred the if, if-else, else approach I've used in both methods 2 and 3. They considered it more readable and thus more maintainable.

I don't think this is the best approach. If you are a professional programmer, you are familiar with idiom, in whatever language you work in. You know that there are readable, maintainable, ways of doing what needs to be done efficiently. At it's root, deep down underneath, R is in the C family of languages. The basic in/out is based on the C standard library <stdio.h>. The professional way to use R is to use that R idiom efficiently and in a way that other R programmers will understand.

So learn your sprintf formatting codes. They may look like magic numbers the first time you meet them, but they are systematic and ubiquitous. They will be useful in many other contexts, including modern languages like Python and Java and therefore even Scala and Clojure. They will also speed up your code, and don't worry, most other professionals will understand them.

Sunday, 5 May 2013

Hexaflexagon Madness

No, I can't hold a candle to Vi Hart's description. Go and enjoy. Then have some nice Mexican food.

But when you stop rolling on the floor holding your stomach, you might ask yourself  'where did the 3rd side come from'? and, well, I might have an answer.



A hexaflexagon is a 2 dimensional object in some sense. As you fold it up into a triangle, preparing to turn, it becomes 3 dimensional, and when it does, you can open it up. What you find is that the triangular pockets formed by the folds held the 3rd side. This 3rd side is inaccessible until you fold it, but when you open it, you are opening those pockets, revealing the hidden triangles. The former front becomes a symmetrically inverted back, and the former back side moves to the inside of the newly-formed pockets.

Another side-effect of the pockets is that if you keep folding and unfolding, effectively turning it inside out over and over again, it will rotate in the plane, without you turning it.

If you're trying to fold one, here's one tip:

You can estimate a 60° angle by carefully lining up the top corner with the bottom edge of the paper strip, as in the pink circle above. At other angles, the corner is either onto the paper or hanging off the edge, but at 60°, it will line up exactly, so long as the sides are straight.

Chirality is important. Make sure you've got three diamonds visible. If you don't, there is probably an up where there should be a down or vice versa.

I haven't quite got the hexa-hexaflexagon down yet, but we'll get there. The description at Hexaflexagon portal is very helpful, particularly the variation A hexa-hexa-flexagon, available as a PDF.

Oh, yeah, and while you're contemplating your notebook paper:

You didn't think that 9 1/2 x 11 inches was an international standard, did you? Guess what. Most of the rest of the world uses a different 'system', um, like an actual systematic system. The equivalent 'letter' size is A4, but we also have A1 (poster sized), A7 (index card), and other variously-sized characters in between. These sizes have the nicely chosen aspect ratio so that, $L/W = \sqrt{2} = 0.707 $... but that would be irrational, so they have to round off a bit.



This doesn't look very useful until you take the ratio of  $\frac{\sqrt{2}}{2}$. Remember how to divide fractions involving roots? The bit you need to recall is that $2$ is just $\sqrt{2}\times\sqrt{2}$. This means that  $$ \frac{\sqrt{2}}{2} = \frac{\sqrt{2}}{\sqrt{2}\sqrt{2}} = \frac1{\sqrt{2}} $$ when you simplify by canceling like terms on top and bottom. Then, taking the ratio of the long: short sides gives $$ 1: \frac1{\sqrt{2}} $$ Multiplying both sides by $\sqrt{2}$ gives a simpler form, which happens to be the same ratio as the original, large piece of paper: $$ \sqrt{2}:1$$ And no matter what the paper size, the math still works. Now that's a system. Folding an A4 and rotating 90° gives an A5, etc. As always, wikipedia is your friend.

A4 is 21.0 x 29.7 cm, so it's narrower than US Letter paper by 1.23 inches. Which is a perfectly sized strip for hexaflexagon folding.

I haven't decided on whether or not to hold a hexaflexagon party. It might have to wait until next October.




Tuesday, 16 April 2013

Big Data Hackathon London: A few lessons learned

I spent most of my weekend at the Big Data Hackathon London. I'm not hard-core, and I didn't pull an all nighter, but then, even the winning visualisation team said the code written between 4-7 am was rubbish. Better to get some sleep. This was my first ever 'hackathon', and part of the fun was just observing the phenomenon.

The basics: 

The hackathon was organised by Data Science London, and I found out about it through the Data Science Meetup group. I highly recommend this group if you are interested in learning about current methods and tools in Data Science. Their meetings are very interesting and educational, but you have to be very quick with the RSVP -- there's a lot of competition for the limited spaces. As always, the organisers did a great job. I didn't manage to take home any of the swag or awards, but I certainly drank my share of the coffee. And the whole weekend was totally free. Well done!

The hackathon took place at The Hub Westminster, which was a very nice, light, open space. The talk space holds about 100 or so people, and there is desk space and stand-up area where the food is served for milling around and meeting people. The space is well organized with good systems for internet and power. A pleasure to work in.

  • Lesson learned: Bring your own mug to cut down on waste 

The hackathon had three different categories of challenges that teams could submit.
  1. data science challenge 
  2. data visualization challenge 
  3. free-style data challenge 
Most people who came did not have a team lined up. The winning team in the data visualisation challenge got together when two of them carried signs around saying 'Node.js' and 'd3'. The other two thought this was a good idea, and a winning team was formed. One of the team members later said that their goal had just been to improve their javascript skills. The visualisation was quite lovely, and should be showing up in a 'major UK publication' someday soon.
  • Lesson learned: MongoDB + Node.js + d3 = powerful stuff 
  • Lesson learned: Connect a team through the technology you want to learn 
The hackathon started out with a presentation on Microsoft Azure and the suggestion that we use a free trial account (good for 3 months) to do our analysis.

After the talk, someone asked about setting up R on the system. I approached them after the talk, and that was the beginnings of a team. Our team, 'State of the A[R]t' set up an Azure account, and we were able to get R working on a Ubuntu virtual machine without much difficulty. Wenming Ye's blog was helpful for this. It's probably even more helpful if you want to use Python. The Kaggle assessment of the data science submissions relied on the ROCR package, and this relied on gplot, which required us to build R 3.0 from code. Fortunately, one of our team was ace at this and we had it running quite quickly. Meanwhile, the rest of us were looking at the data.

  • Lesson learned: Technology is broad and deep. Someone will like doing the parts you hate. Let them do it. (I have to re-learn this continuously. I try to do too much on my own.) 

The hackathon has a tight schedule. There were talks all afternoon, and if I had gone to all the talks, I would not have made much progress with the data. However, missing all the talks probably wasn't the best strategy either. Next time, I'll try to keep my head up and look around for which talks are truly interesting. Talks were presented by the hackathon sponsors, so highlighted their newest technologies. I can only hope that the talks will be posted so I can catch up with the parts I missed.

  • Lesson learned: It's about learning. Think about what are the learning opportunities today? Will the talks be available tomorrow? 

On Sunday, the data analysis winners each gave a brief indication of what they did. We ended up 89th overall, and we only did that well because one of my team-mates took a careful look at the original benchmark code. I don't think we were alone in this, as 15 teams finished within 0.00001 of us. Re-assuringly, though, we were working along similar lines to the winning team.

  • Lesson learned: Find a good starting place. 

The benchmark was not quite the simple logistic regression we expected from the description. We would have done much better if we had taken the time to look at the code for the benchmark as a first step.

  • Lesson learned: Work efficiently -- write functions or scripts for each step. 

At 12:32 on Sunday, I had a model that resembled the winning model. Maybe it would have done better than 89th, but I didn't get a chance to find out. It took me too long to make the model into a submittable prediction! I should have anticipated this, because the 1st submission also took ages. If I had written some of the steps into functions, it could have been much faster, and the team would have done better.

Overall, it was great fun. I met some lovely people and I learned a lot. Coursera's offerings, including Jeff Leek's 'Data Analysis' and Roger Peng's 'Computing for Data Analysis' gave me a good background for taking part in this event. Hopefully, learning some Network Analysis and a bit of Scala will prove useful for the next one.

Saturday, 2 February 2013

Programming with Mommy

Sometimes the things you do turn around and bite you, and sometimes they make you smile.

So this afternoon I was watching this video in which Greg Wilson talks about programming techniques, programming fashions and the importance of evidence in deciding what to do and how to go about it. There's a section in the middle about the "why-women-can't-be-good-programmers" debate, and he mentions this book, which discusses it at length, with evidence.

So I got to thinking about coding and myself and my daughter. And it just so happens that we were chatting about Angry Bird this morning:
P:  Mommy, did you have Angry Birds when you were little?
S:  No... no, we didn't have anything like Angry Birds. We could listen to music on tapes or records; we could watch television. There weren't many computers. There weren't any videos or CD's. I remember the 1st video game. It came out when I was about 15. Actually, I can show you what it looked like... 

So we went and looked at 'Paddle Ball' at Khan Academy.

It's not the original Pong (nor is it the version that I remember seeing at a friend's house -- that was probably on an Atari VCS). It is close enough to that game that she could get the idea: not Angry Birds. And she could get another idea -- there was the code on the left side of the screen, and we could change it. We could make the ball pink, the background red, the paddle purple. We could change the sizes of the objects, and their speeds. We could interact with the game in a different way, and we did.

So my daughter got her introduction to programming at age 4.


Monday, 3 December 2012

Varicella pays a call

Chicken pox arrived this week. Of course P had been playing with her best friend nearly non-stop during the 1-2 days before the spots appeared. She was infectious, but we didn't know it yet. We're still waiting for him to get feverish, but it's only a matter of time: varicella is highly contagious -- approx. 90% of those exposed will get the disease. Which seems a rather amazing statistic given the number of times I've heard about chicken pox parties that apparently didn't work. Hopefully he will only suffer the same mild case she had - about 50 spots that didn't particularly bother her.

Public health policy for chickenpox in the US and the UK is completely different. It seems that the difference lies in consideration of the long term effects on the entire population, and on the adult reactivation of chicken pox virus known as shingles, or Herpes Zoster. Well, there might be some other issues, too. Basically, the UK seems to be waiting and watching the outcomes of the US vaccination program over time.[3] So far it's a success, but the questions were about what happens 30-50 years into the program, so there's some waiting yet to be done.

I'm no expert, but here's what I know of the story: The varicella vaccine was developed in the 1970's and first licensed in Japan in the 1980's. A full vaccine program in the US began 1995, several years after my 4-year-old sister brought the virus home from nursery and shared it with me. I spread it to the local high school. The severity of the disease goes up with age of first exposure, so, while my sister and most of her nursery class got off with a mild fever and a handful of itchy spots, I was pretty miserable for over a week, and one of my friends was out of school for three weeks. Before the US program started, there were an estimated 4 million cases of chicken pox each year. For every 100,000 cases in teenagers, approximately 216 would end up in hospital, and 6 would die.[1]

Since it's beginnings in 1995, the vaccine program has grown so that school systems in 46 states now require vaccination for entry, and some nurseries and day care centers do, too. Current vaccine coverage is estimated at 94%. The program has been touted as a great success for reducing the number of hospitalizations, serious complications, and deaths due to the virus. There were an estimated 100-150 deaths every year before the program was started. The childhood deaths are now nearly eliminated, and the adult deaths are also reduced. The program has also saved a lot of money and hassle for parents who would have otherwise stayed home from work to look after sick children. The estimated savings is on the order of $500 million annually.[1]

So why isn't there a similar program in the UK?

Well, firstly, there do seem to be some hiccups. The vaccine is not as long-lasting as hoped, and there is a 'breakthrough' disease rate, in which children who have been immunized catch the disease anyway. The claim is that these cases are less severe than they might otherwise have been... although it is difficult to know. The rate of hospital visits does seem to be lower. The disease incidence is reported to be reduced by 83%, and the hospitalizations by 88%. Anyway, the original 1-dose vaccine program was changed to a 2-dose program beginning in 2006 to reduce the disease burden in the 7-14 year old age group. The price of the vaccine is also higher than the original cost-benefit analyses estimated. It's currently at about $80/dose. Which seems high, but frankly, it would have been worth $80 for my daughter not to miss a week of school. Maybe even $160. But if you ask if it is worth $160 to have a 60% chance that she will not miss the week of school, well, things start getting complicated, don't they?

And then there's shingles. According to the US CDC:
"Although many people do not remember, approximately 99.5% of people born in the United States who are 40 years of age and older have had varicella. As a result, all older adults in the United States are at risk for herpes zoster."

People like me, who have had full-blown chicken pox, have latent virus in our nerve ganglia. About 90% got it before the age of 10, when the initial infection was not too serious a disease. Our immune systems can fight this virus and keep it dormant. Occasionally, however, we might have a flare-up, which would be called shingles, also known as Herpes zoster, or just plain zoster. If you have heard of shingles, you've probably heard something like 'intensely painful' in the same breath. In older adults, the pain can last for months (as postherpetic neuralgia or HPN), and feels like your nerves are on fire.  I've never had it, and I don't want it. Actually, it's the kind of thing you would only wish on your worst enemy.

It's not entirely clear what causes shingles, but it only happens in people who had chicken pox, and it is more common in people with weakened immune systems, especially over age 50. According to some reports, if people susceptible to shingles are exposed to the live chicken pox virus, the immune system boosts its defenses against the virus, pushing the next bout of shingles into the distant future. On the other hand, someone with an active shingles rash can spread the virus to non-immune people, who then develop chicken pox.

The US CDC estimates there are about 1 million shingles cases each year, with 10 cases/ 1000 adults over 60. Between 1 and 4% of these will be hospitalized. Overall , Americans who live to be 85 years old have a 50% chance of suffering a bout of shingles. The incidence of shingles has been on the rise in the US, but apparently the rise goes back to before 1995, so cannot be entirely due to the vaccination program. The CDC states that there is no evidence the vaccination program has increased the rate of shingles. Nevertheless, the NHS in the UK lists a possible rise in shingles cases as the main argument against a varicella vaccination program.

Great stuff. To model the effects of a vaccine program, we would need to model this complicated viral transmission system, including years of latency in which the virus is inactive. The frequency of re-exposure to the virus plays a part in the dormancy period and reactivation rate of shingles. The cell-mediated immunity seems to be an important factor, and this varies in different life stages. To predict the effects would require a good model for social contact between, say, school children, babies and grandparents. School and nursery settings are the main places where the disease is spread, and there is a marked seasonal variation corresponding with the school year.

What can we predict about introducing a vaccine?

Well, firstly, the number of cases of the disease will decline. The direct societal costs of the disease will go down. (Success!) The number of people exposed to the virus will also decline. Some of those  will develop shingles because their immune systems did not get the boost provided by community exposure to the virus. Shingles goes up. (Failure!) However... time goes by. Eventually, those people who were immunized grow up and are not susceptible to shingles (success!). Only, not according to the CDC, which says that shingles can occur in anyone who has had the chicken pox virus, whether via the illness or through vaccination. (Failure!) But... people who have been vaccinated are 'less likely' to develop shingles. So if you get immunized and live to 85 years old, your chances of suffering a bout of shingles go from 50% for a wild-type case to 22% for immunization... maybe. Are you confused yet? Basically, there isn't a lot of data available to understand this part. A lot depends on how the susceptibility to both 'breakthrough' chicken pox and to shingles changes over time in people who received the vaccine.

Normally, adults who get chicken pox for the first time suffer a 10x greater rate of complications than children. Many more end up in hospital and with more serious complications. Hopefully, the immunity provided by the vaccine will be sufficient to avoid many cases in adults, but it is too early to tell. We would have to know how the immunity provided by the vaccine evolves over time. And since it was only licensed in 1995, we just don't know that yet. As far as anyone knows, the immunity seems to last somewhere between 6 and 20 years in different people, but it's difficult to measure, because exposure to someone who actually has the disease boosts the immunity. For some people at least, booster shots may be needed.

Anyway, varicella virus is making it's way through the local neighborhood. Neighbors are discussing 'pox parties' and the differences between immunity through vaccination vs wild-type disease. I can't turn back the clock on either myself or my kids, and I don't think the arguments for vaccination are entirely clear because the long-term effects are not known. I prefer to believe that my immunity will continue to last through my adult life, and I won't need a booster. Thankfully, no one in my family has suffered significant consequences from the wild-type chicken pox disease. It doesn't seem severe to me, so I am not unhappy about the NHS decision to hold off on a universal vaccine program.

References:
[1]  Zhou F, Ortega-Sanchez IR, Guris D, Shefer A, Lieu T, Seward JF.  An economic analysis of the universal varicella vaccination program in the United States. J Infect Dis. 2008 Mar 1;197 Suppl 2:S156-64.

[2] http://www.cdc.gov/shingles/hcp/clinical-overview.html  Updated: Oct. 23, 2012. Retrieved: Dec. 3, 2012.

[3] P D Welsby, Chickenpox, chickenpox vaccination, and shingles, Postgrad Med J. 2006 May; 82(967): 351–352. doi:  10.1136/pgmj.2005.038984 PMCID: PMC2563790
[4] Lieu TA, Cochi SL, Black SB, Halloran ME, Shinefield HR, Holmes SJ, et al. Cost effectiveness of a routine varicella program for US children. JAMA 1994; 271: 375-81.doi:10.1001/jama.1994.03510290057037Note: This analysis relied on a $35 cost for the vaccine, which is far below the $80 cost for a single shot, much less the $160 for the two shots now required in most areas.
[5] Susan A. Galea, Ann Sweet, Paul Beninger, Sharon P. Steinberg, Philip S. LaRussa, Anne A. Gershon, and Robert G. Sharrar, The Safety Profile of Varicella Vaccine: A 10-Year Review
 J Infect Dis. 197 (Supplement 2): S165-S169. doi: 10.1086/522125