How to regress with the simple model like y=kx or y=k/x
조회 수: 12 (최근 30일)
이전 댓글 표시
Usually, the regression is done in Matlab with "regress", but it recommends the input X with a column of ones. And I find that if without the constant coefficient setup, the R2 in the states would be negative. My question is: How to regress the k in the simple model y=kx or y=k/x? Note that no constant factor in the model. By the way, can the definition of R^2=sum((y_p-y_mean).^2)/sum((y-y2).^2) still be used to calculate the correlation factor when facing the y=kx or y=k/x model? Thank you.
댓글 수: 0
답변 (1개)
Grzegorz Knor
2011년 9월 20일
When you are sure that he model without constant is appropriate for the data you can use it withous column of ones.
% first case y = kx
x = 0.1:.1:10;
x = x(:);
y = 2*x+rand(size(x));
plot(x,y)
k = x\y % just for compare
[b,bint,r,rint,stats] = regress(y,x);
hold on
plot(x,k*x,'r')
% second case y = k/x
x = 0.1:.1:10;
x = x(:);
y = 2./x+rand(size(x));
figure
plot(x,y);
k = (1./x)\y %just for compare
[b,bint,r,rint,stats] = regress(y,(1./x));
hold on
plot(x,k./x,'r')
Alternatively, you can catch the situation when the model is inadequate:
% first case y = kx+c
x = 0.1:.1:10;
x = x(:);
y = 3+2*x+rand(size(x));
plot(x,y)
[b,bint,r,rint,stats] = regress(y,x);
[msgstr, msgid] = lastwarn;
if strcmpi(msgid,'stats:regress:NoConst')
[b,bint,r,rint,stats] = regress(y,[x ones(size(x))]);
end
hold on
if length(b)==1
plot(x,b*x,'r')
else
plot(x,b(1)*x+b(2),'r')
end
If you still want to fit model like y = kx use left matrix division operator (see example 1 & 2).
참고 항목
카테고리
Help Center 및 File Exchange에서 Linear and Nonlinear Regression에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!