Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vertical line fit using polyfit

Its just a basic question. I am fitting lines to scatter points using polyfit. I have some cases where my scatter points have same X values and polyfit cant fit a line to it. There has to be something that can handle this situation. After all, its just a line fit.

I can try swapping X and Y and then fir a line. Any easier method because I have lots of sets of scatter points and want a general method to check lines.

Main goal is to find good-fit lines and drop non-linear features.

like image 455
Naresh Avatar asked Jun 11 '12 14:06

Naresh


People also ask

Can linear regression be a vertical line?

You can't have a vertical line... because it's not a function. You can have a horizontal line - it will always have an intercept at the mean value of Y, and a slope of zero.

What is the use of Polyfit function?

Polyfit is a Matlab function that computes a least squares polynomial for a given set of data. Polyfit generates the coefficients of the polynomial, which can be used to model a curve to fit the data. Polyval evaluates a polynomial for a given set of x values.

What is the output of Polyfit?

polyfit (MATLAB Functions) [p,S] = polyfit(x,y,n) returns the polynomial coefficients p and a structure S for use with polyval to obtain error estimates or predictions. If the errors in the data y are independent normal with constant variance, polyval produces error bounds that contain at least 50% of the predictions.

How do you fit a line in Matlab?

You can use polyfit to fit a trend line to the data. The output of polyfit is a vector of coefficients corresponding to the polynomial you fit to the data. You can then use polyval for those coefficients to create the trend-line to add to the plot.


2 Answers

First of all, this happens due to the method of fitting that you are using. When doing polyfit, you are using the least-squares method on Y distance from the line.


(source: une.edu.au)

Obviously, it will not work for vertical lines. By the way, even when you have something close to vertical lines, you might get numerically unstable results.

There are 2 solutions:

  1. Swap x and y, as you said, if you know that the line is almost vertical. Afterwards, compute the inverse linear function.
  2. Use least-squares on perpendicular distance from the line, instead of vertical (See image below) (more explanation in here)


(from MathWorld - A Wolfram Web Resource: wolfram.com)

like image 70
Andrey Rubshtein Avatar answered Oct 12 '22 10:10

Andrey Rubshtein


Polyfit uses linear ordinary least-squares approximation and will not allow repeated abscissa as the resulting Vandermonde matrix will be rank deficient. I would suggest trying to find something of a more statistical nature. If you wish to research Andreys method it usually goes by the names Total least squares or Orthogonal distance regression http://en.wikipedia.org/wiki/Total_least_squares

I would tentatively also put forward the possibility of detecting when you have simultaneous x values, then rotating your data about the origin, fitting the line and then transform the line back. I could not say how poorly this would perform and only you could decide if it was an option based on your accuracy requirements.

like image 45
mathematician1975 Avatar answered Oct 12 '22 11:10

mathematician1975