2

我正在尝试使用 statsmodles 计算非线性回归模型。特别是我在学习 patsy 语法时遇到了问题。

是否有任何教程或示例如何使用 patsy 语法来制定非线性模型?

特别是,如何使用 patsy 指定此示例 ( http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html )上的非线性模型?

非常感谢您提前

安迪

4

1 回答 1

8

Patsy 对于拟合一般非线性模型并不是很有用,但是您链接到的页面上的模型是一种特殊的非线性模型——它们使用线性模型拟合方法 (OLS),并应用它基本变量的非线性变换。一个标准且非常有用的技巧是组合同一变量的多个非线性变换,以便有效地拟合更一般的曲线。为此,patsy 非常有用。

你真正想知道的是如何在 patsy 中表达变量转换。这很容易。patsy 的工作方式,给定一个公式字符串 like "x1 + x2:x3",它会扫描并解释特殊的 patsy 运算符,比如+and :,然后剩下的东西 ( x1, x2, x3) 被解释为任意 python 代码。所以你也可以写"np.sin(x1) + np.log(x2):x3"或什么。

唯一需要注意的是,如果你想编写一个使用与 patsy 运算符冲突的 python 运算符的转换。就像,如果你想在你的转换中使用+**,那么你必须小心确保 patsy 不会自己解释这些,并将它们留给 python。这里的技巧是 patsy 将忽略出现在函数调用中的任何运算符(或其他 patsy 不理解的复杂 python 表达式,但主要是函数调用)。因此,如果您编写"x1 + np.log(x2 + x3)",那么 patsy 会将其视为两个预测变量,x1并且np.log(x2 + x3)- 您可以看到它解释了第一个+,但它只留下了第二个,让 python 来解释。

但是,如果您想将两个变量加在一起并将它们用作预测变量,而不用记录日志,该怎么办?好吧,根据我们已经知道的,我们可以想出一个简单的技巧:我们可以定义一个只返回其输入的函数(身份函数),然后调用它,例如"x1 + I(x2 + x3)":现在函数调用I(...)将阻止 patsy 看到第二个+,但是当我们实际评估该术语时,I(x2 + x3)它将与x2plus相同x3

有用的是,patsy 自动提供了一个名为的函数I(),它的工作原理是这样的,它总是可以使用的。

现在您知道了重现该页面上的示例所需知道的一切。对于第一个,公式是"x + I(x**2)"。对于第二个,公式是"x + np.sin(x) + I((x - 5)**2)"

对于最后一个示例,最简单的方法是使用 patsy 内置的分类编码支持:"x + C(groups)". (这C是另一个特殊的内置函数,它可以让我们调整分类数据的编码方式。这里我们只是用它来告诉 patsy,即使它groups看起来像一个数字向量——它的值是 0、1、2——在事实上我们应该把它当作分类的,每个值代表一个不同的组。然后 patsy 应用它的默认分类编码)

于 2013-06-15T17:57:50.537 回答