Как выполнить повторную регрессию в Matlab? - PullRequest
3 голосов
/ 12 марта 2012

У меня есть файл Excel, который содержит 5 столбцов и 48 строк (данные о потреблении воды, населении и количестве осадков за четыре года (1997-2000) каждого месяца)

Year  Month  Water_Demand Population Rainfall  
1997   1        355        4500        25  
1997   2        375        5000        20  
1997   3        320        5200        21  
.............% rest of the month data of year 1997.  
1997  12        380        6000        24  
1998   1        390        6500        23  
1998   2        370        6700        20  
............. % rest of the month data of year 1998  
1998  12        400        6900        19  
1999   1  
1999   2  
.............% rest of the month data of year 1997 and 2000  
2000   12       390        7000        20

Я хочу сделать нескольколинейная регрессия в MATLAB.Здесь зависимой переменной является потребность в воде, а независимой переменной - население и количество осадков.Я написал код для этого для всех 48 строк

A1=data(:,3);
A2=data(:,4);
A3=data(:,5);
x=[ones(size(A1)),A2,A3];
y=A1;
b=regress(y,x);
yfit=b(1)+b(2).*A2+b(3).*A3;

Теперь я хочу сделать повторение.Во-первых, я хочу исключить строку номер 1 (т.е. исключить данные за 1997 год, месяц 1) и выполнить регрессию с остальными данными из 47 строк.Затем я хочу исключить строку № 2 и выполнить регрессию с данными строки № 1 и строки 3-48.Затем я хочу исключить строку № 3 и выполнить регрессию с данными строки № 1-2 и строки 4-48.Всегда есть точка данных 47 строк, так как я исключаю одну строку в каждом прогоне.Наконец, я хочу получить таблицу коэффициентов регрессии и yfit для каждого прогона.

1 Ответ

2 голосов
/ 12 марта 2012

Я могу придумать простой способ - создать цикл for и временную «тестируемую» матрицу, которая будет именно той матрицей, которая у вас есть, без строки, которую вы хотите исключить, например:

C = zeros(3,number_of_lines);
for n = 1:number_of_lines
  under_test = data;
  % this excludes the nth line of the matrix
  under_test(n,:) = [];
  B1=under_test(:,3); 
  B2=under_test(:,4); 
  B3=under_test(:,5); 
  x1=[ones(size(B1)),B2,B3]; 
  y1=B1; 
  C(:,n)=regress(y1,x1);
end

IЯ уверен, что вы можете оптимизировать это с помощью некоторых функций Matlab, которые работают с векторами, без использования цикла for.Но я думаю, что только для 48 строк это должно быть достаточно быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...