Как создать макрос в SAS для повторения PROC MIXED в большом наборе данных

В настоящее время я работаю с набором данных из 760 метаболитов. Эти метаболиты были предоставлены 15 видам бактерий. Кроме того, их рост отслеживали при двух оптических плотностях (OD) в трех повторностях. Таким образом, у меня есть набор данных из 1520 строк и 17 столбцов.

optins formdlim='.';
data = Vera`                                                                             
input Metabolite$ OD P1 P2  P3  P4  P5  P6  P7  C8  C9  C10 B11 B12 B13 B14 B15
;

cards;

proc print; run;

Что я хочу сделать, так это выяснить, совпадают ли данные двух оптических плотностей (нет существенной разницы между данными при 492 и 630 для каждого метаболита. Поэтому я написал следующий код:

PROC mixed DATA=Vera;
CLASS OD ;
MODEL P1 = OD / SOLUTION ;
lsmeans OD/ diff;
RUN;

С его помощью вы можете проанализировать различия между OD при 492 и 630 для каждого вида бактерий. Однако вам придется разделить данные и запустить каждый метаболит отдельно. Это не будет проблемой с небольшим количеством переменных, но у меня их 760. Поэтому я не хочу повторять процедуру и вводить код вручную 760 раз. Я хочу написать макрос для использования в SAS и повторить тот же синтаксис для каждого метаболита. Как я могу это сделать?

Мои данные выглядят так:

Metabolite  OD  P1           P2          P3          P4          P5          P6          P7         C8          C9           C10         B11        B12         B13         B14         B15
C1         492  0.80318008  0.834511094 0.755462174 0.947215787 0.887920107 0.941135272 0.854403285 0.827162124 0.774818623 1.043873527 0.980611933 0.99175232  0.899985465 2.323935576 0.989680725
C1         492  1.015295591 0.937931127 0.862409875 1.035489644 1.020100969 1.432972263 1.20098598  1.014347313 1.024901914 1.350518389 1.228546301 1.058456868 1.021602321 0.882652756 1.068231275
C1         492  0.810476853 0.767190317 0.566538969 1.160767653 1.036374265 1.007790833 1.190486783 1.113972414 0.325186332 0.907718954 1.675218213 0.906072763 1.410147143 1.060946843 1.067602052
C1         630  0.961524961 1.005846657 0.847824375 1.025462906 0.976906071 0.976627864 1.01474825  0.903212955 0.934967536 0.882814468 1.001740347 0.903248894 0.996416257 1.02681187  0.916566129
C1         630  1.554650956 0.737506567 2.452827299 1.037786536 0.874060377 0.950382623 1.081525591 2.143129784 1.077641166 1.993884723 1.685291793 0.927601975 1.097186964 0.84841252  0.942020551
C1         630  3.397638555 3.48494389  2.736307131 4.485634181 4.927877673 4.754434301 5.041446678 3.008039216 1.24514729  3.849372819 3.335763153 4.537001962 4.347699905 2.650736885 5.007861571
C2         492  0.621121776 0.655197791 0.624464533 0.774748488 0.835036637 0.890241965 1.050214203 0.766379479 0.499753317 0.708279952 0.851083004 0.833468896 0.842360044 0.536406298 0.722104984
C2         492  1.75496053  1.625140448 1.234260466 1.600459563 1.805650674 3.902582698 4.366733197 4.3322092   0.884777351 3.659221055 3.698372956 4.424445968 3.911657965 1.184654064 3.032617686
C2         492  1.136163306 0.990741638 1.008046619 1.090941503 1.065424996 1.286243284 1.162517672 1.086776372 1.050708989 0.947436205 1.255244694 1.097283143 1.064965485 1.025620139 0.974254224
C2         630  1.113004223 1.481277257 1.117820203 1.606865598 1.547740666 1.923981394 1.79028251  1.600927099 0.651330519 1.688562315 1.671669463 1.596206391 1.999786168 1.112853138 1.95607287
C2         630  0.802575958 0.63027506  0.688188658 0.879770793 0.779821048 0.884177322 0.942509034 0.755849107 0.630951119 0.712527463 0.897567203 0.847457282 0.838313324 0.696858072 0.737402398
C2         630  3.868652818 3.623364192 2.899296194 4.850127834 5.171682933 5.239876518 5.407341626 3.381502495 1.345204779 4.170354345 3.676830466 4.893081332 4.646074976 2.792233812 5.15275719

Я попытался создать макрос, но думаю, что не получаю то, что хотел бы видеть. Опять же, у меня есть 16 видов бактерий, которые были выращены в присутствии 760 метаболитов. Рост измеряли при 2 различных OD. Я хочу выяснить, существенно ли различается измерение OD для каждого метаболита у каждого вида. Я изменил макрос и модель следующим образом:

options formdlim='-';
data vera;
input Metabolite$ OD P1 P2 P3 P4 P5 P6 P7 C8 C9 C10 B11 B12 B13 B14 B15 B16;
cards;
%macro metabolites(varsel); 

PROC mixed DATA=Vera;
CLASS OD ;
MODEL &varsel = OD / ddfm=kr ;
lsmeans OD/pdiff;
RUN;
%mend 
%metabolites (P1); 
%metabolites (P2);
%metabolites (P3); 
%metabolites (P4); 
%metabolites (P5); 
%metabolites (P6); 
%metabolites (P7); 
%metabolites (C8);
%metabolites (C9); 
%metabolites (C10); 
%metabolites (B11); 
%metabolites (B12); 
%metabolites (B13); 
%metabolites (B14); 
%metabolites (B15); 
%metabolites (B16);

С помощью этой модели я могу видеть, что все метаболиты, измеренные у определенного вида при определенной OD (например, 492 нм), существенно не отличаются от ВСЕХ метаболитов, измеренных при 630 нм. К сожалению, это не имеет биологического значения, и мне все еще нужно повторять синтаксис каждый раз, когда я хочу найти значительные различия между OD в конкретном метаболите у определенного вида.

Я также попытался отсортировать набор данных с помощью оператора «BY», но не получил другого вывода. Что еще мне не хватает?


person Emma Hernandez Sanabria    schedule 27.04.2015    source источник
comment
Просто для пояснения - нужно запускать по уникальным комбинациям Metabolite и OD, а модель останется прежней?   -  person mlegge    schedule 27.04.2015
comment
@ mkemp6 Мне нужно запустить его с помощью уникального метаболита, чтобы сравнить, не различаются ли показания для каждой бактерии между 492 и 630.   -  person Emma Hernandez Sanabria    schedule 27.04.2015
comment
... Значит, модель осталась прежней? А что вы имеете в виду под разницей между данными на 492 и 630? Это номера строк? Я пытаюсь понять, почему они имеют значение, потому что, если столбец Metabolite определяет уникальные наборы, почему мы заботимся о номерах строк?   -  person mlegge    schedule 27.04.2015
comment
Я добавил часть своей таблицы данных, чтобы лучше объяснить себя. Я хочу повторить синтаксис для каждого метаболита и для каждого вида бактерий (P1, P2 и т. Д.). Так что да, модель осталась прежней. 492 и 630 - это длины волн, на которых проводились измерения. Я хочу продемонстрировать, что (например) показания для P1 при 492 нм и 630 нм в метаболите C1 существенно не различаются. Я могу продемонстрировать это с помощью приведенного выше синтаксиса, но я не хочу вручную вводить синтаксис для каждого из 760 метаболитов. Вот почему я хотел бы создать макрос, если это возможно   -  person Emma Hernandez Sanabria    schedule 27.04.2015


Ответы (2)


Просто укажите инструкцию BY:

PROC mixed DATA=Vera;
  CLASS OD ;
  MODEL P1 = OD / SOLUTION ;
  BY Metabolite;
  lsmeans OD/ diff;
RUN;

Ссылка на базу знаний здесь.

person mlegge    schedule 27.04.2015
comment
Я попробовал с утверждением, но все еще не получаю желаемых результатов. Я добавил полную информацию о своей проблеме в своем ответе ниже. - person Emma Hernandez Sanabria; 11.05.2015

Измените структуру данных, чтобы можно было использовать оператор BY, как указано выше. Я не тестировал, но должно работать что-то вроде следующего:

*flip your data;
data flipped;
set vera;
array bs(15) P1-P7 C8-C10 B11-B15;
do i = 1 to dim(bs);
    BS = vname(bs(i)); *capture the name of the variable;
    BS_Value = bs(i);
    output;
end;
run;

proc sort data=flipped; 
 by metabolite bs;
run;

PROC mixed DATA=Vera;
By metabolite bs;
CLASS OD ;
MODEL BS_value = OD / SOLUTION ;
lsmeans OD/ diff;
RUN;
person Reeza    schedule 12.05.2015
comment
спасибо за Ваш ответ. Я попытался переупорядочить данные, но SAS не позволяет мне. Возможно, что-то происходит с присвоением имен элементам массива. - person Emma Hernandez Sanabria; 12.05.2015
comment
Фактически он упоминает, что аргумент № 2 является числовой переменной, в то время как символьная переменная должна быть передана в вызов подпрограммы VNAME, чтобы переменная была обновлена. Я изменил код следующим образом: data flipped; set vera; array bs{16}P1-P7 C8-C10 B11-B16; do i = 1 to dim(bs); call vname (bs{i}, flipped); BS_Value = bs(i); output; end; run; - person Emma Hernandez Sanabria; 12.05.2015
comment
Какую версию SAS вы используете? Единственная проблема, которая, как я вижу, может возникнуть с массивом, заключается в том, что какое-либо из значений вашего массива является символьными переменными, что само по себе было бы проблемой, потому что в любом случае вы не могли бы использовать его в регрессии. - person Reeza; 12.05.2015
comment
Версия SAS - 9_4, и с указанным выше синтаксисом я мог видеть, что все метаболиты, измеренные у определенного вида при определенной OD (например, 492 нм), существенно не отличаются от ВСЕХ метаболитов, измеренных при 630 нм. К сожалению, это не имеет биологического значения, и мне все равно придется повторять синтаксис каждый раз, когда я хочу найти существенные различия между OD в конкретном метаболите у определенного вида. Все переменные - это числа, но OD можно рассматривать как фактор, но я не использую регрессию, это смешанная модель. - person Emma Hernandez Sanabria; 13.05.2015
comment
@Emma, ​​учитывая то, что вы указали выше, код должен запускать все возможные модели. Я не уверен, что еще вам нужно, без более четких спецификаций. Вы никогда не упоминали виды в своих предыдущих данных, поэтому не уверены, откуда они взялись. - person Reeza; 13.05.2015