2013-05-21 75 views

回答

7

懦夫不是件一般非线性模型确实有用,但你链接到页面上的模型是非线性的一种特殊模型 - 他们使用线性模型拟合法(OLS),并将其应用于非线性变换的基本变量。一个标准且非常有用的技巧是将相同变量的多个非线性变换组合起来,以便有效地拟合更一般的曲线。为此,patsy非常有用。

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

唯一需要注意的是,如果你想编写一个使用python运算符的转换,它与patsy运算符冲突。就像,如果你想在你的转换中使用+**,那么你必须小心确保patsy不会解释它们本身,并将它们留给python。这里的技巧是,patsy会忽略出现在函数调用内部的任何运算符(或者patsy不理解的其他复杂python表达式,但大部分是函数调用)。所以如果你写"x1 + np.log(x2 + x3)",那么patsy会把它当作两个预测变量,x1np.log(x2 + x3) - 你可以看到它解释了第一个+,但是它让第二个单独为python解释。

但是如果您想要将两个变量加在一起并将它们用作预测因子而不考虑日志呢?那么,从我们已经知道的,我们可以想出一个简单的黑客攻击:我们可以定义一个函数,它返回它的输入(标识函数),并调用它,如:"x1 + I(x2 + x3)"。现在函数调用I(...)将防止patsy看到第二个+,但是当我们实际评估术语I(x2 + x3)将与x2加相同。

有用的是,patsy会自动提供一个叫做I()的函数,它可以像这样工作,它总是可以使用。

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

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

+0

我们可以使用标识函数创建一个虚拟或交互吗?像我可以构造一个像$ I(x1 *(x2 =='USA'))$? – xappppp