Patsy的权力不允许负整数,因此,如果我们有一些系列数据X
,
patsy.dmatrices('X + X**(-1)', X)
返回错误。如何将X的倒数加到这样一个公式?
答案 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年前做到了这一点,我想不出任何足够好的东西可以做到值得打破兼容性。)