【问题标题】:Looking to expand data without interpolating in SAS希望在不插入 SAS 的情况下扩展数据
【发布时间】:2019-10-15 01:18:25
【问题描述】:

我有一些以 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 函数(method=none、from=to=、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,为什么第 3 行的时间为 3.3 即 123.3 ?时间值是否与行为改变的先前时间相关?换句话说,time_relative 真的是前一行中提到的行为的 time_duration 吗?
  • 嗨,理查德,这是我的一个错误。不,我们有另一个变量显示所见行为的持续时间。这个变量尤其应该是相对于视频开头的时间(以秒为单位),因此在排序时它应该是 0-300。

标签: sas


【解决方案1】:

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 变量的值假定为 SAS 日期或日期时间值。

输入数据必须形成时间序列。这意味着输入数据集中的观察必须按 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;

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2016-12-14
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2010-11-07
    相关资源
    最近更新 更多