Вопрос по function, glm, r – R: передать аргумент glm внутри функции R

6

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

Ваш Ответ

3   ответа
3
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
Вместо немного некрасивогоwhich(names(.)==arg строительство, почему бы не использоватьsubstitute(arg)? Я попробовал это с вашим ответом, и он сработал хорошо во всех трех случаях для вашего в противном случае отличного ответа.
Майасаура, спасибо! Это действительно работает, и я согласен с DWin, что использование замены (arg) легче. В любом случае, теперь я лучше понимаю этот принцип определения ... user1431694
@DWin:substitute(arg) это действительно хороший способ делать такие вещи в функциях. Спасибо за чаевые!
2

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

В этом случае я мог бы тоже,substitute(arg) это отличный способ сделать это в этом случае. Это фактически делает то же самое, что и мое решение, за исключением того, что вы можете передавать параметры в виде имен вместо символов (то есть без кавычек).
Аарон, спасибо тебе тоже! Ваш ответ позволил мне узнать о do.call. Я буду использовать замену (arg), как предложено DWin. user1431694
6

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

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

Похожие вопросы