なたで日記

いろいろな思ったこと書きますヽ(^▽^ゞ) by natade

Posts Tagged ‘MATLAB

MATLABでExcelのTDISTとTINVを使う

leave a comment »


Excel の TDIST関数は、

TDIST(http://office.microsoft.com/ja-jp/excel-help/HP005209312.aspx) より引用
>スチューデントの t 分布のパーセンテージ (確率) を返します。
>数値 (x) は t の計算値で、この t に対してパーセンテージが計算されます。
>t 分布は、比較的少数の標本から成るデータを対象に仮説検定を行うときに使われます。
>この関数は、t 分布表の代わりに使用することができます。
>
>書式
>
>TDIST(x,自由度,尾部)
>
> x t 分布を計算する数値を指定します。
>
> 自由度 分布の自由度を整数で指定します。
>
> 尾部 片側分布を計算するか両側分布を計算するか、数値で指定します。
>尾部に 1 を指定すると片側分布の値が計算され、2 を指定すると両側分布の値が計算されます。

これをMATLABで同じ関数を定義する場合は、

function [ dst ] = excelTDIST( x, degrees_freedom, tails )
    dst = (1 - tcdf(x, degrees_freedom)) * tails;
    return

上記のようになります。
tcdfは、t分布の累積分布関数(cumulative distribution function)です。
tcdfの第1引数はt値。第2引数は自由度(degree-of-freedom)です。

Excel の TINV関数は、

TINV(http://office.microsoft.com/ja-jp/excel-help/HP005209317.aspx) より引用
> スチューデントの t 分布の t 値を、確率の関数と自由度で返します。
>
> 書式
>
> TINV(確率,自由度)
>
> 確率 スチューデントの両側 t 分布に従う確率を指定します。
>
> 自由度 分布の自由度を指定します。

これは、両側となっているようでMATLABで同じ関数を定義する場合は、

function [ t ] = excelTINV( probability, degrees_freedom)
    t = - tinv( probability / 2, degrees_freedom);
    return

あるいは

function [ t ] = excelTINV( probability, degrees_freedom)
    t = tinv( 1 - probability / 2, degrees_freedom);
    return

上記のようになります。
tinvは、t分布の累積分布関数の逆関数(inverse function)です。

関連記事
MATLABを用いた相関係数のt検定 « なたで日記


オマケ
F分布累積分布関数の定義。 cdf(‘F’,X,A,B) と同じです。

function [ cdf ] = fcdf( x, d1, d2 )
    cdf = betacdf( d1*x/(d1*x+d2), d1/2, d2/2 );
    return

Written by なたで

2012年1月6日 at 19:32

カテゴリー: memo, program

Tagged with ,

MATLABを用いた相関係数のt検定

leave a comment »


function[p] = TTestForCorrelationCoefficient(r, n, type)
%Student's t-test of correlation coefficient
%相関係数のt検定
%『入力』
%r 相関係数
%n 相関係数を調べた時のサンプル数
%type 1で片側検定, 2で両側検定(デフォルト)
%『出力』
%p 相関がないといえる確率
%有意水準α=0.05としたとき、α>pであれば、危険率5%で優位な相関がある。

if nargin < 3
	type = 2;
end

% 相関係数を正とする
r = abs(r);
% 0 から 1 とする
r = min(r, 1);
% 統計量
t = r * sqrt(n - 2) ./ sqrt(1 - r.*r);
% 自由度
DF = n - 2;
% スチューデントの t 分布
p = 1.0 - tcdf(t, DF);
% 両側検定は2倍の面積
if type==2
	p = p * 2;
end
% NaN(相関係数が1の時に起こる)だったら、必ず相関があるので 0 に。
p(isnan(p)) = 0;

相関係数のt検定を参考

tcdfのために、Statistics Toolbox($1,000)が必要です。
ない場合は、C言語による最新アルゴリズム辞典affiliate)のP429のtdist.cが多分それです

関連記事
MATLABでExcelのTDISTとTINVを使う « なたで日記

Written by なたで

2011年9月9日 at 21:50

カテゴリー: program

Tagged with ,

bsxfunっぽいもの

leave a comment »


function [ out ] = bsxfun( func, target, data )
%[ out ] = bsxfun( func, target, data )
%MATLABの新しいのにある、bsxfunっぽいもの。
%http://www.mathworks.co.jp/access/helpdesk_ja_JP/help/techdoc/ref/bsxfun.html
%『入力』
%func   種類
%target A
%data   B
%『出力』
%out    出力

name  = func2str(func);
MINUS   = 0;
TIMES   = 1;
RDIVIDE = 2;
LDIVIDE = 3;
PLUS   = 4;

type = -1;
if strcmp(name,'plus'),
     type = PLUS;
elseif strcmp(name,'minus'),
     type = MINUS;
elseif strcmp(name,'times'),
     type = TIMES;
elseif strcmp(name,'rdivide'),
     type = RDIVIDE;
elseif strcmp(name,'ldivide'),
     type = LDIVIDE;
end

%row    height
%column width

[row,   column] = size(target);
[height, width] = size(data);

if ((height==1)&&(width==1)),
     if (type == PLUS),
          out = target + data;
     elseif (type == MINUS),
          out = target – data;
     elseif (type == TIMES),
          out = target .* data;
     elseif (type == RDIVIDE),
          out = target ./ data;
     elseif (type == LDIVIDE),
          out = target .\ data;
     end
else
     out = zeros(row,column);
     for x=1:row,
          for y=1:column,
               a = mod(x – 1,height) + 1;
               b = mod(y – 1,width)  + 1;
          if (type == PLUS),
               out(x,y) = target(x,y) + data(a,b);
          elseif (type == MINUS),
               out(x,y) = target(x,y) – data(a,b);
          elseif (type == TIMES),
               out(x,y) = target(x,y) * data(a,b);
          elseif (type == RDIVIDE),
               out(x,y) = target(x,y) / data(a,b);
          elseif (type == LDIVIDE),
               out(x,y) = target(x,y) \ data(a,b);
          end
     end
end

end

Written by なたで

2010年11月30日 at 15:57

カテゴリー: program

Tagged with ,

ランダムな添え字

leave a comment »


こんな感じで。

Java

    /**
     * 指定した長さの一様分布な重複しないランダムな添え字を作成します。
     * @param length
     * @param seed
     * @return
     */
    public static int[] getRandomIndex(int length, long seed) {
        Random random = new Random(seed);
        int[] buffer = new int[length];
        for (int i = 0; i < length; i++) {
            buffer[i] = i;
        }
        int[] out = new int[length];
        int n, rest;
        for (int i = 0; i < length; i++) {
            rest = length – i;
            n = (random.nextInt() & 0x7FFFFFFF) % rest;
            out[i] = buffer[n];
            if (1 != rest – n) {
                for (int j = 1; j < rest – n; j++) {
                    buffer[n + j - 1] = buffer[n + j];
                }
            }
        }
        return (out);
    }

MATLAB

function [ out ] = getRandomIndex( length, seed )
%[ out ] = getRandomIndex( length, seed )
%指定した長さの一様分布な重複しないランダムな添え字を作成します。

if nargin==2
    s = RandStream.create('mt19937ar','seed',seed);
    RandStream.setDefaultStream(s);
end

data = 1:1:length;
out  = zeros(1,length);
rest = length;

%重複しないランダムな値を作成
for j=1:length
    n = 1 + fix(rest * rand(1,1));
    out(j) = data(n);
    if 0~=rest-n
        for k=1:rest-n
            data(n+k-1) = data(n+k);
        end
    end
    rest = rest – 1;
end

Written by なたで

2010年11月30日 at 15:51

カテゴリー: program

Tagged with , ,