題:
具有R的二次模型。使用poly(..)和I(..)函數(R語言)
Remi.b
2013-08-01 22:20:29 UTC
view on stackexchange narkive permalink

什麼原因導致以下不同結果?

  var1 = c(0.04875,0.13725,0.28350,0.50975,0.77425,0.94700,0.05325,0.14050,0.29725,0.51525,0.79000,0.95400,0.04625,0.15250,0.29000,0.53300,0.79825,0.95225, 0.05025,0.14625,0.28800,0.52625,0.78200,0.95925,0.04700,0.14225,0.30325,0.53500,0.79325,0.95875,0.04775,0.13850,0.28675,0.54250,0.78300,0.95175,0.05150,0.12725,0.30175,0.54725,0.79475,0.96275,0.05375, 0.14100,0.30050,0.53275,0.78100,0.96175,0.05450,0.15300,0.29650,0.52850,0.80100,0.95675,0.05425,0.13975,0.30875,0.56025,0.80575,0.96100,0.05100,0.15350,0.31175,0.53300,0.78900,0.96000,0.04650,0.13525, 0.29600,0.53625,0.78475,0.96375,0.05375,0.13900,0.29600,0.53725,0.78700,0.95800,0.05075,0.14350,0.29225,0.54525,0.80275,0.95800,0.05050,0.13200,0.29850,0.52700,0.80525,0.96150,0.05150,0.14050,0.29450, 0.52375,0.79450,0.96375,0.05375,0.13525,0.30475,0.55250,0.79425,0.96025,0.04950,0.14500,0.29425,0.52250,0.78475,0.95650,0.05225,0.14425,0.29225,0.53150,0.80425,0.95375)var2 = c(1,2, 3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3, 4 ,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5 ,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6 ,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1 ,2,3,4,5,6,1,2,3,4,5,6)var3 = c(4,4,4,4,4,4,4,6,6,6,6,6,6 ,8,8,8,8,8,8,10,10,10,10,10,10,12,12,12,12,12,12,12,14,14,14,14,14,14,16 ,16,16,16,16,16,16,18,18,18,18,18,18,20,20,20,20,20,20,20,22,22,22,22,22,22,22,24,24 ,24,24,24,24,26,26,26,26,26,26,28,28,28,28,28,28,28,30,30,30,30,30,30,32,32,32 ,32,32,32,34,34,34,34,34,34,36,36,36,36,36,36,38,38,38,38,38,38,40,40,40,40 ,40,40)summary(aov(var1〜as.factor(var2)* var3))summary(aov(var1〜as.factor(poly(var2,1))* poly(var3,1))) 

我可能不太了解poly(..)和I(..)的工作方式。

(我的目的是創建不同程度(二次方,三次方等)的模型並比較它們的BIC(或AIC))。

一 回答:
Gavin Simpson
2013-08-01 22:56:29 UTC
view on stackexchange narkive permalink

您第一個模型有各種各樣的錯誤;

  var1〜var2 * var3  

表示 var1 中的方差的模型是由因子 var2 和連續協變量 var3 及其。換句話說,該模型是其中 var2 的每個級別針對擬合的回歸線具有單獨的 intercept slope 的模型。此處沒有多項式。

第二種模型也是錯誤的,但是根據給出的描述,您實際上想要的是不清楚的。該模型

  var1〜poly(var2,1)* poly(var3,1) 

,在其中投射 poly(var2,1) 作為因子實際上與第一個因子相同,只是付出了額外的努力。

poly()生成其第一個度數參數的正交(默認情況下)多項式由第二個參數指定。因此, 1:10 的一階多項式為

  > poly(1:10,1)1 [1,] -0.49543369 [2,] -0.38533732 [ 3,] -0.27524094 [4,] -0.16514456 [5,] -0.05504819 [6,] 0.05504819 [7,] 0.16514456 [8,] 0.27524094 [9,] 0.38533732 [10,] 0.49543369attr(,“度”)[ 1] 1attr(,“ coefs”)attr(,“ coefs”)$ alpha [1] 5.5attr(,“ coefs”)$ norm2 [1] 1.0 10.0 82.5attr(,“ class”)[1]“ poly” “ matrix”  

向量 1:10 的第二個正交多項式本質上是 1:10 (1: 10)*(1:10),但是這樣做的目的是使兩個新向量正交(或不相關)

  > poly(1:10,2)1 2 [1,] -0.49543369 0.52223297 [2,] -0.38533732 0.17407766 [3,] -0.27524094 -0.08703883 [4,] -0.16514456 -0.26111648 [5,] -0.05504819 -0.34815531 [6,] 0.05504819 -0.34815531 [7,] 0.16514456 -0.26111648 [8,] 0.27524094 -0.08703883 [9,] 0.38533732 0.17407766 [10,] 0.49543369 0.522232 97attr(,“度”)[1] 1 2attr(,“ coefs”)attr(,“ coefs”)$ alpha [1] 5.5 5.5
