Как рассчитать среднее значение для ненулевых значений с помощью средств процедуры или сводки процедур

Я хочу иметь среднее значение, основанное на ненулевых значениях для данных переменных, использующих только средства proc. Я знаю, что мы можем рассчитывать с помощью proc sql, но я хочу сделать это с помощью средств proc или сводки по процессу.

В моем исследовании у меня есть 8 переменных, поэтому как я могу рассчитать среднее значение на основе ненулевых значений, где я использую все те, что указаны в операторе var, как показано ниже:

proc means = xyz;
var var1 var2 var3 var4 var5 var6 var7 var8;
run; 

Если мы берем по одной переменной в операторе var и используем условие where для ненулевых переменных, оно работает, но можем ли мы иметь что-то, что будет работать для всех интересующих переменных, упомянутых в операторе var?

Будем очень признательны за ваши предложения. Спасибо !


person Rathod    schedule 19.09.2014    source источник
comment
Вы можете использовать макрос. Кстати, приведенный выше синтаксис неверен, вам нужно добавить ключевое слово данных перед знаком равенства (=).   -  person PKumar    schedule 19.09.2014


Ответы (3)


Один из способов - заменить все нулевые значения на отсутствующие, а затем использовать PROC MEANS.

data zeromiss /view=zeromiss ;
  set xyz ;
  array n{*} var1-var8 ;
  do i = 1 to dim(n) ;
    if n{i} = 0 then call missing(n{i}) ;
  end ;
  drop i ;
run ;

proc means data=zeromiss ;
  var var1-var8 ;
run ;
person Chris J    schedule 19.09.2014

Создайте представление вашего входного набора данных. В представлении определите весовую переменную для каждой переменной, которую вы хотите суммировать. Установите вес на 0, если соответствующая переменная равна 0, и 1 в противном случае. Затем сделайте взвешенную сводку через proc means / proc summary. Например.

data xyz_v /view = xyz_v;
    set xyz;
    array weights {*} weight_var1-weight_var8;
    array vars {*} var1-var8;
    do i = 1 to dim(vars);
        weights[i] = (vars[i] ne 0);
    end;
run;

%macro weighted_var(n);
    %do i = 1 to &n;
        var var&i /weight = weight_var&i;
    %end;
%mend weighted_var;

proc means data = xyz_v;
    %weighted_var(8);
run;

Это менее элегантно, чем решение Криса Дж. Для этой конкретной проблемы, но оно немного лучше обобщает другие ситуации, когда вы хотите применить разные веса к разным переменным в одном и том же резюме.

person user667489    schedule 19.09.2014
comment
А как насчет отрицательных значений vars[i]? - person Chris J; 19.09.2014

Разве вы не можете использовать выражение data?

data lala;
    set xyz;
    drop qty;
    mean = 0;
    qty = 0;

    if(not missing(var1) and var1 ^= 0) then do;
        mean + var1;
        qty + 1;
    end;

    if(not missing(var2) and var2 ^= 0) then do;
        mean + var2;
        qty + 1;
    end;

    /* ... repeat to all variables ... */

    if(not missing(var8) and var8 ^= 0) then do;
        mean + var8;
        qty + 1;
    end;

    mean = mean/qty;
run;

Если вы хотите сохранить среднее значение в том же наборе данных xyz, просто замените lala на xyz.

person Fernando Aires    schedule 19.09.2014
comment
Две вещи - != и += не являются операторами шага данных SAS, они должны быть ^= и + соответственно. Кроме того, выполнение var1 != 0 будет включать пропущенные значения, что приведет к искажению среднего значения. Вместо этого используйте if not missing(var1) and var1 ^= 0. - person Chris J; 19.09.2014
comment
Спасибо - признаюсь, мой синтаксис SAS немного устарел. Исправлю! :) - person Fernando Aires; 19.09.2014