【问题标题】:"Force" model onto data in R? (Linear Regression)“强制”模型到 R 中的数据上? (线性回归)
【发布时间】:2016-09-30 02:29:08
【问题描述】:

我一直在自学 Andy Field 的 Discovering Statistics Using R 并遇到了这段话:

数据拆分:这种方法涉及随机拆分数据 集,计算两半数据的回归方程和 然后比较生成的模型。使用逐步方法时, 交叉验证是个好主意;你应该逐步运行 对大约 80% 的案例的随机选择进行回归。 然后 将此模型强制用于剩余 20% 的数据。通过比较值 在两个样本中的 R2 和 b 值中,您可以判断出 原始模型推广(参见 Tabachnick & Fidell, 2007,了解更多信息) 详细)。

好的,我了解对我的数据进行子集化(使用 sample()),并且我知道如何拟合线性模型(using lm()),但是这条线 “然后在剩下的 20% 的数据上强制使用这个模型” 让我困惑。

这本书再也没有提到过这种技巧。 R 中是否有一些功能允许您将模型强制到数据上并使用该强制模型计算 R^2b-values?也许您输入截距和斜率系数并输出类似summary(lm) 的某些函数?

还是我不明白这段话想说什么?

【问题讨论】:

  • 看看predict()函数-?predict
  • 我相信“强制”只是指“使用”。基本上,因为他们主张对原始 80% 的数据进行逐步回归(这是一个不好的建议,但我不想深入探讨),他们说的是你最终决定的任何模型——这就是你想要适应的模型剩余数据。因此,如果模型最终成为原始数据的 x1+x2+x5,则在另外 20% 上使用模型 x1+x2+x5。
  • 对于交叉验证,请查看预测包中的 CV 函数,这里有一些关于 cv 指标的详细信息 - robjhyndman.com/hyndsight/crossvalidation
  • 你能转录文本而不是添加图像吗?

标签: r linear-regression cross-validation


【解决方案1】:

我赞同杰里米的话。这是一个包含一些虚构数据的示例,您可以运行这些数据来感受它:

set.seed(26) 

mydf = data.frame (a=1:20 , b = rnorm(20), c = 1:20 + runif(20), d = 1:20 +   runif(1:20)*sin(1:20))

trainRows<-sample(1:20, 16)
mydf.train<-mydf[trainRows,]
mydf.test<-mydf[-trainRows,]

myModel<-lm(a~., data = mydf.train)
model1<-step(myModel)

summary(model1)

mydf.test$pred<-predict(model1, newdata = mydf.test)

cor(mydf.test$pred, mydf.test$a)^2
#[1] 0.9999522

【讨论】:

  • 比我的回答有用多了!
【解决方案2】:

您对新数据使用预测功能。

我手头没有这本书,所以我不能告诉你确切的例子,但如果你剩下的 20% 的数据是一个名为“holdout”的数据框,而你的回归模型名为“reg1” ' 然后使用:

holdout$pred <- predict(reg1, newdata=holdout)

然后您可以通过查看预测分数与原始结果分数之间的相关性来计算 $R^2$。如果结果被称为'out',那么:

cor(holdout$pred, holdout$out)^2

应该做的伎俩。

【讨论】:

  • 感谢您提供 predict() 函数,但我该如何处理“com[pare] R^2 和 b 值的值”这一行。据我所知 predict() 没有给我任何统计测试或系数。
  • @user3547456 使用 predict 后,您的值将支持 R^2 计算,将预测值与实际值进行比较。我猜“b-values”是“p-values”的拼写错误。我认为这实际上是 stats.stackexchange.com 的问题,而不是 SO,因为您似乎非常需要统计建议。
  • “b 值”是指逻辑回归的系数吗?
猜你喜欢
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多