2016-12-07 119 views
0

我有一个列有几列。最左边的列是我的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 

这里例如我想获得线性回归的范围在例如行×3〜10,强迫回归交叉0,0。最后得到y1,y2等线性回归的斜率。

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

+0

你能澄清哪些变量是你的独立变量,哪些是你的依赖?要强制截取0,只需在回归模型中添加-1,例如'lm(y〜x -1)'。 – paqmo

+0

列x是自变量,而y1,y2 ..是相关的。 – AGB

回答

0

没有截距的回归模型强制通过原点的回归线。这通过在模型中加-1来实现。要获得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) 

enter image description here

+0

嗨,谢谢!这真的很好。我对sapply功能不是很熟悉。还有更多的y列,我怎么能编写另一个sapply函数来遍历所有的y列?谢谢 – AGB

+0

现在,'lapply'函数应该循环遍历数据框中除第一个(独立变量)之外的所有列。绘图时会出现真正的问题 - 如果你有很多的代码,我提供的代码非常繁琐和笨拙。再次循环y的值以使其自动化会更好。 – paqmo

+0

再次感谢,对不起,我没有名誉u.pvote你。这真的很好。我的最后一个问题是,我将如何获得这些线性拟合的所有斜率的值? – AGB