我有一些以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个观察,每个观察相距半秒(将实际观察秒数舍入到最接近的半秒)。报告的行为将保持不变,直到在最近的半秒内观察到实际变化为止。
答案 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;