如何使用R中的createFolds函数处理lm.fit(0个非na情况)中的错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用R中的createFolds函数处理lm.fit(0个非na情况)中的错误相关的知识,希望对你有一定的参考价值。

我想使用creatFolds函数和特定的set.seed运行回归模型。

我可以运行没有creatFolds函数且没有错误的回归模型。

Friedman数据集可以找到here

   wdbc <- read_csv("friedman.dat", col_names = FALSE, skip = 10) 
   wdbc[] <- lapply(wdbc, scale)

回归模型 createFolds函数

    lm(X6 ~ ., data = wdbc) 

Call:
lm(formula = X6 ~ ., data = wdbc)

Coefficients:
(Intercept)           X1           X2           X3           X4           X5  
  2.553e-16    3.892e-01    3.563e-01    2.834e-04    5.739e-01    2.767e-01  

回归模型with createFolds函数

 FX <- function(seed, data, k=30) {
      set.seed(seed)  
      folds <- createFolds(data[, "X6"], k=k, list=TRUE, returnTrain=TRUE) 
      lm1 <- lapply(folds, function(folds) lm(X6 ~ ., data=data[folds, ]))
    }
    seeds <- 1:30 
    res <- lapply(seeds, FX, data=wdbc) 

 Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases  
答案

createFolds函数是有问题的部分:

createFolds(wdbc[, "X6"], k=1, list=TRUE, returnTrain=TRUE)
$Fold1
integer(0)

这为您提供了一个空向量,因此您正在使空白回归。因此,当您执行以下不同的调用时,会有所不同:

typeof(wdbc[["X6"]])
[1] "double"
typeof(wdbc[,"X6"])
[1] "list"
typeof(as.matrix(wdbc)[,"X6"])
[1] "double"

也许其他一些精通小技巧的人可以加入。

您可以将数据转换为data.frame或使用data[["X6"]]

FX <- function(seed, data, k=30) {
      set.seed(seed)  
      folds <- createFolds(data[["X6"]], k=k, list=TRUE, returnTrain=TRUE) 
      lm1 <- lapply(folds, function(folds) lm(X6 ~ ., data=data[folds, ]))
    }
    seeds <- 1:30 
res <- lapply(seeds, FX, data=wdbc)

res[[1]][[1]]

Call:
lm(formula = X6 ~ ., data = data[folds, ])

Coefficients:
(Intercept)           X1           X2           X3           X4           X5  
  0.0007255    0.3933912    0.3600078   -0.0008834    0.5733893    0.2729162  

以上是关于如何使用R中的createFolds函数处理lm.fit(0个非na情况)中的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将公式转换为变量以与 R 中的 fastLm 函数一起使用

为 R 中的许多列运行具有 emmeans 和对比的 LM

错误:无法检索下一个对象:迭代器已到达末尾。 createFolder@函数:createFolder.gs:8

如何在 R 中实现保留验证

为啥内置的 lm 函数在 R 中这么慢?

如何在自己的函数中使用lm中的变量?