通过 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)
我尝试编写一种方法来从线性模型中删除异常值。我想更灵活地使用我用于此目的的公式。但是没用。
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)