1

我有一个矩阵的观察数和矩阵数,我想删除所有零列,然后我尝试使用 nearZeroVar(dataset)。

removeColumns <-nearZeroVar(datset) # remove zeros
testT <- datset[, -removeColumns]

但是还有另一种方法是

removeZeros <- apply(dataset, 2, function(x) length(unique(x)) == 1)

dataset<- datset[, !removeZeros];

它在小向量中给了我相同的结果,

    mdat <- matrix(c(1,2,3,0,4,5, 0,0,0,0, 0,0,3,0,0,0,0,0,0,0,1,2,3,0), nrow = 6, ncol = 4, byrow = TRUE)
"
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    0
[2,]    4    5    0    0
[3,]    0    0    0    0
[4,]    3    0    0    0
[5,]    0    0    0    0
[6,]    1    2    3    0
"
cols_mdat <-nearZeroVar(mdat)
"4"

mdat_remove <-mdat[,-cols_mdat]


"[,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    0
[3,]    0    0    0
[4,]    3    0    0
[5,]    0    0    0
[6,]    1    2    3
"

mdatzv <- apply(mdat, 2, function(x) length(unique(x)) == 1);
mdat_nzv <- mdat[, !mdatzv];
"
 [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    0
[3,]    0    0    0
[4,]    3    0    0
[5,]    0    0    0
[6,]    1    2    3
"

但在我的数据集中,有 785 个特征和大约 4200 个观察值,它返回不同数量的特征。

你能告诉我这两种方式有什么区别吗?

4

1 回答 1

1

第二个示例只是删除该列中有一个唯一值的列。考虑一下:

mdat <- matrix(c(100,100,100,100,100,100, 0,0,0,0, 0,0,3,0,0,0,0,0,0,0,1,2,3,0), nrow = 6, ncol = 4, byrow = FALSE)
mdat
#    [,1] [,2] [,3] [,4]
#[1,]  100    0    3    0
#[2,]  100    0    0    0
#[3,]  100    0    0    1
#[4,]  100    0    0    2
#[5,]  100    0    0    3
#[6,]  100    0    0    0


mdat[ , !apply(mdat, 2, function(x) length(unique(x)) == 1) ]
#    [,1] [,2]
#[1,]    3    0
#[2,]    0    0
#[3,]    0    1
#[4,]    0    2
#[5,]    0    3
#[6,]    0    0

值是否接近零并不重要,如果列中只有一个唯一值,则逻辑比较==返回TRUE并且!运算符意味着我们排除了该

nearZeroVar另一方面,删除具有唯一值的列,但也删除相对于观察总数而言唯一值非常少的列,并且最常见值与下一个最常见值的比率很大(即高度分散)。现在考虑相同的数据,但是如果我们将最常见值与下一个最常见值的比率设置得足够低,并且将唯一值占样本总数的百分比设置得足够高,那么这些列也将被选中:

nearZeroVar( mdat , freqCut = 4 , uniqueCut = 40 ) 
#[1] 1 2 3

第 1 列和第 3 列被选中,因为它们包含 1 个值。选择第二列是因为大多数列值 ( 0) 与下一个最常见 ( 3) 的比率为 5:1,大于截止值 4,以及列中唯一值数量的百分比(2 个值03)在观察总数(6行)中2/6*100是 33%,这是 <40%我们为唯一切割指定的。

于 2013-04-30T07:44:36.970 回答