在MATLAB中使用矩阵而不是向量进行引导?

Posted

技术标签:

【中文标题】在MATLAB中使用矩阵而不是向量进行引导?【英文标题】:Bootstrp with matrices instead of vectors in MATLAB? 【发布时间】:2021-01-05 06:30:01 【问题描述】:

我正在使用xcorr 来计算两个时间序列之间的互相关。为了评估统计显着性,我需要执行引导并在两个时间序列之间创建随机相关性以创建零分布。例如,timeseries1 的大小为 16x11(即 16 个时间点和 11 个受试者),timeseries2 的大小也是 16x11。这里的主题是匹配的,例如, timeseries1(:,1) 匹配到timeseries2(:,1);即 timeseries1 是来自主题一的一种数据,timeseries2(:,1) 是来自主题一的另一种数据。

我需要对它们进行加扰,以便创建新的随机相关性,例如 timeseries1(:,1)timeseries2(:,5) 等。

我尝试如下使用boostrp

scorr = @(timseries1,timeseries2)(xcorr(timseries1,timeseries2,'coeff'));
bootstat = bootstrp(1000,scorr,a,b);

但是,我收到一个错误,因为引导程序只接受向量而不接受矩阵。在函数的文档中,提供的所有示例都具有每个主题 1 个值的数据,例如,来自 15 个科目的 LSAT 分数与来自 15 个科目的其他测试分数相关。但是我每个主题有 16 个样本,如果我将时间序列减少到一个时间点,我将无法进行互相关。

有人对如何做到这一点有任何建议吗?

【问题讨论】:

【参考方案1】:

您可以使用 randperm 进行抽样而不进行替换,这将返回 1:n_subjects 之间的两个不同的随机整数:

n_boot = 100;
n_subj = 11;
n_samples = 16;
timeseries1 = randn(n_samples, n_subj);
timeseries2 = randn(n_samples, n_subj);


null_dist = nan(n_boot,  ...
                n_samples*2-1);
for i = 1:n_boot
    
    subjs_to_corr = randperm(n_subj, 2);  % draw 2 random numbers from 1:n_subj without replacement
    
    null_dist(i, :) = xcorr(timeseries1(:, subjs_to_corr(1)),  ... 
                            timeseries2(:, subjs_to_corr(2)));
end

【讨论】:

以上是关于在MATLAB中使用矩阵而不是向量进行引导?的主要内容,如果未能解决你的问题,请参考以下文章

怎样用matlab进行列向量归一化?

在 Matlab 中访问单元格中的向量

在MATLAB中从dec2base分离0和1(即在向量而不是1x1数组中)

基本矩阵运算-Matlab

关于用matlab进行向量归一化的问题

Matlab 矩阵特征值排序问题