编辑最小二乘法线的x极限

时间:2019-04-29 14:10:48

标签: matlab regression least-squares

我创建了两个散点图,然后使用lsline为每个图添加回归线。我使用了这段代码:

for i=1:2
  x = ..;
  y = ..;
  scatter(x, y, 50, 'MarkerFaceColor',myColours(i, :));
end
h_lines = lsline;

但是,较深的线远远超出了散点图中的最后一个数据点(大约在x = 0.3处):

enter image description here

lsline似乎没有允许设置其水平范围的属性。在Matlab 2016a中,是否有一种解决方法可以为这两行分别设置此设置?

3 个答案:

答案 0 :(得分:5)

对于单个数据集

这是一种解决方法,而不是解决方案。 lsline内部调用refline,它绘制了一条填充轴的线,该轴由其当前限制给出(xlimylim)。因此,您可以将这些限制更改为线路所需的程度,致电lsline,然后恢复这些限制。

示例:

x = randn(1,100);
y = 2*x + randn(1,100); % random, correlated data
plot(x, y, '.') % scatter plot
xlim([-1.5 1.5]) % desired limit for line
lsline % plot line
xlim auto % restore axis limit

enter image description here

用于多个数据集

在这种情况下,您可以依次对每个数据集应用相同的过程,但是在调用lsline时,只需仅保留一个可见的数据集;否则,当您调用它来创建第二行时,它还会创建第一行的新版本(范围错误)。

示例:

x = randn(1,100); y = 2*x + randn(1,100); % random, correlated data
h = plot(x, y, 'b.'); % scatter plot
axis([min(x) max(x) min(y) max(y)]) % desired limit for line
lsline % plot line
xlim auto % restore axis limit
hold on
x = 2*randn(1,100) - 5; y = 1.2*x + randn(1,100) + 6; % random, correlated data
plot(x, y, 'r.') % scatter plot
axis([min(x) max(x) min(y) max(y)]) % desired limit for line
set(h, 'HandleVisibility', 'off'); % hide previous plot
lsline % plot line
set(h, 'HandleVisibility', 'on'); % restore visibility
xlim auto % restore axis limit

enter image description here

答案 1 :(得分:4)

另一个解决方案:实施自己的hsline。很简单!

在MATLAB中,对直线进行最小二乘拟合是不重要的。给定具有x个元素的列向量yNb = [ones(N,1),x] \ y;是最适合行的参数。 [1,x1;1,x2]*b是具有x坐标x1x2的直线上两个点的y位置。因此,您可以编写(跟随Luis' example,并获得完全相同的输出):

N = 100;
x = randn(N,1); y = 2*x + randn(N,1); % random, correlated data
h = plot(x, y, 'b.'); % scatter plot
hold on
b = [ones(N,1),x] \ y;
x = [min(x);max(x)];
plot(x,[ones(2,1),x] * b, 'b-')

x = 2*randn(N,1) - 5; y = 1.2*x + randn(N,1) + 6; % random, correlated data
plot(x, y, 'r.') % scatter plot
b = [ones(N,1),x] \ y;
x = [min(x);max(x)];
plot(x,[ones(2,1),x] * b, 'r-')

答案 2 :(得分:2)

您可以使用来获得定义直线的点

h_lines =lsline;

h_lines(ii).XDatah_lines(ii).YData将包含2个点,这些点定义每条ii=1,2行的行。使用这些来创建直线的方程式,并在所需范围内绘制直线。