I think its a reasonable assumption if you have reasonable likelihood of infiltration actually happening. What I'm puzzled by (and it seems I'm not alone in this) is how to interpret lower RF compared to controls when controls probably have no infiltration.More restricted isotropic water, if intracellular, might logically indicate new cells coming in.
Yes that's my main thought--from the earlier glymphatics discussion, it seems like astrocytes serve as a buffer zone for water to help the parenchymal space maintain a fairly constant concentration. They do not change size fast enough to be particularly important to fluid flow but they have been observed to swell and contract dramatically. So my thought is that any restriction fraction seen in healthy brains is likely to represent what is stored in astrocytes.Astrocytes might change in water content significantly because they deal with housekeeping and might need to increase cytoplasmic volume considerably.
I guess the question is what else? My instinct says it would have to be a small space enclosed in hydrophobic boundaries.But even the assumption that restricted water has to be in cells seems fragile to me.
There are two lines of dicussions.Is someone able to summarize the discussion here in simpler English at some point for those of us with lower IQ’s? Is the study debunkable?
What I'm puzzled by (and it seems I'm not alone in this) is how to interpret lower RF compared to controls when controls probably have no infiltration.
I guess the question is what else? My instinct says it would have to be a small space enclosed in hydrophobic boundaries.
Ah okay I see the previous discussion about hindered fraction now. So the mystery is how you get a bigger proportion of extracellular water without an increased in hindered fractionThat would fit with more extracellular water )assuming everything is proportions) but agree it doesn't fit with more cells.
so it would have to be water in an extracellular matrix that doesn't exchange much with other compartments to end up in the restricted fractionThere is lots of water in extracellular matrix that doesn't move much - bound to sulphate residues etc.. But if it exchanges with other compartments very quickly then the separate phase may not be apparent. I spent about ten years working on water compartments before MRI became available. The most important thing I learnt was how complicated and counterintuitive it all was, even if the biological solutions had a simple elegance. The next thing I learnt was that almost everyone working in the field of water phases in articular tissue had all their basic concepts wrong. But five years later they admitted their mistakes. My recent foray into brain water with various eminent Norwegian groups suggests that none of them understand diffusion!!
And it seems like it would take a massive amount of ground work to be able to interpret correctly, if the findings aren't a proxy for neuroinflammation. Which seems more and more likely. If there is something here, my sense is that we'll make sense of it by working backwards once the mechanism of ME/CFS is already known, rather than being lead to the mechanism by these findings.Yes. And if the recent literature on CSF flux that I have been reading is anything to go by it is quite plausible that the whole idea of these fractions and compartments is bad physical chemistry. The data will mean something but maybe not what these names imply. Mathematical modellers, in my experience, only too often fail to understand the dynamic geometry at fine grain.
Technically I'm supposed to be good at math, they gave me a PhD. This is the first time in years I've been unfoggy enough to think about it though, so apologies for ramblingI'm not that good at math but I think the very free water (with diffusion > 2.5 μm2/ms) doesn't even enter their equation.
![]()
The second part represents the isotropic components, an integral from a to b where "a and b are the low and high diffusivity limits for the isotropic diffusion spectrum f(D)." Given the further explanation in the text, one is tempted to assume that a = 0.3 and b = 2.5 μm2/ms. That would explain why the free fraction is never mention in the paper.
Thanks for the explanation, that's really helpful. It's been quite a long time since I've done diff eq, I'm sure a lot has leaked out of my brain by now.because after they use this equation to figure out what the function f is, there is an additional step (which is kind of glossed over in the paper) where they use that function f to actually compute NII-RF (and the other values). And in that additional step they are ignoring the free fraction.
Yes, but my concern was that I thought the study had controls that were already well matched for age and sex, I thought they claimed that. So, I'd be surprised if controlling for those things made much difference. But, I'd have to go look at the table with demographics to be sure.
Hmm. I'd need to think about it more, but I think if they were well-matched for age, that would mean that without controlling for age, we can expect the predicted coefficient to be accurate (or at least not biased by age).
But the variance due to differing age among the cohort (e.g. if some individuals were 20 and some were 70) still adds noise to the model, making it more likely to not reach significance, while controlling for that variance can make it more significant.








