首先是一点背景。我是一名心理学专业的学生,所以我的编码背景与你们不相上下:-)
我的问题如下,最重要的观察是用 2 个不同的程序拟合曲线会为我的参数提供完全不同的结果,尽管我的图表保持不变。我们用来拟合纵向数据的主要程序是 kaleidagraph,这应该被视为有点“黄金标准”,我要修改的程序是 matlab。
我试图变得聪明并编写了一些代码(至少对我来说很多),该代码的目标如下: 1. 获取单个纵向数据文件 2. 使用 lsqcurvefit 将这些数据曲线拟合到非参数模型上 3 . 获得数字和 f' 和 f'' 为零的点
这一切都很好(哇哦:-))但是当我开始比较两个程序生成的函数参数时,它们之间存在巨大差异。kaleidagraph 程序保持接近其原始起始值。Matlab 徘徊,有时会变大 1000 倍。但图表在两种情况下或多或少保持相同,并且都很好地拟合数据。但是,如果我知道如何使 matlab 曲线拟合更“保守”并且更靠近它的原始起始值,那就太好了。
validFitPersons = true(nbValidPersons,1);
for i=1:nbValidPersons
personalData = data{validPersons(i),3};
personalData = personalData(personalData(:,1)>=minAge,:);
% Fit a specific model for all valid persons
try
opts = optimoptions(@lsqcurvefit, 'Algorithm', 'levenberg-marquardt');
[personalParams,personalRes,personalResidual] = lsqcurvefit(heightModel,initialValues,personalData(:,1),personalData(:,2),[],[],opts);
catch
x=1;
end
以上是我为将数据文件适合特定模型而编写的代码的一部分。下面是我使用的非参数模型及其函数参数的示例。
elseif strcmpi(model,'jpa2')
% y = a.*(1-1/(1+(b_1(t+e))^c_1+(b_2(t+e))^c_2+(b_3(t+e))^c_3))
heightModel = @(params,ages) abs(params(1).*(1-1./(1+(params(2).* (ages+params(8) )).^params(5) +(params(3).* (ages+params(8) )).^params(6) +(params(4) .*(ages+params(8) )).^params(7) )));
modelStrings = {'a','b1','b2','b3','c1','c2','c3','e'};
% Define initial values
if strcmpi('male',gender)
initialValues = [176.76 0.339 0.1199 0.0764 0.42287 2.818 18.52 0.4363];
else
initialValues = [161.92 0.4173 0.1354 0.090 0.540 2.87 14.281 0.3701];
end
我试图尽可能好地模仿 kaleidagraph 中的曲线拟合过程。在那里我发现他们使用了我选择的 levenberg-marquardt 算法。但是结果仍然不同,我没有更多关于如何改变这一点的线索。
一些额外的调整:
这段代码的想法如下:
我正在尝试比较不同的拟合模型(它们是为此目的而设计的)。所以我要做的是我有 5 个具有不同参数和不同起始值的模型(我的代码的第二部分),接下来我有通用曲线拟合文件。由于有不同的模型,如果我可以限制我的起始值可以偏离多远,那将会很有趣。
任何人都知道如何做到这一点?
有人愿意帮助心理学学生吗?
干杯