问题描述
在从 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 中。要从字符串构建公式,我通常将 paste
与 as.formula
结合使用。所以
as.formula(paste0('. ~ . - ',i))
如果您必须将函数用作 get
和 assign
,则有更实用或更强大的解决方案。
对于您的整个循环,我会执行以下操作:
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