首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SAS中创建宏以重复在大型数据集中混合过程

如何在SAS中创建宏以重复在大型数据集中混合过程
EN

Stack Overflow用户
提问于 2015-04-27 21:46:45
回答 2查看 619关注 0票数 0

我目前正在处理一个包含760种代谢物的数据集。这些代谢产物被提供给15种细菌。此外,在2个光密度(OD)下监测它们的生长,一式三份。因此,我有一个具有1520行和17列的数据集。

代码语言:javascript
复制
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的数据之间没有显着差异。因此,我编写了以下代码:

代码语言:javascript
复制
PROC mixed DATA=Vera;
CLASS OD ;
MODEL P1 = OD / SOLUTION ;
lsmeans OD/ diff;
RUN;

有了这个,你就可以分析每种细菌在492和630的OD值之间的差异。但是,您必须分离数据并分别运行每个代谢物。这对于少量的变量来说不是问题,但是我有760个变量。所以我不想重复这个过程,手动输入代码760次。我想编写一个在SAS中使用的宏,并对每个代谢物重复相同的语法。我该怎么做呢?

我的数据如下所示:

代码语言:javascript
复制
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测量值是否有显着差异。我修改了宏和模型,如下所示:

代码语言:javascript
复制
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);

通过这个模型,我可以看到在特定外径(例如492 nm )的特定物种中测量的所有代谢物与在630 nm处测量的所有代谢物没有显著不同。不幸的是,这没有生物学上的相关性,每次我想要在特定物种的特定代谢物中发现OD之间的显著差异时,我仍然需要重复语法。

我还尝试使用"BY“语句对数据集进行排序,但没有得到任何不同的输出。我还遗漏了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2015-04-27 22:57:08

只需指定一条BY语句:

代码语言:javascript
复制
PROC mixed DATA=Vera;
  CLASS OD ;
  MODEL P1 = OD / SOLUTION ;
  BY Metabolite;
  lsmeans OD/ diff;
RUN;

知识库参考here

票数 3
EN

Stack Overflow用户

发布于 2015-05-12 10:35:20

更改您的数据结构,以便可以如上所述使用BY语句。我还没有测试过它,但是下面这样的代码应该可以工作:

代码语言:javascript
复制
*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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29897812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档