Error in nonlinear regression
Show older comments
I am trying to make a nonlinear regression model of the attached csv file. I used the following code:
if true
data=readtable('ban1.csv')
sea=data(:,1)
sst=data(:,2)
at=data(:,3)
X = [sst,at];
y = sea;
modelfun = @(b,x)b(1) + b(2)*x(:,1).^b(3) + ...
b(4)*x(:,2).^b(5)
beta0 = [100 100 100 100 100];
mdl = fitnlm(X,y,modelfun,beta0)
% code
end
I am getting the following errors:
Error using internal.stats.parseArgs (line 42) Wrong number of arguments.
Error in NonLinearModel.fit (line 1385) internal.stats.parseArgs(paramNames, paramDflts, otherArgs{:});
Error in fitnlm (line 99) model = NonLinearModel.fit(X,varargin{:});
Would be grateful if someone can help me, if possible with code. I would also like to know where I am going wrong.
Thank you
2 Comments
Image Analyst
on 12 Oct 2018
Which is x and which is y? Why are you having 2 x but only 1 corresponding y? What do you want along the x/horizontal/independent axis and what do you want along the y/vertical/dependent axis?
Keegan Carvalho
on 13 Oct 2018
Accepted Answer
More Answers (2)
Image Analyst
on 13 Oct 2018
0 votes
You should use scatteredInterpolant(). Write back if you can't figure it out.
1 Comment
Star Strider
on 13 Oct 2018
Keegan Carvalho has a complete data set, so interpolation would likely not gain anything.
Image Analyst
on 13 Oct 2018
Try using scatteredInterpolant(). Below is a complete demo:
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 20;
format bank
% Read in data.
data=importdata('ban1.csv')
data = data.data;
% Extract various components.
sea=data(:,1)
sst=data(:,2)
at=data(:,3)
%================================ MAIN PART RIGHT HERE ==============================================
% Make the scattered interpolant.
F = scatteredInterpolant(sst, at, sea)
% Get a grid of points at every pixel location in the RGB image.
resolution = 300; % Number of points across that you want ot evaluate it at.
x = linspace(min(sst), max(sst), resolution);
y = linspace(min(at), max(at), resolution);
[xGrid, yGrid] = meshgrid(x, y);
xq = xGrid(:);
yq = yGrid(:);
% Evaluate the interpolant at query locations (xq,yq).
vq = F(xq, yq);
fittedImage = reshape(vq, resolution, resolution);
%================================ END OF MAIN PART ==============================================
imshow(fittedImage, [], 'XData', x, 'YData', y);
axis on;
xlabel('sst', 'FontSize', fontSize);
ylabel('at', 'FontSize', fontSize);
title('sea as a function of sst and at', 'FontSize', fontSize);
colorbar;
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
% For fun, overlay the known points.
hold on;
plot(sst, at, 'r*', 'MarkerSize', 20, 'LineWidth', 2);

You can use a colormap if you want.
11 Comments
Keegan Carvalho
on 14 Oct 2018
Image Analyst
on 14 Oct 2018
Not sure I know what you want now. I thought you wanted a function where you could enter sst and at and get out the predicted sea. And I gave that to you with the F() function. Now I have no idea what you want. Do you want an analytical function? As you can see from the surface fit, there are many peaks and valleys and ridges so there will most likely be no analytical formula you can get with something like multilinear regression (a 2-D polynomial) what will give you that surface unless you overfit it (bad!) with a very high order polynomial.
Keegan Carvalho
on 14 Oct 2018
Edited: Keegan Carvalho
on 14 Oct 2018
Walter Roberson
on 14 Oct 2018
"So is it advisable to use the F() function and state that it can be used to predict sea levels with sst and at?"
In my opinion: NO. In my opinion, the proper response would be to say that the available data is insufficient to find a justifiable model of.
Star Strider
on 14 Oct 2018
@Walter —
My sentiments, exactly.
Keegan Carvalho
on 15 Oct 2018
Image Analyst
on 15 Oct 2018
This F just shows you what the values of sea might have been if you wanted to interpolate something in between, but as I showed you in the scatterplots in your other question, there is essentially no discernible pattern. Everything is essentially random and uncorrelated. The scatter plots show that and the crazy looking image I showed above show that. So for you to think you can just plug in some new value of at and sst and get a reasonably accurate prediction for sea is just fantasy or overly wishful thinking.
The suggestion is that you need to collect much, MUCH more data. Even then there may be no influence. For example if I were to plot the birthdate vs the height and weight of all the people working in my building, hoping to get a nice relationship, it just won't happen because there is no relationship. Your data appears to show no relationship, though perhaps one might emerge if you had tons more data, not just 17.
Walter Roberson
on 16 Oct 2018
"For example if I were to plot the birthdate vs the height"
You might find that the mean height increased as they grew from toddlers to 17-ish, and that the mean height started decreasing again in 40s (people shrink) and 70s (men die off faster than women), but you would not get far in predictions of individual heights.
Walter Roberson
on 16 Oct 2018
You have 17 data points. To have any useful statistical significance, you need at least 5 points per degree of freedom. I figure that you therefore cannot justify any model with more than 3 degrees of freedom, and that you might be able to say "suggestive" with 4 degrees of freedom, but beyond that you should having nothing to say.
When I look at the image that Image Analyst produced for you, it is pretty clear that you cannot meaningfully create it with two degrees of freedom, and you would be pretty hard pressed to create it with four degrees of freedom.
I think you need to let go of the idea that you have enough data for a meaningful analysis.
Keegan Carvalho
on 22 Oct 2018
Keegan Carvalho
on 27 Oct 2018
Categories
Find more on Nonlinear Regression in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!