Repeated measure ANOVA in MATLAB

조회 수: 20 (최근 30일)
Sarfaraz Ahmed
Sarfaraz Ahmed 2022년 1월 16일
댓글: Sarfaraz Ahmed 2022년 1월 24일
Hi Everyone,
I am trying to do ANOVA statistical analysis on the attached data set. This is just example data set to know how to apply anova on the given data. There are 4 cases (t0 ~ t4) and in each case we do 1 observation for each subject using two methods.
Can anyone help please how to generate the below statistical results on the given data sets from MATLAB ?
1) Boxplot with 95% confidance interval (as attached snap) .
2) Sphercity test and histrograph for each method.
3) P values fo each case between method 1 and method 2.
it would be great if someone can help on the script code of such statistical analysis.
Thanks in the anticipation.

채택된 답변

Scott MacKenzie
Scott MacKenzie 2022년 1월 24일
What you have is a 2 x 4 within-subjects design. The independent variables are "Method" (2 levels) and "Case" (4 levels). You didn't provide a name for the dependent variable. Let's call it "Measurement".
To simplify the analysis, I reorganized your data (see attached), positioning the measurements for each participant on the same row.
The script below performs the anova usning MATLAB's ranova function and produces a conventional ANOVA table using a custom function, given at the end.
Results: There is a significant effect of Method on Measurement (F(1,7) = 33.58, p = .0007). There is also a significant effect of Case on Measurement (F(3,21) = 39.44, p < .0001). However, the Method x Case interaction effect on Measurement is not significant (F(3,21) = 1.54, p = .233).
For the other parts to your question, visit the examples provided in the documention for MATLAB's boxplot, boxchart, mauchly (for a spericity test), and histogram functions.
T = readtable('data2.xlsx', 'range', 'B3');
T.Properties.VariableNames = {'v1', 'v2', 'v3', 'v4', 'v5', 'v6', 'v7', 'v8'};
withinDesign = table([1 1 1 1 2 2 2 2]',[1 2 3 4 1 2 3 4]','VariableNames',{'Method','Case'});
withinDesign.Method = categorical(withinDesign.Method);
withinDesign.Case = categorical(withinDesign.Case);
rm = fitrm(T, 'v1-v8 ~ 1', 'WithinDesign', withinDesign);
%mauchly(rm)
AT = ranova(rm, 'WithinModel', 'Method*Case');
disp(anovaTable(AT, 'Measurement'));
ANOVA table for Measurement ================================================================================= Effect df SS MS F p --------------------------------------------------------------------------------- Participant 7 6214.23011 887.74716 Method 1 41.46555 41.46555 33.581 0.0007 Participant(Method) 7 8.64349 1.23478 Case 3 5668.38786 1889.46262 39.435 0.0000 Participant(Case) 21 1006.17038 47.91288 Method:Case 3 3.93187 1.31062 1.542 0.2330 Participant(Method:Case) 21 17.84595 0.84981 =================================================================================
% -------------------------------------------------------------------------
% Function to create a conventional ANOVA table from the overly-complicated
% and confusing ANOVA table created by the ranova function.
function [s] = anovaTable(AT, dvName)
c = table2cell(AT);
% remove erroneous entries in F and p columns
for i=1:size(c,1)
if c{i,4} == 1
c(i,4) = {''};
end
if c{i,5} == .5
c(i,5) = {''};
end
end
% use conventional labels in Effect column
effect = AT.Properties.RowNames;
for i=1:length(effect)
tmp = effect{i};
tmp = erase(tmp, '(Intercept):');
tmp = strrep(tmp, 'Error', 'Participant');
effect(i) = {tmp};
end
% determine the required width of the table
fieldWidth1 = max(cellfun('length', effect)); % width of Effect column
fieldWidth2 = 57; % width for df, SS, MS, F, and p columns
barDouble = repmat('=', 1, fieldWidth1 + fieldWidth2);
barSingle = repmat('-', 1, fieldWidth1 + fieldWidth2);
% re-organize the data
c = c(2:end,[2 1 3 4 5]);
c = [num2cell(repmat(fieldWidth1, size(c,1), 1)), effect(2:end), c]';
% create the ANOVA table
s = sprintf('ANOVA table for %s\n', dvName);
s = [s sprintf('%s\n', barDouble)];
s = [s sprintf('%-*s %4s %11s %14s %9s %9s\n', fieldWidth1, 'Effect', 'df', 'SS', 'MS', 'F', 'p')];
s = [s sprintf('%s\n', barSingle)];
s = [s sprintf('%-*s %4d %14.5f %14.5f %10.3f %10.4f\n', c{:})];
s = [s sprintf('%s\n', barDouble)];
end
  댓글 수: 1
Sarfaraz Ahmed
Sarfaraz Ahmed 2022년 1월 24일
Hi Scott, Thank you very much for your detailed answer.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Analysis of Variance and Covariance에 대해 자세히 알아보기

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by