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

问题描述 投票:0回答:1

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

'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])
r dataframe missing-data glmnet
1个回答
0
投票

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

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

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

EDIT: glmnet函数没有公式接口,也没有设置为处理data.frames和因子的典型R回归函数允许的方式。在查看x的结构(仍然是列表/数据框)并查看?glmnet的帮助页面并在数字矩阵是预期输入时进行一些搜索处理因子的正确方法时,我建议将您的因子转换为假人与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)
© www.soinside.com 2019 - 2024. All rights reserved.