# Documentation

## Multivariate Regression

 Note:   Use only in the MuPAD Notebook Interface. This functionality does not run in MATLAB.

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)```