2

我正在尝试编写一个使用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

你能提供的任何帮助都会很棒。

谢谢!

4

2 回答 2

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 >
}

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

于 2013-09-29T19:27:11.697 回答
1

认为这是 package 中的错误prob

首先,您应该将您创建sampledata

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

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

其次,你不应该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,没有错误。

正在发生的事情的参考:

于 2013-09-29T23:18:40.787 回答