- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经通读了手册页?poly
(我承认我没有完全理解),并且还阅读了书Introduction to Statistical Learning中该函数的描述。 。
我目前的理解是,调用poly(horsepower, 2)
应该相当于编写horsepower + I(horsepower^2)
。然而,这似乎与以下代码的输出相矛盾:
library(ISLR)
summary(lm(mpg~poly(horsepower,2), data=Auto))$coef
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 23.44592 0.2209163 106.13030 2.752212e-289
#poly(horsepower, 2)1 -120.13774 4.3739206 -27.46683 4.169400e-93
#poly(horsepower, 2)2 44.08953 4.3739206 10.08009 2.196340e-21
summary(lm(mpg~horsepower+I(horsepower^2), data=Auto))$coef
# Estimate Std. Error t value Pr(>|t|)
#(Intercept) 56.900099702 1.8004268063 31.60367 1.740911e-109
#horsepower -0.466189630 0.0311246171 -14.97816 2.289429e-40
#I(horsepower^2) 0.001230536 0.0001220759 10.08009 2.196340e-21
我的问题是,为什么输出不匹配,poly
到底在做什么?
最佳答案
要获得问题中的普通多项式,请使用raw = TRUE
。不幸的是,回归中的普通多项式有一个不受欢迎的方面。如果我们拟合一个二次方程,然后拟合一个三次方程,则三次方程的低阶系数与二次方程的低阶系数都不同,即二次方程的 56.900099702、-0.466189630、0.001230536 与 6.068478e+01、-5.688501e-01、 2.079011e-03 retrofit 后的立方体如下。
library(ISLR)
fm2raw <- lm(mpg ~ poly(horsepower, 2, raw = TRUE), Auto)
cbind(coef(fm2raw))
## [,1]
## (Intercept) 56.900099702
## poly(horsepower, 2, raw = TRUE)1 -0.466189630
## poly(horsepower, 2, raw = TRUE)2 0.001230536
fm3raw <- lm(mpg ~ poly(horsepower, 3, raw = TRUE), Auto)
cbind(coef(fm3raw))
## [,1]
## (Intercept) 6.068478e+01
## poly(horsepower, 3, raw = TRUE)1 -5.688501e-01
## poly(horsepower, 3, raw = TRUE)2 2.079011e-03
## poly(horsepower, 3, raw = TRUE)3 -2.146626e-06
我们真正想要的是添加三次项,使得使用二次拟合的低阶系数在使用三次拟合重新拟合后保持不变。为此,需要对 poly(horsepower, 2, raw = TRUE)
的列进行线性组合,并对 poly(horsepower, 3, raw = TRUE)
执行相同的操作,例如二次拟合中的列彼此正交,三次拟合中的列彼此正交。这足以保证当我们添加高阶系数时低阶系数不会改变。请注意,下面两组中的前三个系数现在是相同的(而上面它们不同)。也就是说,在这两种情况下,低于 3 个低阶系数均为 23.44592、-120.13774 和 44.08953 。
fm2 <- lm(mpg ~ poly(horsepower, 2), Auto)
cbind(coef(fm2))
## [,1]
## (Intercept) 23.44592
## poly(horsepower, 2)1 -120.13774
## poly(horsepower, 2)2 44.08953
fm3 <- lm(mpg ~ poly(horsepower, 3), Auto)
cbind(coef(fm3))
## [,1]
## (Intercept) 23.445918
## poly(horsepower, 3)1 -120.137744
## poly(horsepower, 3)2 44.089528
## poly(horsepower, 3)3 -3.948849
重要的是,由于 poly(horsepwer, 2)
的列只是 poly(horsepower, 2, raw = TRUE)
的列的线性组合,因此两个二次方程模型(正交模型和原始模型)代表相同的模型(即它们给出相同的预测),仅在参数化方面有所不同。例如,拟合值是相同的:
all.equal(fitted(fm2), fitted(fm2raw))
## [1] TRUE
原始模型和正交立方模型也是如此。
我们可以验证多项式确实具有也与截距正交的正交列:
nr <- nrow(Auto)
e <- rep(1, nr) / sqrt(nr) # constant vector of unit length
p <- cbind(e, poly(Auto$horsepower, 2))
zapsmall(crossprod(p))
## e 1 2
## e 1 0 0
## 1 0 1 0
## 2 0 0 1
正交多项式的另一个很好的特性是,由于 poly
生成的矩阵的列具有单位长度并且相互正交(并且也与截距列正交),因此残差和的减少由于添加三次项而产生的平方数只是响应向量在模型矩阵的三次列上的投影长度的平方。
# these three give the same result
# 1. squared length of projection of y, i.e. Auto$mpg, on cubic term column
crossprod(model.matrix(fm3)[, 4], Auto$mpg)^2
## [,1]
## [1,] 15.5934
# 2. difference in sums of squares
deviance(fm2) - deviance(fm3)
## [1] 15.5934
# 3. difference in sums of squares from anova
anova(fm2, fm3)
##
## Analysis of Variance Table
##
## Model 1: mpg ~ poly(horsepower, 2)
## Model 2: mpg ~ poly(horsepower, 3)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 389 7442.0
## 2 388 7426.4 1 15.593 0.8147 0.3673 <-- note Sum of Sq value
关于r - R 函数 `poly` 到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19484053/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!