如何在R中使用两个主成分拟合线性回归模型?

8

假设我有一个数据矩阵d

pc = prcomp(d)

# pc1 and pc2 are the principal components  
pc1 = pc$rotation[,1] 
pc2 = pc$rotation[,2]

那么这个应该适用于线性回归模型,对吗?
r = lm(y ~ pc1+pc2)

但是我遇到了这个错误:
Errormodel.frame.default(formula = y ~ pc1+pc2, drop.unused.levels = TRUE) : 
   unequal dimensions('pc1')

我猜可能有一些自动完成这个任务的包,但是这个方法也可以行得通吗?
1个回答

18

答案:你不需要pc$rotation,它是旋转矩阵而不是旋转后的值(分数)矩阵。

生成一些数据:

x1 = runif(100)
x2 = runif(100)
y = rnorm(2+3*x1+4*x2)
d = cbind(x1,x2)

pc = prcomp(d)
dim(pc$rotation)
## [1] 2 2

糟糕,“x”组件是我们想要的。来自?prcomp:

x: 如果'retx'为真,则返回旋转数据的值(中心化(如果请求则缩放)数据乘以’旋转‘矩阵)。

dim(pc$x)
## [1] 100   2
lm(y~pc$x[,1]+pc$x[,2])
## 
## Call:
## lm(formula = y ~ pc$x[, 1] + pc$x[, 2])

## Coefficients:
## (Intercept)    pc$x[, 1]    pc$x[, 2]  
##     0.04942      0.14272     -0.13557  

嘿,这似乎有效,但我在R中尝试了一下
pc 标准偏差: [1] 0.3068542 0.2650774
旋转: PC1 PC2 x1 -0.5518651 0.8339334 x2 -0.8339334 -0.5518651x1 [1]是x1的第一个元素
x1 [1]   [1] 0.69602246
x2 [1]   [1] 0.268991455
那么pc $ x [,1]的第一个元素必须是第一个主成分的第一个元素,对吗? 所以pc $ x [1,1]不应该等于pc $ rotation [1,1] * x1 [1] + pc $ rotation [1,2] * x2 [1]?
pc $ rotation [1,1] * x1 [1] + pc $ rotation [1,2] * x2 [1] [1] -0.1597895
但实际上pc $ x [1,1]是:
pc $ x [1,1] [1] 0.08993233
- phpdash
这看起来很糟糕,难道没有一种方法可以将这些行分开吗? - phpdash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接