【问题标题】:glmnet error - non-conformable argumentsglmnet 错误 - 不符合要求的参数
【发布时间】:2016-05-08 17:51:10
【问题描述】:

我在尝试使用glmnet stats package 时一直遇到顽固错误,如下所示。

我已经尝试了here 列出的有限建议(包括将数据设置为 data.matrix)。我还尝试使用 ?glmnet 中描述的“penalty.box”设置,但没有得到积极的结果。

df = structure(list(term = c(0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), int_rate = c(10.65, 15.27, 15.96, 13.49, 12.69, 7.9, 15.96, 18.64, 21.28, 12.69, 14.65, 12.69, 13.49, 9.91, 10.65, 16.29, 15.27, 6.03, 11.71, 6.03, 15.27, 12.42, 11.71, 11.71, 11.71, 9.91, 16.77, 11.71, 11.71, 7.51, 7.9, 15.96, 8.9, 15.96, 10.65, 9.91, 7.9, 12.42, 12.69, 7.51, 7.9, 18.25, 16.77, 6.03, 9.91, 8.9, 10.65, 6.03, 6.62, 9.91), emp_length = c(NA, 1, NA, NA, 1, 3, 8, 9, 4, 1, 5, NA, 1, 3, 3, 1, 4, NA, 1, 6, 3, NA, NA, 5, 1, 2, 2, NA, 1, 7, 5, 2, 2, 7, NA, 2, 1, 1, 1, 4, NA, 9, NA, NA, 6, NA, 6, NA, 5, 8), annual_inc = c(24000, 30000, 12252, 49200, 80000, 36000, 47004, 48000, 40000, 15000, 72000, 75000, 30000, 15000, 1e+05, 28000, 42000, 110000, 84000, 77385.19, 43370, 105000, 50000, 50000, 76000, 92000, 50004, 106000, 25000, 17108, 75000, 29120, 24044, 34000, 41000, 55596, 45000, 36852, 27000, 68004, 62300, 65000, 55000, 45600, 0000, 1e+05, 27000, 60000, 70000, 80000), delinq_2yrs = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), inq_last_6mths = c(1L, 5L, 2L, 1L, 0L, 3L, 1L, 2L, 2L, 0L, 2L, 0L, 1L, 2L, 2L, 1L, 2L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 2L, 0L, 0L, 1L, 3L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 2L), outcome = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("term", "int_rate", "emp_length", "annual_inc", "delinq_2yrs", "inq_last_6mths", "outcome"), row.names = c(NA, 50L), class = "data.frame")
X = select(df, -outcome)
Y = df$outcome
X_train = as.matrix(X[1:50,])
Y_train = as.matrix(Y[1:50])

library(glmnet)

model = glmnet(X_train, Y_train, family = "binomial")

summary(model)

这是错误:

Error in drop(y %*% rep(1, nc)) : 
  error in evaluating the argument 'x' in selecting a method for     
function 'drop': Error in y %*% rep(1, nc) : non-conformable arguments

实际数据集是 110 个变量和 ~1mm 观察值,但上面的部分数据集产生了同样的问题。

对此调试方法有什么建议吗?

【问题讨论】:

  • 怀疑你不应该这样做dep_var = data.matrix(train$outcome)。更有可能只使用dep_var = train$outcome。还为具有select 的包提供库调用。可能有一个函数允许在未加引号的列名前使用减号,但看起来非常“不标准”。
  • 我之前尝试过该解决方案,但这并没有解决问题。现在我添加了可重复的答案有什么线索吗?
  • 还为select函数添加了dplyr包调用

标签: r logistic-regression glmnet


【解决方案1】:

问题是您有NA 条目是emp_length 列,您不能将其包含在传递给glmnet 的数据集中。您要么需要从数据集中删除包含 NA 值的行,要么对其进行估算。

这里有一些代码可用于删除值并使glmnet 正常工作。

X = select(df, -outcome)
Y = df$outcome
X_train = as.matrix(X[1:50,])
Y_train = as.matrix(sample(0:1,50,replace=TRUE))

has_NA = apply(is.na(X_train), 1, any) #= 1 if any column in that row is NA
X_train = X_train[!has_NA,]
Y_train = Y_train[!has_NA,]

library(glmnet)    
model = glmnet(X_train, Y_train, family = "binomial")

【讨论】:

  • 谢谢。您的解决方案没有解决问题。现在有了一个可重现的例子,你有什么进一步的见解吗?
  • 直到你澄清它是dplyr::select,它才能重现。您还指的是未定义的 raw_data 。我用X = subset(df, ,-outcome); Y = df$outcome。您的结果变量目前全为零,因此这似乎不是一个非常有用的示例。
  • @AME 是的,您的错误是由于您的 NA 矩阵中有 NA 条目。请参阅我的更新回复。正如@42 所说,您的结果中也有全 0,这没什么用,但没关系,因为 glmnet 仍然有效。
  • @BerkU.. 当我的所有结果都是 0 时,我得到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2018-05-15
  • 2015-11-24
  • 2020-09-09
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多