Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 是什么原因引起的;雅可比矩阵;在SAS中是单数吗?_Debugging_Sas_Singular - Fatal编程技术网

Debugging 是什么原因引起的;雅可比矩阵;在SAS中是单数吗?

Debugging 是什么原因引起的;雅可比矩阵;在SAS中是单数吗?,debugging,sas,singular,Debugging,Sas,Singular,我有一个简单的SAS(9.2版)程序,如下所示: proc model; cdf('normal',log(V/100)+1)=0.5; bounds V>0; solve V/solveprint; run; 它抛出了一个例外,说雅可比矩阵是奇异的 The Newton method Jacobian matrix of partial derivatives of the equations with respect to the variables to be solved is

我有一个简单的SAS(9.2版)程序,如下所示:

proc model;
cdf('normal',log(V/100)+1)=0.5;
bounds V>0;
solve V/solveprint;
run;
它抛出了一个例外,说雅可比矩阵是奇异的

The Newton method Jacobian matrix of partial derivatives of the
equations with respect to the variables to be solved is singular.
这一错误的可能原因是什么

更新:我把问题简化了一点。当修改为“cdf('normal',X)=0.5”时,它毫无例外地工作


Update2:边界更新为V>0;但异常仍然存在

您要求SAS解决一个没有解决方案的函数。您要求的是使该等式为真的
V>1000
的值。但是没有这样的值,因为
log(1000/100+1)
约为3.3,并且平均值为0,标准偏差为1的正态随机变量在3.3处的CDF为0.9995。任何较大的
V
值只会使函数更接近1,而不是0.5,因此您的问题没有答案


通过告诉你偏导数的矩阵是奇异的,SAS只是用奇特的数学来表达“你的函数没有解”。(实际上它的意思是,“我把你的问题变成了一个等价的最大化问题,这个问题没有最大值,所以我帮不了你。”)

你要求SAS解决一个没有解的函数。您要求的是使该等式为真的
V>1000
的值。但是没有这样的值,因为
log(1000/100+1)
约为3.3,并且平均值为0,标准偏差为1的正态随机变量在3.3处的CDF为0.9995。任何较大的
V
值只会使函数更接近1,而不是0.5,因此您的问题没有答案


通过告诉你偏导数的矩阵是奇异的,SAS只是用奇特的数学来表达“你的函数没有解”。(实际上,它的意思是,“我已经将您的问题转化为一个等价的最大化问题,而该问题没有最大值,因此我无法帮助您。”)

您将向proc模型传递什么输入数据集?例如,此代码始终有效:

data a;
 v=100;
run;

proc model data=a;
  cdf('normal',log(V/100)+1) = 0.5;
  bounds V>0;
  solve V / solveprint;
run;
quit;
并给出了
V=36.78794

但稍微改变输入数据(见下文)将始终产生奇异雅可比矩阵误差

data a;
 v=0.00001;
run;

proc model data=a;
  cdf('normal',log(V/100)+1) = 0.5;
  bounds V>0;
  solve V / solveprint;
run;
quit;

您要传递给proc模型的输入数据集是什么?例如,此代码始终有效:

data a;
 v=100;
run;

proc model data=a;
  cdf('normal',log(V/100)+1) = 0.5;
  bounds V>0;
  solve V / solveprint;
run;
quit;
并给出了
V=36.78794

但稍微改变输入数据(见下文)将始终产生奇异雅可比矩阵误差

data a;
 v=0.00001;
run;

proc model data=a;
  cdf('normal',log(V/100)+1) = 0.5;
  bounds V>0;
  solve V / solveprint;
run;
quit;


这不是一个错误。这是说你的矩阵是奇异的,即不可逆的。如果你试图解一个方程组,你的矩阵必须是可逆的。部分
cdf('normal',(log(V/90.986)+(0.0477+0.2*0.2*0.5))/0.2的公式是否正确?由于您没有指定mean/stdev,它们默认为1和0,因此cdf()的值为1。但是SAS可能有困难,因为它对V的敏感度仍然很小,并且想要降低V,但是你把它限制在>1000。bound是添加额外的条件来满足,导致问题无法解决,我想guess@NickLH我知道矩阵对数据非常敏感,但如何使矩阵可逆?@yosukesabai,当没有像V>1000这样的界限时,异常仍然存在。我认为默认的平均值应该是0,stdev应该是1。。。正确如果我错了如果你的矩阵是不可逆的,那么你对此无能为力。奇异雅可比矩阵是被零除的矩阵等价物。这不是一个错误。这是说你的矩阵是奇异的,即不可逆的。如果你试图解一个方程组,你的矩阵必须是可逆的。部分
cdf('normal',(log(V/90.986)+(0.0477+0.2*0.2*0.5))/0.2的公式是否正确?由于您没有指定mean/stdev,它们默认为1和0,因此cdf()的值为1。但是SAS可能有困难,因为它对V的敏感度仍然很小,并且想要降低V,但是你把它限制在>1000。bound是添加额外的条件来满足,导致问题无法解决,我想guess@NickLH我知道矩阵对数据非常敏感,但如何使矩阵可逆?@yosukesabai,当没有像V>1000这样的界限时,异常仍然存在。我认为默认的平均值应该是0,stdev应该是1。。。正确如果我错了如果你的矩阵是不可逆的,那么你对此无能为力。奇异雅可比矩阵是被零除的矩阵等价物。顺便说一句,你可以尝试求解
CDF('Normal',log(V/100+1)=0.9999
或非常接近1的值,这应该会给你一个解决方案。通过将约束更改为V>0,仍然存在异常。嗯,好吧,这不是我所期望的。我现在没有访问SAS的权限,因此无法测试它。如果去掉边界会发生什么?如果去掉边界,则是同一件事;仍然是同一个异常。顺便说一句通过这种方式,您可以尝试求解CDF('Normal',log(V/100+1)=0.9999
或非常接近1的值,这应该会给你一个解决方案。通过将约束更改为V>0,仍然会出现异常。嗯,好吧,这不是我所期望的。我现在没有访问SAS的权限,所以无法测试它。如果去掉绑定,会发生什么?如果去掉绑定,则是同一件事;仍然是同一个异常。@Richard-很抱歉,这是一个复制/粘贴错误-现在修复。只需要在第一个数据步骤中更改V=语句。@cmjohns-有趣。你知道为什么会发生这种情况吗?我对
proc model
@Richard不太熟悉-很抱歉,这是一个复制/粘贴错误-现在修复。只需要在中更改V=语句第一个数据步骤。@cmjohns-很有趣。你知道为什么会发生这种情况吗?我对
proc模型不太熟悉。