こんにちは。
整形外科医師ブロガーのボククボです。
データを構造体に格納して整理する
ことは多いと思います。
各フィールドに被験者や試行ごとの配列を
格納していた場合、
その配列の平均や標準偏差を求めることが必要です。
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)を指します。
以上です。