【问题标题】:How to use a regression lm function used for prediction [duplicate]如何使用用于预测的回归lm函数[重复]
【发布时间】:2016-09-20 21:02:11
【问题描述】:

我对数据集应用线性回归:

## Random set 
set.seed(123)
i0=0
imax = 100
x = seq(0,imax,1)
y = c(i0)
for( i in 1:imax ){
i1 = rnorm( n = 1, mean = i0, sd = 1)   
y = c( y, i1 )
i0 = i1
}
plot(x,y)

## Build a data frame out of it
d0 = data.frame( x, y )

## Apply a linear regression 
f0 = lm( d0$y ~ d0$x )

## Plot the fitted function
abline(f0)

现在我想用这个拟合函数来知道预测值

  1. 插值(例如 x=3.5)
  2. 外推值(例如 x=110)

我在网上只找到了这个答案:

y2=predict(f0, data.frame(x=seq(0,100,1)))

但这与我想要的不同。我当然可以使用它们的参数手动实现这些函数,但我希望它具有通用性。

欢迎任何提示!

【问题讨论】:

  • “内插”和“外插”值是什么意思?你期待什么结果(predict 使用新数据从模型返回预测 - 你还需要什么)?
  • 即使数据中有更多可用信息,您也仅通过其线性趋势来表示时间序列数据。这真的是您想要的吗?
  • 这个例子是自制的。我尝试做的是使用 lm 在时间序列上拟合函数 f(x) = c1 * x + c2 * x + c3...,然后使用 lm 的结果来计算 f(x) x 的值我可能会喜欢。
  • 线性外插或插值时间序列很少是聪明的,但要回答这个问题,只需使用 predict(f0, data.frame(x = z))z 是任何值。 R 帮助通常相当好,因此键入?predict.lm 会更详细地解释它。您必须使用f0 = lm(y ~ x, data = d0) 来明确变量的调用方式。
  • 我查看了 predict 函数,但它在我做事的时候吐在我脸上:predict(f0,data.frame(x=20)) but got: 'newdata' has 1行,但找到的变量有 101 行

标签: r regression lm function


【解决方案1】:

在线性回归中,您的最佳估计(无论您是否进行插值/插值)始终只是计算拟合值。也就是说,你有等式:

$$ y = \beta_0 + \beta_1 x_1 + \dotso + \beta_k x_k $$

然后您只需输入值。乘以 $\beta_j$,然后求和。做到这一点的简单方法是将数据存储在向量中。像这样:

$$ y = \boldsymbol{\beta}'X $$

其中$\boldsymbol{\beta}'$ 是系数$(1 \times k)$ 的行向量,$X$ 是列向量$(k \times 1)$。因此 $y$ 是一个标量(拟合/预测值)。在 R 中会是这样的:

# Generate data:
x <- rgamma(n = 1000, shape =  2)
y <- 5 + 0.5*x + rnorm(1000)
reg1 <- lm(y ~ x)

# Now for doing unit prediction:
some_new_x <- 5 # This is the new value of x you wish to predict for
intercept  <- 1 # This is always 1
coef(reg1) %*% c(intercept, some_new_x)

# We can also do predictions for an entire data frame:
x <- seq(from = 1, to = 1000, by = 1)
predict(reg1, newdata = data.frame(cbind(1, x)))

使用 predict 确实应该是您的首选方式。 它按名称跟踪变量,因此您不需要 必须以正确的顺序组织它以获得一个平均数。

【讨论】:

  • 谢谢,但是我想避免在寻找插值时必须实现该功能。这真的是唯一的方法吗?
  • 实现这个功能是什么意思?它就在 base R 中,没有任何包?
  • 我的意思是,如果我拟合函数 f(x) = c1 * x + c2 * c + c3,有没有办法使用 lm 的结果得到 f(x=3.5),或者我需要从 lm 中提取系数 c1,c2,c3 并计算它吗?我是否清楚地说明了我的问题?
  • 是的,你需要所有的系数(或者假设其余的都是 0)。预测就是您想要的,它完全按照您的描述进行
  • 我不确定c 来自上述等式,但在R 中,您可以使用@Repmat 在答案中讨论的想法为该用例编写一个小型轻量级函数.如果要隐藏对coef 的调用,可以编写一个函数,将lm 对象作为参数,然后在函数体中使用coef
猜你喜欢
  • 2015-06-21
  • 2016-10-28
  • 2013-02-14
  • 2019-07-28
  • 2019-08-08
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多