【问题标题】:R: Non-numeric argument to mathematical functionR:数学函数的非数字参数
【发布时间】:2015-06-07 16:46:21
【问题描述】:

我写了一个用户定义的函数:

epf <- function(z,x,noise=std_noise){
    z_dims <- length(z)
    std_noise <- 0.5*matrix(1,1,z_dims)
    std_noise <- as.data.frame(std_noise)

    obs_prob <- dnorm(z,x[1:z_dims],noise)

    error <- prod(cbind(1,obs_prob))
    return(error)
}

这个函数在另一个函数的for循环中被调用:

w <- matrix(0,N,1)
        for (i in 1:N){
            w[i] <- epf(z,p[i,],R_noise) 
        }

其中z 是一个二维向量,N=1000p 是一个包含 1000 个观察值和 4 个变量的数据框,R_noise 是一个包含 1 个观察值和 4 个变量的数据框。

这里我得到错误:“数学函数的非数字参数”,对于obs_prob &lt;- dnorm(z,x[1:z_dims],noise)这一行

谁能帮我找出错误?

我已经查看了与我类似的问题,但我仍然无法在我的代码中找到错误。

编辑:
增加了N的定义

【问题讨论】:

  • 'data.frame': 1 obs. of 2 variables: $ V1: num 1.44 $ V2: num -2.66 NULL
  • 这就是问题所在。 dnorm 将接受矩阵,而不是数据框。试试dnorm(as.matrix(z), x[1...
  • @plafort 最好将此作为答案。

标签: r


【解决方案1】:

dnorm(as.matrix(z), x[1:a_dims], noise) 可能会更好。

更广泛地说,一行两列的数据框可能更好地表示为向量。数据框看起来像矩阵,正如您所说的“二维向量”,但它们在重要方面有所不同。

可能会发生相同的错误,因为您通过传递 R_noise 在其最后一个参数 noise 中提供了第二个数据帧 dnorm

另外,考虑p[i, ] 有四个值。它被obs_probx[1:z_dims] 子集化。在这种情况下,z_dims 将等于 2,因为 length(z) 是 2。所以您正在评估 dnorm(data.frame(z), p[1, ][1:2], data.frame(R_noise))

【讨论】:

  • 我仍然遇到同样的错误。我将尝试再次查看我的代码,看看是否可以在其他参数之一中找到错误。
  • 我将循环中的所有参数都更改为矩阵。成功了 - 谢谢!
  • 乐于助人。请注意,dnorm 的第二个参数中正在回收不同的值。用一个小例子检查结果以检查准确性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多