下面是一个完整的 MATLAB 代码示例,该代码会根据 data.xlsx
文件中的数据,判断数据的正态性并选择合适的相关性检验方法(皮尔逊或斯皮尔曼),最后将相关性矩阵保存为新的 Excel 文件。
代码概述
- 导入数据:读取 Excel 文件中的数据,每一列代表一个变量。
- 正态性检验:根据数据的行数选择合适的正态性检验方法。
- 若行数小于 50,使用 Shapiro-Wilk 检验。
- 若行数大于等于 50,使用 Anderson-Darling 检验。
- 相关性分析:根据正态性检验结果,选择使用皮尔逊相关系数(对于符合正态分布的数据)或斯皮尔曼等级相关系数(对于非正态分布的数据)进行相关性分析。
- 保存结果:将相关性矩阵保存到新的 Excel 文件中。
MATLAB 代码
% Step 1: 导入数据
filename = 'data.xlsx'; % 假设文件名为 'data.xlsx'
data = readmatrix(filename); % 导入数据矩阵,每列代表不同数据,行代表观测值
% Step 2: 获取数据的行数
[numRows, numCols] = size(data); % 获取数据的行数和列数
% Step 3: 判断数据是否为正态分布
normalityResults = zeros(1, numCols); % 用来存储每列数据是否符合正态分布的结果(0 = 正态,1 = 非正态)
for i = 1:numCols
columnData = data(:, i); % 获取第i列数据
% 根据数据的行数选择正态性检验方法
if numRows < 50
% 小样本使用Shapiro-Wilk检验
[h, pValue] = swtest(columnData); % 使用Shapiro-Wilk检验,h=0表示符合正态分布,h=1表示不符合
else
% 大样本使用Anderson-Darling检验
[h, pValue] = adtest(columnData); % 使用Anderson-Darling检验
end
% 如果p值小于0.05,说明数据不符合正态分布,h=1为非正态
normalityResults(i) = h;
end
% Step 4: 相关性分析
correlationMatrix = zeros(numCols, numCols); % 初始化相关性矩阵
for i = 1:numCols
for j = i:numCols % 只计算上三角矩阵,避免重复计算
if normalityResults(i) == 0 && normalityResults(j) == 0
% 如果两列数据都符合正态分布,使用皮尔逊相关系数
correlationMatrix(i, j) = corr(data(:, i), data(:, j), 'Type', 'Pearson');
else
% 如果有任意一列数据不符合正态分布,使用斯皮尔曼等级相关系数
correlationMatrix(i, j) = corr(data(:, i), data(:, j), 'Type', 'Spearman');
end
correlationMatrix(j, i) = correlationMatrix(i, j); % 对称填充矩阵
end
end
% Step 5: 保存结果到 Excel 文件
outputFilename = 'correlation_results.xlsx';
writematrix(correlationMatrix, outputFilename); % 保存相关性矩阵到 Excel 文件
disp('相关性分析结果已保存到 "correlation_results.xlsx"');
代码详解:
-
导入数据:
- 使用
readmatrix
导入data.xlsx
文件的数据,假设每一列是一个不同的数据变量,行是观测值。
- 使用
-
正态性检验:
- 如果样本数小于 50,使用
swtest
进行 Shapiro-Wilk 检验(MATLAB 默认没有此函数,可能需要额外工具箱或自定义实现)。 - 如果样本数大于等于 50,使用
adtest
进行 Anderson-Darling 检验。 - 检验结果保存在
normalityResults
中,0
表示正态,1
表示非正态。
- 如果样本数小于 50,使用
-
相关性分析:
- 如果两个变量都符合正态分布,使用皮尔逊相关系数(
corr
,Type
,'Pearson'
)。 - 如果有任意一个变量不符合正态分布,使用斯皮尔曼等级相关系数(
corr
,Type
,'Spearman'
)。 - 计算结果存储在
correlationMatrix
中,这是一个对称矩阵,表示各个变量之间的相关性。
- 如果两个变量都符合正态分布,使用皮尔逊相关系数(
-
保存结果:
- 使用
writematrix
将相关性矩阵保存为新的 Excel 文件correlation_results.xlsx
。
- 使用
注意事项:
- Shapiro-Wilk 检验:MATLAB 默认没有
swtest
函数,如果你没有这个函数,你可以使用其他工具箱,如统计和机器学习工具箱,或者用其他方法来进行正态性检验(如kstest
)。 - 结果解释:皮尔逊相关系数适用于数据呈正态分布的情况,而斯皮尔曼相关系数适用于非正态分布的数据或非线性关系。