删除相关矩阵中的NA

时间:2013-10-01 09:54:44

标签: r variables matrix correlation na

我正在为4000变量的数据框做一个相关矩阵,我想删除显示>的变量。 0.5相关,所以我使用{caret}包中的这个命令。

removeme <- findCorrelation(corrMatrix, cutoff = 0.5, verbose = FALSE)

Error in if (mean(x[i, -i]) > mean(x[-j, j])) { : 
missing value where TRUE/FALSE needed

我拥有的数据变化很大,我在这里和那里得到NA值。首先,我在这个命令的帮助页面上找不到可以处理NA值的东西,所以我决定自己删除NA值。

有些变量在数据中一直显示NA值,有些变量显示的NA值很少。我试图删除导致任何NA值的变量,以便我能够使用上述命令。这是我的数据的最小例子

dput(df) <- structure(list(GK = 1:10, HGF = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L), HJI = c(2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    HDF = c(5L, 6L, 8L, 9L, 5L, 2L, 4L, 3L, 2L, 1L), KLJG = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), KLJA = c(0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L), KDA = c(10L, 11L, 15L, 18L, 
    11L, 10L, 10L, 15L, 12L, 13L), OIE = c(NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA), AFE = c(0L, 0L, 0L, 1L, 0L, 0L, NA, 
    NA, NA, NA)), .Names = c("GK", "HGF", "HJI", "HDF", "KLJG", 
"KLJA", "KDA", "OIE", "AFE"), class = "data.frame", row.names = c(NA, 
-10L))

corrMatrix <- cor(df,use="pairwise.complete.obs")

摆脱这些恼人的变量最好的想法是什么?我已经尝试了许多命令,但没有找到一个可以摆脱这些变量的理想命令。以下是我的一项试验:

removeme <- corrMatrix[,which(as.numeric(rowSums(is.na(corrMatrix))) > 100)] 

此命令的问题是,如果存在超过100个错误变量(在相关矩阵中给出NA),则将删除正常变量,因为正常变量的列将具有&gt; 100 NA值。

我希望这次编辑能让我的问题更加清晰。欢呼声。

3 个答案:

答案 0 :(得分:13)

如果您只想删除任何包含一个或多个NA的列,那么只需执行

x<-x[,colSums(is.na(x))==0]

但是,即使数据丢失,您也可以通过在函数NA中指定use参数来计算没有cor值的相关矩阵。将其设置为pairwise.complete.obscomplete.obs将导致相关矩阵没有NA s。

complete.obs将忽略所有缺少数据的行,而pairwise.complete.obs将忽略丢失的数据对。请注意,虽然pairwise.complete.obs“听起来更好”,因为它使用了更多的可用数据,但不能保证产生正定相关矩阵,这可能是个问题。

> set.seed(123)
> x<-array(rnorm(500),c(100,5))
> x[sample(500,3)]<-NA
> cor(x)
     [,1] [,2] [,3]        [,4]        [,5]
[1,]    1   NA   NA          NA          NA
[2,]   NA    1   NA          NA          NA
[3,]   NA   NA    1          NA          NA
[4,]   NA   NA   NA  1.00000000 -0.01925986
[5,]   NA   NA   NA -0.01925986  1.00000000
> cor(x,use="pairwise.complete.obs")
            [,1]        [,2]        [,3]        [,4]        [,5]
[1,]  1.00000000 -0.04377085 -0.18049501 -0.04914247 -0.19374986
[2,] -0.04377085  1.00000000  0.01296008  0.02606083 -0.12333765
[3,] -0.18049501  0.01296008  1.00000000 -0.03218139 -0.02675554
[4,] -0.04914247  0.02606083 -0.03218139  1.00000000 -0.01925986
[5,] -0.19374986 -0.12333765 -0.02675554 -0.01925986  1.00000000
> cor(x,use="complete.obs")
            [,1]        [,2]        [,3]        [,4]        [,5]
[1,]  1.00000000 -0.06263112 -0.17914810 -0.02574970 -0.20504268
[2,] -0.06263112  1.00000000  0.01263764  0.02543900 -0.12571570
[3,] -0.17914810  0.01263764  1.00000000 -0.03866312 -0.02520500
[4,] -0.02574970  0.02543900 -0.03866312  1.00000000 -0.01688848
[5,] -0.20504268 -0.12571570 -0.02520500 -0.01688848  1.00000000

答案 1 :(得分:5)

在评估数据集预测变量的相关性之前,请删除零方差预测变量。

删除零方差预测变量

zv <- apply(df, 2, function(x) length(unique(x)) == 1)

dfr <- df[, !zv](suppose df is the name of your dataset)

n=length(colnames(dfr))

计算相关矩阵

correlationMatrix <- cor(dfr[,1:n],use="complete.obs")

总结了相关矩阵

print(correlationMatrix)

查找高度校正的属性(理想情况下> 0.7)

highlyCorrelated <- findCorrelation(correlationMatrix, cutoff=(0.7),verbose = FALSE)

打印高度相关属性的索引

print(highlyCorrelated)

重要变量

important_var=colnames(df[,-highlyCorrelated])

答案 2 :(得分:2)

目前尚不清楚你想做什么。但这里有一个如何处理缺失值的例子。我用一个小矩阵表示。

mm <- matrix(NA+0,ncol=4,nrow=3)
mm[1:3] <- 1
mm[8] <- 1

   [,1] [,2] [,3] [,4]
[1,]    1   NA   NA   NA
[2,]    1   NA    1   NA
[3,]    1   NA   NA   NA

删除所有元素为NA

的列
mm[,!colSums(is.na(mm)) == nrow(mm),drop=FALSE]
    [,1] [,2]
[1,]    1   NA
[2,]    1    1
[3,]    1   NA

删除具有任何NA

的列
mm[, !colSums(is.na(mm)) >1,drop=FALSE] ## you can also complete.cases
    [,1]
[1,]    1
[2,]    1
[3,]    1