如何替换R中多列的拟合值

How to replace the fitted value in multiple columns in R

我有一个名为 new.cars 的数据框。我需要对数据框中的所有列应用线性回归公式。 new.cars 中有数千列,因此无法在公式中指明每一列。有四列 PCAs 在我要应用此公式的所有其他列(PCAs 以外的列)的公式中将保持不变。

第一列(第 mercedes 列)的公式为

fit1 <- lm(mercedes ~ PCA1 + PCA2+PCA3+PCA4, data=new.cars)
new.cars[,"mercedes"] <-fit1$fitted.values

以此类推所有其他汽车列.. 用 fitted value 替换列值的最佳方法是什么(并且还省略了列中的 NA 值,这意味着我不想更改 NAs——因为它们是空单元格,不需要装)?

  new.cars<- structure(list(mercedes = c(1, 1, 1, 1), vw = c(1, 2, 0, NA), 
            camry = c(2, 0, 0, NA), civic = c(4, 1, 1, 1), ferari = c(2, 
            2, 2, 0), PCA1 = c(0.021122, 0.019087, 0.022184, 0.021464
            ), PCA2 = c(0.023872, 0.024295, 0.022471, 0.027509), PCA3 = c(0.000784, 
            0.001996, 0.003911, 0.006119), PCA4 = c(-0.004811, -0.003296, 
            0.001868, -0.001636)), .Names = c("mercedes", "vw", "camry", 
        "civic", "ferari", "PCA1", "PCA2", "PCA3", "PCA4"), row.names = c("S05-F13-P01.GT", 
        "S08-F10-P01.GT", "S08-F11-P01.GT", "S09-F66-P01.GT"), class = "data.frame")

我们可以遍历 'new.cars' 的 names(不是 PCA),使用 [=30 创建一个 formulapaste =]变量作为自变量,提取'fitted values'中的一个list('lst')。我们通过从 'new.cars' 中提取非 PCA 列来创建一个新数据集 ('new1.cars')。为 list 长度比 'lst' 中元素的 'maximum' 长度短的元素填充 NA,并将输出分配给新数据集。

lst <- lapply(names(new.cars)[1:5], function(x) 
  lm(formula(paste(x, '~', paste0("PCA", 1:4, collapse="+"))), data= new.cars)$fitted.values)
new1.cars <- new.cars[1:5]
new1.cars[] <- lapply(lst, `length<-`,max(lengths(lst)))

更新

如果有只有 NA 值的列,我们可以创建一个例外来避免在

上执行 lm
lst <- lapply(names(new.cars)[1:5], function(x) {
                 x1 <- new.cars[[x]]
            if(all(is.na(x1))){
               NA } else lm(formula(paste(x, '~', paste0("PCA", 1:4, collapse="+"))), 
            data= new.cars)$fitted.values
         })

其余步骤同上