【问题标题】:Error in R: x must be numericR中的错误:x必须是数字
【发布时间】:2015-01-28 20:17:37
【问题描述】:

我尝试在 r 中编写一个程序“使用函数从任何分布生成随机样本”。但它显示“hist.default(xbars) 中的错误:'x' 必须是数字” 我的程序在这里

sim.clt <- function(n, ran.func,..., simsize,...)
{
  xbars<-vector()
  for(i in 1:simsize=simsize)
  {
    x<-function(ran.func)

      xbars[i]<-mean(x)
 }
par(mfrow=c(2,1))
hist(xbars)
qqnorm(xbars)
return(xbars)
}
sim.out<-sim.clt(n=20,ran.func="rexp",simsize=5000)
shapiro.test(sim.out)

#

我是 r 编程的新手,所以不知道如何解决这个问题。 谢谢...

【问题讨论】:

    标签: r statistics distribution


    【解决方案1】:

    这里有很多问题。

    for(i in 1:simsize=simsize)
    

    应该会报错:

    > for(i in 1:simsize=simsize) { print(i)}
    Error: unexpected '=' in "for(i in 1:simsize="
    

    更好的是

    for(i in seq_len(simsize))
    

    然后

    x <- function(ran.func)
    

    没有按照你的想法做;它返回一个以xbars[i]&lt;-mean(x) 为主体的函数,如:

    > x <- function(ran.func)
    + 
    +       xbars[i]<-mean(x)
    > x
    function(ran.func)
    
          xbars[i]<-mean(x)
    > is.function(x)
    [1] TRUE
    

    我想你想打电话给ran.func,所以你可能需要

    FUN <- match.fun(ran.func)
    x <- FUN()
    

    但这会失败,因为您似乎没有传递任何参数以使 ran.func 起作用,即使在使用 rexp 的示例中只是 n

    错误消息源于最后一点。您将xbars 定义为空的vector(),默认情况下它创建了一个空的逻辑向量:

    > xbars <- vector()
    > xbars
    logical(0)
    > is.numeric(xbars)
    [1] FALSE
    

    现在,如果您在定义 x 时没有犯错误,这不会是一个问题(回想一下,xbars[i]&lt;-mean(x) 现在位于函数 x 的主体中,并且从未被显式调用),这意味着xbars 仍然是一个空的逻辑向量。由于这不是数字,hist 会抛出您看到的错误。

    另一个错误是你不能在函数定义中使用两次...。您是否试图让第一个包含参数传递给 ran.func 和第二个 ... 传递给别的东西。你只是不能在 R 中做到这一点。

    这是你想要的吗?

    sim.clt <- function(n, ran.func, simsize, ...) {
      ## ... passed to ran.func for other parameters of distribution
      xbars <- numeric(simsize)
      for(i in seq_len(simsize)) {
        FUN <- match.fun(ran.func)
        x <- FUN(n = n, ...)
        xbars[i] <- mean(x)
      }
      ## plot
      op <- par(mfrow=c(2,1))
      on.exit(op)
      hist(xbars)
      qqnorm(xbars)
      xbars
    }
    
    > sim.out<-sim.clt(n=20,ran.func="rexp",simsize=5000)
    > shapiro.test(sim.out)
    
        Shapiro-Wilk normality test
    
    data:  sim.out
    W = 0.9867, p-value < 2.2e-16
    

    【讨论】:

    • 非常感谢。这就是我想要的,你的解释对我很有帮助。
    • 你能给我一个建议吗...如果我想进一步修改函数以不仅研究平均值的抽样分布,而且通过使用第二个函数来研究任何统计数据,我必须做什么?
    • @moniruzzaman 如果您还有其他问题,请随时将其作为单独的问题发布。请记住给出一个可重现的示例,并显示您的代码失败的地方。
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2022-01-05
    • 2014-07-27
    • 2020-12-19
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多