MATLAB中FOR循环的回归
我有以下代码:MATLAB中FOR循环的回归,matlab,for-loop,regression,Matlab,For Loop,Regression,我有以下代码: colBIN = {0.050, 0.055, 0.060, 0.065, 0.070, 0.075, 0.080, 0.085, 0.090, 0.095,0.1}; for i = 1 : length(colBIN)-1 colBIN{i,2} = find(cols(:,1) <= cell2mat(colBIN(i+1,1)) & cols(:,1) > cell2mat(colBIN(i,1))); end rowBIN = {0.04
colBIN = {0.050, 0.055, 0.060, 0.065, 0.070, 0.075, 0.080, 0.085, 0.090, 0.095,0.1};
for i = 1 : length(colBIN)-1
colBIN{i,2} = find(cols(:,1) <= cell2mat(colBIN(i+1,1)) & cols(:,1) > cell2mat(colBIN(i,1)));
end
rowBIN = {0.045, 0.046, 0.047, 0.048, 0.049, 0.050, 0.051, 0.052};
for i = 1 : length(rowBIN)-1
rowBIN{i,2} = find(rows(:,1) <= cell2mat(rowBIN(i+1,1)) & rows(:,1) > cell2mat(rowBIN(i,1)));
end
binCombos = cell(length(rowBIN)-1,length(colBIN)-1);
for m = 1 : length(rowBIN)-1
for n = 1 : length(colBIN)-1
binCombos{n,m} = intersect( rowBIN{m,2}(:,1),colBIN{n,2}(:,1));
end
end
binRows = size(binCombos,1);
binCols = size(binCombos,2)-1;
j = j + 1;
for n = 1 : binRows;
for m = 1 : binCols;
thisBin = binCombos{n,m}(:,:);
if isempty(thisBin)==0
%polyfit
quadmod = polyfit(x_vrbl(thisBin), y_vrbl(thisBin), 2);
interval = 0.0:0.001:1;
quadmodcurve = polyval(quadmod,interval);
[r2 rmse] = rsquare(y_vrbl(thisBin), quadmodcurve);
plot(x_vrbl(thisBin), y_vrbl(thisBin), '*', interval, quadmodcurve);
xlabel('x_vrbl');
ylabel('y_vrbl');
axis([0,1,0,1]);
header = ['R^2 =' num2str(r2),'coeffs:',num2str(quadmod)];
title(header);
saveas(gcf, sprintf('plot_%d.pdf', j));
%residuals
res = y_vrbl(thisBin) - quadmodcurve;
plot(x_vrbl(thisBin),res,'+');
header2 = ['residuals'];
title(header2);
saveas(gcf, sprintf('residuals_%d.pdf', j));
end
j = j + 1;
end
end
colBIN={0.050,0.055,0.060,0.065,0.070,0.075,0.080,0.085,0.090,0.095,0.1};
对于i=1:长度(colBIN)-1
colBIN{i,2}=find(cols(:,1)cell2mat(colBIN(i,1));
终止
rowBIN={0.045,0.046,0.047,0.048,0.049,0.050,0.051,0.052};
对于i=1:长度(rowBIN)-1
rowBIN{i,2}=find(rows(:,1)cell2mat(rowBIN(i,1));
终止
binCombos=单元格(长度(rowBIN)-1,长度(colBIN)-1);
对于m=1:长度(rowBIN)-1
对于n=1:长度(colBIN)-1
binCombos{n,m}=intersect(rowBIN{m,2}(:,1),colBIN{n,2}(:,1));
终止
终止
binRows=大小(binCombos,1);
binCols=大小(binCombos,2)-1;
j=j+1;
对于n=1:binRows;
对于m=1:binCols;
thisBin=binCombos{n,m}(:,:);
如果isempty(thisBin)==0
%多面体
quadmod=polyfit(x_vrbl(thisBin),y_vrbl(thisBin),2);
间隔=0.0:0.001:1;
quadmodcurve=polyval(quadmod,区间);
[r2 rmse]=rsquare(y_vrbl(thisBin),quadmodcurve);
绘图(x_vrbl(thisBin),y_vrbl(thisBin),“*”,区间,四元曲线);
xlabel('x_vrbl');
ylabel('y_vrbl');
轴([0,1,0,1]);
header=['R^2='num2str(r2),'coeffs:',num2str(quadmod)];
标题(标题);
saveas(gcf,sprintf('plot_%d.pdf',j));
%残差
res=y_vrbl(thisBin)-四元曲线;
图(x_vrbl(thisBin),res,“+”);
校长2=[‘残差’];
职称(校长2);
saveas(gcf,sprintf('residuals_u%d.pdf',j));
终止
j=j+1;
终止
终止
解释/问题:
binCombos
是一个二维单元数组,每个单元的数据点数量不一致。我正在将二次曲线拟合到每个唯一单元格的数据,并尝试(未成功)输出R^2值,以及绘制残差
我认为问题与以下事实有关:
polyval
函数所需的“间隔”与y\u vrbl(thisBin)
在尝试查找rsquare时的数组大小不匹配,同样,在计算残差时也不匹配。例如,如果我设置了interval=x_vrbl(thisBin)
,则残差“起作用”,但多边形拟合完全混乱。我猜这应该起作用:
quadmodcurve = polyval(quadmod,y_vrbl(thisBin));
[r2 rmse] = rsquare(y_vrbl(thisBin), quadmodcurve);
interval = 0.0:0.001:1;
quadmodcurve = polyval(quadmod,interval);
为了确定拟合质量,必须仅在样本的x值处计算多项式。为了绘制完整的多项式图,您需要以更大且间隔更规则的x值对其进行求值。我设法使您的代码在运行时使用 更正一些错误后:
d = importdata('sample_data.xlsx');
y_vrbl = d.data(:, 1);
x_vrbl = d.data(:, 2);
rows = d.data(:, 3);
cols = d.data(:, 4);
cb = {0.050, 0.055, 0.060, 0.065, 0.070, 0.075, 0.080, 0.085, 0.090, 0.095,0.1};
for i = 1 : length(cb)-1
colBIN{i,2} = find(cols(:,1) <= cell2mat(cb(i+1)) & cols(:,1) > cell2mat(cb(i)));
end
rb = {0.045, 0.046, 0.047, 0.048, 0.049, 0.050, 0.051, 0.052};
for i = 1 : length(rb)-1
rowBIN{i,2} = find(rows(:,1) <= cell2mat(rb(i+1)) & rows(:,1) > cell2mat(rb(i)));
end
binCombos = cell(length(rowBIN)-1,length(colBIN)-1);
for m = 1 : length(rowBIN)-1
for n = 1 : length(colBIN)-1
binCombos{n,m} = intersect( rowBIN{m,2}(:,1),colBIN{n,2}(:,1));
end
end
binRows = size(binCombos,1);
binCols = size(binCombos,2)-1;
j = 1;
for n = 1 : binRows;
for m = 1 : binCols;
thisBin = binCombos{n,m}(:,:);
if ~isempty(thisBin)
% polyfit
quadmod = polyfit(x_vrbl(thisBin), y_vrbl(thisBin), 2);
% compute residuals and R²
quadmodcurve = polyval(quadmod,y_vrbl(thisBin));
[r2, rmse] = rsquare(y_vrbl(thisBin), quadmodcurve);
res = y_vrbl(thisBin) - quadmodcurve;
% plot fit
interval = 0.0:0.001:1;
quadmodcurve = polyval(quadmod,interval);
plot(x_vrbl(thisBin), y_vrbl(thisBin), '*', interval, quadmodcurve);
xlabel('x_vrbl');
ylabel('y_vrbl');
axis([0,1,0,1]);
header = ['R^2 =' num2str(r2),'coeffs:',num2str(quadmod)];
title(header);
saveas(gcf, sprintf('plot_%d.pdf', j));
% plot residuals
plot(x_vrbl(thisBin),res,'+');
header2 = ['residuals'];
title(header2);
saveas(gcf, sprintf('residuals_%d.pdf', j));
end
j = j + 1;
end
end
似乎更合适,在大多数情况下,R²大于0.9
我的建议是:检查R²在您的案例中是否是适合度的正确度量,并检查该函数是否正确地实现了它。Matlab附带的函数是可以信任的,但是Matlab文件交换上的帖子没有质量保证。据我所知,如果不能运行此代码,它应该是正确的,就像您最初使用的方式一样。到底是什么问题?您是否收到错误消息?再次查看:rsquare做什么?您可以发布您的实现吗?这是我用于r^2的例程:良好的开始,这解决了正确输出曲线和数据的问题。然而,我得到的R^2的大部分是零,即使有大量的数据和好看的拟合…?你能发布一个样本数据集吗?忘了提及;“行”和“列”存储箱可以按升序/降序等距排列。感谢您仔细查看!我不知道如何建造垃圾箱。也许你可以发布其中一个箱子的x_vrbl(thisBin)和y_vrbl(thisBin)的值?只是在我的原始帖子中添加了构建箱子的代码,让我知道这是否有效,或者实际上有点可疑:那
max
根本没有任何意义。根据下面的评论,我认为rsquare函数可以工作,我只是在polyval中使用了错误的变量。无论如何,我真的很感谢你对这个问题的分析。谢谢你!
[r2, rmse] = rsquare(y_vrbl(thisBin), quadmodcurve, false);