patsy中的互惠

时间:2015-09-09 15:57:00

标签: python patsy

Patsy的权力不允许负整数,因此,如果我们有一些系列数据X

patsy.dmatrices('X + X**(-1)', X)

返回错误。如何将X的倒数加到这样一个公式?

1 个答案:

答案 0 :(得分:3)

运算符的特殊含义在嵌入式函数调用中被关闭;所以如果你写X + 1 / x,那么patsy会将其解释为特殊的pat +/运算符,但是如果你写了类似X + sin(1 / X)的东西,那么patsy会继续解释+ 1}}作为一个特殊的patsy运算符,但整个sin(1 / X)表达式被传递给Python进行评估,Python会将/作为常规除法进行评估。

如果我们想要计算sin(1 / X)那就没关系。但我们不这样做(为什么我们呢?)。我们只想要简单的1 / X。那我们怎么做呢?

好吧,我们可能会很棘手:我们需要一个函数调用来欺骗patsy的解析器忽略/并将它交给Python - 但没有任何东西说函数必须任何事情。我们可以定义一个识别函数:

def identity(value):
    return value

然后在类似X + identity(1 / X)的公式中使用它。

事实上,这个技巧非常方便,patsy已经为你预定了一个功能,并将其作为一个名为I(...)的{​​{3}}提供。一般来说,你可以认为I(...)是一种引用算子 - 这是一种说“嘿patsy,请不要尝试解释这个区域中的任何东西,只需将其传递给Python kthx”。

所以回答你原来的问题:尝试写dmatrix("X + I(1 / X)", data)

(下一个问题:为什么这个奇怪的黑客攻击函数I和所有东西?答案就是这就是R在30年前做到了这一点,我想不出任何足够好的东西可以做到值得打破兼容性。)