Fitting data polynomial fitlm

3 次查看(过去 30 天)
I am trying to fit data, first to a polynomial of degree 1 and then to a polynomial of degree 1 but log(y) instead of y. How make a predicting to what the data would look like the year 2020 and plot it? (The first x-value is 1972 and it increases with 1 until 2011)
clear all
clf
load moore.mat %xtime and y are 40x1 double
%data for mooores law
%polynomial of degree 1
figure(13)
mdl1 = fitlm(xtime,y)
subplot(2,1,1)
plot(mdl1,'Color','m')
hold on
ttime = 1972:1:2020;
T = [];
for j=1972:1:2020
t = ((j.*4.4366.^20) -8.8006^10);
T = [T t];
end
plot(ttime,T)
%polynomial of degree 1 mwith log y instead of y
mdl3 = fitlm((xtime),log(y));
%maybe I should use predict
%R^2 för modellerna -> this I get with fitlm
%transforming the logarithmically fitted version back to normal
%using data from fitlm
Y = [];
for i=1972:1:2020
y_ny = (i.*0.52342-1030.3);
Y = [Y y_ny];
end
xtime_ny = 1972:1:2020;
%Får ut med fitlm i cmd window
subplot(2,1,2)
plot(xtime_ny,Y,'c-*')
legend('label1')
%are the residuals normally distributed, investigate with qqplot
%making a new plot with a prediction in year 2020 (the x data is in years)
%this plot is supposed to be with the polynomial of the first degree...
%...and the polynomial that used the logaritm
%look at graphs for the year 2020

采纳的回答

Mathieu NOE
Mathieu NOE 2020-11-13
hello Karolina
here my suggestion; if you need further help , let me know
yes, it's a first polynomial fit once the y data are in log scale
clear all
clf
load moore.mat %xtime and y are 40x1 double
%data for mooores law
% so log(y) is linear with time (linear)
figure(1);semilogy(xtime,y);
y_log10 = log10(y);
% do some smoothing ?
N = 10;
y_log10_smoothed = myslidingavg(y_log10, N);
figure(2);plot(xtime,y_log10,'b',xtime,y_log10_smoothed,'*-r');
% polynomial fit
% Fit a polynomial p of degree 1 to the (x,y) data:
% + remove first and last points of smoothed data
ind = 2:length(xtime)-1;
xs = xtime(ind);
yls = y_log10_smoothed(ind);
p = polyfit(xs,yls,1);
% Evaluate the fitted polynomial p and plot:
% yls_fit = polyval(p,xtime);
% Y = POLYVAL(P,X) returns the value of a polynomial P evaluated at X. P
% is a vector of length N+1 whose elements are the coefficients of the
% polynomial in descending powers:
%
% Y = P(1)*X^N + P(2)*X^(N-1) + ... + P(N)*X + P(N+1)
yls_fit = p(1)*xtime + p(2);
figure(3);plot(xtime,y_log10,'o', xs,yls,'--',xtime,yls_fit,'-')
legend('data','data smoothed','linear fit')
% going back from log to linear scale for y
y_lin = 10.^(yls_fit);
% now use the fit model to predict future value
new_x_data = [2015 2020 2025]; % can be scalar or vector
new_y_data = 10.^(p(1)*new_x_data + p(2)); % can be scalar or vector
figure(4);semilogy(xtime,y,'o',xtime,y_lin,'-',new_x_data,new_y_data,'*');
legend('data','model fit','extrapolation')

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Linear and Nonlinear Regression 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by