プログラミング

【MATLAB】構造体やcellに格納された配列の平均、標準偏差

投稿日:

こんにちは。

整形外科医師ブロガーのボククボです。

データを構造体に格納して整理する
ことは多いと思います。

各フィールドに被験者や試行ごとの配列を
格納していた場合、

その配列の平均や標準偏差を求めることが必要です。

MATLABにそういう関数あるかな?
と探してみましたが、なかったので

(あったらゴメン)

方法をご紹介します。

使用するデータ

構造体Sのtrialというフィールドに
10個の配列を格納しています。

各配列は、適当に作ったdouble配列(100×3)です。

構造体データ

歩行周期で標準化した
3種類のデータみたいなものを想定しています。
10人分のデータとおもってください。

(同サイズデータであることが必要です。)

図示すると

for i=1:10
    plot(S(i).trial);
    hold on
end

方法1.力技(for文使いまくり)

平均化するために愚直に
足し合わせるコードを書いてみました。

方法2を思いつくまでは、これを使っていました。

オススメは方法2ですので、読み飛ばしてもかまいません。

さて、早速コードです。

%あらかじめ割り当てしとく
total=zeros(100,3);
count=0;

%1ならそのまま代入、2つめ以降は合計値と合算
for i=1:length(S)
    if i==1
        total=S(i).trial;
        count=1;
    else
        total=total+S(i).trial;
        count=count+1;
    end
end

%合計値/被験者数
average=total./count;

平均波形が得られました。

標準偏差を計算するなら、
各被検者の各時刻のデータを取り出して、
それぞれの標準偏差を求めればできそうですが、、

for文がいっぱいで
なんか
面倒くさいですね。。。

ボククボは3つ以上の入れ子構造は非対応です。

というわけで、方法2に行きます。

方法2.(n+1)次元配列を利用

n次元のデータを(n+1)次元配列に格納して
関数を実行します。

こちらのほうが、いろいろ応用できそうです。

今回のデータは100×3の2次元配列なので

利用するのは3次元配列です。

まず、被験者10人のデータもふくめて
100×3×10の3次元配列にしてしまいます。

%事前割り当て
allsubjectsdata=zeros(100,3,10);
%格納作業
for i=1:length(S)
    allsubjectsdata(:,:,i)=S(i).trial;
end

ここまで来たら、簡単です。

mean関数、std関数を使えば、
平均・標準偏差が求められます。

注意点は、’次元3に沿って’関数を実行する

ことでしょうか。

%次元3に沿って、mean,stdを実行
average=mean(allsubjectsdata,3);
SD=std(allsubjectsdata,1,3);

各関数の最後の”,3”が次元の指定です。
stdの”,1”は標本標準偏差を使用するって意味です。
”,0”だと、標本不偏分散(N-1のやつ)になります。

さて、得られた平均±分散を図示します。

%%平均±SDを図示
plot(average,'b');hold on
plot(average-SD,'--r');
plot(average+SD,'--r');
平均±分散

うまくいっています。

3次元データの平均だったら、
4次元配列に入れて計算という風に利用してください。

まとめ

cellや構造体に格納した、同サイズ配列の

平均、標準偏差の求め方をまとめました。

慣れてる人にとっては当たり前なんでしょうか?

ボククボは完全に独学だったので、
こういうこと教えてくれる人もいなくて大変でした。。

余談ですが、医学でSTDというと
性病(Sex Transmitted Desease)を指します。

以上です。


-プログラミング
-, , , ,

Copyright© ボククボのブログ , 2020 All Rights Reserved Powered by STINGER.