2012-06-01 4 views
6

Я пытаюсь привыкнуть к вопросам определения области в R. Я хотел бы вызвать функцию glm() внутри функции, но она не работает, по-видимому, по причинам, удалось установить с помощью функций assign() или eval().R: передать аргумент glm внутри функции R

Вот упрощенная версия:

ao <- function (y, x, phi = seq (0,1,0.1), dataset, weights) { 
    logLikvector <- rep(0,length(phi)) # vector of zeros to be replaced thereafter 
    for (i in 1:length(phi)) {   # loop to use glm() 
     fit <- glm (y ~ x, data = dataset, family = binomial, weights = weights)   
     logLikvector[i] <- logLik(fit)  # get log likelihood 
    } 
    logLikvector 
} 

Теперь я хочу использовать функцию ао() в моем наборе данных

ao (y = Prop, x = Age, dataset = mydata, weights = Total) 

Это не работает, но следующие работы:

ao (y = mydata$Prop, x = mydata$Age, dataset = mydata, weights = mydata$Total) 

Кто-нибудь знает, что делать?

Любая помощь будет принята с благодарностью!

Btw, вот как повторить мою проблему с набором данных я использую

library("MASS") 
data(menarche) 
mydata <- menarche 
mydata$Prop <- mydata$Menarche/mydata$Total 
+2

Спасибо за возможность опробовать урок, который я узнал сегодня утром на SO. –

ответ

5

Решение с заменой (предложение @DWin).

function(y, x, dataset, weights){ 
    f <- substitute(glm(y~x, data=dataset, weights=weights, family=binomial)) 
    logLik(eval(f)) 
} 
+0

Many tha nks Sobala! Я бы не нашел его сам, так как я все еще в начале кривой обучения в R! – user1431694

2
ao <- function (x, y, phi = seq (0,1,0.1), dataset, weights) { 
    logLikvector <- rep(0,length(phi)) 
    x <- dataset[,substitute(x)] 
    y <- dataset[,substitute(y)] 
    weights <- dataset[,substitute(weights)] 
     for (i in 1:length(phi)) {   # loop to use glm() 
     fit <- glm (y ~ x, data = dataset, family = binomial, weights = weights) 
     logLikvector[i] <- logLik(fit)  # get log likelihood 
    } 
    return(logLikvector) 
} 



library("MASS") 
data(menarche) 
mydata <- menarche 
mydata$Prop <- mydata$Menarche/mydata$Total 
ao(y = "Prop",x = "Age", dataset = mydata, weights = "Total") 


[1] -55.37763 -55.37763 -55.37763 -55.37763 -55.37763 -55.37763 
[7] -55.37763 -55.37763 -55.37763 -55.37763 -55.37763 
+1

Вместо слегка уродливого 'which (names (.) == arg' construction, почему бы не использовать' substitute (arg) '? Я попробовал это с вашим ответом, и он работал хорошо во всех трех случаях для вашего отличного ответа. –

+0

Maiasaura, спасибо! Это действительно работает, и я согласен с DWin в том, что использование substitute (arg) легче. В любом случае я лучше понимаю этот принцип обзора ... – user1431694

+0

@DWin: 'substitute (arg)' - действительно хороший способ сделать такие как это внутри функций. Спасибо за подсказку! – Aaron

1

Я предлагаю создать формулу с paste и вызова функции с do.call.

ao <- function (y, x, phi = seq (0,1,0.1), dataset, weights) { 
    logLikvector <- rep(0,length(phi)) # vector of zeros to be replaced thereafter 
    for (i in 1:length(phi)) {   # loop to use glm() 
    f <- as.formula(paste(y, x, sep="~")) 
    fit <- do.call("glm", list(formula=f, data=as.name(dataset), 
        family="binomial", weights=as.name(weights))) 
    logLikvector[i] <- logLik(fit)  # get log likelihood 
    } 
    logLikvector 
} 

Затем вызовите его следующим образом:

ao("Prop", "Age", dataset="mydata", weights="Total") 

См https://stackoverflow.com/a/7668846/210673 для более подробной информации.

+0

Аарон, спасибо вам тоже! Ваш ответ позволил мне узнать о do.call. Я буду использовать замену (arg), как это было предложено DWin. – user1431694

+0

В этом случае я тоже мог бы, 'substitute (arg)' - отличный способ сделать это в этом случае. Фактически это делает то же самое, что и мое решение, за исключением того, что вы можете передавать параметры как имена вместо символов (т. е. без кавычек). – Aaron

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