2016-12-07 152 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