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())
Yes, that is what I think is going on, though they don't go into detail so I'm not certain. I assume this is somewhere in earlier papers and I just haven't found it yet.So is the idea that once they get f from fourier transformation, they're computing values for everything in the 0 < D < 0.3 range and calling that NII-RF? Or rather, if it's a fraction, they're computing it for every "bucket" of diffusion coefficients within a voxel and then expressing each bucket as a fraction of the whole?
Sorry, "ignoring" was the wrong word. I just meant that for some reason they aren't calculating/reporting a value ("NII-Free") that corresponds to those larger values of D in the same way "NII-RF" corresponds to small D (other papers using the same methods/equation do report a free value). You're right (or at least, it would be my guess too) that they still need to take the free fraction into account, in the denominator, to report all these values as fractions of the total.I don't know how the latter would work if they're not taking the free fraction into account but also I'm likely to be misunderstanding something here
I don't think it's circular. When we give age to the model, it can predict how much the brain metric would change due to age if ME/CFS status was held steady. For example, you can look at the 2nd plot above (the 1st 3d plot) and imagine the model is predicting a line for age but only in controls (ME/CFS status = 0). It's not unreasonable to think it can fit a nice slope for age. It just does it for the whole sample at once to get one slope for everyone.I guess the issue with controlling for age (or anything) with a statistical model is that usually we don't know exactly what the effect of the variable truly is. It's fine when we know for sure that age increases the variable by 1 each decade. But, when we are using our sample to calculate the effect that we will control for, it all becomes very circular, and possibly adjustments are spurious.
If the sample is restricted to a small age range, then it does decrease variance. And it also reduces the possibility of non-linear effects at extreme ages. So using a restricted age range increases the likelihood of detecting a true effect. But if a study fits a model where the age range is very wide, and still gets a significant result, I don't think it's inherently an issue.1. ideally we want to control as much as possible in the sample, so, in this case, maybe try to get all females in the age range 35 to 45 - or get a big enough sample that some stratification can be done to see if the effect shows up in different subsets
I'm not sure why what I posted would make you more suspicious of controlling for confounders.2. be even more suspicious of studies that make extensive use of models that control for 'confounders' than I was already
What I mean by circular is that the effect of age is calculated from the sample. If by chance something weird is going on in our sample that skews the relationship between age and the signals for some individuals, that might result in us making an adjustment that doesn't reflect what is true in the wider population.I don't think it's circular. When we give age to the model, it can predict how much the brain metric would change due to age if ME/CFS status was held steady. For example, you can look at the 2nd plot above (the 1st 3d plot) and imagine the model is predicting a line for age but only in controls (ME/CFS status = 0). It's not unreasonable to think it can fit a nice slope for age. It just does it for the whole sample at once to get one slope for everyone.