R:在R函数内将参数传递给glm
我试图习惯R中的作用域问题。我想在函数中调用函数R:在R函数内将参数传递给glm,r,function,glm,R,Function,Glm,我试图习惯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 i
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 (y = mydata$Prop, x = mydata$Age, dataset = mydata, weights = mydata$Total)
有人知道该怎么做吗
任何帮助都将不胜感激
顺便说一句,这里是如何复制我使用的数据集的问题
library("MASS")
data(menarche)
mydata <- menarche
mydata$Prop <- mydata$Menarche / mydata$Total
library(“MASS”)
数据(月经初潮)
mydataao我建议使用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
}
有关更多详细信息,请参阅。带替代品的解决方案(@DWin建议)
函数(y、x、数据集、权重){
f与其使用稍微难看的结构(名称(.)==arg
结构,为什么不使用替换(arg)
?我用你的答案尝试了一下,它在所有三种情况下都能很好地为你提供出色的答案。Maiasaura,谢谢!这确实有效,我同意DWin使用替换(arg)的观点更轻。无论如何,我现在更了解这个范围原则了…@DWin:substitute(arg)
是在函数中执行类似操作的一种非常好的方法。感谢您的提示!感谢您给我机会尝试我今天早上在SO上学到的课程。Aaron,也感谢您!您的回答让我了解了do.call。我将按照DWin的建议使用替换(arg)。在这种情况下,我也可以使用,替换(arg)
在这种情况下是一种很好的方法。它实际上与我的解决方案完全相同,只是您可以将参数作为名称而不是字符(即不带引号)传递。非常感谢Sobala!我自己不会轻易找到它,因为我仍然处于R中学习曲线的开始阶段!
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
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")
function(y, x, dataset, weights){
f <- substitute(glm(y~x, data=dataset, weights=weights, family=binomial))
logLik(eval(f))
}