Asked by Keegan Carvalho
on 10 Oct 2018 at 15:31

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

Answer by Star Strider
on 10 Oct 2018 at 16:22

You are not extracting your ** table** variables correctly.

This works (extracting the data from your ** table**):

X = [data.sst, data.at]; y = data.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)

and so does this (using your ** table**, and simply rearranging its columns to be compatible with what

new_table = data(:, [2 3 1]); 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(new_table,modelfun,beta0)

The ** ‘carbig’** model is likely not appropriate for your sea level and temperature data, so I am not surprised that the model fails, even though the code now runs without error.

Star Strider
on 12 Oct 2018 at 17:56

Choose a set that seems reasonable. With some models, there are ways to approximate the signs and magnitudes of initial estimates. For other models, not. (I was just experimenting with the model you posted, and it bears no relations to climatology or reality. There is certainly nothing to recommend it.)

When I ran your initial data, the only predictor that was reasonable was the year. There is probably too much noise (or not enough data) otherwise to demonstrate a relationship. That is simply reality.

Keegan Carvalho
on 13 Oct 2018 at 7:15

Star Strider
on 13 Oct 2018 at 11:34

My pleasure.

This is not my area of expertise. I suggest you do an Interweb search for an appropriate model.

Sign in to comment.

Answer by Image Analyst
on 13 Oct 2018 at 14:57

You should use scatteredInterpolant(). Write back if you can't figure it out.

Star Strider
on 13 Oct 2018 at 15:06

Keegan Carvalho has a complete data set, so interpolation would likely not gain anything.

Sign in to comment.

Answer by Image Analyst
on 13 Oct 2018 at 15:59

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.

Keegan Carvalho
about 17 hours ago

Image Analyst I've been thinking of the same as I seem to get pretty bad equations and R^2 values. Maybe the nonlinear regression might not be the best. However, I did find the F() method interesting.

So is it advisable to use the F() function and state that it can be used to predict sea levels with sst and at? I wanted to use this in my thesis. I would like your opinion since I could consider this as an alternative to regression

Walter Roberson
about 16 hours ago

"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
about 15 hours ago

**@Walter —**

My sentiments, exactly.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## Image Analyst (view profile)

Direct link to this comment:https://www.mathworks.com/matlabcentral/answers/423273-error-in-nonlinear-regression#comment_621590

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 (view profile)

Direct link to this comment:https://www.mathworks.com/matlabcentral/answers/423273-error-in-nonlinear-regression#comment_621762

@Image Analyst I wanted to develop a nonlinear relationship between sea level with sea surface temp (sst) and air temp (at). So I wanted to get an equation like sea ~ b1 + b2(sst)^b3 +b4(at)^b5

Sign in to comment.