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

Arrays 在SAS中使用数组、循环和条件语句在数据中指定的起始位置获取校验累积和,arrays,loops,sas,survival-analysis,cumulative-sum,Arrays,Loops,Sas,Survival Analysis,Cumulative Sum,我正在做一个生存分析,想知道是否有更好的方法用数组和循环来编写下面的过程 我希望能够在最后一段代码中指定几个星期,而不必全部写出。我试图得到从可变周位置(周是失败周)开始的n周数的累积和。变量w1-w52是一台设备的状态,因此我想看看一台设备在出现故障之前是否已经连续运行了数周 proc phreg data=dataset; model week*failure(1) = var1 var2 var3 var4 week week_runtime/ ties = efron;

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

我希望能够在最后一段代码中指定几个星期,而不必全部写出。我试图得到从可变周位置(周是失败周)开始的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,当每周都没有发生故障时,它才是真的

我不知道PROC PHREG内部的编程是否支持数据步骤的全部功能,但在数据步骤中,您可以使用一个迭代DO循环和一个WHILE()子句,在发现故障后立即停止

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中,请注意,因为我认为过程中不支持原始的更简单数组语法。您必须在数组名称和变量列表之间添加多余的
[*]
标记。

不清楚您试图创建的逻辑是什么。听起来您需要一个布尔标志WEEK_RUNTIME,当每周都没有发生故障时,它才是真的

我不知道PROC PHREG内部的编程是否支持数据步骤的全部功能,但在数据步骤中,您可以使用一个迭代DO循环和一个WHILE()子句,在发现故障后立即停止

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中,请注意,因为我认为过程中不支持原始的更简单数组语法。您必须添加多余的
[*]
数组名称和变量列表之间的标记。

为什么您要在PHREG proc中派生此新变量,而不是在数据步骤中派生值,然后在proc步骤中使用此变量?过程步骤中所需的代码更少。您是否可以显示一些示例输入数据以及所需的周运行时值想要计算示例值。N从何而来?为什么您要在PHREG proc中派生这个新变量,而不是在数据步骤中派生该值,然后在proc步骤中使用该变量?过程步骤中需要的代码更少。您能否显示一些示例输入数据以及希望计算的周运行时值对于示例值,N从何而来?