【问题标题】:Not the desired out from a self-constructed function in R不是 R 中的自构建函数所期望的结果
【发布时间】:2021-09-10 08:33:48
【问题描述】:
library('pracma')
q <-function(beta){
    beta[1] + 
    beta[3]*(
      3 *exp(1*beta[2])/(exp(1*beta[2])+exp(2*beta[2])) +
      4 *exp(2*beta[2])/(exp(1*beta[2])+exp(2*beta[2]))
      )
  
}
jacobian(q,c(1,1,1))

     [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059

为产生相同结果的指数部分创建一个 for 循环:

g <-function(beta) {
  j = 1:2
  sumeal <- sum(exp(j*beta[2]))
  eal <- c()
  for (i in j) {
    eal[i] <-(exp(i*beta[2]))/sumeal
  }
  beta[1]+beta[3]*(3*eal[1]+2*eal[2])
}

     [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059

现在我想为一组值生成这个函数。所以例如也适用于 5 和 6

q <-function(beta){
    beta[1] + 
    beta[3]*(
      5 *exp(1*beta[2])/(exp(1*beta[2])+exp(2*beta[2])) +
      6 *exp(2*beta[2])/(exp(1*beta[2])+exp(2*beta[2]))
      )
  
}
jacobian(q,c(1,1,1))

     [,1]      [,2]     [,3]
[1,]    1 0.1966119 5.731059

目标是使用 for 循环编写函数,以便获得以下输出

     [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059
[2,]    1 0.1966119 5.731059

我尝试了以下方法,但似乎不起作用

g <-function(beta) {
  j = 1:2
  sumeal <- sum(exp(j*beta[2]))
  eal <- c()
  for (i in j) {
    eal[i] <-(exp(i*beta[2]))/sumeal
  }
  xlag <- matrix(c(3,5,4,6), ncol = 2)
  ealx <- xlag * eal[col(xlag)] #2x2 matrix which multiplies the values by the exponential part
  beta[1]+beta[3]*(ealx) #probably where it goes wrong with the multiplication
}
jacobian(g,c(1,1,1))

     [,1]       [,2]      [,3]
[1,]    1 -0.5898358 0.8068243
[2,]    1  0.9830597 3.6552929
[3,]    1 -0.7864477 1.0757657
[4,]    1  1.1796716 4.3863515

哪个尺寸不正确,值不正确

【问题讨论】:

  • 我看不出第一个结构和下一个结构有什么区别,除了 3, 4 改为 5, 6
  • 这个不同,另一个有一个简单的错误,我想出了如何解决。确实 3,4 更改为 5,6 y 但是,我想要获得的是一个函数,它可以从 1 个函数输出 3,4 和 5,6 的情况。而不是手动将 3,4 更改为 5,6。
  • 您是否尝试将这两个参数(即 3、4 更改为 5、6)
  • 是的,没错。
  • 最好从矩阵中获得值 3、4、5 和 6

标签: r function loops for-loop


【解决方案1】:

我们可以改变参数,增加2个

q <-function(beta, n1, n2 ){
    beta[1] + 
    beta[3]*(
      n1 *exp(1*beta[2])/(exp(1*beta[2])+exp(2*beta[2])) +
      n2 *exp(2*beta[2])/(exp(1*beta[2])+exp(2*beta[2]))
      )
  
}

现在,我们可以使用 Map 来完成此操作

do.call(rbind, Map(function(n1, n2) jacobian(q, c(1, 1, 1), 
     n1= n1, n2 = n2), c(3, 5), c(4, 6)))

-输出

      [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059
[2,]    1 0.1966119 5.731059

for 循环


n1 <- c(3, 5)
n2 <- c(4, 6)

out <- c()
for(i in seq_along(n1)) {
   out <- rbind(out, jacobian(q, c(1, 1, 1), n1 = n1[i], n2 = n2[i]))
}
out
     [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059
[2,]    1 0.1966119 5.731059

对于'g',我们可以使用rowSums

g <-function(beta) {
  j = 1:2
  sumeal <- sum(exp(j*beta[2]))
  eal <- c()
  for (i in j) {
    eal[i] <-(exp(i*beta[2]))/sumeal
  }
  xlag <- matrix(c(3,5,4,6), ncol = 2)
   ealx <- rowSums(xlag * eal[col(xlag)])
  beta[1]+beta[3]*(ealx)
  
  } 

jacobian(g,c(1,1,1))
     [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059
[2,]    1 0.1966119 5.731059

或者可以使用%*%

g <-function(beta) {
  j = 1:2
  sumeal <- sum(exp(j*beta[2]))
  eal <- c()
  for (i in j) {
    eal[i] <-(exp(i*beta[2]))/sumeal
  }
  xlag <- matrix(c(3,5,4,6), ncol = 2)
   ealx <- xlag %*% eal
  beta[1]+beta[3]*(ealx)
  }
jacobian(g,c(1,1,1))
     [,1]      [,2]     [,3]
[1,]    1 0.1966119 3.731059
[2,]    1 0.1966119 5.731059

【讨论】:

  • 这确实是我想要的输出。但是,我希望模型对于指数部分也很灵活。我在原始帖子中使用for循环构建。我指的是 eal[i] 部分。有没有办法在您建议的解决方案中实现这一点?
  • @Wietze 所以你想要g 而不是q。对不起,我在帖子中的很多功能感到困惑
  • @Wietze 是相同的功能还是不同的计算。你最后一个代码块的预期输出是什么
  • @Wietze 你能在你的代码块中把这行改成ealx &lt;- xlag * eal[col(xlag)]
  • @Wietze 我更新了帖子。再看清楚,有一个+缺失,可以用rowSums纠正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多