Matlab не регрессируют, если любой Y равен нулю в цикле - PullRequest
0 голосов
/ 23 февраля 2019

Я использую регрессию для выполнения линейной регрессии для большого файла nc (содержащего широту, долготу, время и температуру).Таким образом, для каждого широты и долготы температура регрессирует в течение 30 лет (одно измерение в год).

В некоторые годы некоторые температуры равны 0 К, в этих случаях я хочу, чтобы контур не регрессировал, поэтому окончательнаясредний уклон не включает их.

Ниже приведена важная часть моего кода.

Я не получаю сообщение об ошибке, но также не получаю никакой разницы в том, включаю ли я y (y == 0) = NaN ;, так что я думаю, что может быть лучше.Я понял, что регресс игнорирует их автоматически, но, похоже, это также не так.

% initialise time parameters
time_begin  = [1981, 1, 1, 0,0,0];
time_end    = [2010,12,31,23,0,0];
years       = (time_begin(1):time_end(1))';
nyears      = length(years);
% create storage and regress
TXx = randi(100, 288, 192, 30);
lat = rand(192, 1);
lon = rand(288, 1);
time = rand(30,1);
M = numel(lon);
N = numel(lat);
slope = zeros(M, N);
intercept = zeros(M, N);
T = numel(time);
x = ([ones(T, 1) years]);
% Regress each lat/lon location
for i = 1 : M
    for j = 1 : N
        % Get all time instances of each lat/lon location
        y = squeeze(TXx(i, j, :));
        y(y==0) = NaN;
        % Create regression problem and solve
        c = regress(y, x);
        intercept(i, j) = c(1);
        slope(i, j) = c(2);      
    end
end

1 Ответ

0 голосов
/ 24 февраля 2019

Значения NaN игнорируются, но не так, как вы хотите ... Отдельные точки данных игнорируются, а не весь набор данных, и, следовательно, по-прежнему выполняется регрессия.

Вы можете просто добавить простую проверку, используя оператор if,

for i = 1 : M
   for j = 1 : N
        % Get all time instances of each lat/lon location
        y = squeeze(TXx(i, j, :));
        if ~any(y==0)
            % Create regression problem and solve
            c = regress(y, x);
            intercept(i, j) = c(1);
            slope(i, j) = c(2);      
        end
    end
end
...