I agree that these reasons for move outs are solid; you certainly could not predict, prevent, nor control them. You can, however, minimize their effects going forward should these situations arise again.
Communications with residents is key.
1) Loss of income leading to failure to pay rent: this is something that most residents will never recover from. Give them a chance to leave before you file for eviction and have them sign an agreement that stipulates a payment plan. Make sure this plan includes a clause if a payment is missed; you will send the file to collections which will appear on their credit report until paid. Offer this as an alternative to filing for an eviction that will result in a judgement that will affect their credit and ability to rent as long as it is not satisfied. It also saves all parties the costs of the legal process.
2) Loss of a roommmate: allow the remaining resident to advertise for a replacement roommate and screen them like a new applicant. I would go to an income requirement of each household member needing to make 2.5x the rent ON THEIR OWN as opposed to 3.5x collectively. If you accept guarantors, the guarantor should make 5x the rent (just so you know they can meet their own obligations and assist your resident should the situation arise).
If I recall correctly; you are in a position to be able to replace residents quickly with new ones, so I would not worry too much about the turnovers as long as I could collect (or at least file for collection) on residents that leave owing you money. If you have units remaining vacant for too long on the other hand, I would worry.
You are doing everything else right.