statsmodels
是否支持非线性回归到任意方程? (我知道有一些形式已经内置,例如用于逻辑回归,但我更灵活一些)
在解决方案https://stats.stackexchange.com/a/44249中关于非线性回归的问题,
代码位于R
并使用函数nls
。它有公式的参数用start = list(a1=0, ...)
定义。这些当然只是一些初步的猜测,而不是最终的拟合值。但与lm
相比,这里的不同之处在于参数不需要来自输入数据的列。
我已经能够使用statsmodels.formula.api.ols
作为R lm
的等价物,但当我尝试将其用于具有参数的等式(而不是输入/输入组合的权重)时),statsmodels抱怨没有定义的参数。它似乎没有与start=
相同的参数,因此引入它们并不明显。
statsmodels
中是否有不同的类或函数接受这些初始参数值的定义?
编辑:
我当前的尝试以及使用lmfit建议后的解决方法
from statsmodels.formula.api import ols
import numpy as np
import pandas as pd
def eqn_poly(x, a, b):
''' simple polynomial '''
return a*x**2.0 + b*x
def eqn_nl(x, a, b):
''' fractional equation '''
return 1.0 / ((a+x)*b)
x = np.arange(0, 3, 0.1)
y1 = eqn_poly(x, 0.1, 0.5)
y2 = eqn_nl(x, 0.1, 0.5)
sigma =0.05
y1_noise = y1 + sigma * np.random.randn(*y1.shape)
y2_noise = y2 + sigma * np.random.randn(*y2.shape)
df1 = pd.DataFrame(np.vstack([x, y1_noise]).T, columns= ['x', 'y'])
df2 = pd.DataFrame(np.vstack([x, y2_noise]).T, columns= ['x', 'y'])
res1 = ols("y ~ 1 + x + I(x ** 2.0)", df1).fit()
print res1.summary()
res3 = ols("y ~ 1 + x + I(x ** 2.0)", df2).fit()
#res2 = ols("y ~ eqn_nl(x, a, b)", df2).fit()
# ^^^ this fails if a, b are not initialised ^^^
# so initialise a, b
a,b = 1.0, 1.0
res2 = ols("y ~ eqn_nl(x, a, b)", df2).fit()
print res2.summary()
# ===> and now the fitting is bad, it has an intercept -4.79, and a weight
# on the equation 15.7.
给出lmfit
公式,它能够找到参数。
import lmfit
mod = lmfit.Model(eqn_nl)
lm_result = mod.fit(y2_noise, x=x, a=1.0, b=1.0)
print lm_result.fit_report()
# ===> this one works fine, a=0.101, b=0.4977
但是试图将y1,x放入ols似乎不起作用(“PatsyError:模型缺少必需的结果变量”)。我并没有真正遵循这个建议。