SAS中使用数组、循环、条件语句获取数据中指定起始位置的校验累计和

Use array, loop, and conditional statement in SAS to get check cumulative sum at a specified starting position in data

我正在进行生存分析,想知道是否有更好的方法来使用数组和循环编写下面的过程。

我希望能够在最后一段代码中指定几周的时间,而不必全部写出来。我正在尝试从变量 week 位置(week 是失败周)开始返回 n周数。变量 w1-w52 是一件设备的状态,所以我想看看一件设备在出现故障之前是否已经 运行 连续几周。

proc phreg data=dataset;
    model week*failure(1) = var1 var2 var3 var4 week week_runtime/ ties = efron;
    array weeks(*) w1-w52;

    /* This is the status of equipment at the week of fail */
    equipment_sts = weeks[week]; 
    
    /* This is where I'm trying to make my code more efficient so I can specify n weeks */
    if sum(weeks[week] + weeks[week-1] + weeks[week-2] + weeks[week-3] .... weeks[week - n]) = n then week_runtime = 1;
    else week_runtime = 0;
run;

不清楚您要创建的逻辑是什么。听起来你想要一个布尔标志,WEEK_RUNTIME,当 WEEK 没有发生故障时,它是真的。

我不知道 PROC PHREG 内部的编程是否支持 DATA 步的全部功能,但在数据步中,您可以使用带有 WHILE() 子句的迭代 DO 循环,一旦找到失败。

data have ;
  input week week1-week5 ;
cards;
2 1 1 1 0 0
3 1 1 0 0 0
4 1 1 1 1 1
;

data want;
  set have;
  array weeks week1-week5 ;
  week_runtime=1;
  do index=1 to min(week,dim(weeks)) while (week_runtime=1);
    week_runtime=weeks[index];
  end;
  drop index;
run;

结果:

                                                             week_
Obs    week    week1    week2    week3    week4    week5    runtime

 1       2       1        1        1        0        0         1
 2       3       1        1        0        0        0         0
 3       4       1        1        1        1        1         1

PS 如果您确实将此代码放入 PROC PHREG 中,请当心,因为我认为过程中不支持原始的更简单的 ARRAY 语法。您必须在数组名称和变量列表之间添加多余的 [*] 标记。