我有以下数据。我的目标是通过交叉验证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)
}
))
但是这似乎有问题。有人可以帮我解决这个问题吗?还有没有比该方法更简单的方法了?
谢谢
答案 0 :(得分:2)
要replicate
要记住,您需要传递一个函数。
这是您的入门指南,也应该predict
处理测试数据,在对newdata
的调用中使用predict
。
首先,此功能完成了有关拆分数据和模型的所有工作,请注意,如果您以后要更改它,则可以传递不同的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)