Osteomyelitis and the microbiome

A reader asked me to research and give speculation on Chronic recurrent multifocal osteomyelitis (CRMO). The reader has been seeing an increasing number of patients referred to her with this diagnosis. ( “a prevalence of around one in a million patients” [2018]) There are some 450+ studies on PubMed.

The relationship of inflammatory bowel disease (IBD) and chronic recurrent multifocal osteomyelitis (CRMO) is understood as extraintestinal rheumatic manifestations. CRMO is a chronic, relapsing, inflammatory, noninfectious disorder of the skeletal system of unknown origin. The disease course is not always recurrent. The association of CRMO and ulcerative colitis (UC) is very rarely reported. [2019]

“Chronic non-bacterial osteomyelitis (CNO) or chronic recurrent multifocal osteomyelitis (CRMO) is an autoinflammatory disorder characterized by sterile bone osteolytic lesions…  More frequent manifestations not directly related to bone involvement were myalgia (12%), …and gastrointestinal symptoms (8%). ” [2018]

  • “that predominantly affects children… Laboratory studies can be normal,” [2018]
  • “, the potential for direct infectious causation or indirect causation by infectious stimulation of immunity cannot be entirely excluded.” [2011]
  • “Other disease associations with chronic multifocal osteomyelitis….. Inflammatory bowel disease, especially Crohn’s” [2011]

My initial probe was pub med where I found just over 400 studies of CRMO. What I noticed reviewing these was a number of studies citing “Chronic nonbacterial osteomyelitis”. This caused me to ask the question, is CRMO actually osteomyelitis with multiple bacteria involved (my “bacteria consortium” model) — and no single known bacteria cause identified?

Bacteria Associated?

Osteomyelitis has been reported to be associated with the following:

  • Mycobacterium fortuitum [2012]
  • Coxiella burnetti — Q Fever [2011] [1998]
  • Staphylococcus aureus, Staphylococcus epidermidis [2008]
  • Corynebacterium [2016]
  • “The total positive rate of culture for bacterial OM was 81.82%, with Staphylococcus aureus being the most frequently detected pathogen (44.70%). ” [2019]

A Single Strong Candidate Gut Bacteria

“A recent paper in the journal Nature discusses experiments that provide a link between a certain gut bacteria, diet, and osteomyeltis (an autoinflammatory bone disease).  Osteomyelitis occurs when there is a bacterial infection of the bone marrow.  It is often treated with antibiotics but sometimes surgery and amputation are necessary.

The discovery that diet could alter the progression of the disease led the researchers to investigate the microbiome of these mice.  The mice with low fat diets had higher amounts of Prevotella and lower amounts of Lactobacillus when compared to normal mice.  The reverse was true for the high fat diet mice, they had much less Prevotella and much more Lactobacillus in their guts, which better represents the composition in normal mice.

To further investigate if Prevotella may be causing the disease, the researchers gave antibiotics to the low fat diet mice, which destroyed the Prevotella population, and decreased the symptoms of the disease.

Finally, the researchers performed microbiome transplants into germ-free mice that were susceptible for osteomyeltis.  Any germ-free mouse that received a transplant high in Prevotella and then was fed a low fat diet developed the disease.  However, any mouse that received a transplant that was low in Prevotella, even if that mouse was on a low fat diet, did not develop the disease. ” [2014]

This appears to have additional evidence:

Bottom Line

There is an absence of microbiome studies for CRMO. I have added this official diagnosis to the symptoms list in the hope that we may as citizen scientists may slowly build up data on this.

If we run with the Prevotella hypothesis — then looking at our database for Prevotella (which is seen in only 54% of the samples) we have:

With the following to be avoided:

Notes from a reader

Sometime a reader sends a long email that provide very useful experience, and often encouragement for the approach/model that I am advocating. For my posts, I prefer to keep strictly to PubMed studies and not mix in personal experiences etc. I also like to read of people success in finding their own paths towards health.

I  just wanted to write and thank you for a couple of things, first, getting back to me a few months ago and suggesting zinc and vitamin A. I think that helped.

