2017-10-21 52 views
2

我有一个包含1000个观察值和76个变量的数据集,其中约有20个是分类变量。我想在整个数据集上使用LASSO。我知道有因素变量在LASSO中通过lars或glmnet并不真正起作用,但变量太多,并且存在太多不同的,无序的值,他们可以对这些变量进行合理的数值重新编码。在分类变量中使用R中的LASSO

在这种情况下可以使用LASSO吗?我该怎么做呢?创建预测的矩阵债收益率这样的响应:

hdy<-as.numeric(housingData2[,75]) 
hdx<-as.matrix(housingData2[,-75]) 
model.lasso <- lars(hdx, hdy) 
Error in one %*% x : requires numeric/complex matrix/vector arguments 

我意识到,其他方法可能更容易或更合适,但面临的挑战实际上是做到这一点使用拉尔斯或glmnet,所以如果可能的话,我将不胜感激任何想法或反馈。

谢谢

+0

使用'model.matrix'创建预测矩阵,它将使用虚拟变量重新编码您的因子变量。你可能也想看一下组套索 – user20650

+0

因此,使用hdx <-model.matrix(〜。,data = xdata,contrasts.arg = sapply(xdata,is.factor))我能够做到这一点,但然后将其插入lars()给我的错误“错误在if(any(nosignal)){:缺少值,其中TRUE/FALSE需要”。我不知道如果(任何(nosignal))在哪里,但它不是我故意运行的任何代码。我不完全熟悉套索的内部运作,所以很抱歉。 – Alex

+0

到目前为止,但我们需要一个可重复的例子来帮助你更远。下面的例子使用'lars(x = x_train,y = df $ var5)'似乎工作正常。你的输入数据中有“NA”值吗? –

回答

0

您可以使用您的model.matrix做出因素虚拟变量。

我创建了一个data.frame。 y是目标变量。

create_factor <- function(nb_lvl, n= 100){ 
    factor(sample(letters[1:nb_lvl],n, replace = TRUE))} 

df <- data.frame(var1 = create_factor(5), 
      var2 = create_factor(5), 
      var3 = create_factor(5), 
      var4 = create_factor(5), 
      var5 = rnorm(100), 
      y = create_factor(2)) 


    # var1 var2 var3 var4  var5 y 
    # 1 a c c b -0.58655607 b 
    # 2 d a e a 0.52151994 a 
    # 3 a b d a -0.04792142 b 
    # 4 d a a d -0.41754957 b 
    # 5 a d e e -0.29887004 a 

选择所有因子变量。我用dplyr::select_if然后解析 变量名就可以像y ~ var1 + var2 +var3 +var4

library(dplyr) 
library(stringr) 
library(glmnet) 
vars_name <- df %>% 
    select(-y) %>% 
    select_if(is.factor) %>% 
    colnames() %>% 
    str_c(collapse = "+") 

model_string <- paste("y ~",vars_name) 

的表达model.matrix创建虚拟变量。不要忘记as.formula强制字符公式。

x_train <- model.matrix(as.formula(model_string), df) 

适合你的模型。

lasso_model <- cv.glmnet(x=x_train,y = df$y, family = "binomial", alpha=1, nfolds=10) 

该代码可以简化。但这个想法在这里。

+0

所以这一切都运行到最后一部分当我这样做,我得到错误“glmnet中的错误(x,y,权重=权重,偏移量=偏移量,lambda = lambda,:在y (1000)不等于x(0)的行数“这在我看时很有意义,因为x_train看起来是一个num [0,1:128]的矩阵。是吧? – Alex

+0

好吧,那么所有你的行至少有一个NA,你需要通过输入它们来处理你的缺失值有一些有很多NA的列,你可以删除。 当你有一个足够完整的行的数据集,它可以与: 'lasso_model < - cv.glmnet(x = x_train,y = na.omit(df $ y),family =“binomial”,alpha = 1,nfolds = 10)'(我加了'na.omit' df $ y) –