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. Ще използвам substitute(arg), както е предложено от 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
Maiasaura, благодаря ти! Това наистина работи и съм съгласен с DWin, че използването на заместител (arg) е по-леко. Както и да е, сега разбирам по-добре този принцип на обхват... - person user1431694; 03.06.2012
comment
@DWin: substitute(arg) е наистина хубав начин да се правят неща като тези в рамките на функции. Благодаря за бакшиша! - person Aaron left Stack Overflow; 03.06.2012