带R的二元多项式回归
我试图用R做一些非常简单的事情,但我不确定我是否做得很好。我有一个包含三列V1、V4、V5的数据集,我想进行回归,以获得以下两个变量多项式的系数Ci、j:带R的二元多项式回归,r,regression,polynomials,R,Regression,Polynomials,我试图用R做一些非常简单的事情,但我不确定我是否做得很好。我有一个包含三列V1、V4、V5的数据集,我想进行回归,以获得以下两个变量多项式的系数Ci、j: sum[i=0->3] sum[j=0->i] Ci,j . (V4_k)^i . (V5_k)^(3-j) 因此,我尝试使用函数polym: lm(V1 ~ polym(V4, V5, degree=3, raw = TRUE), data) 这给了我以下的系数 [1] 1.048122e+04 -2.050453e+02
sum[i=0->3] sum[j=0->i] Ci,j . (V4_k)^i . (V5_k)^(3-j)
因此,我尝试使用函数polym:
lm(V1 ~ polym(V4, V5, degree=3, raw = TRUE), data)
这给了我以下的系数
[1] 1.048122e+04 -2.050453e+02 1.407736e+00 -3.309312e-03 -3.748650e+01 8.983050e-01 -4.308559e-03 1.834724e-01 -6.868446e-04 4.030224e-04
现在,如果我很好地理解我们必须如何建立一个公式,我假设下面的公式也会给出同样的结果:
lm(v1 ~ V4 + V5 + I(V4 * V5) + I(V4^2 * V5) + I(V4^3 * V5) + I(V4^2 * V5^2) + I(V4^2*V5^3) + I(V4^3 * V5^2) + I(V4^3 * V5^3), data)
但我得到了不同的系数:
[1] 3.130403e+03 -1.652007e+01 -1.592879e+02 3.984177e+00 -2.419069e-02 3.919910e-05 1.008657e-04 4.271893e-07 -5.305623e-07 -2.289836e-09
你能告诉我我做错了什么,用R实现回归的正确方法是什么吗?用样本数据
dd<-data.frame(x1=rnorm(50),
x2=rnorm(50))
dd<-transform(dd, z = 2*x1-.5*x1*x2 + 3*x2^2+x1^2 + rnorm(50))
都是一样的
请注意,在扩展中,有如下术语
I(V4^3 * V5) + I(V4^2 * V5^2)
它们都是四次项(指数之和是4),所以它们不应该出现在三次多项式中。所以这取决于你想要什么。通常,对于三次多项式
sum[i=0->3] sum[j=0->3-i] Ci,j . (V4_k)^i . (V5_k)^j
因此i+jpolym(V4,V5)调用并没有给出您所认为的结果。(本例中使用poly或polym并不重要)
让我们看一个例子:
v1 <- 1:10; v2 <- 1:10
poly(v1, v2, degree=3, raw=TRUE)
1.0 2.0 3.0 0.1 1.1 2.1 0.2 1.2 0.3
[1,] 1 1 1 1 1 1 1 1 1
[2,] 2 4 8 2 4 8 4 8 8
[3,] 3 9 27 3 9 27 9 27 27
[4,] 4 16 64 4 16 64 16 64 64
[5,] 5 25 125 5 25 125 25 125 125
[6,] 6 36 216 6 36 216 36 216 216
[7,] 7 49 343 7 49 343 49 343 343
[8,] 8 64 512 8 64 512 64 512 512
[9,] 9 81 729 9 81 729 81 729 729
[10,] 10 100 1000 10 100 1000 100 1000 1000
v1您是否检查了poly()返回矩阵的顺序?它似乎返回了V4,V4^2,V4^3,V5,V5^2,V5^3,。。。这与您的自定义公式不同。而且,V4^3*V5是四阶多项式。事实上,我的扩展是错误的。但是现在如何解释第一次调用(使用polym),我得到了10个系数,而不仅仅是6个系数,就像我用适当的展开式得到的那样(去掉指数>3)?@TanguyA。如果你看我上面的例子,它有适当的展开式,有9个项,加上一个截距项,你得到10个总系数估计。所以10是正确的数字。听起来您的扩展中缺少了一些术语。您是对的。现在,两次调用的结果相同。这样我就可以得到我想要的系数。谢谢你的回答!
v1 <- 1:10; v2 <- 1:10
poly(v1, v2, degree=3, raw=TRUE)
1.0 2.0 3.0 0.1 1.1 2.1 0.2 1.2 0.3
[1,] 1 1 1 1 1 1 1 1 1
[2,] 2 4 8 2 4 8 4 8 8
[3,] 3 9 27 3 9 27 9 27 27
[4,] 4 16 64 4 16 64 16 64 64
[5,] 5 25 125 5 25 125 25 125 125
[6,] 6 36 216 6 36 216 36 216 216
[7,] 7 49 343 7 49 343 49 343 343
[8,] 8 64 512 8 64 512 64 512 512
[9,] 9 81 729 9 81 729 81 729 729
[10,] 10 100 1000 10 100 1000 100 1000 1000