Search code examples
pythoncurve-fittinglmfit

python global fitting for data-sets of different sizes


I was wondering if there is a way I can use LMfit to fit datasets that have different sizes with the same model with a some shared and some independent parameters.

This link is the closest I found to a similar question but it assumes the same x for all y.

Thanks for all advice and input


Solution

  • Per your comment that a scipy example is OK:

    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    
    y1 = np.array([ 16.00,  18.42,  20.84,  23.26])
    y2 = np.array([-20.00, -25.50, -31.00, -36.50, -42.00])
    comboY = np.append(y1, y2)
    
    x1 = np.array([5.0, 6.1, 7.2, 8.3])
    x2 = np.array([15.0, 16.1, 17.2, 18.3, 19.4])
    comboX = np.append(x1, x2)
    
    if len(y1) != len(x1):
        raise(Exception('Unequal x1 and y1 data length'))
    if len(y2) != len(x2):
        raise(Exception('Unequal x2 and y2 data length'))
    
    
    def function1(data, a, b, c): # not all parameters are used here, c is shared
            return a * data + c
    
    def function2(data, a, b, c): # not all parameters are used here, c is shared
            return b * data + c
    
    
    def combinedFunction(comboData, a, b, c):
        # single data reference passed in, extract separate data
        extract1 = comboData[:len(x1)] # first data
        extract2 = comboData[len(x1):] # second data
    
        result1 = function1(extract1, a, b, c)
        result2 = function2(extract2, a, b, c)
    
        return np.append(result1, result2)
    
    
    # some initial parameter values
    initialParameters = np.array([1.0, 1.0, 1.0])
    
    # curve fit the combined data to the combined function
    fittedParameters, pcov = curve_fit(combinedFunction, comboX, comboY, initialParameters)
    
    # values for display of fitted function
    a, b, c = fittedParameters
    
    y_fit_1 = function1(x1, a, b, c) # first data set, first equation
    y_fit_2 = function2(x2, a, b, c) # second data set, second equation
    
    plt.plot(comboX, comboY, 'D') # plot the raw data
    plt.plot(x1, y_fit_1) # plot the equation using the fitted parameters
    plt.plot(x2, y_fit_2) # plot the equation using the fitted parameters
    plt.show()
    
    print('a, b, c:', fittedParameters)