【问题标题】:R: Regression with a holdout of certain variablesR:保留某些变量的回归
【发布时间】:2014-06-25 06:08:11
【问题描述】:

我正在使用 lm() 进行多线性回归模型,Y 是响应变量(例如:利益回报),其他是解释变量(100 多个案例,30 多个变量)。

有一些变量被认为是关键变量(关于投资),当我运行 lm() 函数时,R 返回一个 adj.r.square 为 97% 的模型。但一些关键变量并不是重要的预测因素。

有没有办法通过保留模型中的所有关键变量(作为重要的预测变量)来进行回归?调整后的 R 平方是否减小并不重要。

如果回归不起作用,是否有其他方法?

谢谢!

===========================

数据集上传 https://www.dropbox.com/s/gh61obgn2jr043y/df.csv

===========================

其他问题: 如果某些变量从前期到本期有影响怎么办? 示例:一个人早上吃早餐时吃药,午餐后药效可能会持续(他/她在午餐时吃第二颗药) 我想我需要考虑数据转换。 * 我的第一选择是加一个结转率:obs.2_trans = obs.2 + c-o rate * obs.1 * 也许我还需要考虑药丸效应本身的衰减,所以s曲线指数变换也是必要的。

以变量main1为例,我可以用try-out方法得到一个理想的协率和s曲线参数,从0.5开始,以0.05为步长进行测试,最高1或最低0,直到我得到最高模型分数 - 比如说,最低 AIC 或最高 R 平方。 这已经是一个巨大的测试量。 如果我需要同时测试 3 个以上的变量,我如何通过 R 来管理?

谢谢!

【问题讨论】:

  • 如果您提供数据集,您可能会得到更好的答案:将其上传到某处并在您的问题中发布链接。一种可能性是您的 30 多个变量中有几个是高度相关的。如果您提供数据集,我可以向您展示几种诊断方法。
  • 您好 jlhoward,数据集已上传。如果变量被命名为“main”,则这些变量被认为是模型的主要变量

标签: r regression


【解决方案1】:

首先,关于“重要性”的说明。对于模型中包含的每个变量,线性建模包报告该变量的系数不为零的可能性(实际上,它们报告p=1-L)。我们说,如果 L 较大(p 较小),则系数“更显着”。因此,虽然谈论一个变量比另一个变量“更重要”是很合理的,但没有绝对的标准来断言“重要”与“不重要”。在大多数科学研究中,截止值是L>0.95 (p<0.05)。但这完全是武断的,也有很多例外。回想一下,欧洲核子研究中心不愿意断言希格斯玻色子的存在,直到他们收集到足够的数据来证明它对 6-sigma 的影响。这大致对应于 p -9。在另一个极端,许多社会科学研究断言 p

其次,如果您的变量高度相关(在您的情况下就是这样),那么从模型中删除一个变量会极大地改变所有 p 值是很常见的。具有高 p 值(不显着)的保留变量可能突然具有低 p 值(更显着),只是因为您从模型中删除了一个完全不同的变量。因此,尝试手动优化拟合通常是一个坏主意。

幸运的是,有许多算法可以为您做到这一点。一种流行的方法从具有所有变量的模型开始。在每一步中,最不重要的变量都会被删除,并将得到的模型与上一步的模型进行比较。如果删除此变量显着降低模型,则基于某些指标,该过程将停止。一个常用的指标是Akaike information criterion (AIC),在 R 中,我们可以使用 MASS 包中的 stepAIC(...) 基于 AIC 标准优化模型。

第三,回归模型的有效性取决于某些假设,尤其是这两个:误差方差是恒定的(不依赖于 y),并且误差的分布近似正态。如果不满足这些假设,p 值完全没有意义!一旦我们拟合了模型,我们就可以使用残差图和 QQ 图来检查这些假设。 您必须为任何候选模型执行此操作!

最后,异常值的存在经常严重扭曲模型(几乎按照定义!)。如果您的变量高度相关,则此问题会被放大。因此,在您的情况下,查找异常值并查看删除它们后会发生什么情况非常重要。

下面的代码总结了这一切。

