Documentation Center

  • Trial Software
  • Product Updates

Multivariate Regression

The stats::reg function also performs linear and nonlinear regressions with two or more independent variables. The following example demonstrates how to perform regression and fit the data to a function of two variables. Suppose, you have three data lists that contain coordinates x, y, and z of discrete points:

sampleX := [
   -0.9612553839, -0.329576986, 0.7544749248, 0.7339191669,
   -0.294101483, -0.9809519422, -0.6251624775, -0.1885706545,
    0.4729466504, 0.4402179092, -0.1883574567, -0.6260246367,
   -0.0274947885, -0.01843922645, -0.02687538212, -0.03682895886,
   -0.009212115975, -0.04956242636]:
sampleY := [
   -0.02185415496, -0.9146217269, -0.5792023459, 0.5440822742,
    0.8848317212, -0.03925037966, -0.02360776024, -0.5657632266,
   -0.3461422332, 0.3429495709, 0.5113552882, -0.02089004809,
   -0.03700165982, -0.0226531849, -0.004897297126, -0.03063832565,
   -0.03469956571, -0.01391540741]:
sampleZ := [
    0.2755344332, 0.272077192, 0.2682296712, 0.2915713541,
    0.2737466882, 0.3060314064, 0.7624231851, 0.8013891042,
    0.7755723041, 0.7631156115, 0.7816602999, 0.7807856826,
    0.9679031724, 0.9661527172, 0.9632260164, 0.986479402,
    0.9554368723, 0.9768285979]:

Suppose, you want to find the surface that fits these points. Start with plotting the data. The plot::PointList3d function, which plots a finite number of discrete points, requires the coordinates of each point to be grouped together. The following commands create separate lists for the coordinates of each point: [xi, yi, zi] and put these lists into one nested list:

points := [[sampleX[i], sampleY[i], sampleZ[i]]
                        $ i = 1..nops(sampleX)]:

Now, use the plot::PointList3d function to visualize the data:

plot1 := plot::PointList3d(points, PointSize = 2.5):
plot(plot1)

Rotating the plot can help you guess which surface can possibly fit the data. This plot shows that the data can belong to the upper half of a sphere. Thus, try to fit the data to a sphere with an unknown radius r. The stats::reg function searches for the best fitting value for the parameter r:

fit := stats::reg(sampleX, sampleY, sampleZ,
     sqrt(r^2 - x1^2 - y1^2), [x1, y1], [r])

The stats::reg function also accepts the nested list points:

fit := stats::reg(points, sqrt(r^2 - x1^2 - y1^2),
                                    [x1, y1], [r])

The stats::reg function returns the parameters of the model and the quadratic error in a form of a nested list. To access the parameters separately, use the following commands:

R := op(fit)[1][1];
chi2 := op(fit)[2]

Now, plot the data and sphere that you used to fit the data on the same plot. Rotate the plot to see how the sphere fits the data:

plot2 := plot::Function3d(sqrt(R^2 - x^2 - y^2),
                          x = -1..1, y = -1..1):
plot(plot1, plot2)

Was this topic helpful?