互惠互利

Reciprocals in patsy

Patsy 的力量不允许负整数,所以,如果我们有一些系列数据 X

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

returns 一个错误。我如何将 X 的倒数添加到这样的 patsy 公式中?

运算符的特殊含义在嵌入式函数调用中被关闭;因此,如果您编写 X + 1 / x,那么 patsy 会将其解释为特殊的 patsy +/ 运算符,但如果您编写类似 X + sin(1 / X) 的内容,则 patsy 会继续将 + 作为一个特殊的 patsy 运算符,但是整个 sin(1 / X) 表达式被传递给 Python 来计算,并且 Python 将计算 / 作为常规除法。

所以如果我们想计算 sin(1 / X) 就可以了。但是我们不这样做(我们为什么要这样做?)。我们只想要普通的 1 / X。那我们该怎么做呢?

好吧,我们可以很狡猾:我们需要一个函数调用来欺骗 patsy 的解析器忽略 / 并将其提供给 Python -- 但没有任何内容表明该函数必须 任何事情。我们可以定义一个识别函数:

def identity(value):
    return value

然后在 X + identity(1 / X).

这样的公式中使用它

事实上,这个技巧非常方便,patsy 已经为您预定义了一个函数,并将其作为 built-in 提供,名为 I(...)。通常,您可以将 I(...) 视为一种引用运算符——这是一种表示 "hey patsy, please do not try to interpret anything in this region, just pass it through to Python kthx".

的方式

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

(下一个问题:为什么这个奇怪的 hack 函数 I 和所有东西?答案是 30 年前 R 就是这样做的,我想不出更好的方法值得打破兼容性。)