在R函数中使用“prob”包时出错

时间:2013-09-29 19:15:20

标签: r probability

我正在尝试编写一个使用prob包来计算条件概率的函数。当使用该函数时,我继续遇到相同的错误,该错误表明无法找到函数中的对象。

下面是一个可重现的例子,其中我计算没有函数的条件概率,然后尝试使用该函数产生相同的结果。我不确定错误是由于prob包的限制还是由于我的错误。

# Load prob package
library(prob)

# Set seed for reproducibility
set.seed(30)

# Sample data frame
sampledata <- data.frame(
  X <- sample(1:10),
  Y <- sample(c(-1, 0, 1), 10, replace=TRUE))

# Set probability space
S <- probspace(sampledata)

# Subset Y between -1 and 0
A <- subset(S, Y>=-1 & Y<=0)

# Subset X greater than 6
B <- subset(S, X>6)

# Compute conditional probability
P <- prob(A, given=B)

以上代码产生以下概率:

> P
[1] 0.25

尝试编写函数来计算相同的概率:

# Create function with data frame, variables, and conditional inputs
prob.function <- function(df, variable1, variable2, state1, state2, cond1){
  s <- probspace(df)
  a <- subset(s, variable1>=state1 & variable1<=state2)
  b <- subset(s, variable2>cond1)
  p <- prob(a, given=b)
  return(p)
}

# Demonstrate the function
test <- prob.function(sampledata, Y, X, -1, 0, 6)

此功能出现以下错误:

Error in eval(expr, envir, enclos) : object 'b' not found

您可以提供任何帮助都很棒。

谢谢!

2 个答案:

答案 0 :(得分:2)

这看起来像prob中的错误。

当我在Vanilla R中运行时,我得到了同样的错误。但是当我在工作区中创建对象b时,错误消失了:

> print(b)
Error in print(b) : object 'b' not found
> test <- prob.function(sampledata, Y, X, -1, 0, 6)
Error in eval(expr, envir, enclos) : object 'b' not found
>
> b <- "dummy variable"
> print(b)
[1] "dummy variable"
> test <- prob.function(sampledata, Y, X, -1, 0, 6)
> test
[1] 0.25
>

作为临时解决方法,只需在当前环境中创建一个虚拟b即可。


至于错误,如果您查看prob.default的来源(在上面的示例中是prob(a, given=b)最终调用的内容),您将看到以下部分:

if (missing(given)) {
    < cropped >
}
else {
    f <- substitute(given)
    g <- eval(f, x)                  <~~~~ 
    if (!is.logical(g)) {            <~~~~
        if (!is.data.frame(given))   <~~~~
            stop("'given' must be data.frame or evaluate to logical")
        B <- given

    }
    ...
    < cropped >
}

它是从g跳到given,也许是在无意中?我会联系包维护者,因为这可能是一个疏忽。

答案 1 :(得分:1)

认为这是包prob中的错误。

首先,您应该将sampledata创建为

sampledata <- data.frame(
  X = sample(1:10),
  Y = sample(c(-1, 0, 1), 10, replace=TRUE))

您的原始代码不仅会创建此数据框,还会创建全局环境中的变量XY,这些变量在您调用函数时实际上会在以后使用。

其次,你不应该在函数内部调用subset()。改为使用括号子集:

prob.function <- function(df, variable1, variable2, state1, state2, cond1){
  s <- probspace(df)
  a <- s[s[[variable1]]>=state1 & s[[variable1]]<=state2, ]
  b <- s[s[[variable2]]>cond1, ]
  p <- prob(a, given=b)
  return(p)
}

并将variable1variable2作为字符串传递:

test <- prob.function(sampledata, "Y", "X", -1, 0, 6)

现在你有test==0.25,没有错误。

正在进行的参考:

相关问题