我正在用Matlab编写一个程序,任务是使用5个不同的模型拟合8个参数,并输出它们的FVAL,以计算AIC和BIC,从而获得5个模型中的最佳模型。我的问题是,尽管不同模型拟合的参数完全不同,但我得到的FVAL分数相同,这对我来说毫无意义。
我的任务总共有234个数据点和8个参数,但每个数据点只使用2个参数。答案是二进制1或0。我有一个234x1的双变量,称为“results”,这是我想要预测的分数,每个数据点都是1或0。另一个234x1的双变量称为“tParamVal”,这是使用的2个参数中的第一个参数,这是得分为1,2,3,或4。最后,234 × 1双变量caleld 'sParamVal',这是使用的第二个参数,这是得分为5,6,7,或8。因此,对于234个数据点,我有param1(例如,3),param2(例如,8),结果(例如,1)。
我这样定义我的模型:
null = @(params, x) mean(results); % null model.
multiplicative = @(params, x) params(x(1)) * params(x(2)); % multiplicative model
minimalism = @(params, x) min(params(x(1)), params(x(2))); % minimum model.
字符串
对于目标函数,我使用负对数似然定义为:
objective_null = @(params) -mean((results .* log(null(params, ...
[tParamVal, sParamVal]) + 1e-10)) + ((1 - results) .* ...
log(1 - null(params, [tParamVal, sParamVal]) + 1e-10)));
objective_mul = @(params) -mean((results .* log(multiplicative(params, ...
[tParamVal, sParamVal]) + 1e-10)) + ((1 - results) .* ...
log(1 - multiplicative(params, [tParamVal, sParamVal]) + 1e-10)));
objective_min = @(params) -mean((results .* log(minimalism(params, ...
[tParamVal, sParamVal]) + 1e-10)) + ((1 - results) .* ...
log(1 - minimalism(params, [tParamVal, sParamVal]) + 1e-10)));
型
这是3个基本模型,我添加了另外2个模型,它们具有以下规则的约束:第一个参数>第二个参数>第三个参数>第四个参数的分数和另一个规则:第五个参数>第六个>第七个>第八个。这是我如何定义约束的:
constraint = @(params) [params(1) - params(2), params(2) - params(3), ...
params(3) - params(4), params(5) - params(6), ...
params(6) - params(7), params(7) - params(8)];
型
具有约束的最后2个模型的目标函数定义为:
penalized_objective_mul = @(params) objective_mul(params) + ...
sum(min(0, constraint(params)).^2);
penalized_objective_min = @(params) objective_min(params) + ...
sum(min(0, constraint(params)).^2);
型
对于BADS优化算法,您需要提供一个起始点x0:
x0 = [0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5]; % Starting point
型
以及硬下界(lb)和上界(ub):
lb = [0 0 0 0 0 0 0 0]; % Lower bounds
ub = [1 1 1 1 1 1 1 1]; % Upper bounds
型
为获得拟合参数和fval I,运行5个模型的以下线路:
% null model
[null_fit, null_fval] = bads(objective_null, x0, lb, ub);
nullStruct.(subject) = [null_fit, null_fval];
% multiplicative model
[mul_fit, mul_fval] = bads(objective_mul, x0, lb, ub);
mulStruct.(subject) = [mul_fit, mul_fval];
% multiplicative with constraint model
[mulConst_fit, mulConst_fval] = bads(penalized_objective_mul, x0, lb, ub);
mulConstStruct.(subject) = [mulConst_fit, mulConst_fval];
% minimalism model
[min_fit, min_fval] = bads(objective_min, x0, lb, ub);
minStruct.(subject) = [min_fit, min_fval];
% minimalism with constraint model
[minConst_fit, minConst_fval] = bads(penalized_objective_min, x0, lb, ub);
minConstStruct.(subject) = [minConst_fit, minConst_fval];
型
这一切都是在for循环中为每个“subject”运行的。
对于每个受试者,我得到不同的FVAL分数,但在同一受试者内和不同模型之间,我得到相同的FVAL分数。值得注意的是,虽然FVAL是相同的,但不同的模型输出不同的参数,他们拟合。
我想问题出在目标函数上,我试着改变和复习了几次,但都没有成功。
先谢了。
1条答案
按热度按时间py49o6xq1#
问题出在模型功能上。
修正后的型号功能:
字符串