使用 glmnet 预测数据集中的连续变量

Using glmnet to predict a continuous variable in a dataset

我有这个数据集。 wbh

我想使用 R 包 glmnet 来确定哪些预测变量可用于预测生育率。但是,我一直无法这样做,很可能是因为对包没有充分的了解。生育力变量是 SP.DYN.TFRT.IN。我想看看数据集中的哪些预测因子对生育率的预测能力最强。我想使用 LASSO 或岭回归来缩小系数的数量,我知道这个包可以做到这一点。我只是在实施时遇到了一些问题。

我知道没有我要道歉的代码片段,但我对如何编写代码感到迷茫。

如有任何建议,我们将不胜感激。

感谢阅读

这是一个关于如何 运行 glmnet 的例子:

library(glmnet)
library(tidyverse)

df是你提供的数据集。

select y 变量:

y <- df$SP.DYN.TFRT.IN

select数值变量:

df %>%
  select(-SP.DYN.TFRT.IN, -region, -country.code) %>%
  as.matrix() -> x

select 因子变量并转换为虚拟变量:

df %>%
  select(region, country.code) %>%
  model.matrix( ~ .-1, .) -> x_train

运行 模型,这里有几个参数可以调整我建议检查 documentation。这里我只是 运行 5 折交叉验证来确定最好的 lambda

cv_fit <- cv.glmnet(x, y, nfolds = 5) #just with numeric variables

cv_fit_2 <- cv.glmnet(cbind(x ,x_train), y, nfolds = 5) #both factor and numeric variables

par(mfrow = c(2,1))
plot(cv_fit)
plot(cv_fit_2)

最佳 lambda:

cv_fit$lambda[which.min(cv_fit$cvm)]

最好的系数 lambda

coef(cv_fit, s = cv_fit$lambda[which.min(cv_fit$cvm)])

相当于:

coef(cv_fit, s = "lambda.min")

在 运行 宁 coef(cv_fit, s = "lambda.min") 之后,结果 table 中具有 - 的所有特征都从模型中删除。这种情况对应于图上用左侧垂直虚线描绘的左侧 lambda。
我建议阅读链接的文档 - 如果您了解一点线性回归并且包非常直观,那么弹性网很容易掌握。我还建议阅读 ISLR, at least the part with L1 / L2 regularization. and these videos: 1, 2, 3 4, 5, 6, first three are about estimating model performance via test error and the last three are about the question at hand. This one 了解如何在 R 中实现这些模型。顺便说一下,视频中的这些人发明了 LASSO 并制作了 glment。

同时检查 glmnetUtils library which provides a formula interface and other nice things like in built mixing parameter (alpha) selection. Here is the vignette