r - 通过厨师距离和 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)
错误:“符号”类型的对象不是子集
我不明白我做错了什么??
有人可以帮我吗?纳丁
解决方案
您的代码中有几个问题。
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
which 会做你需要的我认为,像这样:
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)
推荐阅读
- ms-access - 将 MS Access 表中的值分配给变量
- vue.js - 推送路由(从 vueJS 移动到 nuxtJS)
- azure - 只有 RDP 从本地局域网工作到站点 2 站点 IPSEC 的天蓝色
- ruby-on-rails - Rspec 和 FactoryGirl 有几个模型
- azure - Azure WAF 403 响应
- css - 为 ID 创建别名
- firewall - 连接到后面的服务器
- c# - 当字符串包含空值(“NaN”)时,JsonConvert.DeserializeObject 失败
- javascript - vuex 中 { dispatch, commit } 的类型是什么?
- oracle-apex - Apex 应用程序文本项字段的电子邮件验证