如何使用 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       

(不必明确说明新的 xordered()

如果您想更深入地研究计算,可以查看模型矩阵:

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

有关更多详细信息,请查看 ?polypoly() 的源代码(尽管这些都不容易!)