我编写了一个代码,用于在R中模拟数据集,以观察机器学习中后向选择的工作原理。我生成了poly()函数来编写多项式函数,然后希望使用Cp、BIC和调整后的R^2来选择合适的多项式。
代码如下:
###生成数据集 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)### 查找最佳Cp、BIC和调整后R^2的模型大小which.min(mod.summary$cp)
对于Cp、BIC和调整后的R^2,我得到了应有的三次多项式模型
然而,现在我想模拟100个数据集,并查看在多少个数据集中我得到了正确的模型。我模拟了100个数据集,但现在对于每个度量标准,我都没有得到三次多项式。我不太明白我做错了什么。我的模拟代码是:
###生成100个数据集data <- replicate(100, rnorm(n=100))epsilon <- replicate(100,rnorm(n=100))###公式(与之前相同) Y = beta0 + beta1 * data + beta2 * data^2 + beta3 * data^3 + epsilon data.full = data.frame(y = Y, x = data) ###使用多项式项 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和调整后的R^2给出了不同的结果。例如,使用y.1和x.1(模拟中的第一个数据集)得到以下结果:
which.min(bwd.summary$cp): 7
which.min(bwd.summary$bic): 4
which.max(bwd.summary$adjr2): 9
有人能帮我指出我在模拟这100个数据集时做错了什么吗?
回答:
如果我正确地阅读了你的代码,你在同一个模拟数据集上运行了100次模型,而不是所有100个模拟数据集,以下方法应该可以解决这个问题:
set.seed(42)###生成100个数据集data <- replicate(100, rnorm(n=100))epsilon <- replicate(100,rnorm(n=100))###公式(与之前相同) 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){ ###使用多项式项 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)
使用这个随机数种子,可以得到一些行,其中所有标准都选择了正确的模型。