从回归中去除另一个变量后筛选不稳定系数的符号
Screening unstable coefficient's sign after removing another variable from regression
我正在尝试测试在我从 R 中的 lm()
中删除另一个变量后,哪个变量的符号将发生变化(+ 或 -)。
这是我的数据:
df <- data.frame(T1 = c(70,65,87,67,70,65,87,67,69),
T2 = c(95,88,91,65,87,67,70,65,101),
T3 = c(64,65,53,74,91,65,87,67,70),
T4 = c(56,64,75,65,67,70,65,87,67),
T5 = c(640,650,530,740,910,650,870,670,700),
NYC = c(50,51,78,88,74,91,65,87,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
我正在尝试测试在我从 R 中的 lm()
中删除另一个变量后,哪个变量的符号将发生变化(+ 或 -)。
这是我的数据:
df <- data.frame(T1 = c(70,65,87,67,70,65,87,67,69),
T2 = c(95,88,91,65,87,67,70,65,101),
T3 = c(64,65,53,74,91,65,87,67,70),
T4 = c(56,64,75,65,67,70,65,87,67),
T5 = c(640,650,530,740,910,650,870,670,700),
NYC = c(50,51,78,88,74,91,65,87,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