变量选择,AIC、BIC
# =========================================================
# 1. 构造最开始的十维多元回归模拟数据
# =========================================================
set.seed(123)
# 样本量
n <- 200
# 自变量个数
p <- 10
# 生成 n × p 的自变量矩阵
X_raw <- matrix(rnorm(n * p, mean = 0, sd = 1), nrow = n, ncol = p)
# 给自变量命名
colnames(X_raw) <- paste0(\”X\”, 1:p)
# 真实截距
beta0_true <- 5
# 真实回归系数
# 其中 X4 和 X7 的真实系数为 0,表示它们实际上是无效变量
beta_true <- c(
2.0, # X1
–1.5, # X2
3.0, # X3
0.0, # X4
1.2, # X5
–2.0, # X6
0.0, # X7
0.8, # X8
1.5, # X9
–1.0 # X10
)
# 随机误差项
epsilon <- rnorm(n, mean = 0, sd = 1)
# 因变量 Y
Y <- beta0_true + X_raw %*% beta_true + epsilon
Y <- as.vector(Y)
cat(\”\\n========== 真实模型信息 ==========\\n\”)
cat(\”真实截距 beta0 =\”, beta0_true, \”\\n\”)
cat(\”真实有效变量:X1, X2, X3, X5, X6, X8, X9, X10\\n\”)
cat(\”真实无效变量:X4, X7\\n\\n\”)
# =========================================================
# 2. 手动 OLS 拟合函数
# =========================================================
# 对任意变量集合 selected_vars 拟合线性回归模型
# 并计算 SSE、R2、调整后 R2、AIC、BIC
#
# AIC = n * log(SSE / n) + 2k
# BIC = n * log(SSE / n) + k * log(n)
#
# 其中:
# n 为样本量
# SSE 为残差平方和
# k 为参数个数,包括截距项
# =========================================================
manual_ols_by_vars <- function(X_raw, Y, selected_vars) {
X_raw <- as.matrix(X_raw)
Y <- matrix(Y, ncol = 1)
n <- length(Y)
# 如果没有选择任何变量,则只拟合截距模型
if (length(selected_vars) == 0) {
X_design <- matrix(1, nrow = n, ncol = 1)
colnames(X_design) <- \”Intercept\”
} else {
X_selected <- X_raw[, selected_vars, drop = FALSE]
X_design <- cbind(1, X_selected)
colnames(X_design) <- c(\”Intercept\”, selected_vars)
}
# 参数个数,包括截距项
k <- ncol(X_design)
# OLS估计 beta_hat = (X\’X)^(-1)X\’Y
beta_hat <- solve(t(X_design




