You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

错误原因与解决方法

错误原因

  1. 语法误用:代码中n = M( do(0, 50, 1) );这一行,将变量M当作模块(函数)调用,而M是DO循环内定义的向量(你的样本数据中每个Name仅对应一个avg值,因此M最终是标量5),SAS IML无法将其识别为模块,因此触发报错。
  2. 变量名冲突:之前已经用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:52:44