全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3189 3
2014-10-14
以下程序在运行的时候总是出现:

NOTE: IML Ready
ERROR: (execution) Invalid subscript or subscript out of range.

operation : [ at line 14952 column 114
operands  : Z_VALUE1, J, *LIT1067

Z_VALUE1      1 row       3 cols    (numeric)

1.1337026   1.27154 1.1668986

J      1 row       1 col     (numeric)

         2

*LIT1067      1 row       1 col     (numeric)

         1

statement : ASSIGN at line 14952 column 61
ERROR: (execution) Matrices do not conform to the operation.

有高手帮忙看看啦!



%macro stratCI(data=, treatment=, strata=, response=, level=);
%if %sysfunc(exist(&data))=0 %then
%do;
%put " ERROR: Input dataset not specified"; %goto exit;
%end;

%if %length(&treatment) = 0 %then
%do;
%put " ERROR: Treatment group must be specified";
%goto exit;
%end;

%if %length(&strata) = 0 %then
%do;
%put " ERROR: Strata must be specified";
%goto exit;
%end;

%if %length(&response) = 0 %then
%do; %put " ERROR: Response must be specified";
%goto exit;
%end;

proc sql noprint;
create table temp
as select
&treatment as treatment,
&strata as strata,
&response as response
from &data;
quit;

%let alpha= 1-&level/2;
proc sort data=temp;
by strata treatment;
run;
proc freq data=temp noprint ;
by strata;
tables treatment/riskdiff nopercent nocol norow out=freq_strata;
run;
proc freq data=temp;
by strata;
tables treatment*response/riskdiff nopercent nocol out=freq;
ods output RiskDiffCol2 = riskstrata;
run;

* Total Frequency;
proc transpose data=freq_strata out=freq_strata1 (drop=_NAME_ _LABEL_) prefix=n_trt;
by strata;
var count;
run;
* Proportion;
proc transpose data=riskstrata out=riskstrata1 (drop=_NAME_) prefix=prop;
where Row in ('第 1 行','第 2 行');
by strata;
var Risk;
run;
* Risk difference;
data riskstrata2;
set riskstrata(rename=(risk=r_diff));
if Row = '差值';
keep r_diff ASE strata;
run;


* Merge;
data ready;
merge freq_strata1 riskstrata1 riskstrata2;
by strata;
run;
*STRATA-ADJUSTED RISK DIFFERENCE;
data ready1;
set ready;
*calculate weight;
CMH_part = (n_trt1*n_trt2)/(n_trt1+n_trt2);  /*Cochran-Mantel-Haenszel weight*/
invar_part =1/ASE**2;                   /*inverse of variance weight*/
min_part1= (n_trt1+n_trt2);
min_part2= min_part1*r_diff;
min_part3= invar_part*r_diff;
run;
proc sql;
create table ready2 as select strata,
sum(CMH_part) as CMH_sum,
sum(invar_part) as invar_sum,
sum(min_part1) as min_sum1,
sum(min_part2) as min_sum2,
sum(min_part3) as min_sum3
from ready1;
quit;

data ready3;
merge ready1 ready2;
by strata;
min_alpha = r_diff*invar_sum - min_sum3;
min_beta = invar_part * (1 + min_alpha*min_sum2/min_sum1);
min_part4=r_diff*min_beta;
min_part5 = r_diff*min_alpha*invar_part; run;
proc sql;
create table ready3_1 as select *,
sum(min_part4) as min_sum4,
sum(min_part5) as min_sum5 from ready3;
quit;

data weights;
set ready3_1;
CMH_weight = CMH_part/CMH_sum;
INVAR_weight = invar_part/invar_sum;
MIN_weight = min_beta/invar_sum-(min_alpha*invar_part/(invar_sum + min_sum5))*(min_sum4/invar_sum);
run;


/* all weights are calculated. */
proc iml;
use weights;
read all;
read all var {CMH_weight invar_weight min_weight} into w;
n=n_trt1||n_trt2;
n_strata=nrow(n); /*表示组别的数*/
totaln=sum(n);
p= prop1||prop2;

/* unadjusted CI :Pool */
p1_1 = n_trt1 # prop1;
p2_1 = n_trt2 # prop2;
n1=n_trt1[+,];
n2=n_trt2[+,];
p1=p1_1[+,]/n1;
p2=p2_1[+,]/n2;
Crude_Lower = (p1-p2) - probit(&alpha)# sqrt(p1 # (1-p1)/n1 + p2 # (1-p2)/n2);
Crude_Upper = (p1-p2) + probit(&alpha)# sqrt(p1 # (1-p1)/n1 + p2 # (1-p2)/n2);
/* start to calculate Wald CI */
adj_rdiff= w # r_diff;
wald_part1= adj_rdiff[+,];
wald_var = 1/invar_part;
sq_w = w ## 2;
adj_var = sq_w # wald_var;
wald_part2 = adj_var[+,];
Wald_L = wald_part1 - probit(&alpha)*sqrt(wald_part2);
Wald_U = wald_part1 + probit(&alpha) *sqrt(wald_part2);
Wald_Lower=Wald_L`;
Wald_Upper=Wald_U`;

/* end of Wald CI */


* 1. calculate z_gamma;/*表示两组,三个分层因素*/
/*partz_a1 = J(n_strata,3,1);
partz_a2 = J(n_strata,3,1);
partz_b1 = J(n_strata,3,1);
partz_b2 = J(n_strata,3,1); */

partz_a1 = J(n_strata,3,1); /*表示两组,三个分层因素*/
partz_a2 = J(n_strata,3,1);
partz_b1 = J(n_strata,3,1);
partz_b2 = J(n_strata,3,1);

do i=1 to n_strata;
  do j=1 to 3;
   partz_a1[i,j] = (sq_w[i,j]/n_trt1[i,1]) # (p[i,1] # (1-p[i,1]));
   partz_a2[i,j] = (sq_w[i,j]/n_trt2[i,1]) # (p[i,2] # (1-p[i,2]));
   partz_b1[i,j] = w[i,j] # sqrt(p[i,1] # (1-p[i,1])/n_trt1[i,1]);
   partz_b2[i,j] = w[i,j] # sqrt(p[i,2] # (1-p[i,2])/n_trt2[i,1]);
end;
end;
z_value1=(probit(&alpha)*sqrt(partz_a1[+,])/partz_b1[+,]);
z_value2=(probit(&alpha)*sqrt(partz_a2[+,])/partz_b2[+,]);

PRINT z_value1 z_value2;



* 2. calculate L1 L2 U1 U2 based on stratified Wilson CI;
/*wilson_part1a= J(n_strata,3,1);
wilson_part1b= J(n_strata,3,1);
wilson_part2a= J(n_strata,3,1);
wilson_part2b= J(n_strata,3,1);
*/

wilson_part1a= J(n_strata,3,1);
wilson_part1b= J(n_strata,3,1);
wilson_part2a= J(n_strata,3,1);
wilson_part2b= J(n_strata,3,1);
do i=1 to n_strata;
   do j=1 to 3;    /*表示有多少分层*/
     wilson_part1a[i,j]=(n[i,1] # p[i,1] + 0.5 # (Z_value1[j,1] ## 2))/(n[i,1] + Z_value1[j,1] ## 2);
     wilson_part1b[i,j]=((n[i,1] # Z_value1[j,1])/(n[i,1]+Z_value1[j,1]##2)) # (sqrt(4 # n[i,1] # p[i,1] # (1-p[i,1]) + Z_value1[j,1] ##2)/(2 # n[i,1]) );
     wilson_part2a[i,j]=(n[i,2] # p[i,2] + 0.5 # (Z_value2[j,1] ## 2))/(n[i,2] + Z_value2[j,1] ## 2);
     wilson_part2b[i,j]=((n[i,2] # Z_value2[j,1])/(n[i,2]+Z_value2[j,1]##2)) # (sqrt(4 # n[i,2] # p[i,2] # (1-p[i,2]) + Z_value2[j,1] ##2)/(2 # n[i,2]) );
    end;
  end;
wilson_L1 = w #( wilson_part1a - wilson_part1b); wilson_U1 = w #( wilson_part1a + wilson_part1b);
wilson_L2 = w #( wilson_part2a - wilson_part2b); wilson_U2 = w #( wilson_part2a + wilson_part2b);
newcombe_L1 = wilson_L1[+,];
newcombe_U1 = wilson_U1[+,];
newcombe_L2 =wilson_L2[+,];
newcombe_U2 =wilson_U2[+,];
* 3. Calculate lambda1 and 2;
lam1= sq_w/n_trt1;
lam2 = sq_w/n_trt2;
lambda1 = lam1[+,];
lambda2 = lam2[+,];
* 4. calculate lower/upper limit for newcombe CI;
NEWCOMBE_L = wald_part1 - probit(&alpha)#sqrt(lambda1 # newcombe_L1 #(1- newcombe_L1)+lambda2#newcombe_U2#(1-newcombe_U2));
NEWCOMBE_U = wald_part1 + probit(&alpha)#sqrt(lambda2 # newcombe_L2 #(1-newcombe_L2)+lambda1#newcombe_U1#(1-newcombe_U1));
Newcombe_Lower=newcombe_L;
Newcombe_Upper=newcombe_U;
/* end of Newcombe CI */


Stratum_nm = {'Strata','Sample size in Trt1','Sample size in Trt2','Proportion in Trt1', 'Proportion in Trt2','Proportion difference (Trt1 - Trt2)','CMH weight', 'Inverse of Variance weight', 'Minimum risk weight' };
Adj_nm = {"Adjusted proportion difference", "Wald CI (lower)","Wald CI (upper)", "Newcombe CI (lower)","Newcombe CI (upper)"} ;
Weights= { "CMH", "Inverse of Variance", "Minimum risk"};
CI = {"Crude CI (lower)","Crude CI (upper)"};
Strata_sum = (1:n_strata)`||n_trt1|| n_trt2 || prop1 || prop2 || r_diff || CMH_weight || invar_weight || min_weight;
Adj_sum = wald_part1`||wald_Lower || Wald_Upper ||newcombe_Lower || newcombe_Upper ; Crude_CI = crude_Lower` || crude_Upper`;
file print; put @35 "Strata-adjusted confidence interval"//;
put @35 "Summary for dataset "/; put @30 "Sample size " @75 totaln / @30 "Number of strata " @75 n_strata;
print crude_CI[colname=CI label= "Unadjusted summary" format=6.4]; print Adj_sum [rowname=weights colname=Adj_nm label= "Adjusted summary" format=6.4];
quit;
%exit:
%mend stratCI;



DATA TEMP;
INPUT ID treatment strata response @@;
cards;
1 1 2 0
2 2 2 1
3 1 2 0
4 1 2 1
5 2 3 0
6 1 1 1
6 2 1 1
6 2 1 1
7 1 2 1
8 1 3 1
9 1 1 1
10 1 1 1
11 1 2 1
12 1 3 0
1 1 2 0
2 2 2 1
3 1 2 1
4 1 2 0
5 2 3 1
6 1 1 0
7 1 2 1
8 1 3 1
9 1 1 0
10 1 1 0
11 1 2 0
12 1 3 1


;
run;


%stratCI(data=TEMP, treatment=treatment, strata=strata, response=response, level=0.05);




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-10-15 09:35:04
写得真好                                                                        
                                       
                                                     
                                                     
                                             
                                                                 
                                                                                 
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-15 22:43:51
……麻烦能不能只把重点和问题列出来,就发一段这么长的代码,说真的,我没耐心看完
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-17 10:10:57
这个程序是想计算,校正了分层因素 strata 后,两组之间的率差以及其95%CI,但在进行PROC IML 的时候,为啥总出现 Invalid subscript or subscript out of range.
麻烦重点看这部分类容:
:* 1. calculate z_gamma;/*表示两组,三个分层因素*/
partz_a1 = J(n_strata,3,1); /*表示两组,三个分层因素*/
partz_a2 = J(n_strata,3,1);
partz_b1 = J(n_strata,3,1);
partz_b2 = J(n_strata,3,1);

do i=1 to n_strata;
  do j=1 to 3;
   partz_a1[i,j] = (sq_w[i,j]/n_trt1[i,1]) # (p[i,1] # (1-p[i,1]));
   partz_a2[i,j] = (sq_w[i,j]/n_trt2[i,1]) # (p[i,2] # (1-p[i,2]));
   partz_b1[i,j] = w[i,j] # sqrt(p[i,1] # (1-p[i,1])/n_trt1[i,1]);
   partz_b2[i,j] = w[i,j] # sqrt(p[i,2] # (1-p[i,2])/n_trt2[i,1]);
end;
end;
z_value1=(probit(&alpha)*sqrt(partz_a1[+,])/partz_b1[+,]);
z_value2=(probit(&alpha)*sqrt(partz_a2[+,])/partz_b2[+,]);

PRINT z_value1 z_value2;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群