代码之家  ›  专栏  ›  技术社区  ›  fx7sts

内部求和R中的内部生产求和

  •  0
  • fx7sts  · 技术社区  · 7 年前

    我对要优化的函数的编码有问题,其中有两个求和和和一个产生式,所有这些都有不同的索引。为了简单起见,我将代码分为两个函数。

    在第一个函数中,j从0变为k:

    w = function(n,k,gam){
      j = 0:k
      w = (1 / factorial(k)) * n * sum(choose(k, j * gam))
      return(w)}
    

    在第二个函数中,k从0变为n(固定为10);相反,生产从1到长度(x):

        f = function(gam,del){
       x = mydata #vector of 500 elements
       n = 10    
     k = 0:10  
     for (i in 0:10)
            pdf = prod( sum( w(n, k[i], gam) * (1 / del + (n/x)^(n+1))
    return(-pdf)}
    

    尝试该函数时,我得到以下错误:

    Error in 0:k : argument of length 0
    

    编辑 :这就是我试图编写的代码

    enter image description here

    我想最大化的地方 L(d,g) 使用 optim 以及:

    enter image description here

    n 固定为特定值。

    1 回复  |  直到 4 年前
        1
  •  1
  •   duckmayr    7 年前

    解决方案

    改变 for (i in 0:10) for ( i in 1:11 ) . 注意:当我复制并运行您的代码时,我还注意到一些不相关的括号/括号遗漏,您可能还需要修复。

    解释

    你的问题是 R 像许多其他编程语言或一些数学公式一样,使用基于1的索引系统,而不是基于0的索引系统。如果您运行以下代码,您将得到相同的错误,并且它可以找出问题所在:

    k = 0:10
    for ( i in 0:10 ) {
        print(0:k[i])
    }
    
    Error in 0:k[i] : argument of length 0
    

    第一次迭代时出现错误,因为没有 0 元素 k . 将其与以下循环进行比较:

    k = 0:10
    for ( i in 1:11 ) {
        print(0:k[i])
    }
    
    [1] 0
    [1] 0 1
    [1] 0 1 2
    [1] 0 1 2 3
    [1] 0 1 2 3 4
    [1] 0 1 2 3 4 5
    [1] 0 1 2 3 4 5 6
    [1] 0 1 2 3 4 5 6 7
    [1] 0 1 2 3 4 5 6 7 8
     [1] 0 1 2 3 4 5 6 7 8 9
     [1]  0  1  2  3  4  5  6  7  8  9 10
    

    使现代化

    您对答案的评论澄清了您需要的一些其他信息:

    只是为了充分了解一切,在这样的情况下我怎么知道 这就是R是索引x上的乘积和k上的求和?

    简而言之,这取决于如何嵌套循环和函数调用。更详细地说:

    • 当你打电话的时候 f() ,则启动 for 在元素上循环 k 所以 R 正在索引 对于 循环(我的重新格式化版本中括号中的所有内容 f() 下)“开” k . 对于中的每个元素 k ,您分配 prod(...) pdf (旁注:我不知道你为什么要写信 pdf格式 在该循环的每次迭代中)
    • sum( w(n, k[i], gam) * gamma(1 / del + k[i]) * s^(n + 1)) 生成长度向量 max(length(w(n, k[i], gam)), length(s)) (旁注:小心回收!——参见 Section 2.2 of "An Introduction to R" ); prod(sum( w(n, k[i], gam) * gamma(1 / del + k[i]) * s^(n + 1))) 有效地索引该向量的元素
    • w(n, k[i], gam) * gamma(1 / del + k[i]) * s^(n + 1) 生成长度向量 最大(长度(w(n,k[i],gam)),长度(s)) ; 总和(w(n,k[i],gam)*γ(1/del+k[i])*s^(n+1)) 有效地索引该向量的元素

    通过向量化操作显式或隐式索引的内容取决于所讨论的嵌套循环或函数调用的级别。您可能需要仔细考虑和规划何时要对什么进行索引,这将告诉您需要如何嵌套内容。将索引变化最快的操作放在最内部的调用上。例如,在 效应 , prod(1:3 + sum(1:3)) 将索引结束 sum(1:3) 先生成那个和,然后再索引 1:3 + sum(1:3) 生产产品。即。, 总和(1:3) =1+2+3=6,然后 产品(1:3+总和(1:3)) = (1 + 6) * (2 + 6) * (3 + 6) = 7 * 8 * 9 = 504. 这就像数学中的括号一样。

    另外,另一方面,我不会像在中那样从函数中引用全局变量 f() --我在下面的代码中强调了您在哪里这样做,并提供了一个不这样做的替代方案。

    f = function(gam, del){
        x = mydata # don't refer to a global variable "mydata", make it an argument
        n = 10  
        s = n / x  
        k = 1:11
        for (i in 1:11){
            pdf = prod( sum( w(n, k[i], gam) * gamma(1 / del + k[i]) * s^(n + 1)))
        }
        return(-pdf)
    }
    
    # Do this instead
    # (though there are still other things to fix,
    # like re-writing over "pdf" eleven times and only using the last value)
    
    f = function(gam, del, x, n = 10) {
        s = n / x
        s = n / x  
        k = 0:10
        for (i in 1:11){
            pdf = prod( sum( w(n, k[i], gam) * gamma(1 / del + k[i]) * s^(n + 1)))
        }
        return(-pdf)
    }