R Caret:NA没有缺失值时的错误

时间:2017-12-28 19:36:25

标签: r dataframe missing-data glmnet

我正在尝试为没有缺失值的数据集运行分类算法。这是数据集描述:

'data.frame':   59977 obs. of  6 variables:
 $ gender      : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 1 1 2 2 ...
 $ age         : num  35.7 35.7 35.7 35.7 35.7 ...
 $ code        : Factor w/ 492 levels "ADN105","AXN16B",..: 128 128 128 363 363 363 104 104 221 221 ...
 $ totalflags  : num  4 4 4 4 4 4 3 3 2 2 ...
 $ measure2    : num  30 30 30 1 1 1 23 23 22 22 ...
 $ outcome     : num  1 1 1 0 0 0 1 1 1 1 ...
 - attr(*, "na.action")=Class 'omit'  Named int [1:138] 3718 3719 5493 5494 5495 5496 7302 7303 8415 8416 ...
  .. ..- attr(*, "names")= chr [1:138] "4929" "4930" "7384" "7385" ...

当我运行以下命令时

x <- Mydataset[,1:5]
y <- Mydataset[,6]
fit <- glmnet(x, y, family="binomial", alpha=0.5, lambda=0.001)

我得到了

Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  : 
  NA/NaN/Inf in foreign function call (arg 5)
In addition: Warning message:
In lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  :
  NAs introduced by coercion

在运行glm模型之前,我这样做了:

Mydataset <- na.omit(Mydataset)

并检查确保没有NA存在:

sapply(Mydataset, function(y) sum(length(which(is.na(y)))))

我得到了:

gender          age       code totalflags     measure2   outcome


 0            0            0            0            0            0 

我看了其他问题,找不到任何相关内容。感谢您的任何想法和帮助

编辑:答案

我做了一点挖掘并决定将数据框更改为数字矩阵,模型运行没有抱怨。这是帮助我的代码:

x <- data.matrix(Mydataset[,1:5])
y <- data.matrix(Mydataset[,6])

1 个答案:

答案 0 :(得分:0)

最可能的原因是一个或多个级别内的因子变量数量很少或为零。先试试这个:

 Mydataset [ c('gender',  'code') ] <- 
                             lapply( Mydataset [ c('gender',  'code') ], factor)

如果这不起作用,那么您应该显示使用的实际代码以及所用对象的更好描述和名称。目前我们甚至不知道xy是什么。

EDIT: glmnet函数没有公式接口,并且没有设置为处理data.frames和因子的典型R回归函数允许的方式。查看x的结构(仍然是列表/数据框)并查看?glmnet的帮助页面并在数字矩阵时进行一些搜索处理因子的正确方法/ em>是预期的输入,我建议将您的因子转换为model.matrix的假人。如果更改治疗对比的默认对比度方案,则可以更轻松地解释结果(参见https://stats.stackexchange.com/questions/69804/group-categorical-variables-in-glmnet):

contr.Dummy <- function(contrasts, ...){
   conT <- contr.treatment(contrasts=FALSE, ...)
   conT
}
options(contrasts=c(ordered='contr.Dummy', unordered='contr.Dummy'))

x.m <- model.matrix( ~.-1, x)
fit <- glmnet(x=x.m, y, family="binomial", alpha=0.5, lambda=0.001)