R : передать аргумент glm внутри функции R.

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

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

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() в своем наборе данных.

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

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

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

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

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

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

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

person user1431694    schedule 01.06.2012    source источник
comment
Спасибо за возможность опробовать урок, который я усвоил сегодня утром на SO.   -  person IRTFM    schedule 02.06.2012


Ответы (3)


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

function(y, x, dataset, weights){
  f <- substitute(glm(y~x, data=dataset, weights=weights, family=binomial))
  logLik(eval(f))
}
person Wojciech Sobala    schedule 02.06.2012
comment
Большое спасибо, Собала! Я бы не нашел его сам легко, так как я все еще в начале кривой обучения в R! - person user1431694; 03.06.2012

Я предлагаю создать формулу с 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.

person Aaron left Stack Overflow    schedule 02.06.2012
comment
Аарон, спасибо и тебе! Ваш ответ позволил мне узнать о do.call. Я буду использовать замену (аргумент), предложенную DWin. - person user1431694; 03.06.2012
comment
В этом случае я тоже мог бы, substitute(arg) - отличный способ сделать это в этом случае. На самом деле он делает то же самое, что и мое решение, за исключением того, что вы можете передавать параметры как имена, а не символы (т.е. без кавычек). - person Aaron left Stack Overflow; 03.06.2012

person    schedule
comment
Вместо немного уродливой конструкции which(names(.)==arg почему бы не использовать substitute(arg)? Я попробовал это с вашим ответом, и он хорошо сработал во всех трех случаях для вашего отличного ответа. - person IRTFM; 02.06.2012
comment
Майазаура, спасибо! Это действительно работает, и я согласен с DWin, что использование замены (arg) легче. Во всяком случае, теперь я лучше понимаю этот принцип определения области видимости... - person user1431694; 03.06.2012
comment
@DWin: substitute(arg) - действительно хороший способ делать такие вещи внутри функций. Спасибо за совет! - person Aaron left Stack Overflow; 03.06.2012