Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:在R函数内将参数传递给glm_R_Function_Glm - Fatal编程技术网

R:在R函数内将参数传递给glm

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

我试图习惯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 (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”)
数据(月经初潮)

mydata
ao我建议使用
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))
}