使用 R 的二次模型。使用 poly(..) 和 I(..) 函数(R 语言)

机器算法验证 r 回归 二次型
2022-04-03 20:58:18

是什么导致以下不同的结果?

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.54375,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,6,6,6,6,6,6,8,8,8,8,8,8,10,10,10,10,10,10,12,12,12,12,12,12,14,14,14,14,14,14,16,16,16,16,16,16,18,18,18,18,18,18,20,20,20,20,20,20,22,22,22,22,22,22,24,24,24,24,24,24,26,26,26,26,26,26,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))。

1个回答

你有第一个模型各种各样的错误;那个模型

var1 ~ var2 * var3

表示方差由因子和连续协变量var1的主要影响及其相互作用来解释。换句话说,该模型是一个模型,其中每个水平都有一个单独的截距斜率,用于拟合的回归线。这里没有多项式。var2var3 var2

第二个模型也是错误的,但是从给出的描述中你真正想要的并不清楚。那个型号

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.49543369
attr(,"degree")
[1] 1
attr(,"coefs")
attr(,"coefs")$alpha
[1] 5.5

attr(,"coefs")$norm2
[1]  1.0 10.0 82.5

attr(,"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.52223297
attr(,"degree")
[1] 1 2
attr(,"coefs")
attr(,"coefs")$alpha
[1] 5.5 5.5

attr(,"coefs")$norm2
[1]   1.0  10.0  82.5 528.0

attr(,"class")
[1] "poly"   "matrix"

我不清楚你想要什么,但如果你想探索不同多项式的模型,var2然后var3使用

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

var2对于和的二次多项式的主效应var3或者更复杂

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

这是二次 invar2和三次 in的主要影响var3以及它们的相互作用。

I( ) 将括号中的内容与 R 的公式解析代码隔离隔离。例如,您可能通常会看到

var1 ~ var2 + var2^2 + var3 + var3^2

这与var1 ~ poly(var2, 2) + poly(var3, 2)(除了多项式不是正交的)相同,或者应该是不幸的是,^在一个公式中意味着有序的术语,即它本身加上它的相互作用,因为^有特殊的含义。要停止 R^的错误解释,请将这些术语包装在I( ). IE

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

但是,请注意var2I(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 2
attr(,"class")
[1] "poly"   "matrix"

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