如何创建一个循环来迭代地从回归方程中去除系数

时间:2018-06-11 19:14:36

标签: r loops rstudio regression

示例任意df:

Dates        NY       CA       OH       MA
2018-01-01   9073     4564     2342     5645
2018-01-02   2342     4565     3453     5675
2018-01-03   1234     7567     5345     6877
2018-01-04   1231     3545     3453     7686
2018-01-05   4512     4564     3453     6787
.....        ....     ....     ....     ....

我正在尝试对包含> 300变量的df进行迭代逐步回归。我为自己设置了一个简单的df(如上图所示)来练习到达那里。

这是我希望实现的目标: 1)逐步回归 2)删除系数> =指定值(选择任何进行测试,比如说.1) 3)重新运行逐步回归 4)重复步骤2或在未满足约束条件时停止(意味着,如果所有系数都在指定值内,则停止循环)

这是我到目前为止的作品:

1)step(lm(NY~. -Dates, df))

2)names(coef(df))[which(coef(df)<=.2)]

因此1完成逐步回归运算,2完成命名小于或等于指定值的系数,比如说0.2。如何组合代码以从步骤1回归中删除这些值,并在没有变量的情况下重新应用逐步回归,并继续此过程直到所有变量都符合指定范围?

谢谢,

1 个答案:

答案 0 :(得分:1)

就像在@useR的评论中所说的那样,我不相信你在做什么,但如果你想要一个机制的答案,那么就这样吧。

请注意,需要step,简单lm会产生完全相同的结果。

我将使用内置数据集mtcars作为示例。

data("mtcars")

response <- "mpg"
fmla <- as.formula(paste(response, ".", sep = "~"))

iter <- 0
fit <- lm(fmla, mtcars)
while(any(abs(coef(fit)) >= 2)){
  iter <- iter + 1
  nm <- names(coef(fit))[abs(coef(fit)) < 2]
  fmla <- if(any(grepl("Inter", nm)))
    paste(response, paste(nm, collapse = "+"), sep = "~")
  else
    paste(response, paste(c("0", nm), collapse = "+"), sep = "~")
  fmla <- as.formula(fmla)
  fit <- lm(fmla, mtcars)
}

fit
#
#Call:
#  lm(formula = fmla, data = mtcars)
#
#Coefficients:
#  cyl     disp       hp     qsec     carb  
#0.4795  -0.0465   0.0314   1.4152  -0.7596 

如果您想检查不需要step,只需将lm行替换为

fit <- step(lm(fmla, mtcars))