我正在尝试编写一个使用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
您可以提供任何帮助都很棒。
谢谢!
答案 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))
您的原始代码不仅会创建此数据框,还会创建全局环境中的变量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)
}
并将variable1
和variable2
作为字符串传递:
test <- prob.function(sampledata, "Y", "X", -1, 0, 6)
现在你有test==0.25
,没有错误。
正在进行的参考: