Python 用statsmodels和patsy拟合精确方程

Python 用statsmodels和patsy拟合精确方程,python,statistics,curve-fitting,statsmodels,patsy,Python,Statistics,Curve Fitting,Statsmodels,Patsy,Statsmodels允许使用patsy和Statsmodels.formula.api使用R型公式进行方程拟合。我想在一个数据框架中使用列来适应一个特定的函数,然而,我似乎只能接近。例如,如果我有以下数据框,其中包含列['A','B','C','D'],并希望拟合以下形式的方程式: y = (A + B) / D 我可以将公式字符串写成y~(A+B):D-1,它产生两个系数:A:D和B:D。然后我可以做一些代数运算,去掉其中一个前面的系数,但不能两者都去掉 有没有一种简单的方法来拟合这种形式

Statsmodels允许使用patsy和
Statsmodels.formula.api
使用R型公式进行方程拟合。我想在一个数据框架中使用列来适应一个特定的函数,然而,我似乎只能接近。例如,如果我有以下数据框,其中包含列
['A','B','C','D']
,并希望拟合以下形式的方程式:

y = (A + B) / D
我可以将公式字符串写成
y~(A+B):D-1
,它产生两个系数:
A:D和B:D
。然后我可以做一些代数运算,去掉其中一个前面的系数,但不能两者都去掉

有没有一种简单的方法来拟合这种形式的自定义函数,而不切换到scipy curve_fit或lmfit

编辑
为了澄清,我的目标是为D获得一个合适的值,让a和B成为存储在数据帧中的值。为了实现这一点,我生成了一个名为
D
的伪列1。因此,我已知的值是
y、A和B
,其中
D
是我的拟合参数。到目前为止,我得到了两个a结果,看起来像
y=a:D*a+B:D*B
,然后我可以提取得到类似
y=(a+B:D/a:D*B)/a:D的东西。
这很有效,只是我不希望系数在B前面。

你说“其中一个前面的系数”是什么意思?在您的特定示例中,不可能有唯一的解决方案,因为您可以(例如)将a、B和D全部乘以2(或任何非零常数),并得到一个等价的表达式。此外,不清楚您想要“拟合”什么,因为您的方程似乎没有为系数留下任何“空间”;您只是直接在数据列上执行代数。注意,patsy和R中的
指定了交互项而不是除法。你能澄清一下参数在哪里/是什么吗?如果您有一个解释性变量
x=(a+B)/D
,那么您只需创建一个新的变量或带有pandas的列即可。如果它是参数中的非线性函数,那么lmfit或curve_fit是目前比statsmodels更好的选择。也许曲线拟合在这里会是一个更好的选择。@DavidHagan:正如user333700所提到的,您可以创建一个
a\u+B
列,然后对其进行拟合。@BrenBarn ah。我明白你的意思。是的,对于这个例子来说,这肯定是可行的。但随着方程变得更加复杂,它可能会变得混乱。谢谢