从多个数据的线性回归中获取 y 轴截距和斜率,并将截距和斜率值传递给数据框

Posted

技术标签:

【中文标题】从多个数据的线性回归中获取 y 轴截距和斜率,并将截距和斜率值传递给数据框【英文标题】:Getting the y-axis intercept and slope from a linear regression of multiple data and passing the intercept and slope values to a data frame 【发布时间】:2014-02-15 14:54:55 【问题描述】:

我有一个数据框x1,它是用下面这段代码生成的,

x <- c(1:10)
y <- x^3
z <- y-20
s <- z/3
t <- s*6
q <- s*y
x1 <- cbind(x,y,z,s,t,q)
x1 <- data.frame(x1)

我想提取数据的 y 轴截距和线性回归拟合的斜率,

    x    y   z          s    t             q
1   1    1 -19  -6.333333  -38     -6.333333
2   2    8 -12  -4.000000  -24    -32.000000
3   3   27   7   2.333333   14     63.000000
4   4   64  44  14.666667   88    938.666667
5   5  125 105  35.000000  210   4375.000000
6   6  216 196  65.333333  392  14112.000000
7   7  343 323 107.666667  646  36929.666667
8   8  512 492 164.000000  984  83968.000000
9   9  729 709 236.333333 1418 172287.000000
10 10 1000 980 326.666667 1960 326666.666667 

我用下面的代码融合并绘制了三列数据,

xm <- melt(x1, id=names(x1)[1], measure=names(x1)[c(2, 4, 5)], variable = "cols")
plt <- ggplot(xm) +
    geom_point(aes(x=x,y= value, color=cols), size=3) +
    labs(x = "x", y = "y") 

现在我需要的是分别对所有数据进行线性最小二乘拟合,并将生成的截距和斜率存储在新的数据框中。

我使用plt + geom_abline(),但没有得到想要的结果。有人可以告诉我如何解决这个问题。

【问题讨论】:

那个情节在我看来不是很线性。你想拟合多项式吗? @Roland 这只是一个例子,不过我需要做一个线性拟合 【参考方案1】:

我想你正在寻找geom_smooth。如果您使用参数method = "lm" 调用此函数,它将计算所有组的线性拟合:

ggplot(xm, aes(x = x, y = value, color = cols)) +
  geom_point(size = 3) +
  labs(x = "x", y = "y") + 
  geom_smooth(method = "lm", se = FALSE)

您还可以使用poly 函数和formula 参数指定二次拟合:

ggplot(xm, aes(x = x, y = value, color=cols)) +
  geom_point(size = 3) +
  labs(x = "x", y = "y") + 
  geom_smooth(method = "lm", se = FALSE, formula = y ~ poly(x, 2))


要提取对应的回归系数,可以使用这种方法:

# create a list of coefficients
fits <- by(xm[-2], xm$cols, function(i) coef(lm(value ~ x, i)))

# create a data frame
data.frame(cols = names(fits), do.call(rbind, fits))

#   cols X.Intercept.         x
# y    y   -277.20000 105.40000
# s    s    -99.06667  35.13333
# t    t   -594.40000 210.80000

如果您想要二次拟合,只需将 value ~ x 替换为 value ~ poly(x, 2)

【讨论】:

感谢您的回答,确实这是我想要做的线性拟合。但是,如何获得传递给另一个变量或数据框的每个相应拟合的相应 y 轴截距和斜率。再次感谢有关如何执行多项式拟合的建议,我正在学习很多新东西。 @Amm 我添加了关于提取回归系数的部分。 这正是我所需要的,非常感谢您的宝贵建议! 我相信他们想要by(xm[-2], xm$cols, function(i) coef(lm(value~x, data=i)))coef(lm(cbind(y, s, t) ~ x, data=x1)) 会更容易做到。 @Roland 感谢您指出这一点。你的方法要巧妙得多。

以上是关于从多个数据的线性回归中获取 y 轴截距和斜率,并将截距和斜率值传递给数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在大时间序列 DataFrame 上应用短时间序列线性回归

SQL 中的线性回归置信区间

我们如何计算 statsmodels OLS 中的截距和斜率?

使用 lm() 进行线性回归 - 对结果感到惊讶

具有指定斜率的线性回归

ggplot2:绘制具有不同截距但具有相同斜率的回归线