https://github.com/jdiedrichsen/pcm_toolbox
Raw File
Tip revision: 4e290a8b2c0d0820f868b7bcb60a3da7bb30e6ee authored by Jörn Diedrichsen on 26 April 2023, 01:59:24 UTC
Update pcm_estimateRegression.m
Tip revision: 4e290a8
pcm_indicatorMatrix.m
function [X,a]=pcm_indicatorMatrix(what,c)
% function X=pcm_indicatorMatrix(what,c)
% Makes a indicator Matrix for the classes in c
% INPUT:
%   what   : gives the type of indicator matrix that is needed
%      'identity'       : a regressor for each category
%      'identity_p'     : a regressor for each category, except for c==0
%      'reduced'        : GLM-reduced coding (last category is -1 on all indicators)
%      'pairs'          : Codes K category as K-1 pairs
%      'allpairs'       : Codes all K*(K-1) pairs in the same sequence as pdist
%      'allpairs_p'     : Same a allpairs, but ignoring 0
%      'interaction_reduced'
%      'hierarchical'   : Codes for a fixed variable underneath a normal factor
%      'hierarchicalI'  : Codes for a random variable unerneath a normal factor
%   c      : 1xN or Nx1 vector of categories
% OUTPUT:
%   X      : design Matrix
% Joern Diedrichsen 2012

transp=0;
if size(c,1)==1
    c      =  c';
    transp =  1;
end;

[row,col]  = size(c);

for s=1:size(c,2)
    [a,~,cc(:,s)]=unique(c(:,s)); % Make the class-labels 1-K
end;

K=max(cc);     % number of classes, assuming numbering from 1...max(c)

switch (what)
    case 'identity'                 % Dummy coding matrix
        X=zeros(row,K);
        for i=1:K
            X(cc==i,i) = 1;
        end;
    case 'identity_fix'             % Dummy coding matrix with fixed columns 1...K
        X=zeros(row,max(c));
        for i=1:max(c)
            X(c==i,i) = 1;
        end;
        
    case 'identity_p'               % Dummy coding matrix except for 0: Use this to code simple main effects
        a(a==0)=[];
        K=length(a);
        X=zeros(row,K);
        for i=1:K
            X(c==a(i),i) = 1;
        end;
        
    case 'reduced'                  % Reduced rank dummy coding matrix (last category all negative)
        X=zeros(row,K-1);
        for i=1:K-1
            X(cc==i,i) = 1;
        end;
        X(sum(X,2)==0,:)=-1;
    case 'reduced_p'                % Reduced rank dummy coding matrix, except for 0
        a(a==0)=[];
        K=length(a);
        X=zeros(row,K-1);
        for i=1:K-1
            X(c==a(i),i) = 1;
        end;
        X(c==a(K),:)=-1;
        
    case 'pairs'                    % K-1 pairs
        X=zeros(row,(K-1));
        for i=1:K-1
            X(cc==i,i)   =  1./sum(cc==i);
            X(cc==i+1,i) = -1./sum(cc==i+1);
        end;
    case 'allpairs'                 % all possible pairs
        X=zeros(row,K*(K-1)/2);
        k=1;
        for i=1:K
            for j=i+1:K
                X(cc==i,k) = 1./sum(cc==i);
                X(cc==j,k) = -1./sum(cc==j);
                k         = k+1;
            end;
        end;
    case 'allpairs_p'               % all possible pairs  except for 0
        a(a==0)=[];
        K=length(a);
        X=zeros(row,K*(K-1)/2);
        k=1;
        for i=1:K
            for j=i+1:K
                X(c==a(i),k) = 1./sum(c==a(i));
                X(c==a(j),k) = -1./sum(c==a(j));
                k         = k+1;
            end;
        end;
    case 'interaction_reduced'
        X1=indicatorMatrix('reduced',cc(:,1));
        X2=indicatorMatrix('reduced',cc(:,2));
        for n=1:row
            X(n,:)=kron(X1(n,:),X2(n,:));
        end;
    case 'hierarchical'             % Allows for a random effects f c(:,2) within each level of c(:,1)
        X1=indicatorMatrix('identity',cc(:,1));
        X2=indicatorMatrix('reduced',cc(:,2));
        for n=1:row
            X(n,:)=kron(X1(n,:),X2(n,:));
        end;
    case 'hierarchicalI'             % Allows for a random effects f c(:,2) within each level of c(:,1)
        C=size(cc,2);
        for i=1:C
            X{i}=indicatorMatrix('identity',cc(:,i));
        end;
        A=X{end};
        for i=C-1:-1:1
            B=[];
            for n=1:row
                B(n,:)=kron(X{i}(n,:),A(n,:));
            end;
            A=B;
        end;
        X=A;
    otherwise
        error('no such case');
end;

% Transpose design matrix
if (transp==1)
    X = X';
else
    a=a';
end;
back to top