在R中模拟数据集以进行模型选择

时间:2019-02-27 10:16:29

标签: r machine-learning simulation

我编写了一个代码来模拟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 :(得分:1)

如果我正确阅读了您的代码,则在同一模拟数据集上运行了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种子,可以给出一些行,其中所有标准都选择正确的模型。