Meanwhile, the second thing I wanted to thank you for is that I recently had a relapse or flare-up, whatever you want to call it, such that I had not felt as bad since 2015. I took a fresh look at your materials and changed a few things and instantly felt better.
So much better, in fact, that I wonder if it would be worth while for you to add another lens to the way you look at the microbiome. 

Specifically, I am wondering if you might want to look at how various foods, bacteria, prebiotics etc. affect neurotransmitters. I ask because the transformation I experienced the other day upon eating a quarter of a cup of sesame seeds, two apples, and a package of candied pineapple) after having some beef was transformative within minutes and hours, and I can’t think of anything that could work that quickly except maybe the impact of neurotransmitters on neurons in the gut.

I’ll outline what happened to me the other day so you know what I mean. It’s not particularly methodical  but that’s just not how my brain is working right now.

I took another look at your front page, noticed the emphasis on bifido bacteria, and the suggestion to eat sesame.

1) I also noticed the suggestion to eat two apples a day.

2) One thing I have known for a couple of years is that I feel better if I eat a lot of beef. Because it is supposedly not good to eat too much and especially because it is very expensive, I try to get around it by eating fish, eggs, lamb (weirdly, lamb is less expensive than beef currently) etc.

On this particular day, last week, I could not walk a block, or upstairs in my house, without feeling out of breath. This came on several days of needing to rest, etc., and probably an insidious onset for several months. There was some family stress, plus I was sick with three different viruses between the end of December and February and  I was panicked that I was going to go back to my 2015 level of being sick.

I didn’t think I could  physically make it to the store to buy the sesame and apples so I called a friend to help me but she was leaving town. So…

After not having  beef much at all for a few weeks, I ate a couple of large beef Polish sausages and that perked me up mentally and physically  enough to go to a couple of different stores for what I needed.

Then because I was hungry, I did something impulsive which is buy a bag of candied pineapple at the produce store and eat the whole thing. I instantly felt energized and euphoric and figured it was the sugar.

When I got home I ate a quarter cup of organic sesame seeds and an apple. 

I continued to feel energetic and euphoric all evening without a crash.

That was about three days ago. Since then I have reverted to what I was doing food-wise when I felt my best, a couple of years ago. For breakfast, every day for now, stir-fried beef w/ sesame seeds, a huge serving of purple cabbage cole slaw, broccoli, and an apple. Later in the day, dark chocolate, almonds, more apples, coleslaw, and broccoli.

Meanwhile I am also taking (and have been) turmeric, bromelain, nattokinase, and NAC, plus meds for allergies / asthma and an antidepressant, plus dark chocolate and almonds. 

What I have read since then is that

* pineapple is one of the foods highest in seratonin, though of course dietary seratonin does not cross the blood-brain barrier.  
* Sesame is one of the foods highest in precursors to glutamate and seratonin.
*Apples help with acetylcholine.

I can’t explain the beef. I know it’s high in B12 but I’ve been supplementing that anyway, so eating beef shouldn’t make a dramatic instant difference.  I know it’s high in iron but I have had my iron tested again and again and it’s always good.  What I will say is I often feel extraordinarily well after I eat it, sometimes like…this will sound weird…my blood is singing.

Thinking about this reminds me of a time when I was about 30, I had been eating a pretty much vegetarian diet and not much pasta, and I went home to visit my parents and had a huge dinner of spaghetti with meat sauce. My drive on the way home was the first time I had experienced the “singing blood” and I attributed it to the carbs in the pasta but now I think it was probably the beef in the sauce, since I hadn’t had beef in a long time. 

There is something with those things that make me feel better *immediately*. For the past several days I have had a TBS of sesame seeds a few times a day and I always feel better after — specifically, happier and more alert.
About 20 years ago, I went through a period where my health was really good – no allergy pills needed, no asthma meds, no antidepressants. As it happens, at that time, I lived in the part of the country I do now so I attributed it to different allergens than the former place. But it is also true that at that time, just because I like sesame and my husband was often out in the evening, I would sometimes just have a quarter of a cup of sesame for dinner, just because I liked it. Weird, I know, but now I wonder if that is the real reason why I felt so good during that period of my life.

