如何使用 R 中的有序因子系数进行预测?
How do I make predictions using an ordered factor coefficient in R?
我目前正在尝试加深对 R 中有序因子的理解,并将它们用作线性模型中的因变量。我了解输出 .L 、.Q 和 .C 代表线性、二次和三次,但我想知道什么是“newx”,它可以使用下面的方程来推导我的有序因子的每个级别的估计值。
我认为“newx”是从 contr.poly()
函数导出的,但使用它会导致我的方程与从 predict()
函数导出的结果不匹配。谁能帮我理解“newx”应该是什么?
set.seed(101)
d <- data.frame(x=sample(1:4,size=30,replace=TRUE))
d$y <- rnorm(30,1+2*d$x,sd=0.01)
d$x = factor(d$x, labels=c("none", "some", "more", "a lot"))
Coefs <- coef(lm(y~ordered(x), d))
newx <- contr.poly(4)
predict(lm(y~ordered(x), d), newdata = data.frame(x = as.factor(c("none", "some", "more", "a lot"))))
Coefs[1]+(Coefs[2]*newx[1,1])+(Coefs[3]*newx[1,2]^2)+(Coefs[4]*newx[1,3]^3)
Coefs[1]+(Coefs[2]*newx[2,1])+(Coefs[3]*newx[2,2]^2)+(Coefs[4]*newx[2,3]^3)
Coefs[1]+(Coefs[2]*newx[3,1])+(Coefs[3]*newx[3,2]^2)+(Coefs[4]*newx[3,3]^3)
Coefs[1]+(Coefs[2]*newx[4,1])+(Coefs[3]*newx[4,2]^2)+(Coefs[4]*newx[4,3]^3)
只需给 R 一个数据框,其中 x
值取自因子水平(“none”、“一些”等),剩下的就交给它了。
我稍微更改了您的设置,将数据框中 x
的类型更改为 ordered()
(这将执行所有计算)。
d$x = ordered(d$x, labels=c("none", "some", "more", "a lot"))
m1 <- lm(y~x, d) ## save fitted object
Coefs <- coef(m1)
现在我们可以predict()
:
predict(m1, newdata = data.frame(x=c("none","more")))
## 1 2
## 2.993959 6.997342
(不必明确说明新的 x
是 ordered()
)
如果您想更深入地研究计算,可以查看模型矩阵:
model.matrix(~unique(d$x))
对于因子的每个级别,这些是值 R 乘以系数以生成预测(例如对于级别 =“none”,1*b0 + (-0.67)*b1 + 0.5*b2 - 0.223*b3
)
(Intercept) unique(d$x).L unique(d$x).Q unique(d$x).C
1 1 -0.6708204 0.5 -0.2236068
2 1 -0.2236068 -0.5 0.6708204
3 1 0.2236068 -0.5 -0.6708204
4 1 0.6708204 0.5 0.2236068
有关更多详细信息,请查看 ?poly
或 poly()
的源代码(尽管这些都不容易!)
我目前正在尝试加深对 R 中有序因子的理解,并将它们用作线性模型中的因变量。我了解输出 .L 、.Q 和 .C 代表线性、二次和三次,但我想知道什么是“newx”,它可以使用下面的方程来推导我的有序因子的每个级别的估计值。
我认为“newx”是从 contr.poly()
函数导出的,但使用它会导致我的方程与从 predict()
函数导出的结果不匹配。谁能帮我理解“newx”应该是什么?
set.seed(101)
d <- data.frame(x=sample(1:4,size=30,replace=TRUE))
d$y <- rnorm(30,1+2*d$x,sd=0.01)
d$x = factor(d$x, labels=c("none", "some", "more", "a lot"))
Coefs <- coef(lm(y~ordered(x), d))
newx <- contr.poly(4)
predict(lm(y~ordered(x), d), newdata = data.frame(x = as.factor(c("none", "some", "more", "a lot"))))
Coefs[1]+(Coefs[2]*newx[1,1])+(Coefs[3]*newx[1,2]^2)+(Coefs[4]*newx[1,3]^3)
Coefs[1]+(Coefs[2]*newx[2,1])+(Coefs[3]*newx[2,2]^2)+(Coefs[4]*newx[2,3]^3)
Coefs[1]+(Coefs[2]*newx[3,1])+(Coefs[3]*newx[3,2]^2)+(Coefs[4]*newx[3,3]^3)
Coefs[1]+(Coefs[2]*newx[4,1])+(Coefs[3]*newx[4,2]^2)+(Coefs[4]*newx[4,3]^3)
只需给 R 一个数据框,其中 x
值取自因子水平(“none”、“一些”等),剩下的就交给它了。
我稍微更改了您的设置,将数据框中 x
的类型更改为 ordered()
(这将执行所有计算)。
d$x = ordered(d$x, labels=c("none", "some", "more", "a lot"))
m1 <- lm(y~x, d) ## save fitted object
Coefs <- coef(m1)
现在我们可以predict()
:
predict(m1, newdata = data.frame(x=c("none","more")))
## 1 2
## 2.993959 6.997342
(不必明确说明新的 x
是 ordered()
)
如果您想更深入地研究计算,可以查看模型矩阵:
model.matrix(~unique(d$x))
对于因子的每个级别,这些是值 R 乘以系数以生成预测(例如对于级别 =“none”,1*b0 + (-0.67)*b1 + 0.5*b2 - 0.223*b3
)
(Intercept) unique(d$x).L unique(d$x).Q unique(d$x).C
1 1 -0.6708204 0.5 -0.2236068
2 1 -0.2236068 -0.5 0.6708204
3 1 0.2236068 -0.5 -0.6708204
4 1 0.6708204 0.5 0.2236068
有关更多详细信息,请查看 ?poly
或 poly()
的源代码(尽管这些都不容易!)