#!/usr/bin/env python
# coding: utf-8
# In[118]:
import numpy as np
import pandas as pd
import statsmodels.api as sm
import plotly.express as px
import plotly.graph_objects as go
# In[180]:
base_age = np.random.normal(loc = 50, scale = 15, size = 20)
age = np.concatenate([base_age, base_age]) + np.random.normal(0, 0.5, 40)
mecfs_status = np.concatenate([np.full(20, 0), np.full(20, 1)])
brain_metric = (0.2 * age) + mecfs_status + np.random.normal(loc=0, scale=0.1, size=40)
df = pd.DataFrame({
"Age": age,
"ME/CFS Status": mecfs_status,
"Brain Metric": brain_metric,
})
df.head()
# In[181]:
X = sm.add_constant(df['ME/CFS Status'])
y = df['Brain Metric']
model = sm.OLS(y, X)
results = model.fit()
fig = px.scatter(df, x='ME/CFS Status', y='Brain Metric', color="Age", opacity=0.65)
fig.update_traces(marker=dict(size=10))
fig.add_traces(go.Scatter(x=X['ME/CFS Status'], y=results.predict(X), showlegend=False))
fig.update_layout(
width=500,
height=500,
title={
'text': "Regression with only ME/CFS Status (Matched for age)",
'y':0.95,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top'
}
)
fig.show()
print(results.summary())
# In[182]:
X = sm.add_constant(df[['ME/CFS Status', 'Age']])
y = df['Brain Metric']
results = sm.OLS(y, X).fit()
xrange = [X['ME/CFS Status'].min(), X['ME/CFS Status'].max()]
yrange = [X['Age'].min(), X['Age'].max()]
xx, yy = np.meshgrid(xrange, yrange)
pred = results.predict(sm.add_constant(np.c_[xx.ravel(), yy.ravel()]))
pred = pred.reshape(xx.shape)
# Generate the plot
fig = px.scatter_3d(df, x='ME/CFS Status', y='Age', z='Brain Metric', color="Age")
fig.update_traces(marker=dict(size=3))
fig.add_traces(go.Surface(
x=xrange,
y=yrange,
z=pred,
opacity=0.5,
colorscale=[[0, 'lightblue'], [1, 'lightblue']],
showscale=False,
))
fig.update_layout(
width=800,
height=600,
title={
'text': "Regression with ME/CFS Status and Age (Matched for age)",
'y':0.95,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top'
})
fig.show()
print(results.summary())
# In[ ]:
# In[184]:
base_age = np.random.normal(loc=50, scale=15, size=20)
age = np.concatenate([base_age, base_age + 10]) + np.random.normal(0, 0.5, 40)
mecfs_status = np.concatenate([np.full(20, 0), np.full(20, 1)])
brain_metric = (0.2 * age) + mecfs_status + np.random.normal(loc=0, scale=0.1, size=40)
df = pd.DataFrame({
"Age": age,
"ME/CFS Status": mecfs_status,
"Brain Metric": brain_metric,
})
df.head()
# In[185]:
X = sm.add_constant(df['ME/CFS Status'])
y = df['Brain Metric']
model = sm.OLS(y, X)
results = model.fit()
fig = px.scatter(df, x='ME/CFS Status', y='Brain Metric', color="Age", opacity=0.65)
fig.update_traces(marker=dict(size=10))
fig.add_traces(go.Scatter(x=X['ME/CFS Status'], y=results.predict(X), showlegend=False))
fig.update_layout(
width=500,
height=500,
title={
'text': "Regression with only ME/CFS Status (Unmatched ages)",
'y':0.95,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top'
}
)
fig.show()
print(results.summary())
# In[186]:
X = sm.add_constant(df[['ME/CFS Status', 'Age']])
y = df['Brain Metric']
results = sm.OLS(y, X).fit()
xrange = [X['ME/CFS Status'].min(), X['ME/CFS Status'].max()]
yrange = [X['Age'].min(), X['Age'].max()]
xx, yy = np.meshgrid(xrange, yrange)
pred = results.predict(sm.add_constant(np.c_[xx.ravel(), yy.ravel()]))
pred = pred.reshape(xx.shape)
# Generate the plot
fig = px.scatter_3d(df, x='ME/CFS Status', y='Age', z='Brain Metric', color="Age")
fig.update_traces(marker=dict(size=3))
fig.add_traces(go.Surface(
x=xrange,
y=yrange,
z=pred,
opacity=0.5,
colorscale=[[0, 'lightblue'], [1, 'lightblue']],
showscale=False,
))
fig.update_layout(
width=600,
height=600,
title={
'text': "Regression with ME/CFS Status and Age (Unmatched ages)",
'y':0.95,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top'
})
fig.show()
print(results.summary())