R语言 删除高度相关的变量并保留低相关的变量

9wbgstp7  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(265)

我有一个数据集“rf1”的845特征和1052行,并希望消除,为了做ML,高度相关的特征。我做了这个代码,但它显示我的特征和相关性没有消除它们...

`corr_simple<-function(rf1,sig=0.9)
{df_cor <- rf1 %>% mutate_if(is.character, as.factor)
df_cor <- df_cor %>% mutate_if(is.factor, as.numeric)
corr<-cor(df_cor)
corr[lower.tri(corr,diag=TRUE)] <- NA 
corr[corr == 1] <- NA 
corr <- as.data.frame(as.table(corr))
corr <- na.omit(corr) 
corr <- subset(corr, abs(Freq) > sig) 
corr <- corr[order(-abs(corr$Freq)),] 
print(corr)
mtx_corr <- reshape2::acast(corr, Var1~Var2,value.var="Freq")}
corr_simple(rf1)`

这是结果,但我想消除阈值为0.9 MY RESULTS的变量
当我使用像这样的函数时,我会看到这样的错误消息:

`data<-data.frame(rf1)
cor_matrix <- cor(data)
cor_matrix_rm <- cor_matrix                 
cor_matrix_rm[upper.tri(cor_matrix_rm)] <- 0
diag(cor_matrix_rm) <- 0
cor_matrix_rm
data_new <- data[ , !apply(cor_matrix_rm, 2, function(x) any(x > 0.90))]
Error in [.data.frame(data, , !apply(cor_matrix_rm, 2, function(x) any(x >  : 
  undefined columns selected`

我搜索并尝试了其他解决方案,但总是这个问题...

w6lpcovy

w6lpcovy1#

你可以用一个循环来完成,这里有一个使用mtcars的例子,你把阈值设置为r_threshold(在下面的示例中为.8)。循环mtcars的列,每次都删除相关性绝对值与预定义阈值相关的列。删除相关列后,将移至下一列。保留前面步骤中未删除的列。注意,cyldispwt已被删除(您可以通过循环前后列名的差异看出这一点。

data(mtcars)
colnames(mtcars)
#>  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
#> [11] "carb"

r_threshold <- .8
keep_going <- TRUE
i <- 1
while(keep_going){
  s <- seq(i+1, ncol(mtcars))
  r <- cor(mtcars[,s], mtcars[,i])
  if(any(abs(r) > r_threshold)){
    mtcars <- mtcars[, -s[which(abs(r) > r_threshold)]]
  }
  i <- i+1
  if(ncol(mtcars) <= i){
    keep_going <- FALSE
  }
}
colnames(mtcars)
#> [1] "mpg"  "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"

reprex package(v2.0.1)于2023年2月9日创建

相关问题