2013-09-29 3 views
2

Я пытаюсь написать функцию, которая использует пакет prob для вычисления условных вероятностей. При использовании функции я продолжаю сталкиваться с той же ошибкой, которая указывает, что объект внутри функции не может быть найден.Ошибка при использовании пакета «prob» в функции R

Ниже приведен воспроизводимый пример, в котором я вычисляю условную вероятность без функции, а затем пытаюсь использовать эту функцию для получения того же результата. Я не уверен, что ошибка связана с ограничениями с пакетом 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

Спасибо за ваш вопрос и спасибо за доклад на форуме об ошибке. Поиграв с ним, и теперь, читая эту дискуссию, предстоит еще большая работа. Завтра я ожидаю обновление R-Forge. –

ответ

2

Это похоже на ошибку в prob.

Когда я запускаю это в Vanilla R, я получаю ту же ошибку. Но когда я создаю объект b в моем рабочем пространстве, в disapears ошибки:

> 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, возможно, случайно? Я хотел бы связаться с сопровождающим пакета, так как это может быть недосмотр.

+0

Спасибо за ваш быстрый ответ! Я уведомит автора пакета об этой ошибке. –

+0

Благодарим вас, Рикардо, за то, чтобы определить, где лежит проблема. –

+0

@ G.JayKerns никакой проблемы вообще. Я думаю, что может быть аналогичная проблема в других методах 'prob' и, возможно, стоит посмотреть. Спасибо за пакет –

1

I не думаю, что это ошибка в пакете prob.

Во-первых, вы должны создать вам sampledata, как

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

Ваш исходный код создает не только это, но и dataframe переменные 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, и никакой ошибки.

Ссылки на то, что происходит:

+0

Эй, @Ferdinand, хотя я думаю, что ваш совет по использованию подмножества не стоит на месте, я все еще думаю, что есть что-то подозрительное, что происходит с 'prob' и, вероятно, будет ошибкой. Обратите внимание на часть различных ответов от функции, основанную на том, что находится в моей рабочей среде, где единственное отношение к функции - это имя общего объекта (но значение не имеет никакого отношения к функции). Не говоря уже о том, что это все еще не работает при запуске в 'R -vanilla':/ –

+2

@RicardoSaporta. Вы правы, это ошибка. Он забыл 'enclos = parent.frame()' в 'eval (f, x)'. В этот момент 'f' содержит символ' b', а 'x' содержит dataframe' a'. Поскольку по умолчанию для eval является фрейм, вызывающий его, парсер будет искать 'b' в пространстве имен' prob' и вверх, минуя «стек вызовов», где находится реальный 'b'. Когда вы создаете фиктивный 'b',' eval' не выдает ошибку, 'is.logical (g)' FALSE (это строка), но 'is.data.frame (given)' is TRUE, потому что 'given 'это реальный' b', а не обещание. Ошибка найти! :-) –

+0

Привет @ Ferdinand.kraft, спасибо за ваш очень полезный совет, особенно в отношении того, когда/как использовать подмножество(). Теперь, когда проблема связана с ошибкой в ​​пакете, я отправил автору сообщения письмо со ссылкой на эту дискуссию. Еще раз спасибо! –

Смежные вопросы