2012-07-13 235 views
2

是否有MATLAB實現Flexible Least Squares (FLS) regressionMATLAB實現的靈活最小二乘(FLS)迴歸

我正在尋找一種像樣的(好的,最不痛苦的)方法來處理具有時變係數的迴歸。所有的想法都是值得歡迎的,但最好的辦法是指向FLS迴歸實現,因爲我在廣泛的谷歌搜索之後找不到一個。


1. R. Kalaba and L. Tesfatsion (1989), "Time-Varying Linear Regression via Flexible Least Squares", Computers and Mathematics with Applications, Vol. 17, pp. 1215-1245

+0

是否有玩具輸入,我可以用它來驗證我的代碼? – Yamaneko 2012-08-06 19:52:25

回答

1

我已經找到了FLS迴歸的R code on GitHub。我將它轉換爲MATLAB,但由於R和MATLAB的功能不同,可能會有一些錯誤。現在,我們只需要對其進行測試即可進行最終調整。

function X = fls(A, b, mu, ncap, smoothed) 

if isempty(mu) 
    mu = 1; 
end 

if isempty(ncap) 
    ncap = length(b); 
end 

if isempty(smoothed) 
    smoothed = true; 
end 

[m n] = size(A); 

M = zeros(n, n, ncap); 
E = zeros(n, ncap); 
X = zeros(n, ncap); 
R = eye(n) * mu; 

for j = 1:ncap 
    Z = linsolve(qr(R + tcrossprod(A(j,:))), eye(n)); 
    M(:,:,j) = mu * Z;    % (5.7b) 
    v = b(j) * A(j,:); 

    if (j == 1) 
     p = zeros(n,1); 
    else 
     p = mu * E(:,j-1); 
    end 

    w = p + v; 

    E(:,j) = Z * w;     % (5.7c) 
    R = -mu * mu * Z; 

    diag = R(1:n+1:end); 
    R(diag) = R(diag) + 2*mu; 
end 

% Calculate eqn (5.15) FLS estimate at ncap 
Q = -mu * M(:,:,ncap-1); 

diag = Q(1: (size(Q,1)+1) : end); 
Q(diag) = Q(diag) + mu; 
Ancap = A(ncap,:); 

C = Q + Ancap' * Ancap; 
d = mu * E(:,ncap-1) + b(ncap)*Ancap'; 
X(:,ncap) = C * d; 
X(:,ncap) = linsolve(qr(C),d); 

if smoothed 
    % Use eqn (5.16) to obtain smoothed FLS estimates for 
    % X[,1], X[,2], ..., X[,ncap-1] 

    for j = 1:ncap-1 
     l = ncap - j; 
     X(:,l) = E(:,l) + M(:,:,l) * X(:,l+1); 
    end 
else 
    X = X(:,ncap); 
end 

end 

function resp = tcrossprod(A) 
resp = A * A'; 
end 
+0

這兩行是幹什麼的? 'diag = Q(1:(size(Q,1)+1):end); Q(diag)= Q(diag)+ mu;'如果Q只是一個1x1矩陣? – Jase 2013-08-28 18:25:53

+0

這條線獲得主對角線的指數。我手邊沒有MATLAB來測試它,但是如果Q是1x1,我認爲它會返回一個空矩陣。如果不是,它會給出錯誤。爲了解決這個問題,我們應該首先檢查Q的大小,如果是1x1,則使用其單值;否則,使用這一行。 – Yamaneko 2013-09-08 03:48:53