在SAS中创建漏斗图时遇‘未解析模块M’错误求助
SAS PROC IML 错误排查:ERROR: Invocation of unresolved module M
问题描述
在SAS中尝试基于个人均值创建漏斗图,编写PROC IML代码后出现错误提示:ERROR: Invocation of unresolved module M。M是DO循环内创建的变量,并非模块,对此错误感到困惑,请求协助排查解决。
样本数据
data test_00; input Name$ avg; datalines; Greg 4 Jess 5 Jimmy 5 Sandra 1 Maddie 3 Kyle 2 Eric 5 ; run;
尝试的代码
proc iml; use test_00; read all var {name avg}; close test_00; u=unique(name); p=ncol(u); mean= j(p,1); sem= j(p,1); n= j(p,1); do i= 1 to p; idx= loc(name=u[i]); n[i]=ncol(idx); M = avg[idx]; mean[i]=mean(M); sem[i]= sqrt(var(M)/n[i]); end; y=avg[:]; s=sqrt(var(avg)); print y s[label="StDev"]; n = M( do(0, 50, 1) ); p = {0.001 0.025 0.975 0.999}; z = quantile("normal", p); limits = y + s / sqrt(n) * z;
错误信息
ERROR: Invocation of unresolved module M. statement : ASSIGN at line 1644 column 1
错误原因与解决方法
错误原因
- 语法误用:代码中
n = M( do(0, 50, 1) );这一行,将变量M当作模块(函数)调用,而M是DO循环内定义的向量(你的样本数据中每个Name仅对应一个avg值,因此M最终是标量5),SAS IML无法将其识别为模块,因此触发报错。 - 变量名冲突:之前已经用
n存储每个Name对应的样本量,此处再次用n赋值新序列,会覆盖原有变量,导致逻辑混乱。
解决方法
修改代码中错误的行,调整变量名并修正语法:
proc iml; use test_00; read all var {name avg}; close test_00; u=unique(name); p=ncol(u); mean= j(p,1); sem= j(p,1); n_group= j(p,1); /* 重命名变量避免冲突 */ do i= 1 to p; idx= loc(name=u[i]); n_group[i]=ncol(idx); M = avg[idx]; mean[i]=mean(M); sem[i]= sqrt(var(M)/n_group[i]); end; y=avg[:]; s=sqrt(var(avg)); print y s[label="StDev"]; n_seq = do(0, 50, 1); /* 直接生成0到50的序列,无需调用M */ p = {0.001 0.025 0.975 0.999}; z = quantile("normal", p); limits = y + s / sqrt(n_seq) * z; /* 使用新变量名n_seq */
说明:
- 将存储组样本量的变量从
n改为n_group,避免与后续序列变量冲突; - 直接用
do(0,50,1)生成所需序列,赋值给新变量n_seq,不再错误调用M; - 后续计算中使用
n_seq替代原错误的n,确保逻辑正确。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

