从回归中去除另一个变量后筛选不稳定系数的符号

问题描述

在从 R 中的 lm()删除一个变量后,我试图测试哪个变量的符号会改变(+ 或 -)。
这是我的数据:

df <- data.frame(T1 = c(70,65,87,67,70,69),T2 = c(95,88,91,101),T3 = c(64,53,74,70),T4 = c(56,64,75,67),T5 = c(640,650,530,740,910,870,670,700),NYC = c(50,51,78,67))

我编写了以下代码

mymod <- lm(NYC~.,df)
storage <- c()
for(i in names(df[,!(names(df) %in% "NYC")])) {
  myupdate <- update(mymod,. ~ . -get(i))
  mysign <- mymod$coefficients[!names(mymod$coefficients) %in% c(get(i),'(Intercept)')]*
    myupdate$coefficients[!names(myupdate$coefficients) %in% '(Intercept)']
  storage <- c(storage,names(mysign[mysign]<0))  
}

因此,我的响应变量是 NYC,我想先删除 T1 并更新回归并检查与完整模型相比是否有任何变量迹象(即 T2、T3、T4 和 T5)发生变化(即 lm(NYC~T1+T2+T3+T4+T5,df))。然后我删除 T2 等等。intercept 的符号并不重要,但我们一直将它保留在模型中。 我认为的逻辑是检查完整模型和更新模型的乘法是否为负。因此,它显示了完整模型和更新模型中的相应迹象相互对立。由于 (-)x(-)(+)x(+) 始终为正值。

不幸的是我的代码抛出了一个错误

Error in get(i) : object 'T1' not found

预期的输出可能如下所示:

>storage
[1] "T3" "T5"

我不知道如何修复它,或者是否有一种有效的方法解决它。任何帮助将不胜感激。

解决方法

提示逐行运行您的代码,以找到导致错误的确切行。在 for 循环的情况下,您可以设置 i <- "T1 并单独运行 for 循环中的行。

在这种情况下,问题出在 get(i) 上。那是因为没有变量 T1。该变量仅存在于 data.frame 中。要从字符串构建公式,我通常将 pasteas.formula 结合使用。所以

as.formula(paste0('. ~ . - ',i))

如果您必须将函数用作 getassign,则有更实用或更强大的解决方案。

对于您的整个循环,我会执行以下操作:

covs <- setdiff(names(df),"NYC")
m0 <- lm(NYC ~ .,data = df)

res <- data.frame(cov = covs,est0 = coef(m0)[-1])

for (cov in covs) {
  m <- update(m0,as.formula(paste0(". ~ . - ",cov)))
  coefs <- coef(m)[-1]
  m <- match(res$cov,names(coefs))
  res[[cov]] <- sign(coefs[m]) == sign(res$est0)
  # OR
  # res[[cov]] <- coefs[m]
}

结果:

> res
   cov        est0   T1    T2   T3   T4   T5
T1  T1 -0.11329815   NA  TRUE TRUE TRUE TRUE
T2  T2 -0.52177372 TRUE    NA TRUE TRUE TRUE
T3  T3 -0.02237203 TRUE FALSE   NA TRUE TRUE
T4  T4  0.80376280 TRUE  TRUE TRUE   NA TRUE
T5  T5          NA   NA    NA   NA   NA   NA