Dissociation constant from single-molecule experiments

analysis
smFRET
Author

Jochem H. Smit

Published

July 18, 2024

How do we find a dissociation constant from single-molecule FRET data?

Lets consider a simple two-state binding experiment where a protein binds a ligand, and upon binding there is a conformational change such that the bound state can be descriminated from the apo state by a single-molecule FRET experiment.

(For the smFRET initiated: we are here talking about a confocal solution based ALEX smFRET experiment)

\[ \ce{P + L <=>[k_{on}][k_{off}] PL} \]

The differential equations for this reaction scheme are:

\[ \begin{eqnarray} \frac{\partial [P]}{\partial t} = - k_{on} [P][L] + k_{off} [PL] \\ \frac{\partial [L]}{\partial t} = - k_{on} [P][L] + k_{off} [PL] \\ \frac{\partial [PL]}{\partial t} = k_{on} [P][L] - k_{off} [PL] \end{eqnarray} \]

We now want to find the dissociation constant \(K_d\), which is defined as:

\[ K_d \equiv \frac{k_{off}}{k_{on}} \]

There are two main properties of single-molecule experiments important for the determination of \(K_d\):

  1. We don’t measure the concentration of the labelled protein, but rather we measure the fraction of either \(P\) or \(PL\) with respect to the total amount of labelled protein.
  2. The protein \(P\) is labelled and is present at low (~100 pM) concentrations. This means that the concentration of the ligand \(L\) will not notably decrease upon binding the protein when forming the complex \(PL\). Therefore, we can assume that the concentration ligand \([L]\) is always equal to the initial concentration ligand \([L_{0}]\).

Because of 1. we should write down how the fractions we measure relate to concentrations:

\[ \begin{eqnarray} \theta_P = \frac{[P]}{[P] + [PL]} \\ \theta_{PL} = \frac{[PL]}{[P] + [PL]} \end{eqnarray} \]

Where \(\theta_P\) and \(\theta_{PL}\) are now the fractions of apo protein and complexed protein, respectively. The denominators of the above expression is the total amount of protein and is therefore constant in time. Therefore, we can divide the differential equations above by this sum to transform the differential equations to now describe fractional populations instead of concentration.

\[ \begin{eqnarray} \frac{\partial \theta_P}{\partial t} = - k_{on} \theta_P[L_0] + k_{off} \theta_{PL} \\ \frac{\partial \theta_{PL}}{\partial t} = k_{on} \theta_P[L_0] - k_{off} \theta_{PL} \end{eqnarray} \]

Where we have also used the approximation that \([L] = [L_0]\) from 2 If we now further assume that the equilibrium is at steady-state, no changes in time occur anymore and we can set the left hand side of the equations to zero. Rearranging the equation then gives:

\[ \frac{k_{off}}{k_{on}} = \frac{\theta_P}{\theta_{PL}}[L_{0}] \]

or:

\[ K_d = \frac{\theta_P}{\theta_{PL}}[L_{0}] \] To sanity check: if the affinity goes down, eg \(k_{off}\) increases, \(K_d\) becomes a bigger nummer (small \(K_d\) = good binding), and the fraction of the free protein goes up as expected.

From this equation we can see that we can find the dissociation constant from a single smFRET measurement by simply multiplying the free/bound ratios of protein with the known concentration of ligand added, and no titration is needed.

Perhaps its surprising that there is a simple linear relationship between \(K_D\) the ratio of population fractions. Shouldn’t there be some kind of sigmoidal dependence?

Lets rearrange the previous result to calculate the actual fraction of free protein instead of the ratio:

\[ \begin{eqnarray} \frac{[L_0]}{K_d} &= \frac{\theta_{PL}}{\theta_{P}} \\ \theta_{P} &= \frac{1}{r + 1} \end{eqnarray} \]

Where \(r \equiv \frac{[L_0]}{K_d}\) and we have used \(\theta_P + \theta_{PL} = 1\). Lets plot the result for a range of ligand / dissociation constant ratios and plot the result:

Code
import plotly.express as px
import numpy as np
import polars as pl

# Calculate the fractions of P and PL given a ratio of L0 over Kd
r = np.logspace(-2, 2, 100, endpoint=True)
th_P = 1 / ( r + 1)
th_PL = 1 - th_P

# Create a Polars DataFrame
df = pl.DataFrame({
    'L0/kd': r,
    'P': th_P,
    'PL': th_PL
})

# Melt the DataFrame to long format
df_long = df.unpivot(index=['L0/kd'], on=['P', 'PL'], variable_name='Species', value_name='Value')

# Create the plot
fig = px.line(df_long, x='L0/kd', y='Value', color='Species', log_x=True,
              labels={'Value': 'Fraction P, PL', 'L0/kd': 'Ratio L0/Kd'},
              )
# Show the plot
fig.show()
Figure 1: Fractions of \(P\) and \(PL\) for a range of ratios of ligand vs \(K_d\)

And there is our sigmoid!

In summary, it turns out that in smFRET experiments we can find the \(K_D\) from a single measurement and there is no need for a titration of concentrations. Of course, for higher accuracy it is better to take multiple measurements around the \(K_d\) and least-squares fit the available data. Just make sure that the concentrations are around the \(K_d\).