вычисление среднеквадратичной ошибки прогноза на основе смоделированных данных в R - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующие данные.Моя цель - рассчитать среднеквадратичную ошибку прогноза (MSPE) с использованием перекрестной проверки путем повторения 100 раз.

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

С этого момента мне нужно разделить данные на данные обучения и тестирования.Поэтому я сначала вычислил индексы, используя функцию sample.int в R. На основе этих индексов я разделил данные на обучающие и тестовые наборы.

    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)

}
  ))

Но, похоже, с этим есть проблема. Может кто-нибудь помочь мне разобраться с этим?Также есть ли более простой способ сделать это, чем этот метод?

Спасибо

1 Ответ

0 голосов
/ 12 декабря 2018

К 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...