attr(,“ coefs”)$ norm2 [1] 1.0 10.0 82.5 528.0attr(,“ class”)[1]“ poly”“ matrix”  

我不清楚您想要,但是如果您要探索 var2 var3 的不同多項式的模型,則只需使用

  var1〜poly(var2,2 )+ poly(var3,2) 

表示 var2 var3 的二次多項式的主要作用。或更複雜的

  var1〜poly(var2,2)* poly(var3,3) 

,這是中二次函數的主要作用> var2 var3 中的立方, plus

I() 從R的公式解析代碼中隔離隔離括號中的內容。例如,您可能通常會看到

  var1〜var2 + var2 ^ 2 + var3 + var3 ^ 2  

,它與 var1相同〜poly(var2,2)+ poly(var3,2)(多項式不是正交的),否則它應該是。不幸的是,公式中的 ^ 表示有序術語,即它本身及其相互作用,因為 ^ 具有特殊含義。要停止R錯誤地解釋 ^ ,請將這些術語包裝在 I()中。即

  var1〜var2 + I(var2 ^ 2)+ var3 + I(var3 ^ 2) 

但是,請注意 var2 I(var2 ^ 2)將相關(對於 var3 I(var3 ^ 2)同樣)和相關變量在模型中可能會引起問題。因此,如上所述,使用 poly()生成正交多項式。

請注意, poly()可以為您提供通常的原始多項式通過使用 raw = TRUE 。因此,這可能是您對向量 1:10

  > poly(1:10,2,raw = TRUE)的二次方的期望。1 2 [1,] 1 1 [2,] 2 4 [3,] 3 9 [4,] 4 16 [5,] 5 25 [6,] 6 36 [7,] 7 49 [8,] 8 64 [9 ,] 9 81 [10,] 10 100
attr(,“ degree”)[1] 1 2attr(,“ class”)[1]“ poly”“ matrix”  

但是 poly(1:10,2) 在模型中會更好。

這是對一個不太容易回答的問題的最佳答案!感謝GavinSimpson!我得到了有關I()和poly()的所有知識。但是我不確定as.factor的效果。您實際上在答案的第一個灰色框上犯了一個錯誤嗎?您不是要在var2上使用as.factor嗎?有人甚麼時候在公式中使用一個因子?當它應用於的事物被視為協變量時?
@Remi.b謝謝。我故意刪除了“ as.factor”,並說我以為“ var2”已經是一個因素了,以簡化事情。 “ as.factor(var2)”將創建一個因數,因此將其擴展到模型矩陣中的$ 1-1美元列(假設使用默認的對比度並包含截距)。我不會在公式中使用`as.factor()`-您應該將模型擬合與數據分析代碼分開,但是人們會這樣做,並且它是有效的,因為`model.frame`安排了函數的調用正在創建用於構建模型矩陣的數據。
好!但是,我仍然沒有真正理解“ as.factor(var2)`會創建一個因子,從而將其擴展為模型矩陣中的** l-1 **列”的含義。為什麼有人會使用這樣的模型?也許舉一個實驗設計的實際例子,有人可能會幫助我!許多想法
R可能已經讀入值c(1,2,3,1,2,3,1,2,2,2,2,1,2,1,2)作為*整數*向量。如果這些是類,則將使用1 df作為該變量的*錯誤*模型。 $ l-1 $列使用默認的對比度表示參考級別(由截距表示)與因子中每個其他級別/類之間的均值差。考慮一個變量“ Treatment”,其取值為“ c(0,5,10,50)”,其中“ 0”是控件。 R很可能*不會*讀入它作為因素,如果將其插入`aov()`中,它將使用單個df並將'Treatment'作為線性協變量。
好!非常感謝GavinSimpson的幫助!
還應注意,由R生成的正交多項式在解釋回歸係數方面會增加額外的摺皺。如果要真正了解效果的大小,則必須退出poly(raw = FALSE,默認設置)所做的轉換。我了解到,通過在計算交互項之前先對變量進行居中,可以充分利用poly的優勢。
@rpierce +1好點了。我們遇到的問題是將特定模型擬合到物種豐度數據。配備有poly(x,2)的係數很難用基本理論模型來解釋...


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...