2015-09-14 24 views
0

如果我有一個矩陣蘇哈作爲應用elementes的到矢量的功能(子集的行?)以矩陣

x<-matrix(rnorm(30), nrow=5, ncol=6) 
x 

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] -2.6564554 -0.1719174 -1.7631631 1.0351035 -0.85090759 0.7581632 
[2,] -2.4404669 1.2146747 0.4600974 -0.6089264 -2.41420765 -0.7267048 
[3,] 1.3201133 1.8951935 -0.6399949 0.5049551 0.03612261 -1.3682810 
[4,] -0.3066386 -0.4304691 0.4554501 -1.7170087 0.20599860 0.4328180 
[5,] -1.7813084 -0.2572694 0.7048373 -0.7844590 -0.36105730 -0.8113932 

我想生成包含每個組3的數據的斜率的矩陣Y每一行分,這樣的元素Y[1,1]和我的新矩陣的Y[1,2]會是這樣的:

Y[1,1]=lm(x[1,1:3]~c(1,2,3))$coefficient[2] 
Y[1,2]=lm(x[1,2:4]~c(1,2,3))$coefficient[2] 

我知道如何做到這一點用的,這是確定的小數據,但這樣做對數據集超過一百萬行幾乎無法通過這種方式。我與apply()函數的問題是,我知道如何將函數應用於數據集的每個行,列或單個元素,但不適用於3個元素的集合。希望我很清楚。 謝謝

回答

1

有來自zoo一個rollapply功能,似乎你想要做什麼。

library(zoo) 
rr <- t(rollapply(t(x), by.column=TRUE, width=3, 
        FUN=function(z) coef(lm(z ~ c(1,2,3)))[2])) 

好像有可能是有一個額外的轉置,但我無法弄清楚如何擺脫它......

+0

或利用的默認值:'t(rollapply(t(x),3,function(z)coef(lm(z〜I(1:3)))[2]))' –

+0

@ G.Grothendieck謝謝,這很好。 – jenesaisquoi

+0

@ G.Grothendieck感謝您的幫助 – Mailo

1

我在每一行創建一個循環函數來計算每個三元素集的係數。

mylm = function (x) { 
    v=vector("numeric", length(x)-2) 
    for (i in 1:(length(x)-2)) { 
    v[i]=lm(x[i:(i+2)]~c(1,2,3))$coefficient[2] 
    } 
    v 
} 
Y = t(apply(x, 1, FUN=mylm)) 
Y 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.2655043 -0.3789681 0.2305446 -0.8279703 
[2,] -0.1925491 -0.4061229 0.3647903 -0.1093176 
+0

感謝您的幫助@pcantalupo – Mailo