October 6, 2022

How to optimize the SRK/T A constant

The SRK/T formula

The SRK/T formula (1,2) has long been one of the most popular IOL calculation methods : it is still widely used and its optimized constant is often used to tune other formulas.

Inner working of the SRK/T formula. Figure from : Debellemanière G, Dubois M, Gauvin M, Wallerstein A, Brenner LF, Rampat R, Saad A, Gatinel D. The PEARL-DGS Formula: The Development of an Open-source Machine Learning-based Thick IOL Calculation Formula. Am J Ophthalmol. 2021 Dec;232:58-69.

What is an optimization ?

Optimizing a formula involves shifting its constant up or down, to obtain a mean prediction error equal to zero.

SRK/T Optimization process

The following code allows you to obtain the optimized A constant for a given dataset.

The OptimizeSRKT() function takes various variables as inputs : dataframe is the pd.DataFrame() object containing the data; col_AL , col_R, col_power, col_SE are the names of the related dataframe columns (string);  aconst_start (float) should be the closest value you can guess for the adjusted A constant. The SRKTES() function calculates the SRK/T SE prediction for a given eye / implanted IOL power.

The function will calculate the predicted SRK/T spherical equivalent, calculate the prediction error for each eye, then its mean for the whole dataset ; by adding the mean error to the A constant (it's a trick !), we'll quickly find the A constant leading to a prediction error equal to zero, which is the adjusted A constant.

def OptimizeSRKT(dataframe, col_AL, col_R, col_power, col_SE, aconst_start):
    dataframe['aconst'] = aconst_start
    dataframe['SRKTES'] = dataframe[[col_AL, col_R, 'aconst', col_power]].apply(lambda x : SRKTES(*x), axis = 1)
    dataframe['error'] = dataframe[col_SE] - dataframe['SRKTES']
    mean_error = dataframe.error.mean()
    while mean_error > 0.00001:
        dataframe['aconst'] += mean_error
        dataframe['SRKTES'] = dataframe[[col_AL, col_R, 'aconst', col_power]].apply(lambda x : SRKTES(*x), axis = 1)
        dataframe['error'] = dataframe[col_SE] - df['SRKTES']
        mean_error = dataframe.error.mean()
        print('Mean error : ', mean_error)
    print('Optimized SRK/T A constant : ', dataframe.aconst.unique()[0])
# Example : 

OptimizeSRKT(df, 'AL', 'R', 'Power', 'ES_postop', 118.0)

# Output : 
# Mean error :  0.0773036659614707
# Mean error :  0.007425076192446311
# Mean error :  0.0007240370609196819
# Mean error :  7.070440730831753e-05
# Mean error :  6.90546869455154e-06
# Optimized SRK/T A constant :  119.08180447676536

References

1- Retzlaff JA, Sanders DR, Kraff MC. Development of the SRK/T intraocular lens implant power calculation formula. J Cataract Refract Surg. 1990 May;16(3):333-40.

2- Retzlaff JA, Sanders DR, Kraff MC. Development of the SRK/T intraocular lens implant power calculation formula: Erratum. J Cataract Refract Surg. 1990;16(4):528.