clc; clear; close all;
% 输入数据 (5种温度 × 4次试验)
data = [55.0, 58.0, 57.4, 57.1; % 温度1
54.4, 56.8, 52.4, 56.0; % 温度2
54.0, 54.1, 54.3, 54.0; % 温度3
56.4, 57.0, 56.6, 57.0; % 温度4
56.1, 57.0, 56.1, 54.0]; % 温度5
[k, n] = size(data);
N = k * n;
group_means = mean(data, 2);
grand_mean = mean(data(:));
SST = sum((data(:) - grand_mean).^2);
SSB = n * sum((group_means - grand_mean).^2);
SSW = 0;
for i = 1:k
SSW = SSW + sum((data(i,:) - group_means(i)).^2);
end
% 计算自由度
df_between = k - 1; % 组间
df_within = N - k; % 组内
df_total = N - 1; % 总自由度
MSB = SSB / df_between;
MSW = SSW / df_within;
% 计算F统计量
F_stat = MSB / MSW;
% 计算p值
p_value = 1 - fcdf(F_stat, df_between, df_within);
% 输出结果
fprintf('===== 方差分析结果 =====\n');
fprintf('总平方和 (SST): %.4f\n', SST);
fprintf('组间平方和 (SSB): %.4f\n', SSB);
fprintf('组内平方和 (SSW): %.4f\n', SSW);
fprintf('组间均方 (MSB): %.4f\n', MSB);
fprintf('组内均方 (MSW): %.4f\n', MSW);
fprintf('F统计量: %.4f\n', F_stat);
fprintf('P值: %.6f\n', p_value);
% 假设检验结论
alpha = 0.05;
if p_value < alpha
fprintf('\n结论: 在显著性水平 α=%.2f 下拒绝原假设(p<α)\n', alpha);
fprintf('温度对产品收率有显著影响 (p=%.6f)\n', p_value);
else
fprintf('\n结论: 在显著性水平 α=%.2f 下不拒绝原假设(p>α)\n', alpha);
fprintf('温度对产品收率无显著影响 (p=%.6f)\n', p_value);
end
% 可视化结果
figure;
boxplot(data', 'Labels', {'Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5'});
title('不同温度下产品收率分布');
xlabel('温度水平');
ylabel('收率 (%)');
grid on;
figure;
hold on;
errorbar(1:k, group_means, std(data, 0, 2)/sqrt(n), 'o-', 'LineWidth', 1.5, 'MarkerSize', 8);
plot(xlim, [grand_mean grand_mean], 'r--', 'LineWidth', 1.5);
hold off;
title('不同温度下收率均值比较');
xlabel('温度水平');
ylabel('收率均值 (%)');
legend('各温度均值±标准误', '总均值', 'Location', 'best');
xticks(1:k);
xticklabels({'Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5'});
grid on;
figure;
subplot(1, 2, 1);
bar([SSB, SSW]);
set(gca, 'XTickLabel', {'组间变异 (SSB)', '组内变异 (SSW)'});
title('变异来源分解');
ylabel('平方和');
subplot(1, 2, 2);
bar(F_stat);
title('F统计量');
ylabel('F值');
line(xlim, [finv(1-alpha, df_between, df_within), finv(1-alpha, df_between, df_within)], ...
'Color', 'r', 'LineStyle', '--');
legend('F统计量', '临界值', 'Location', 'northwest');
grid on;
不改变源代码,做的过程当中一般要有一个方差齐性检验的过程,直接假定5种温度水平下的收率数据具有相同的方差
最新发布