Search code examples
pythonlmfit

Using multiple independent variables in Python lmfit


I am trying to fit a model to some data. The independent variables are called A and B, and they are columns in a Pandas DataFrame. I am trying to fit with two parameters against y in the data frame.

Previously, with curve_fit from Scipy, I could do:

def fun(X, p1, p2):
  A, B = X
  return np.exp(p1*A) + p2*B

X = (df['A'].tolist(), df['B'].tolist())
popt, pcov = curve_fit(fun, X, df['y'].tolist())

But now, I'm using lmfit, where I cannot simply "pack" the independent variables like with curve_fit:

def fun(A, B, p1 = 1, p2 = 1):
  return np.exp(p1*A) + p2*B

model = Model(fun, independent_vars=['A', 'B'])

How do I run model.fit() here? The FAQ is not really helpful—what do I have to flatten in the first place?


Solution

  • I created a complete, working example with two independent variables:

    import pandas as pd
    import numpy as np
    from lmfit import Model
    
    df = pd.DataFrame({
      'A'      : pd.Series([1, 1, 1, 2, 2, 2, 2]),
      'B'      : pd.Series([5, 4, 6, 6, 5, 6, 5]),
      'target' : pd.Series([87.79, 40.89, 215.30, 238.65, 111.15, 238.65, 111.15])
    })
    
    def fun(A, B, p1 = 1, p2 = 1):
      return p1 * np.exp(A) + p2 * np.exp(B)
    
    model = Model(fun, independent_vars=['A', 'B'])
    fit = model.fit(df['target'], A = df['A'], B = df['B'])
    

    The trick is to specify all variables as keyword arguments in fit().