3

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

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

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

4

1 回答 1

6

运算符的特殊含义在嵌入式函数调用中被关闭;因此,如果您编写X + 1 / xthen patsy 会将其解释为特殊的 patsy和+运算/符,但如果您编写类似 的内容X + sin(1 / X),则 patsy 会继续将作为常规划分。+sin(1 / X)/

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

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

def identity(value):
    return value

然后在像这样的公式中使用它X + identity(1 / X)

事实上,这个技巧非常方便,以至于 patsy 已经为您预定义了一个函数,并将其作为内置的名为I(...). 通常,您可以将其I(...)视为一种引用运算符——这是一种说“嘿,帕西,请不要尝试解释该区域中的任何内容,只需将其传递给 Python kthx”的方式。

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

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

于 2016-04-11T02:55:17.607 回答