在statsmodels中有相当于R的nls吗?

时间:2018-01-29 16:23:08

标签: python r statsmodels

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:模型缺少必需的结果变量”)。我并没有真正遵循这个建议。

0 个答案:

没有答案