互惠互利

T.C*_*tor 3 python patsy

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

patsy.dmatrices('X + X**(-1)', X)
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ith 6

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

所以如果我们想计算sin(1 / X). 但我们没有(我们为什么要这样做?)。我们只想要普通的1 / X。那我们怎么做呢?

好吧,我们可能会很棘手:我们需要一个函数调用来欺骗 patsy 的解析器忽略/并将其提供给 Python —— 但是没有任何内容表明该函数必须执行任何操作。我们可以定义一个识别函数:

def identity(value):
    return value
Run Code Online (Sandbox Code Playgroud)

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

而事实上,这一招是如此得心应手那懦夫已经预定义的功能给你,并将它作为一个内置的I(...)。通常,您可以将其I(...)视为一种引用运算符——它是一种说“嘿,patsy,请不要尝试解释该区域中的任何内容,只需将其传递给 Python kthx”的一种方式。

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

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