Anyway, in closing, I want to say I think of you often with appreciation and have told a lot of people about you and I hope you feel better soon. And I am in the process of finally looking for a full time job after stopping work at the end of 2015…I will let you know how it turns out.

With much gratitude,

Bottom Line — some Research for me to do

This email definitely intrigued me. This lense will be explored in research over the next weeks. For the moment, you have a user’s experience to work from.

Data Science – Hunting for bacteria related to Symptoms

Some smart readers wrote saying that they are familiar with R but not the microbiome. This post is intended to kickstart them on a simple desired goal:

Which bacteria (or combination of bacteria) are associated with certain symptoms.

We have 240 symptoms and thousands of bacteria … oops, a big problem. We do not have a lot of microbiomes with symptoms list — so we are likely forced to deal with only the most common symptoms at present.

Information about bacteria is layered

A quick read on wikipedia on bacteria taxonomy may help. If you just grab the Taxonomy file, you will see the species counted in with it’s parent genus, who is counted in with family, etc… not the best scenario for analysis.

To simplify out matters, I have done extracts on each layer and dropped them at http://lassesen.com/ubiome/

So to load one layer, it’s just a few lines

library(tidyverse)
Species <-read_csv(“http://lassesen.com/ubiome/TaxonomyByspecies.csv&#8221;)
symptoms <-read_csv(“http://lassesen.com/ubiome/Symptoms.csv&#8221; )
samplesymptom <-read_csv(“http://lassesen.com/ubiome/SampleSymptom.csv&#8221;)
samplesWithTitle <- inner_join(samplesymptom, symptoms, by=”symptomId” )

Looking at this one, we find some 2,181 columns (species) and a sampleId (that matches that in symptoms).

From my prior post, you can see how we can get the most common symptom (symptomId=1,”General: Fatigue”) and then a list of sampleId with:

HasFatigue <-samplesWithTitle %>% filter(symptomId==1)

We need to only include observations that reported ANY symptoms, which is easy to do:

PeopleWithSymptoms <- samplesymptom %>% group_by(sampleId) %>% summarize(peopleWith=n()) %>% arrange(peopleWith)

Next we joins this with the level of taxonomy we wish to explore.

SpeciesWithSymptoms <-merge(PeopleWithSymptoms ,Species, by=”sampleId”)

We next put the sets together and set symptomId to 0 for those without fatigue. We have 47.5% of the records with Fatigue.

fulldata <- left_join(SpeciesWithSymptoms,HasFatigue,by=”sampleId”)
fulldata$symptomId =ifelse(is.na(fulldata$symptomId),0,fulldata$symptomId)
#We need to remove the symptom_name
drops <- c(“symptom_name”)
regdata <-fulldata[, !(names(fulldata) %in% drops)]

Picking the Model

I went with a simple linear model for the sake of illustration and toss everything at it!

test <- lm(symptomId ~ .,regdata)

We end up getting a rather long report back:

Where there is a + sign, it indicates increased risk of fatigue as the numbers of bacteria increases, -sign decreased risk of fatigue as the numbers of bacteria increases.

I can now redo it, picking just a few bacteria:

and then looking at the statistics, we see that there is no statistical significance for this relationship (we want to see a p-value < 0.001)

That’s it. No revelations — just an illustration of walking the path. All of the code for above is below.

library(tidyverse)
Species <-read_csv(“http://lassesen.com/ubiome/TaxonomyByspecies.csv&#8221;) symptoms <-read_csv(“http://lassesen.com/ubiome/Symptoms.csv&#8221; ) samplesymptom <-read_csv(“http://lassesen.com/ubiome/SampleSymptom.csv&#8221;) samplesWithTitle <- inner_join(samplesymptom, symptoms, by=”symptomId” ) HasFatigue <-samplesWithTitle %>% filter(symptomId==1)
PeopleWithSymptoms <- samplesymptom %>% group_by(sampleId) %>% summarize(peopleWith=n()) %>% arrange(peopleWith)
SpeciesWithSymptoms <-merge(PeopleWithSymptoms ,Species, by=”sampleId”)

fulldata <- left_join(SpeciesWithSymptoms,HasFatigue,by=”sampleId”)
fulldata$symptomId =ifelse(is.na(fulldata$symptomId),0,fulldata$symptomId)
drops <- c(“symptom_name”)
regdata <-fulldata[, !(names(fulldata) %in% drops)]
test <- lm(symptomId ~ .,regdata)

Doing a run with Phylum,

Phylum <-read_csv(“http://lassesen.com/ubiome/TaxonomyByPhylum.csv&#8221;) symptoms <-read_csv(“http://lassesen.com/ubiome/Symptoms.csv&#8221; ) samplesymptom <-read_csv(“http://lassesen.com/ubiome/SampleSymptom.csv&#8221;) samplesWithTitle <- inner_join(samplesymptom, symptoms, by=”symptomId” ) HasFatigue <-samplesWithTitle %>% filter(symptomId==1)
PeopleWithSymptoms <- samplesymptom %>% group_by(sampleId) %>% summarize(peopleWith=n()) %>% arrange(peopleWith)
PhylumWithSymptoms <-merge(PeopleWithSymptoms ,Phylum, by=”sampleId”)
fulldata <- left_join(PhylumWithSymptoms,HasFatigue,by=”sampleId”)
fulldata$symptomId =ifelse(is.na(fulldata$symptomId),0,fulldata$symptomId)
drops <- c(“symptom_name”)
regdata <-fulldata[, !(names(fulldata) %in% drops)]
test <- lm(symptomId ~ .,regdata)

We find statistical significance with 45% explained by the phylum.

Sudden Onset ME Flare – uBiome One Week Later

I just received my uBiome report for a sample taken 6 days after a sudden onset ME flare. It was sudden onset because over 15 minutes I could feel my entire body shift and booked off sick for the rest of that day (and following week). The cause was stress, the cause of 40% of ME cases according to studies (the other 60% were infections).

I have two normal health ubiome for reference (each at least 6 months apart). As you can see with this first chart, three important groups did a nose dive.

Only Lactobacillus Helveticus (not in probiotic that I was taking)

This is repeated with other groups:

Other items are unchanged, such as diversity

And looking at various levels of bacteria, nothing jumps out

Microbiome Site Analysis

I uploaded the JSON to
http://microbiomeprescription.com/upload , and then look at various reports.

What shows up in the comparison is that High Counts across all conditions went up by 30%.

Oldest on left, newest on right

Some specific jumps:

In terms of the experimental End Produces, we also see some interesting shifts (most numbers were roughly the same)

Large drops in following genus (was normal-range earlier and often went down to -98%)

  • Akkermansia
  • Anaerococcus
  • Dialister
  • Enterobacter
  • Porphyromonas
  • Staphylococcus
  • Succiniclasticum

Major increases in following genus:

Bottom Line

First item is that this is likely a unique report — 6 days after onset. A diagnosis of ME/CFS classically requires 6 months of extensive no-results testing, so any ubiome test result would be after a significant progression of microbiome shifts.

Lactic acid producers has crashed, histamine and hydrogen peroxide producers have increased. Significant shift towards a IBS/IBD profile.

Probiotics

After preparing this post, I started with Enterogermina (4 Bacillus clausii in suspension) and within 12 hours found significant changes including:

  • Stopping high frequency stool movements that had been ongoing for 4 days
  • Change of mood – from borderline depression to very mellow and very very laid back.

It was interesting to note the list of avoid

Plans going forward (reduce the high ones)

One of the items, choline deficiency, means that I should cut out my usual 2 eggs each morning because they are high in choline.

Some of the strong avoids were interesting (and unexpected)

Building a model of Symptoms

We will continue onwards from my last post . Our first step is to determine how many clusters (groupings) of the symptoms that our current data supports.

We do this by trying every size up to 25 and then inspect the chart. The first part is pretty standard R code.

symptoms <-read_csv(“http://lassesen.com/ubiome/SymptomsObservations.csv&#8221;) scaled=scale(symptoms) par(mfrow = c(1, 1)) wss <-0 for (i in 1:25) { km.out <- kmeans(scaled, centers = i, nstart = 20, iter.max = 50) wss[i] <- km.out$tot.withinss }

We then go and drop this data on a plot:

plot(1:25, wss, type = “b”, main=”Ability to decompose symptoms”, xlab = “Number of Clusters”, ylab = “Within groups sum of squares”)

The chart indicate that we likely only have two clusters that are distinct. While our hope was to be able to better cluster people by their symptoms — there is just not enough data yet.

We can look at just 2 clusters with this code

km.out <- kmeans(scaled, centers = 2,nstart = 20, iter.max = 50) km.out

This gives us a list(km.out$cluster) showing which symptom belongs to which group. We then compute the average (mean) for each group and each symptom. We then do some manipulation to change the structure of the table so we get symptom, average in Group1, average in Group 2.

symptoms$cluster=km.out$cluster
group1 <-aggregate(symptoms, by=list(symptoms$cluster),mean) %>% gather(symptom,group,-cluster) %>% filter(cluster==1)
group2 <-aggregate(symptoms, by=list(symptoms$cluster),mean) %>% gather(symptom,group,-cluster) %>% filter(cluster==2)
colnames(group2) = c(“c”,”symptom”,”group2″) colnames(group1) = c(“c”,”symptom”,”group1″) report<-merge(group1,group2,by=”symptom”) %>% select(symptom,group1,group2)
report
We see that one group has more people in the 40-60 range.

We can then sort the symptoms by the differences between group:

report %>% arrange(desc(group2-group1))

We see that one group has a high rate of neurological issues and the other does not.

For symptoms that do not vary much between the groups we see a lot of official diagnosis that are not ME/CFS like –

Building a model for ME/CFS only

The above was done for ALL samples uploaded — a mixed bag. As see, we could classify by symptoms into a ME/CFS group (Group 2) and a non ME/CFS group (Group 1).

With the above R-Scripts we can apply it to a subset that we define by selecting one or more symptoms as being required. For ME/CFS: GeneralFatigue.

This gives us 144 observations

And the same code as above

Again the chart suggests that two clusters is what the data supports.

Create the report, as above:

And now the symptoms that MOST separate the groups. We see that one group was various symptoms — having any would drop them into Group 1.

Looking at what least separate we see a lot of symptoms with no observations that also had general fatigue. Many of these symptoms are associated with ME/CFS — This implies that the picking of
general fatigue alone, was likely a bad choice.

BOTTOM LINE

This post intent was NOT to discover an interesting fact, but to show how you can explore the data (and hopefully discover an interesting fact that you will share).

To make your life easier, I have the R code needed below to do your investigations.

library(tidyverse)
symptoms <-read_csv(“http://lassesen.com/ubiome/SymptomsObservations.csv&#8221;) meSymptoms <- symptoms %>% filter([YOUR ITEM 1]==1,[YOUR ITEM 2]==1)
dim(meSymptoms) #see how many rows you have

par(mfrow = c(1, 1))
wss <-0
for (i in 1:25) {
# Fit the model: km.out
km.out <- kmeans(meSymptoms, centers = i, nstart = 20, iter.max = 50)
# Save the within cluster sum of squares
wss[i] <- km.out$tot.withinss
}
plot(1:25, wss, type = “b”, main=”Ability to decompose ME symptoms”,
xlab = “Number of Clusters”,
ylab = “Within groups sum of squares”)

meSymptoms$cluster=km.out$cluster
group1 <-aggregate(meSymptoms, by=list(meSymptoms$cluster),mean) %>% gather(symptom,group,-cluster) %>% filter(cluster==1)
group2 <-aggregate(meSymptoms, by=list(meSymptoms$cluster),mean) %>% gather(symptom,group,-cluster) %>% filter(cluster==2)
colnames(group2) = c(“c”,”symptom”,”group2″)
colnames(group1) = c(“c”,”symptom”,”group1″)
report<-merge(group1,group2,by=”symptom”) %>% select(symptom,group1,group2)
report %>% arrange(desc(abs(group2-group1))) #most different
report %>% arrange(abs(group2-group1)) #least different

Caution

When the number of observations go low, you may get no meaningful results. Example:

Just 36 rows

We expect to see a big drop initially and then a clear “elbow” in the curve. There was none appearing with the above.