Матричная обусловленность в порядковой логистической регрессии
У меня есть два набора данных, один необработанный и один очищенный. Независимая переменная - это урон, который может принимать любое значение от 0 до 100 включительно. Зависимая переменная - это рейтинг пользователя, который может принимать любое целое число от 1 до 5 включительно. Поскольку IV является непрерывным, а порядковый номер DV, я использую логистическую регрессию для прогнозирования будущих ответов - в частности, я использую встроенную в MATLAB функцию mnrfit, определяя тип модели в качестве порядкового.
Это работало хорошо для необработанных данных, но я получаю ошибку при попытке регрессии на очищенных данных. В частности,
В mnrfit>ordinalFit (строка 349) В mnrfit (строка 206) Предупреждение: матрица является единственной, близкой к единственной или плохо масштабируемой. Результаты могут быть неточными. RCOND = NaN. Ошибка использования Linsolve Matrix должна быть положительно определенной.
Ошибка в mnrfit (строка 248) bcov = linsolve(hess,eye(size(hess)),struct('SYM',true,'POSDEF',true));"
Между двумя наборами данных нет большой разницы, просто несколько нулей в очищенных ответах. Номер условия необработанной матрицы ответа составляет около 57, а числа очищенной матрицы ответа - около 58. Ранг и необработанного ответа, и матрицы очищенного ответа составляет 5, что равно количеству столбцов в каждой матрице. Поэтому я не уверен, почему регрессия должна работать с необработанными данными, а не с очищенными данными.
Может кто-нибудь предложить, как продолжить устранение неполадок / отладки? Или почему регрессия может не работать? Я включил соответствующие фрагменты кода и образцы данных в конце этого поста.
Заранее спасибо!
Это код для исходной модели logit, основанной на необработанных данных:
% fit logit model to all data - responses as a function of mean CDF
% expect a positive trend - i.e. that responses get larger as mean CDF
% increases
% 1: predictor variable is mean CDF; response variable is the user
% damage rating - this is the way our experiment was designed
% get unique values of mean CDF
[x,ia,ic] = unique(crowddata(:,3));
y(1:length(x),1:5) = 0;
for i = 1:length(x)
y(i,1:5) = crowddata(ia(i),5:9);
beq(i,1) = buckets(ia(i),3);
buneq(i,1) = buckets(ia(i),4);
end
% get sample sizes (total number of responses) for each mean CDF
for i = 1:length(x)
ssize(i,1) = y(i,1) + y(i,2) + y(i,3) + y(i,4) + y(i,5);
end
% fit a ordinal logistic regression model
[b,dev,stat] = mnrfit(x,y,'model','ordinal');
b2 = [b(1:4)';repmat(b(5:end),1,4)];
xx = (1:1:276)';
% get probability that a mean CDF is in a category, based on our
% logit model that includes all user responses
pihat = mnrval(b,xx,'model','ordinal','interactions','off');
Ниже приведен код регрессионной модели, основанной на очищенных данных.
% new regression model using only responses cleaned based on time
% 2: predictor variable is mean CDF; response variable is the user
% damage rating - this is the way our experiment was designed
% get unique values of mean CDF
[x_clean,ia,ic] = unique(crowddata_clean(:,3));
y_clean(1:length(x_clean),1:5) = 0;
for i = 1:length(x_clean)
y_clean(i,1:5) = crowddata_clean(ia(i),5:9);
beq(i,1) = buckets(ia(i),3);
buneq(i,1) = buckets(ia(i),4);
end
% get sample sizes (total number of responses) for each mean CDF
for i = 1:length(x_clean)
ssize_clean(i,1) = y_clean(i,1) + y_clean(i,2) + y_clean(i,3) +...
y_clean(i,4) + y_clean(i,5);
end
% fit a ordinal logistic regression (linear) model
[bclean,dev,stat] = mnrfit(x_clean,y_clean,'model','ordinal');
b3 = [b(1:4)';repmat(b(5:end),1,4)];
ОБНОВЛЕНО: x и x_clean - это 276 x 1 векторов со значениями в диапазоне от ~0,3 до ~77.
Y и y_clean - это 276 x 5 матриц с номерами условий около 14. Вот первые 10 строк y
2 0 0 0 0
2 0 0 0 0
1 1 0 0 0
10 1 0 0 0
2 1 0 0 0
8 1 1 0 0
0 1 0 0 0
4 1 0 0 0
5 0 0 0 0
2 2 0 1 0
0 2 3 0 0