r-使用lsfit()将PC与数据进行比较



我有一个包含2000个观测值(行(和600个变量(列(的数据框架。参见可复制示例:

list <- list()
for(i in 1:600){
list[[i]] <- sample(seq(0,0.6,l=2000))
}
df <- as.data.frame(do.call(cbind,list))

我想对变量执行PCA,然后使用lsfit来比较主成分和数据(以及一些其他数据,但这里省略了这一点(之间的拟合。我的第一个问题是,当我对数据集执行PCA时,我的主要组件的长度为20000。我希望它们的长度是600。然而,这是通过转换数据帧来解决的。

pc_model <- prcomp(df, center=F, rank=3)
pcs <- pc_model$x # wrong length, why?

df_trans <- as.data.frame(t(df))
pc_model2 <- prcomp(df_trans, center=F, rank=3)
pcs2 <- pc_model2$x # correct length, why?

我的下一个问题是,当我试图使用lsfit((将2000年的观测结果与主要组件进行比较时,我会收到各种各样的抱怨:

fit <- lsfit(df_trans, pcs2) # Error in lsfit(df_trans, pcs2) : only 600 cases, but 2001 variables
fit2 <- lsfit(df, pcs2) # Error in complete.cases(x, y, wt) : not all arguments have the same length
fit3 <- lsfit(df[1,], pcs2[,1]) # Error in complete.cases(x, y, wt) : not all arguments have the same length

对于转置的数据帧,lsfit((抱怨我的变量太多。对于非转置数据帧,它认为自变量的长度不相同,即使我只从df(长度=600(中给它一行,从pcs2(长度=60(中给他一列。如何在我的PC和我的20000个观测值之间获得最小二乘拟合?

  1. 第一个pc_model$x只是由轴(PC1, PC2, PC3)定义的新空间中观测值的坐标,因此您将拥有与观测值一样多的行,即2000个观测值对应2000行
  2. ls.fit(X, Y)试图拟合模型Y = Xb + e,其中Y和e是(N,M)矩阵,X是(N,K)矩阵,b是(K,M)向量。并且K是您想要在估计中使用的变量的数量(K=原始X矩阵中的列的数量+1,如果您想要计算作为默认值的截距的系数(=K使得该回归是可计算的。
    • 运行fit2 <- lsfit(df, pcs)将给出正确的输出,因为条件已得到验证,即相同的行数和N=2000>K=601
    • 错误CCD_ 9是由具有2000列(用于截距的变量+1(的df_trans而pcs2仅具有600行引起的。选择前599列可避免错误lsfit(df_trans[,1:599] ,pcs2)
    • 错误CCD_ 11是由ls.fit内部的参数CCD_

最新更新