【问题标题】:Plot linear regression on multiple columns within specific range在特定范围内的多列上绘制线性回归
【发布时间】:2016-12-07 15:04:13
【问题描述】:

我有一个包含几列的列表。最左边一列是我的 x 轴数据,其余的是各种 y 数据集。

我想为这些列中的每一列生成线性回归,但只是针对 x 中的特定范围,然后强制线性回归通过 0,0。最后提取所述线性回归的线斜率。下面是我的一些数据的示例。

    x       y1       y2       y3       y4
1  2.495   -1e-04   -1e-03   -1e-04    0e+00
2  2.995   -2e-04   -7e-04   -2e-04    0e+00
3  3.495    2e-04   -2e-04    1e-04    2e-04
4  3.995    0e+00   -3e-04    0e+00    1e-04
5  4.495    0e+00   -3e-04    0e+00    0e+00
6  4.995    0e+00   -3e-04    0e+00    1e-04
7  5.495    1e-04   -2e-04    0e+00    1e-04
8  5.995   -1e-04   -1e-04    0e+00    3e-04
9  6.495    1e-04    1e-04    2e-04    3e-04
10 6.995    1e-04    0e+00    0e+00    3e-04

例如,在这里,我将获得 x 范围内的线性回归,例如第 3 到 10 行,强制回归与 0,0 相交。最后,得到 y1、y2 等线性回归的斜率。

我知道 abind 和 lm 函数,但只能绘制单个回归而不强制 0,0 相交。谢谢

【问题讨论】:

  • 您能否澄清一下哪些变量是您的自变量,哪些是您的因变量?要强制截距为 0,只需在回归模型中添加 -1,例如lm(y ~ x -1)
  • 列 x 是自变量,而 y1, y2.. 是相关的。

标签: r plot linear-regression


【解决方案1】:

没有截距的回归模型强制回归线通过原点。这是通过在模型中添加 -1 在 R 中实现的。要获得您想要的 x 范围,只需将观测值子集到该范围内,然后使用 lapply 循环遍历不同的自变量:

dat2 <- dat[3:9,]
fits <- lapply(dat2[,-1], function(x) lm(x ~ dat2[,1] - 1))

使用ggplot2 绘制数据和回归线。使用 reshape2 包中的 melt 使数据变长。这有助于ggplot2 将数据分类:

library(ggplot2); library(reshape2)
mdat <- melt(dat2,id="x")
ggplot(data = mdat) + 
  geom_point(aes(y = value, x = x, color=variable)) +
  geom_smooth(data=mdat,aes(x=x,y=value,color = variable),formula = y ~ x - 1,
              method = "lm", se = F)

【讨论】:

  • 您好,谢谢!效果很好。我对 sapply 函数不是很熟悉。还有更多的 y 列,我该如何编写另一个 sapply 函数来遍历所有 y 列?谢谢
  • 就目前而言,lapply 函数应该遍历数据框中除第一列(自变量)之外的所有列。真正的问题出现在绘图时——如果你有很多 y,我提供的代码非常乏味和笨拙。再次循环 y 的值以使其自动化会更好。
  • 再次感谢,对不起,我没有为你投票的声誉。这真的很好用。我的最后一个问题是,我如何获得这些线性拟合的所有斜率的值?
  • sapply(fits, coef)
猜你喜欢
  • 2019-11-02
  • 2019-10-20
  • 1970-01-01
  • 2012-04-19
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多