【问题标题】:How can I filter out rows from linear regression based on another linear regression如何根据另一个线性回归从线性回归中过滤掉行
【发布时间】:2015-08-23 19:30:33
【问题描述】:

我想进行一个线性回归,它包含三个步骤:1) 对所有数据点运行回归 2) 取出 10 个异常值使用rstandard 的绝对距离值3) 在新数据框上再次运行回归。 我知道如何手动完成,但这些非常尴尬。有没有办法自动完成?取出列也可以吗?

这是我的玩具数据框和代码(我将取出 2 个顶级异常值):

df <- read.table(text = "userid target birds    wolfs     
                 222       1        9         7 
                 444       1        8         4 
                 234       0        2         8 
                 543       1        2         3 
                 678       1        8         3 
                 987       0        1         2 
                 294       1        7         16 
                 608       0        1         5 
                 123       1        17        7 
                 321       1        8         7 
                 226       0        2         7 
                 556       0        20        3 
                 334       1        6         3 
                 225       0        1         1 
                 999       0        3         11 
                 987       0        30         1  ",header = TRUE) 
model<- lm(target~ birds+ wolfs,data=df)
rstandard <- abs(rstandard(model))
df<-cbind(df,rstandard)
g<-subset(df,rstandard > sort(unique(rstandard),decreasing=T)[3])
g
       userid target birds wolfs rstandard    
    4     543      1     2     3  1.189858    
   13    334      1     6     3  1.122579  

   modelNew<- lm(target~ birds+ wolfs,data=df[-c(4,13),])

【问题讨论】:

  • 您能解释一下您确定什么是异常值的规则吗?根据您的代码,这是abs(rstandard()) 中两个最高值的情况,但这似乎很随意。我问是因为使用关于价值而不是相对排名的规则会更容易做到这一点。
  • 你好@ulfelder,这个规则是基于我对我拥有的一个大数据集所做的许多测试。实际上我打算在我拥有的其他数据集上测试这个规则,这就是我想自动化它。
  • 所以澄清一下,您要始终适用的规则是:扔掉两个最有影响力的案例?
  • 是@ulfelder。但重要的是要找出是否有办法根据过滤器删除行或列作为回归的一部分。过滤器可以更改,例如 mybe Bonferonni 测试会更好,但如何过滤回归本身的结果?

标签: r linear-regression


【解决方案1】:

如果不估计两个模型,我看不出你怎么能做到这一点,第一个模型用于识别最有影响力的案例,第二个模型用于确定没有这些案例的数据。您可以简化代码并避免使工作区混乱,但是,通过一次性完成所有操作,在调用中嵌入子集过程以估计“最终”模型。这是您给出的示例的代码:

model <- lm(target ~ birds + wolfs,
    data = df[-(as.numeric(names(sort(abs(rstandard(lm(target ~ birds + wolfs, data=df))), decreasing=TRUE)))[1:2]),])

这里,初始模型、影响评估和随后的数据子集都内置在第一个data =之后的代码中。

另外,请注意,生成的模型将不同于您的代码生成的模型。那是因为你的g 没有正确识别出两个最有影响力的案例,你可以看看你是否只关注abs(rstandard(lm(target ~ birds + wolfs, data=df))) 的结果。我认为这与您使用unique() 有关,这似乎没有必要,但我不确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 2017-08-20
    • 2021-11-23
    • 2012-10-28
    • 2019-10-09
    • 1970-01-01
    • 2017-06-17
    • 2019-01-29
    相关资源
    最近更新 更多