Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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
CRAN文件包提交:“;错误:C堆栈使用率太接近限制;_R_Package_Cran_Submission - Fatal编程技术网

CRAN文件包提交:“;错误:C堆栈使用率太接近限制;

CRAN文件包提交:“;错误:C堆栈使用率太接近限制;,r,package,cran,submission,R,Package,Cran,Submission,这是我在向CRAN提交R包时遇到的一个问题。所以我 无法控制堆栈大小(因为问题发生在一个CRANs平台上) 我无法提供一个可复制的示例(因为我不知道CRAN上的确切配置) 问题 尝试向CRAN提交时,自动预测试(适用于Debian x86_64-pc-linux-gnu;不适用于Windows!)失败,注意:C堆栈使用量7975520太接近限制 我知道这是由一个有三个参数的函数引起的,它的主体大约有800行长。函数体由这些参数的加法和乘法组成。您可以找到函数varzeta6()(从第647行

这是我在向CRAN提交R包时遇到的一个问题。所以我

  • 无法控制堆栈大小(因为问题发生在一个CRANs平台上)
  • 我无法提供一个可复制的示例(因为我不知道CRAN上的确切配置)
问题 尝试向CRAN提交时,自动预测试(适用于Debian x86_64-pc-linux-gnu;不适用于Windows!)失败,注意:
C堆栈使用量7975520太接近限制

我知道这是由一个有三个参数的函数引起的,它的主体大约有800行长。函数体由这些参数的加法和乘法组成。您可以找到函数
varzeta6()
(从第647行开始)

我如何处理这个问题?

我不能做的事情:

  • 提供一个可复制的例子(至少我不知道如何)
  • 更改堆栈大小
我在想的事情:

  • 尝试将函数分解为更小的部分。但我不知道怎样才能最好地做到这一点
  • 不知何故可以预编译?函数(老实说,我只是猜测)这样CRAN就不会抱怨了
让我知道你的想法

详情/背景 之所以
varzeta6()
(和
varzeta4()
/
varzeta5()
,甚至更是
varzeta7()
)如此之长且R-效率低下,是因为它们本质上是从mathematica复制粘贴的(在尽可能简化mathematica代码并将其调整为有效的R代码之后)。因此,代码绝不是R优化的(这是@MauritsEvers严格指出的)

为什么我们需要mathematica?因为我们需要的是递归结构方程模型的模型隐含结构相关矩阵的一般形式,该模型最多有8个结构作为模型方程参数的函数。此外,还有一些限制。 为了了解这个问题,让我们采用两个可以递归求解的方程组:

  • Y2=β1*Y1+zeta1
  • Y3=β2*Y1+β3*Y2+zeta2
我们感兴趣的是协方差:E(Y1*Y2),E(Y1*Y3)和E(Y2*Y3)作为beta1,beta2,beta3的函数

  • E(Y1)=E(Y2)=E(Y3)=0
  • E(Y1^2)=E(Y2^2)=E(Y3^3)=1
  • E(Yi*zeta_j)=0(i=1,2,3和j=1,2)
对于这样一个简单的模型,这是相当简单的:

  • E(Y1*Y2)=E(Y1*(beta1*Y1+zeta1)=beta1*E(Y1^2)+E(Y1*zeta1)=beta1
  • E(Y1*Y3)=E(Y1*(β2*Y1+β3*(β1*Y1+zeta1)+zeta2)=β2+β3*beta1
  • E(Y2*Y3)=
但当你把Y4,Y5加到Y8时,你会发现这会很快变得一团糟。 通常,模型隐含的构造相关矩阵可以写成(表达式实际上看起来更复杂,因为我们还允许多达5个外部构造。这就是为什么
varzeta1()
看起来已经很复杂的原因。但现在忽略此点。):

  • V(Y)=(I-B)^-1 V(zeta)(I-B)“^-1
其中I是单位矩阵,B是模型参数的下三角矩阵(β)。V(zeta)是对角矩阵。函数
varzeta1()
varzeta2()
,…,
varzeta7()
计算主要对角元素。因为我们约束了Var(Yi)要始终为1,齐塔人的方差如下。以方程Var(Y2)=β1^2*Var(Y1)+Var(zeta1)--->Var(zeta1)=1-β1^2为例。这在这里看起来很简单,但当我们计算这种递归方程链中第六个方程的方差时,会变得非常复杂,因为Var(zeta6)取决于Y1,…,Y5之间的所有先前协方差,这些协方差本身取决于各自先前的协方差

好的,我不知道这是否能让事情变得更清楚。这里是要点:

  • varzeta1()
    ,…,
    varzeta7()
    的代码是从mathematica复制粘贴的,因此不是R优化的
  • Mathematica是必需的,因为据我所知,R不能处理符号计算
  • 我可以“手动”进行R优化(这非常乏味)
  • 我认为必须将
    varzetaX()
    的结构视为给定的。因此,问题是:我是否可以以某种方式使用此函数

  • 作为一个注释,这有点太长了,但希望这能为您提供一些优化
    varzeta*
    函数代码的想法;或者至少,它可能会给您一些思考的食物

    有几件事让我感到困惑:

  • 所有
    varzeta*
    函数都有参数
    beta
    gamma
    phi
    ,它们似乎是矩阵。但是,在
    varzeta1
    中,您不使用
    beta
    ,而
    beta
    是第一个函数参数
  • 我很难将你在文章底部给出的细节与
    varzeta*
    函数的代码联系起来。你没有解释
    gamma
    phi
    矩阵的来源,也没有解释它们表示什么。此外,看到
    beta
    是模型的参数etimate,我不明白为什么
    beta应该是一个矩阵
  • 正如我在前面的评论中提到的,如果这些表达式不能被简化,我会非常惊讶。R可以轻松地进行很多矩阵运算,不需要预先计算单个项

    例如,您可以使用
    crossprod
    tcrossprod
    计算叉积,
    %*%
    实现矩阵乘法

    其次,R中的许多数学运算都是矢量化的。我已经提到过,你可以简化

    1-伽马[1,1]^2-伽马[1,2]^2-伽马[1,3]^2-伽马[1,4]^2-伽马[1,5]^2
    
    作为

    1-求和