【问题标题】:Interpolate the time stamped patient data插入带时间戳的患者数据
【发布时间】:2024-01-23 00:42:02
【问题描述】:

问题:我正在处理患者数据,其中参数以不同的采样频率记录,因此具有不同的时间戳。

我想创建一个矩阵,其中数据由“最后一个已知值”插值,直到新的原始值随时间变化。所以最后我有一个统一的矩阵,其中每个参数在每个时间戳都有值。

数据格式如下:

Time              Hear Rate(Variable)         
18:00:00 PM       74 
18:02:00 PM       75
18:04:00 PM       85     
18:06:00 PM       71        
18:08:00 PM       79        
18:10:00 PM       72  

Time              Blood Press. (Variable)         
18:01:00 PM       100
18:05:00 PM       120
18:09:00 PM       121

目标:

Time              Hear Rate(Variable)    Blood Press.    
18:00:00 PM       74                      NaN
18:01:00 PM       74                      100
18:02:00 PM       75                      100 
18:03:00 PM       75                      100
18:04:00 PM       85                      100 
18:05:00 PM       85                      120
18:06:00 PM       71                      120
18:07:00 PM       71                      120 
18:08:00 PM       79                      120
18:09:00 PM       79                      121
18:10:00 PM       72                      121

缺失位置的插值数据应该是已知事件的先前值,并且应该保持不变,直到发生下一次更改。

我目前指的是来自 MATLAB 用户论坛的以下线程

http://www.mathworks.com/matlabcentral/answers/101237-how-can-i-do-1-d-interpolation-with-interp1-to-find-the-nearest-value-to-the-left-of-the-point-i-e

【问题讨论】:

    标签: matlab time-series interpolation


    【解决方案1】:

    正如您从提供的链接中看到的那样,您实际上是在尝试执行zero-order hold

    我们将第一组时间称为t_hr(字符串元胞数组)和第二组时间t_bp(也是字符串元胞数组)。然后调用心率hr 和血压bp

    通过组合t_hrt_bp 构建一个新的元胞数组t

    t = [t_hr; t_bp];
    

    hrbp 中填写一些NaNs,使它们的长度与t 相同。在t 中,向量的第一部分对应于我们知道的hr 的时间,后半部分对应于bp。相应地使用这些知识:

    hr = [hr; nan(length(t) - length(hr),1)];
    bp = [nan(length(t) - length(bp),1); bp];
    

    现在你有了三个向量:t(好吧,这实际上是一个元胞数组); hrbphrbp的元素对应t中的元素,包括NaNs:

    t = 
    '18:00:00 PM'
    '18:02:00 PM'
    '18:04:00 PM'
    '18:06:00 PM'
    '18:08:00 PM'
    '18:10:00 PM'
    '18:01:00 PM'
    '18:05:00 PM'
    '18:09:00 PM'
    
    hr =
    74
    75
    85
    71
    79
    72
    NaN
    NaN
    NaN
    
    bp =
    NaN
    NaN
    NaN
    NaN
    NaN
    NaN
    100
    120
    121
    

    现在,我们可以对t进行排序:

    [t_sorted, idx] = sort(t);
    

    idx 包含t 的索引,这些索引被移动形成t_sorted。在这种情况下,idx == [1 7 2 3 8 4 5 9 6].'。我们可以用它对bphr进行排序:

     hr_sorted = hr(idx)
     hr_sorted =
     74
     NaN
     75
     85
     NaN
     71
     79
     NaN
     72
    
     bp_sorted = bp(idx)
     bp_sorted =
     NaN
     100
     NaN
     NaN
     120
     NaN
     NaN
     121
     NaN
    

    然后,应用零阶保持:

    for ii = 2:length(t)
        if isnan(hr_sorted(ii))
            hr_sorted(ii) = hr_sorted(ii-1);
        end
        if isnan(bp_sorted(ii))
            bp_sorted(ii) = bp_sorted(ii-1);
        end
    end
    

    你的最终向量变成:

    hr_sorted =
    74
    74
    75
    85
    85
    71
    79
    79
    72
    
    bp_sorted =
    NaN
    100
    100
    100
    120
    120
    120
    121
    121
    

    请注意,您的目标答案中有 11 个不同的时间,但您只提供了 9 个。 (缺少 18:03 和 18:07。)您可以通过将额外的 NaNs 添加到 hrbp 并制作 t 一个包含 t_hr 的元胞数组来轻松扩展此答案、t_bp 和元胞数组t_missing ={'18:03:00 PM', '18:07:00 PM'}

    【讨论】:

    • 感谢您的青睐 :) 一定会尝试在我的大型数据集上实施。 @当