Пример t-теста в Matlab

В Matlab мне нужно сгенерировать две гауссовские случайные выборки с распределениями:

  1. N(100,5)
  2. N(115,15)

Затем запустите симуляцию 1000 раз и подсчитайте, сколько раз нулевая гипотеза была отклонена из 1000 раз для каждого размера выборки, сканируемого от 2 до 50.

Наконец, мне нужно отобразить результат отклонений H0 в зависимости от размера выборки.

h = zeros(1000,1);
k = 0;

for i = 1:1000
    r1 = ();
    r2 = ();
    for j= 2:50
        r1(j-1)=normrnd(100,5,[1,j]);
        r2(j-1)=normrnd(110,15,[1,j]);
    end
    h(i)=ttest2(r1,r2)
    if h(i)==1
        k=k+1;
    end
    percent_of_rejection_Null=(k/1000*100);
end
%plot(h vs sample_size)

Может ли кто-нибудь помочь мне исправить приведенный выше код?


person FunnyBuzer    schedule 20.10.2019    source источник


Ответы (1)


Было несколько проблем с вашим кодом:

  1. ri - это вектор изменяющегося размера, поэтому вам нужно добавить его к структуре, которая может хранить элементы с разными размерами -> массив ячеек.
  2. percent_of_rejection_Null должен быть вектором для хранения всех значений.
  3. вы не указали, какой именно тип графика вы ищете, я показал гистограмму, но ее легко настроить на нужный вам.
  4. вычисление h было проблематичным, его вектор равен 50 на каждой итерации, поэтому необходимо вычислить сумму 1.

Кусок кода:

h = zeros(1000,1);
percent_of_rejection_Null = zeros(1000,1);
k = 0;

for i = 1:1000
    r1 = {};
    r2 = {};
    for j= 2:50
        r1{j-1}=normrnd(100,5,[1,j]);
        r2{j-1}=normrnd(110,15,[1,j]);
    end
    h = cellfun(@ttest2, r1, r2);
    k = sum(h==1);
    percent_of_rejection_Null(i) = (k/1000*100);
end
figure;
plot(percent_of_rejection_Null)

Получившийся сюжет:

введите здесь описание изображения

Если результат не тот, что вам нужен, отредактируйте свой вопрос, чтобы я мог его скорректировать.

person David    schedule 20.10.2019
comment
Теперь ясно! Спасибо - person FunnyBuzer; 20.10.2019
comment
Вы можете упростить код, вызвав ttest2 в том же цикле, в котором вы делаете случайные выборки. Тогда вам не нужно хранить промежуточные данные, вы просто накапливаете количество в k. - person Cris Luengo; 20.10.2019
comment
@CrisLuengo, вы абсолютно правы, но я хотел сохранить ту же логику, насколько это возможно, чтобы иметь возможность указать на недостатки кода. использование ri действительно не нужно, если кто-то не использует его вне цикла, и это не упоминалось - person David; 20.10.2019
comment
@DavidS У меня все еще есть некоторые сомнения в правильности моего исходного кода. В конце концов, я хочу построить график количества отклонений в зависимости от размеров выборки, сканируемой от 2 до 50. Поэтому у меня есть сомнения, следует ли мне использовать просто r1(j-1)=normrnd(100,5) вместо r1(j-1)=normrnd(100,5,[1,j]), потому что в противном случае для каждой симуляции мои смоделированные выборки всегда будут тот же размер. Что вы думаете? - person FunnyBuzer; 20.10.2019
comment
@FunnyBuzer Я не знаю, какова ваша цель в коде, который вы нам дали, ваше сомнение может быть верным, чтобы сохранить одинаковые размеры векторов, но это может быть не так. Вам нужно подумать о своей проблеме и прийти к выводу, важны ли разные размеры в отношении проблемы, которую вы пытаетесь решить; Надеюсь, это имеет больше смысла - person David; 21.10.2019