【问题标题】:calculating mean squared prediction error based on simulated data in R基于R中的模拟数据计算均方预测误差
【发布时间】:2019-05-13 04:05:08
【问题描述】:

我有以下数据。我的目标是通过重复 100 次使用交叉验证来计算均方预测误差 (MSPE)。

y=rnorm(250,0,2)
    x1=rnorm(250,0,3)
    x2=rnorm(250,1,1)
    datasim=data.frame(y,x1,x2)

首先,我需要将数据拆分为训练和测试数据。所以我首先使用 R 中的 sample.int 函数计算了索引。基于这些索引,我将数据分成训练集和测试集。

    dd=replicate(100,sample.int(n = nrow(datasim), 
size = floor(.75*nrow(datasim)), replace = F))

          train_set=apply(dd,2,function(y)
          datasim[y, ])

        test_set=apply(dd,2,function(y)
          datasim[-y, ])

之后我必须使用训练数据来拟合模型。并且基于测试数据,我需要预测并获得均方预测误差(MSPE)。我不知道如何从这里开始。特别是我不知道如何链接训练集和测试集,以便我可以预测和计算 MSPE。

我使用另一个 lapply 函数内部的 lapply 函数尝试使用它。

lapply(test_set, function(train_set) {
  lapply(train_set,function(x)
    mean((test_set$y- predict.lm(y ~ x1 + x2, data = train_set))^2)

}
  ))

但这似乎有问题。谁能帮我解决这个问题?还有比这个方法更简单的方法吗?

谢谢

【问题讨论】:

    标签: r simulation lapply lm


    【解决方案1】:

    replicate 记住你需要传递一个函数。

    这是让你前进的东西,你也应该在测试数据上使用predict,在对predict的调用中使用newdata

    首先,这个函数完成了分割数据和模型的所有部分,注意你可以传递不同的perc,如果你以后想改变它。

    sim_function <- function(datas, perc=0.75) {
      idx = sample(nrow(datas), floor(perc*nrow(datas)), replace = F) # sample idx
    
      train = datas[idx, ]
      test = datas[-idx, ]
    
      pred_lm = predict(lm(y~x1+x2,data=train), # model on train data
                  newdata = test[, -1]) # predict on test data
    
      return(mean((test$y - pred_lm)^2)) # mse and return it
    }
    

    现在我们可以拨打replicate:

    sim_rep <- replicate(100, sim_function(datasim)) # or sim_function(datasim, perc = 0.60) as an example
    head(sim_rep)
    [1] 4.664940 3.543390 3.119503 3.493320 4.182965 5.101870
    

    数据:

    set.seed(123) # always remember this when you simulate
    y=rnorm(250,0,2)
    x1=rnorm(250,0,3)
    x2=rnorm(250,1,1)
    datasim=data.frame(y,x1,x2)
    

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 2018-12-27
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多