首页 > 解决方案 > 通过厨师距离和 lm 模型去除异常值

问题描述

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

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)

错误:“符号”类型的对象不是子集

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

有人可以帮我吗?纳丁

标签: routliers

解决方案


您的代码中有几个问题。

  • 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你可以改为使用sapplywhich 会做你需要的我认为,像这样:

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) 

推荐阅读