2012-01-23 79 views
0

我使用矩陣在R中具有矢量化Q.我有2個Cols需要使用特定索引進行迴歸。數據是使用矢量化和矩陣的R中的迴歸

matrix_senttoR = [ ... 
        0.11 0.95 
        0.23 0.34 
        0.67 0.54 
        0.65 0.95 
        0.12 0.54 
        0.45 0.43 ] ; 
indices_forR = [ ... 
      1 
      1 
      1 
      2 
      2 
      2 ] ; 
在矩陣

Col1中是數據說MSFT和歌(3各自行)和col2上是從基準StkIndex返回,上對應的日期。數據是從Matlab發送的矩陣格式。

我目前使用

slope <- by( data.frame(matrix_senttoR), indices_forR, FUN=function(x) 
         {zyp.sen (X1~X2,data=x) $coeff[2] }  ) 
betasFac <- sapply(slope , function(x) x+0) 

我用data.frame上面我不能用cbind()返回。如果我使用cbind(),那麼Matlab會提供一個錯誤,因爲它不理解數據的格式。我從Matlab裏面運行這些命令(http://www.mathworks.com/matlabcentral/fileexchange/5051)。您可以用lm替換zyp(zyp.sen)。

BY在這裏很慢(可能是因爲數據幀?)。有沒有更好的方法來做到這一點? 150k行數據需要14secs +。我可以在R中使用矩陣矢量化嗎?謝謝。

+1

如果你只是運行一個迴歸,爲什麼麻煩將代碼從MATLAB傳遞到R?在統計工具箱裏,MATLAB的'regress'函數可以做到這一點。 –

+0

對代碼進行一些分析以查看放緩的位置也是一個好主意。您需要知道'by'佔用了多少時間,以及您的建模函數多少,以及在MATLAB和R之間傳遞數據需要多少時間。 –

+0

@Richie - >這是因爲我試圖做非參數迴歸,特別是使用zyp庫包。我所有的數據都在Matlab中。我唯一的選擇是自己設計Theil-Sen Regressor! – Maddy

回答

0

我仍然認爲你是從MATLAB過渡到R而回頭過於複雜的事情。傳遞150k行數據必然會大大減慢速度。

zyp.sen實際上是很平凡的移植到MATLAB。在這裏你去:

function [intercept, slope, intercepts, slopes, rank, residuals] = ZypSen(x, y) 
% Computes a Thiel-Sen estimate of slope for a vector of data. 

n = length(x); 

slopes = arrayfun(@(i) ZypSlopediff(i, x, y, n), 1:(n - 1), ... 
    'UniformOutput', false); 
slopes = [slopes{:}]; 
sni = isfinite(slopes); 
slope = median(slopes(sni)); 

intercepts = y - slope * x; 
intercept = median(intercepts); 

rank = 2; 
residuals = x - slope * y + intercept; 

end 


function z = ZypSlopediff(i, x, y, n) 

z = (y(1:(n - i)) - y((i + 1):n)) ./ ... 
    (x(1:(n - i)) - x((i + 1):n)); 

end 

我檢查這個使用R的example(zyp.sen),它給出了相同的答案。

x = [0 1 2 4 5] 
y = [6 4 1 8 7] 
[int, sl, ints, sls, ra, res] = ZypSen(x, y) 

你應該真的做一些進一步的檢查,雖然,只是爲了確保。

1

這很容易被移動到一個評論,但:

有幾件事情要考慮,我傾向於避免by()功能,因爲它的返回值是一個時髦的對象。相反,爲什麼不把你的indices_forR向量添加到data.frame?

df <- data.frame(matrix_senttoR) 
df$indices_forR <- indices_forR 

的plyr包做的工作從這裏:

ddply(df,.(indices_forR),function(x) zyp.sen(X1~X2,data=x)$coeff[2]) 

您可以輕鬆地使用multi-thread或DOMC和doSnow參數.parallel=TRUE此操作ddply。

如果速度是目標,我也會學習data.table包(它包裝data.frame並且更快)。另外,我假定慢速撥號是zyp.sen()呼叫而不是by()呼叫。在多個內核上執行會加快這一點。

> dput(df) 
structure(list(X1 = c(0.11, 0.23, 0.67, 0.65, 0.12, 0.45), X2 = c(0.95, 
0.34, 0.54, 0.95, 0.54, 0.43), indices_forR = c(1, 1, 1, 2, 2, 
2)), .Names = c("X1", "X2", "indices_forR"), row.names = c(NA, 
-6L), class = "data.frame") 

> ddply(df,.(indices),function(x) lm(X1~X2,data=x)$coeff[2]) 
    indices   X2 
1  1 -0.3702172 
2  2 0.6324900 
+0

- >當執行類似 evalR('slope < - ddply(df,。(indices_forR),function(x)zyp.sen(X1〜X2,data = x)$ coeff [2])時,步驟ddply不起作用。 ');我收到一個錯誤:Invoke Error,Dispatch Exception:Object is static;不允許操作 – Maddy

+0

@Maddy聽起來像是Matlab錯誤,而不是R錯誤。不確定'zyp.sen()'包來自哪個包,但在R本身中使用lm()''''''''''''''' – Justin

+0

- >謝謝賈斯汀。但我想現在我堅持使用zyp。它是非參數化的,我必須專門使用它。我知道這是基於matlab的錯誤。我不是很熟悉R,所以這個Q希望得到一個解決方案。 – Maddy