2015-09-09 35 views
2

懦夫的權力不允許負整數,所以,如果我們有一些序列數據X倒數的帕齊

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

返回一個錯誤。我如何將X的倒數加到這樣一個可怕的公式中?

+0

是否(1/X)'也不允許? –

+0

不是,1是爲常量保留的。 –

+0

另外,'/'是在patsy中定義的,它會計算'1 + 1:X'。 –

回答

3

運算符的特殊patsy含義在嵌入函數調用中關閉;所以,如果你寫X + 1/x然後帕齊解釋,由於特殊的帕齊+/運營商,但如果你喜歡寫東西X + sin(1/X),然後帕齊繼續解釋+作爲一種特殊的帕齊運營商,但整個sin(1/X)表達被傳遞到Python評估,Python會將/評估爲常規部門。

所以這很好,如果我們想計算sin(1/X)。但我們不(我們爲什麼?)。我們只是想要1/X。那麼我們該怎麼做呢?

好了,我們可能會非常棘手:我們需要一個函數調用來欺騙懦夫的解析器到無視/,並把它給Python的 - 但沒有什麼,指出函數必須什麼。我們可以只定義一個識別功能:

def identity(value): 
    return value 

,然後用一個公式像X + identity(1/X)

事實上,這個技巧非常方便,以至於patsy已經爲您預定義了一個函數,並將其作爲built-in作爲I(...)提供。一般來說,你可以將I(...)想象成一種引用操作符 - 這是一種說「嘿帕西,請不要試圖解釋這個區域中的任何東西,只是傳遞給Python kthx」。

因此,要回答你原來的問題:嘗試寫dmatrix("X + I(1/X)", data)

(下一個問題:爲什麼用功能I一切這種怪異的破解這個問題的答案是,這爲R如何在30年前做了,我想不出有什麼更好的事情值得打破兼容性。)

+0

我知道在6個月後,我從寫這個程序的人那裏得到了一個答案,我問了一個晦澀難懂的問題。 –