【问题标题】:Determine dataset that was used to generate an lm() model确定用于生成 lm() 模型的数据集
【发布时间】:2018-09-07 15:15:32
【问题描述】:

假设我获得了一个多元线性回归模型,例如:
y = B0 + B1x1 + B2x2

并且鉴于此模型的截距/系数值:
B0 = 0.005275169B1
B1 = 0.067347131
B2 = -0.207909721

但是.. 我没有生成该模型的 原始 数据集(x/y 值)。有没有办法生成一个 new 数据集,然后将其输入 lm() ,然后生成的 lm()$coef 调用会吐出上面提到的相同的 BO、B1、B2 值?总之,我想生成一个数据集,当输入 lm() 时,它会生成一个与上述系数 100% 完全相同的模型。

【问题讨论】:

  • 这是一个有点奇怪(或者可能是奇怪的措辞)的问题。您是否正在寻找predict?建立模型后,您可以根据预测变量的任何值生成由预测响应组成的新数据。如果您随后将相同的模型拟合到新数据,您将获得模型的相同参数(但不同的 sds)。
  • 之前@markus 在Anscombe's Quartet 上发表了一条有趣的评论,遗憾的是被删除了。我建议阅读。
  • [续] Anscombe 的四重奏演示了如果忽略残差结构,了解汇总统计数据(例如均值、方差、回归系数)如何变得毫无意义。换句话说,您可能从模型中获得的参数估计不是唯一地提供对基础数据概率分布的洞察。
  • 也许你正在寻找这样的东西:stackoverflow.com/a/39622066/2761575
  • 你可以这样做,但它没有多大价值,因为错误将完全是人为的(在最简单的情况下甚至为零)。

标签: r linear-regression


【解决方案1】:

为了扩展我上面的评论,这里是一个使用 mtcars 数据集的示例,其中我们拟合了 mpg = beta0 + beta1 * disp 形式的线性模型。

fit <- lm(mpg ~ disp, data = mtcars)
summary(fit)
#
#Call:
#lm(formula = mpg ~ disp, data = mtcars)
#
#Residuals:
#    Min      1Q  Median      3Q     Max
#-4.8922 -2.2022 -0.9631  1.6272  7.2305
#
#Coefficients:
#             Estimate Std. Error t value Pr(>|t|)
#(Intercept) 29.599855   1.229720  24.070  < 2e-16 ***
#disp        -0.041215   0.004712  -8.747 9.38e-10 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 3.251 on 30 degrees of freedom
#Multiple R-squared:  0.7183,   Adjusted R-squared:  0.709
#F-statistic: 76.51 on 1 and 30 DF,  p-value: 9.38e-10

我们为disp 生成一些新数据,并使用模型系数来预测mpg 的响应。

df <- data.frame(disp = seq(1, 1000, length.out = 20))
df$mpg <- predict(fit, newdata = df)

我们现在将相同的模型拟合到新数据。

fit.new <- lm(mpg ~ disp, data = df)
#
#Call:
#lm(formula = mpg ~ disp, data = df)
#
#Residuals:
#       Min         1Q     Median         3Q        Max
#-1.720e-14 -3.095e-15  1.302e-15  3.618e-15  5.719e-15
#
#Coefficients:
#              Estimate Std. Error    t value Pr(>|t|)
#(Intercept)  2.960e+01  2.235e-15  1.325e+16   <2e-16 ***
#disp        -4.122e-02  3.819e-18 -1.079e+16   <2e-16 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 5.178e-15 on 18 degrees of freedom
#Multiple R-squared:      1,    Adjusted R-squared:      1
#F-statistic: 1.165e+32 on 1 and 18 DF,  p-value: < 2.2e-16
#
#Warning message:
#In summary.lm(fit.new) : essentially perfect fit: summary may be unreliable

注意估计值是如何相同的(但标准差和 t 统计量不同!)。另请注意第二个模型拟合底部的警告。


更新

如果您有系数 beta0beta1,只需将响应计算为

beta0 <- coef(fit)[1]
beta1 <- coef(fit)[2]
df <- data.frame(disp = seq(1, 1000, length.out = 20))
df$mpg <- beta0 + df$disp * beta1

【讨论】:

  • 在您的示例中,初始数据集使用 mtcars 创建并保存到 lm 对象中。但是在我的情况下,我无法创建初始 lm() 模型,因为我没有任何数据。我只有通过笔/纸提供给我的 BO、B1、B2 系数值。我需要一种方法来创建一个数据集(例如您的示例中的 mtcars),当我将 lm() 拟合到它时,它会在 lm() 摘要中为我提供那些原始的 BO、B1、B2 coef 值。
  • 对不起,你说得对,这是一个奇怪的问题。它只是学校作业的一部分,所以也许我没有正确询问。我只是想以某种方式创建一个 x/y 值数据集,我可以将其输入 lm() 以创建一个具有相同 coef 的模型。
  • @JD1 如果你有系数也是一样的(见我更新的答案);为x1x2 生成一些数字后,只需将响应计算为beta0 + beta1 * x1 + beta2 * x2
【解决方案2】:

我认为您正在寻找 lm 对象中的 model 字段。这是一个可重现的示例

fit <- lm(mpg ~ disp, data = mtcars)    
newdata <- fit$model
#                      mpg  disp
# Mazda RX4           21.0 160.0
# Mazda RX4 Wag       21.0 160.0
# Datsun 710          22.8 108.0
# Hornet 4 Drive      21.4 258.0
# Hornet Sportabout   18.7 360.0
# Valiant             18.1 225.0
# ...

【讨论】:

  • 不幸的是,我没有像 mtcars 这样的现有数据集来运行 lm()。我只有为 B0、B1、B2 提供的 coef 值(在纸上提供)。我想创建一个 x/y 值的数据集,将其输入 lm() 会给我一个模型,该模型具有与纸上提供的相同 B0、B1、B2 系数。如果这甚至可能......
  • 没问题 - 我误解了你的问题。我以为您已经获得了 lm 对象本身。无论如何我都可以在这里留下这个答案,以防其他路人发现它有用
猜你喜欢
  • 2011-07-03
  • 2012-06-12
  • 1970-01-01
  • 2017-08-08
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多