Reputation: 735
I am trying to get used to scoping issues in R. I'd like to call the function glm()
inside a function but it does not work, apparently for scoping reasons I did not manage to fix with the functions assign()
or eval()
.
Here is a simplified version:
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
}
Now I want to use the function ao() on my dataset
ao (y = Prop, x = Age, dataset = mydata, weights = Total)
This does not work, but the following works:
ao (y = mydata$Prop, x = mydata$Age, dataset = mydata, weights = mydata$Total)
Does anyone know what to do ?
Any help would be greatly appreciated !!!
Btw, here is how to replicate my problem with the dataset I am using
library("MASS")
data(menarche)
mydata <- menarche
mydata$Prop <- mydata$Menarche / mydata$Total
Upvotes: 7
Views: 4619
Reputation: 32986
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
Upvotes: 3
Reputation: 7551
Solution with substitute (@DWin suggestion).
function(y, x, dataset, weights){
f <- substitute(glm(y~x, data=dataset, weights=weights, family=binomial))
logLik(eval(f))
}
Upvotes: 6
Reputation: 37744
I suggest creating the formula with paste
and calling the function with 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
}
Then call it like this:
ao("Prop", "Age", dataset="mydata", weights="Total")
See https://stackoverflow.com/a/7668846/210673 for more details.
Upvotes: 3