gpt4 book ai didi

python - 在 statsmodels 中是否有等同于 R 的 nls?

转载 作者:行者123 更新时间:2023-12-05 07:37:33 25 4
gpt4 key购买 nike

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

最佳答案

考虑 scipy.optimize.curve_fit根据需要的类似 R.nls 的函数

关于python - 在 statsmodels 中是否有等同于 R 的 nls?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48505727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com