我有一个包含多个列的列表。最左边的列是我的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 :(得分:0)
没有截距的回归模型会强制回归线穿过原点。这是在R中通过向模型添加-1来实现的。要获得所需的x范围,只需将观察值集中到该范围,然后使用lapply
循环遍历不同的自变量:
dat2 <- dat[3:9,]
fits <- lapply(dat2[,-1], function(x) lm(x ~ dat2[,1] - 1))
使用ggplot2
绘制数据和回归线。使用melt
包中的reshape2
来生成数据。这有助于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)