2017-10-21 75 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) –