2013-05-21 122 views

回答

7

懦夫不是件一般非線性模型確實有用,但你鏈接到頁面上的模型是非線性的一種特殊模型 - 他們使用線性模型擬合法(OLS),並將其應用於非線性變換的基本變量。一個標準且非常有用的技巧是將相同變量的多個非線性變換組合起來,以便有效地擬合更一般的曲線。爲此,patsy非常有用。

你真正想知道的是如何在patsy中表達變量轉換。這很容易。 patsy的工作原理是,給定一個像"x1 + x2:x3"這樣的公式字符串,它掃描並解釋特殊的可怕運算符,如+:,然後將剩下的內容(x1,x2,)解釋爲任意的python代碼。所以你可以寫"np.sin(x1) + np.log(x2):x3"或其他什麼。

唯一需要注意的是,如果你想編寫一個使用python運算符的轉換,它與patsy運算符衝突。就像,如果你想在你的轉換中使用+**,那麼你必須小心確保patsy不會解釋它們本身,並將它們留給python。這裏的技巧是,patsy會忽略出現在函數調用內部的任何運算符(或者patsy不理解的其他複雜python表達式,但大部分是函數調用)。所以如果你寫"x1 + np.log(x2 + x3)",那麼patsy會把它當作兩個預測變量,x1np.log(x2 + x3) - 你可以看到它解釋了第一個+,但是它讓第二個單獨爲python解釋。

但是如果您想要將兩個變量加在一起並將它們用作預測因子而不考慮日誌呢?那麼,從我們已經知道的,我們可以想出一個簡單的黑客攻擊:我們可以定義一個函數,它返回它的輸入(標識函數),並調用它,如:"x1 + I(x2 + x3)"。現在函數調用I(...)將防止patsy看到第二個+,但是當我們實際評估術語I(x2 + x3)將與x2加相同。

有用的是,patsy會自動提供一個叫做I()的函數,它可以像這樣工作,它總是可以使用。

現在你知道你需要知道的一切,以重現該頁面上的例子。對於第一個,公式是"x + I(x**2)"。第二,公式是"x + np.sin(x) + I((x - 5)**2)"

對於最後一個示例,僅使用patsy的內置分類編碼支持最簡單:"x + C(groups)"。(這裏C是另一個特殊的內置函數,可以讓我們調整分類數據的編碼方式,在這裏我們只是用它來表示即使groups看起來像一個數值向量 - 它的值是0,1,2 - - 實際上我們應該把它當作是分類的,每個值代表不同的組,然後patsy應用它的默認分類編碼)

+0

我們可以使用標識函數創建一個虛擬或交互嗎?像我可以構造一個像$ I(x1 *(x2 =='USA'))$? – xappppp