希望在不插值SAS的情况下扩展数据

时间:2019-10-12 18:17:09

标签: sas

我有一些以5分钟为间隔进行编码的视频编码数据。我具体使用的变量是行为改变的时间(相对于5分钟视频的开始时间(以秒和毫秒为单位)),每5分钟每个人的观察次数和行为本身都不同。例如:

Participant     Time_Relative      Behavior
     1               0                3
     1               123.3            4
     1               153.6            1
     1               300              4
     2                0               5
     2                360             3

我想要做的是扩展数据,以便每个参与者都有相等数量的观察值(当前参与者的观察值范围为3-33),说在五分钟的视频中每0.5秒观察一次,但行为保持不变直到改变之时都一样。我尝试了多个PROC EXPAND函数(方法=无,从=到=,factor(x,x)等),但它会一直插值并创建行为的平均值,或者将时间序列变量插值给一些奇怪的数字真的没有任何意义!

例如,我希望参与者1和2具有相同数量的时间观察和行为:

Participant  Time_elapsed_from_video_start(seconds)   Behavior
     1                         0                         3
     1                         .5                        3
     1                         1                         3
     1                         1.5                       3
     .                            
     . 
     .
     1                         123                       4
     1                         123.5                     4
     2                         0                         5
     2                         .5                        5
     2                         1                         5
     2                         1.5                       5
     .                            
     . 
     .
     2                         123                       5
     2                         123.5                     5

(此处的点代表参与者1和参与者2的数据末尾的椭圆形,不丢失数据) 最后,我尝试为每个参与者进行300个观察,每个观察相距半秒(将实际观察秒数舍入到最接近的半秒)。报告的行为将保持不变,直到在最近的半秒内观察到实际变化为止。

1 个答案:

答案 0 :(得分:0)

Proc EXPAND处理从非周期间隔到周期性间隔的命名间隔,并且不能同时使用因子选项(比如说半秒)

假设数据中的时间值实际上是持续时间,而不是时间戳,则需要一个中间步骤将持续时间转换为从开始到经过的时间。

data have;
  input id time_relative response;datalines;
 1 0      3
 1 123.3  4
 1 3.3    1
 1 300    4
 2 0      5
 2 360    3
run;

data have2;
  set have;
  by id;

  if first.id then time = time_relative; else time+time_relative;
run;

/* From Help -- Overview: EXPAND Procedure
 * You can also convert aperiodic series, observed at arbitrary points in time, 
 * into periodic estimates. For example, a series of randomly timed quality control 
 * spot-check results might be interpolated to form estimates of monthly average defect rates. 
 */

proc expand data=have2 out=want to=second;
  by id;
  id time;
  convert response=response2 / method=step; 
  format time 6.2;
run;

从帮助

  

ID声明

     

ID变量;

     

ID语句为一个数字变量命名,该变量标识输入和输出数据集中的观测值。 ID变量的值假定为SAS日期或datetime值。

     

输入数据必须形成时间序列。这意味着输入数据集中的观测值必须按ID变量(在BY变量内(如果有))排序。此外,不应有重复的观测值,并且在由FROM =选项定义的相同时间间隔内,两个观测值都不应具有ID值。

您可以在DATA步骤中编写自己的“扩展”代码:

data want (keep=id X Y rename=(X=time Y=response));

  length id X Y 8;

  X = 0;
  Y = .;

  do until (last.id);

    set have;
    by id;

    if first.id 
      then time = time_relative; 
      else time + time_relative;

    do X = X by 0.5 while (X < time);
      output;      
    end;

    Y = response;
  end;  

  output;

  format X 6.1;
run;