# 加载必要包
library(glmnet)
library(dplyr)
library(effects)
library(openxlsx)
# 1. 数据准备 ----------------------------------------------------------------
# 载入数据(请根据实际路径修改)
library(readxl)
heart_data <- read_excel("C:/Users/jiangyihan/Desktop/Lasso.xlsx")
# 检查数据结构
cat("数据维度:", dim(heart_data), "\n")
cat("前5行数据预览:\n")
print(head(heart_data, 5))
# 设置自变量和因变量
x <- as.matrix(heart_data[, 2:ncol(heart_data)]) # 自变量:第7列到最后一列
#x <- scale(x)
y <- heart_data[, 1] # 因变量:第1列
# 2. Lasso回归建模 ----------------------------------------------------------
# 设置随机种子保证可重复性
set.seed(1234)
# 建模(自动执行标准化,standardize=TRUE为默认)
alpha1_fit_linear <- glmnet(
x, y,
family = "binomial", # 连续型因变量
alpha = 1, # Lasso回归(alpha=1)
nlambda = 100 # 生成100个lambda值
)
# 绘制系数路径图
plot(alpha1_fit_linear, xvar = "lambda", main = "")
title(main = "Lasso coefficient path", line = 2) # 调整line值控制位置
# 3. 交叉验证选择lambda -----------------------------------------------------
set.seed(1234) # 重置随机种子
alpha1_fit_cv <- cv.glmnet(
x, y,
type.measure = "mse", # 使用均方误差
alpha = 1, # Lasso回归
family = "binomial",
nfolds = 10 # 10折交叉验证
)
# 绘制交叉验证误差
plot(alpha1_fit_cv, main = "")
title(main = "Cross-validation error curves", line = 2) # 调整line值控制位置
# 4. 提取结果 --------------------------------------------------------------
# 选择lambda.min(保留更多变量)
best_lambda <- alpha1_fit_cv$lambda.min
cat("最优lambda值(lambda.min):", best_lambda, "\n")
# 提取对应系数
coef_matrix <- coef(alpha1_fit_cv, s = best_lambda)
# 转换为数据框并筛选非零系数
feature_opt <- coef_matrix %>%
as.matrix() %>%
as.data.frame() %>%
rename(coef = 1) %>%
filter(coef != 0) %>% # 筛选非零系数
tibble::rownames_to_column("variable")
# 显示保留的变量
cat("\n保留的变量及系数:\n")
print(feature_opt)
# 显示保留变量数量
cat("\n共保留", nrow(feature_opt)-1, "个特征(排除截距项)\n")
# 5. 高级调整(可选) --------------------------------------------------------
# 如果需要进一步调整保留变量数量,可以:
# - 手动设置lambda值(例如取中间值)
# custom_lambda <- exp(mean(log(c(alpha1_fit_cv$lambda.min, alpha1_fit_cv$lambda.1se))))
# coef_matrix <- coef(alpha1_fit_cv, s = custom_lambda)
# - 调整筛选阈值(例如保留|系数|>0.01的变量)
# feature_opt_adj <- feature_opt %>% filter(abs(coef) > 0.01)
# 6. 弹性网络扩展(可选) ----------------------------------------------------
# 尝试混合Lasso和Ridge(alpha=0.9)
set.seed(1234)
alpha09_fit_cv <- cv.glmnet(
x, y,
alpha = 0.9, # 90% Lasso + 10% Ridge
family = "gaussian"
)
# 比较变量数量
coef_alpha09 <- coef(alpha09_fit_cv, s = "lambda.min")
cat("\n弹性网络(alpha=0.9)保留变量数量:", sum(coef_alpha09 != 0)-1, "\n")
######################################交互效应(模型优化)#######################
#
# 离散的*横坐标
fit3 <- glm(是否购买过湘绣 ~ 性别*对湘绣文化的了解程度, data = heart_data,family = binomial)
#离散: 横坐标 离散化
plot(effect("性别:对湘绣文化的了解程度", fit3, ,list(性别=c(1,2))),
lines=c(1,2),
multiline=TRUE,
lty=c(1,2),
grid=TRUE,
xlab="对湘绣文化的了解程度", #横坐标
ylab="是否有意愿购买湘绣的概率Y",
main="交互效应的探索(性别X2*对湘绣文化的了解程度X7)")
# 离散的*横坐标
fit4 <- glm(是否购买过湘绣 ~ 月可支配消费金额为*对湘绣文化的了解程度, data = heart_data,family = binomial)
#离散: 横坐标 离散化
plot(effect("月可支配消费金额为:对湘绣文化的了解程度", fit4, ,list(月可支配消费金额为=c(1,2,3,4))),
lines=c(1,2,3,4),
multiline=TRUE,
lty=c(1,2,3,4),
grid=TRUE,
xlab="对湘绣文化的了解程度", #横坐标
ylab="是否有意愿购买湘绣的概率Y",
main="交互效应的探索(可支配金额X3*对湘绣文化的了解程度X7)")
# 离散的*横坐标
fit4 <- glm(是否购买过湘绣 ~ 年龄*对湘绣文化的了解程度, data = heart_data,family = binomial)
#离散: 横坐标 离散化
plot(effect("年龄:对湘绣文化的了解程度", fit4, ,list(年龄=c(1,2,3))),
lines=c(1,2,3),
multiline=TRUE,
lty=c(1,2,3),
grid=TRUE,
xlab="对湘绣文化的了解程度", #横坐标
ylab="是否有意愿购买湘绣的概率Y",
main="交互效应的探索(年龄X1*对湘绣文化的了解程度x7)")
帮我检查一下这个r语言代码
最新发布