使用多个模型时从线性回归中删除异常值

时间:2018-04-24 14:21:36

标签: r lm

我想重新运行我的多元线性回归分析,删除有影响的观察/异常值以确定它们的影响。我的数据有大约1000个30个变量的观察值(5个预测变量,25个结果)。

df <- data.frame(replicate(30, sample(0:1000, 1000, rep = TRUE)))

我对25个结果变量中的每一个执行多元线性回归:

library(tidyverse)

reg <- df %>%
  gather(outcome_name, outcome_value, -(X1 : X5)) %>%
  group_by(outcome_name) %>%
  nest() %>%
  mutate(model = map(data, ~lm(outcome_value ~ X1 + X2 + X3 + X4 + X5, data 
  =.)))

然后我可以随后提取感兴趣的统计数据:

stats <- reg %>%
  mutate(glance = map(model, broom::glance), 
         tidy = map(model, broom::tidy, conf.int = TRUE)
  )

我想重新运行上述内容,但已删除了已识别的异常值,例如,通过&gt; 2个标准偏差高于平均值,或者通过像Cook的距离识别它们。但是,我无法弄清楚如何排除代码中的异常值,以便每个回归模型都适当地迭代。

我尝试过滤观察&gt;在执行回归之前,每个结果变量的平均值为2 SD,但是我丢失了所有25个结果回归模型的观察值,而不是单个结果模型,该观察值是异常值。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用broom::augment向每个数据集添加相关度量,并保持map - ping。

例如:

library(tidyverse)
library(broom)
set.seed(1)
df <- data.frame(replicate(30, sample(0:1000, 1000, rep = TRUE)))

reg <- df %>%
  gather(outcome_name, outcome_value, -(X1 : X5)) %>%
  group_by(outcome_name) %>%
  nest() %>%
  mutate(model = map(data, ~lm(outcome_value ~ X1 + X2 + X3 + X4 + X5, data = .)),
         data2 = map(model, augment),
         data3 = map(data2, filter, abs(.std.resid) < 2),
         model2 = map(data3, ~lm(outcome_value ~ X1 + X2 + X3 + X4 + X5, data = .)))

统计员的免责声明:我已经解决了你问的编程问题。这不应被视为对所谓的“异常值”自动检查或做任何事情的认可。