如何从 R 中的线性模型获得 1000 个预测?

How can I get 1000 predictions from a linear model in R?

我想对线性回归模型的预测值进行 1000 次模拟,然后根据模型的自变量查看每种类型的汽车有多少次具有最高预测 mpg。 我使用测试和训练集是因为我想在训练数据之外评估模型的拟合度。

data(mtcars)
library(caret)
trainingIndex <- createDataPartition(mtcars$mpg, p = 0.8, list = FALSE)
trainingset <- mtcars[trainingIndex,]
testingset <- mtcars[-trainingIndex,]

我创建了一个数据分区来拥有训练集和测试集。现在我有一个测试集和一个训练集我创建了线性模型

fit <- lm(mpg~., data = trainingset)

现在我有了线性模型,我试图创建一个 bootstrap 来通过模拟进行预测。我使用 boot_predict 但它给了我一个错误。

library(finalfit)
boot_predict(fit,testingset, type = "response", R = 1000, estimate_name = NULL, 
             confint_sep = "to", condense = TRUE, boot_compare = TRUE, compare_name = NULL,
             comparison = "difference", ref_symbol = "-", digits = c(2,3))

错误:mutate() 输入 term 有问题。 x 无效格式“%.2f”;对字符对象使用格式 %s i 输入 term(function (x, digits) ...。 运行 rlang::last_error() 看看哪里出错了。 另外: 警告信息: 在 predict.lm(object, newdata, se.fit, scale = 1, type = if (type == : 来自秩亏拟合的预测可能具有误导性

我不确定这是否是从 bootstrap

中获得 1000 预测的最佳方式

关于如何使用训练和测试的部分还不清楚,我建议你把它整理出来作为另一个问题。看来问题不止一个啊

我可以尝试解决这个问题:

see how many of those times each type of car has the highest predicted mpg base on the independent variables of the model.

对于 1 bootstrap,适合的基本代码如下:

set.seed(111)
da = mtcars[sample(nrow(mtcars),replace=TRUE),]
fit = lm(mpg ~ .,data=da)

要获得排名我们可以做:

rank(predict(fit,mtcars))

然后我们将它包装到一个函数中并通过许多 bootstrap 迭代它:

bootpred = function(data){

da = da[sample(nrow(da),replace=TRUE),]
fit = lm(mpg ~ .,data=da)
rank(predict(fit,data))

}

predictions = replicate(1000,bootpred(mtcars))

结果是一个矩阵,每列 1 bootstrap,每行,汽车预测的排名:

head(predictions[,1:5],10)
                  [,1] [,2] [,3] [,4] [,5]
Mazda RX4           18   16   12   20   18
Mazda RX4 Wag       14   12   11   16   17
Datsun 710          24   24   27   26   23
Hornet 4 Drive      22   19   20   23   21
Hornet Sportabout   15   13   15   11   15
Valiant             16   11   18   21   20
Duster 360           7   29    5    6    9
Merc 240D           23   23   23   25   25
Merc 230            25   20   19   24   32
Merc 280            20   18   22   17   16

这会告诉你每辆车有多少次最高值:

rowSums(predictions==1)
          Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive 
                 18                   0                   0                   0 
  Hornet Sportabout             Valiant          Duster 360           Merc 240D 
                  0                   0                   3                   1 
           Merc 230            Merc 280           Merc 280C          Merc 450SE 
                 12                   1                   0                   1 
         Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental 
                  0                   0                  80                  72 
  Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla 
                174                   0                   3                   0 
      Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28 
                 18                   3                   0                  10 
   Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa 
                  3                   0                   0                   0 
     Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E 
                  0                  10                 591                   0 

这里的问题是 boot_predict() 调用 broom::tidy(),如果 newdata 的行名称不等于 seq_len(nrow(newdata)),它会添加一个 term 列,它打破了 boot_predict() 中的格式化步骤(您会发现 debug() 是您的朋友)。您可能需要考虑向 finalfit here 的开发者提交问题,参考关于此的 Stack Overflow 问题。

同时,您可以通过更改测试集的行名称来解决此问题:

data(mtcars)
library(caret)
set.seed(42)
trainingIndex <- createDataPartition(mtcars$mpg, p = 0.8, list = FALSE)
trainingset <- mtcars[trainingIndex,]
testingset <- mtcars[-trainingIndex,]
rownames(testingset) <- 1:nrow(testingset) ## This is the new step that fixes it
fit <- lm(mpg~., data = trainingset)
library(finalfit)
boot_predict(fit, testingset)
   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
2 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
3 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
4 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
                estimate                      Difference
1 21.02 (13.07 to 27.04)                               -
2  21.68 (6.25 to 40.14)  1.42 (-7.30 to 13.93, p=0.720)
3 15.39 (12.09 to 19.82) -4.82 (-10.83 to 2.68, p=0.180)
4  13.27 (3.26 to 24.34) -6.34 (-18.20 to 4.02, p=0.200)