library(MASS)
url <- "https://dl.dropboxusercontent.com/s/gh61obgn2jr043y/df.csv?dl=1&token_hash=AAGy0mFtfBEnXwRctgPHsLIaqk5temyrVx_Kd97cjZjf8w&expiry=1399567161"
df <- read.csv(url)
initial.fit <- lm(Y~.,df[,2:ncol(df)]) # fit with all variables (excluding PeriodID)
final.fit   <- stepAIC(initial.fit)    # best fit based on AIC
par(mfrow=c(2,2))
plot(initial.fit)                      # diagnostic plots for base model
plot(final.fit)                        # same for best model
summary(final.fit)
# ...
# Coefficients:
#              Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  11.38360   18.25028   0.624  0.53452    
# Main1       911.38514  125.97018   7.235 2.24e-10 ***
# Main3         0.04424    0.02858   1.548  0.12547    
# Main5         4.99797    1.94408   2.571  0.01195 *  
# Main6         0.24500    0.10882   2.251  0.02703 *  
# Sec1        150.21703   34.02206   4.415 3.05e-05 ***
# Third2       -0.11775    0.01700  -6.926 8.92e-10 ***
# Third3       -0.04718    0.01670  -2.826  0.00593 ** 
# ... (many other variables included)
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 22.76 on 82 degrees of freedom
# Multiple R-squared:  0.9824,  Adjusted R-squared:  0.9779 
# F-statistic:   218 on 21 and 82 DF,  p-value: < 2.2e-16

par(mfrow=c(2,2))
plot(initial.fit)
title("Base Model",outer=T,line=-2)
plot(final.fit)
title("Best Model (AIC)",outer=T,line=-2)

因此您可以从中看出,基于 AIC 指标的“最佳模型”实际上确实包括 Main 1、3、5 和 6,但不包括 Main 2 和 4。残差图显示不依赖于y(这很好),并且 QQ 图展示了残差的近似正态性(也很好)。另一方面,杠杆图显示几个点(第 33 行和第 85 行)具有极高的杠杆率,而 QQ 图显示这些相同的点和第 47 行的残差与正态分布并不完全一致。所以我们可以重新运行不包括这些行的拟合,如下所示。

initial.fit <- lm(Y~.,df[c(-33,-47,-85),2:ncol(df)])
final.fit   <- stepAIC(initial.fit,trace=0)
summary(final.fit)
# ...
# Coefficients:
#               Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   27.11832   20.28556   1.337 0.185320    
# Main1       1028.99836  125.25579   8.215 4.65e-12 ***
# Main2          2.04805    1.11804   1.832 0.070949 .  
# Main3          0.03849    0.02615   1.472 0.145165    
# Main4         -1.87427    0.94597  -1.981 0.051222 .  
# Main5          3.54803    1.99372   1.780 0.079192 .  
# Main6          0.20462    0.10360   1.975 0.051938 .  
# Sec1         129.62384   35.11290   3.692 0.000420 ***
# Third2        -0.11289    0.01716  -6.579 5.66e-09 ***
# Third3        -0.02909    0.01623  -1.793 0.077060 .  
# ... (many other variables included)

因此,排除这些行会导致所有“主要”变量 p

最后,仅仅因为您有一个模型可以很好地拟合您现有的数据,并不意味着它可以作为预测模型表现良好。特别是,如果您试图在“模型空间”之外进行预测(相当于外推),那么您的预测能力可能很差。

【讨论】:

  • (+1) 但是,通常不建议逐步选择模型,例如参见here。我通常更喜欢先消除多重共线性变量,例如见here
  • @DavidArenburg 你为什么不使用 OPs 数据把它变成一个例子?
  • 我太懒了,我认为这应该首先进行交叉验证。我会看到的,也许今晚晚些时候
  • 很好的论文。希望能得到更多人的支持。可能要添加的一件事是考虑 X 和 Y 之间的非线性关系的可能性以及具有交互作用的模型的潜力,从而提高预测能力。
  • 谢谢@jlhoward!这很有帮助。我试图在实际层面上扩展我的问题,因为许多情况并不像我们上面讨论的模型那么简单。如果最后一个观察期有影响,我们该怎么办。不必将其视为时间序列问题,但我们必须进行一些相关的转换。更多细节在顶部添加
【解决方案2】:

重要性取决于您数据中的关系......而不是“我希望它们很重要”。

如果数据说它们微不足道,那么它们就是微不足道的。

您将很难通过 30 个变量和只有 100 个观察值来获得任何意义。只有 100 多个观察值,您应该只使用几个变量。对于 30 个变量,您需要 1000 次观察才能获得任何意义。

也许从您认为应该很重要的变量开始,看看会发生什么。

【讨论】:

  • 谢谢 imgschatz!我还想知道当有人给我这个模型时,它是如何成功的,其中包括所有这些变量而不丢弃任何一个变量。但是,有没有比多元回归更准确的方法来对数据集进行建模?
猜你喜欢
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2013-04-09
  • 2018-01-20
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多