Contents

%This lab introduces the notion of simulation to calculate power

1 Init Start with a blank slate

clear all
close all
clc

%Seed the random number generator
s = RandStream('mt19937ar','Seed',sum(round(clock)));
RandStream.setGlobalStream(s);

2 p values, mean differences and significance

sampleSize = 253; %This will control our sample size
numRep = 1e3; %This is the number of times we draw randomly
meanDifference = 0.25; %This will control the actual difference in means in the population

A = randn(numRep,sampleSize,1); %Draw from a random normal distribution with zero mean
A(:,:,2) = randn(numRep,sampleSize,1) + meanDifference; %Similar
%But with an average mean difference

for ii = 1:numRep
    [H(ii) P(ii)] = ttest2(A(ii,:,1),A(ii,:,2));
    %Test 1st sheet vs. 2nd sheet with a 2 sample t-test
end

sum(H)
figure
hist(P)
ans =
   798

3 PPV - "positive predictive value"

%The posterior probability that if something is significant, it is true

%1 Case
alpha = 0.05; %Classic choice
beta = 0.2; %Classic choice - power is 1-beta, we aim for 0.8
R = 0.5; %Whatever - reasonable choice
PPV = ((1-beta)*R)/(R-beta*R+alpha)

%2 All Rs from 0 to 1
R = 0:0.01:1; %Now, let's let R go from 0 to 1
for ii = 1:length(R)
    PPV(ii) = ((1-beta)*R(ii))/(R(ii)-beta*R(ii)+alpha);
end
figure
plot(R,PPV)
xlabel('R')
ylabel('PPV')

%3 So far, we "clamped" power at 0.8 - what if we had lower power?
%Why might we have lower power?
%Because it is hard to get high power if the effect size is low.
%Who has the funds to recruit thousands of participants?
beta = 1:-0.01:0; %Power = 1 - beta, so we'll have this go from 1 to 0
for ii = 1:length(R)
    for jj = 1:length(beta)
    PPV(ii,jj) = ((1-beta(jj))*R(ii))/(R(ii)-beta(jj)*R(ii)+alpha);
    end
end

%Let's summarize the entire Ioannidis paper in one figure
%linking power, R and PPV
figure
h = surf(R,beta,PPV); %Make a surface plot
set(h,'linestyle','none') %Take the mesh off
set(h,'facecolor','interp') %Interpolate colors
xlabel('R')
ylabel('beta')
zlabel('PPV')
colorbar
colormap('hot')
PPV =
    0.8889

4 Funnel plots

%Funnel plots are a meta-analyic tool. They effectivly plot effect size
%vs. power.
%As you increase power, the effects cluster around the "real" effect
%Like in a funnel. Hence funnel plot

%There are more things to see in funnel plots.
%We'll write them here once we did a couple.
%But let's first develop them.

sampleSize = 5:250; %In the interest of time.
effectSize = 0.25; %Later, we put in a real effect size
repeats = 1e2; %I want to save time in class. We do a 100 repeats per sample size

%Preallocate
%This will contain the mean differences - we do a nested loop. To save
%time, we preallocate it in memory.
meanDifference = zeros(length(repeats),length(sampleSize));

%Calculations
%This will allow us to simulate the observed effect sizes for a given
%power. Doing so rr number of times, which will allow us to assess the
%spread
for rr = 1:repeats %Going through all the repeats
    for ii = 1:length(sampleSize) %Going through all the sample sizes
        A = randn(sampleSize(ii),1) + effectSize; %Drawing from a random normal distribution plus effectsize
        B = randn(sampleSize(ii),1); %Doing it again
        meanDifference(rr,ii) = mean(A)-mean(B); %Calculating the actual mean difference and putting it in the storage structure
    end
end

%To plot this, it is easiest to linearize it first
%We could plot this in a for loop as well, but this is exhausting
%So let's not do that. Instead, let's linearize first

linearizedMeanDifference = meanDifference(:); %Put it all in one vector
temp = repmat(sampleSize,[repeats 1]); %Tile the sample size
linearizedsampleSize = temp(:); %Same for sample size

figure
plot(linearizedMeanDifference,linearizedsampleSize,'.','color','k')

ylabel('Sample size')
xlabel('Observed effect size')
set(gcf,'color','w')

line([0 0], [0 max(ylim)],'color','r') %No effect
line([effectSize effectSize], [0 max(ylim)], 'color', 'w') %Real effect