Имитация наборов данных в R для выбора модели - PullRequest
0 голосов
/ 27 февраля 2019

Я создал код для имитации набора данных в R, чтобы увидеть, как работает обратный выбор в машинном обучении.И я сгенерировал функцию poly () для написания полиномиальной функции, а затем хотел выбрать подходящий полином, используя Cp, BIC, скорректированный R ^ 2.

Код:

 ###Generating dataset
 set.seed(1)
 X = rnorm(100)
 eps = rnorm(100)

 beta0 = 3
 beta1 = 2
 beta2 = -3
 beta3 = 0.3
 Y = beta0 + beta1 * X + beta2 * X^2 + beta3 * X^3 + eps

library(leaps)
data.full = data.frame(y = Y, x = X)
mod.full = regsubsets(y ~ poly(x, 10, raw = T), data = data.full, nvmax = 10)
mod.summary = summary(mod.full)

### Find the model size for best cp, BIC and adjr2
which.min(mod.summary$cp)

Для cp, BIC и скорректированного R ^ 2 я получаю модель с полиномом 3, как и должно быть

Однако теперь я хочусмоделируйте 100 наборов данных и посмотрите, сколько наборов данных я получаю правильную модель.Я смоделировал 100 наборов данных, но теперь я не получаю полином 3 для каждого из показателей.И я не совсем понимаю, что я делаю не так.Мой код для симуляции:

###Generating 100 datasets
data <- replicate(100, rnorm(n=100))
epsilon <- replicate(100,rnorm(n=100))

###Formula (same as before)
 Y = beta0 + beta1 * data + beta2 * data^2 + beta3 * data^3 + epsilon
 data.full = data.frame(y = Y, x = data)

 ###Using polynomial terms
 mod.bwd = regsubsets(data.full$y.1 ~ poly(data.full$x.1, 10, raw = T), data = data.full, nvmax = 10, 
method = "backward")
bwd.summary = summary(mod.bwd)

which.min(bwd.summary$cp)
which.min(bwd.summary$bic)
which.max(bwd.summary$adjr2)

Для данного подмножества cp, Bic, adjr2 дают мне разные результаты.Например, использование y.1 и x.1 (первый набор данных в моделировании) дает следующие результаты:

which.min (bwd.summary $ cp): 7

which.min (bwd.summary $ bic): 4

which.max (bwd.summary $ adjr2): 9

Может кто-нибудь помочь мне в том, что я делаю неправильно при моделировании этих100 наборов данных.

1 Ответ

0 голосов
/ 27 февраля 2019

Если я правильно прочитал ваш код, вы запускаете модель на одном и том же смоделированном наборе данных 100 раз вместо всех 100 смоделированных наборов данных, это должно помочь:

set.seed(42)

###Generating 100 datasets
data <- replicate(100, rnorm(n=100))
epsilon <- replicate(100,rnorm(n=100))

###Formula (same as before)
 Y = beta0 + beta1 * data + beta2 * data^2 + beta3 * data^3 + epsilon
 data.full = data.frame(y = Y, x = data)


res <- lapply(1:100, function(i){
 ###Using polynomial terms
 mod.bwd = regsubsets(data.full[[i]] ~ poly(data.full[[100+i]], 10, raw = T), data = data.full, nvmax = 10, 
method = "backward")
bwd.summary = summary(mod.bwd)

c(
which.min(bwd.summary$cp),
which.min(bwd.summary$bic),
which.max(bwd.summary$adjr2)
)
})

res <- do.call(rbind, res)

С помощью этого rng-seed этодает несколько строк, где все цирраты выбирают правильную модель.

...