通过 cooks 距离和 lm 模型去除异常值

Outlier removal via cooks distance and lm models

我尝试编写一种方法来从线性模型中删除异常值。我想更灵活地使用我用于此目的的公式。但是没用。

require(caret)
random_samples <- createDataPartition(iris$Sepal.Length, times=10, p=0.8)

getTrainTest <- function(Index, data){
  train_data <- data[Index, ] # test_data = Umfang von test_rowLocations --> Datensatz k
  test_data <- data[-Index, ] # training data = OG data frame - test data
  return(list("train"=train_data, "test"=test_data))
}

datasets <- lapply(random_samples, getTrainTest, iris)

forumla1 <- as.formula(Sepal.Length ~ Petal.Length)

compute_cooks_models <- function(x,eq){
  cooks.distance(lm(eq, 
                    data = x, na.action = na.exclude))}

result <- Map (compute_cooks_models,datasets, eq=forumla1)

错误:'symbol' 类型的对象不是子集

我不明白我做错了什么??

有人能帮帮我吗? 纳丁

你的代码中有几个问题。

  • datasets 是数据框列表的列表,因此当您使用 Map 遍历它们时,您正在遍历第一级,从而将列表传递给函数 compute_cooks_models。如果你想用训练集训练 lm 模型,那么你必须在参数数据

    中使用 x$train
  • 第二个问题是使用 Map 此函数假定您为函数中的每个参数传递一个向量或值列表。示例如下:

my_fun <- function(x, y){
  paste0(x, y)
}

Map(my_fun, letters[1:5], 1:5)

## Output:
# $a
# [1] "a1"
# 
# $b
# [1] "b2"
# 
# $c
# [1] "c3"
# 
# $d
# [1] "d4"
# 
# $e
# [1] "e5"

这意味着在您的情况下该函数正在尝试获取第一个 datasets 中的元素和 forumla1 中的第一个元素,这在将公式的一个符号传递给 lm 调用时当然会导致错误。 您可以改为使用 sapply,我认为这将满足您的需要,如下所示:

forumla1 <- as.formula(Sepal.Length ~ Petal.Length)

compute_cooks_models <- function(x,eq){
  cooks.distance(lm(eq, data = x$train, na.action = na.exclude))
  }

result <- sapply(datasets, compute_cooks_models, eq=forumla1)