我正在尝试编写一个适合glm的函数,并给我一些统计信息:
library(caret)
library(marginalmodelplots)
data(MissAmerica08)
MissUSA <- MissAmerica08[,c(2,4,6,7,8,10)]
glm.binomial<-function(data,formula,num.trials,linkf="logit",
trctr=trainControl(method = "none"),conf.lvl=0.95)
{
result<-list()
lhs<-formula[[2]]
data[,"wghts"]<-rep(num.trials,length(data[,as.character(lhs)]))
data[,as.character(lhs)]<-data[,as.character(formula[[2]])]/num.trials #so the vector is in [0,1]
fit<-train(form=formula,data=data,family=binomial(),method="glm",
trControl=trainControl(method = "none"), weights=wghts)
result[["Statistics"]] <- summary(fit)
}
glm.binomial(formula=Top10~.,data=MissUSA,num.trials=9)
我的问题是,由于我在拟合模型时在数据框架中输入了数据,因此矢量wghts也成为一个解释变量。是否可以在将其放入train()之前修改公式,以便wghts不在模型中?或者我可以在其他地方存储wghts吗?我也在想把if(公式[[3]] =='。')和'。'替换为所有其他因素,但我不知道该怎么做。谢谢!
答案 0 :(得分:0)
我会进行逻辑检查并使用update
函数更新公式。例如,
f1 <- y ~ a + b + w
myfun <- function(f, w) {
if (is.vector(w)) {
f <- update(f, ~ . - w)
}
return(f)
}
myfun(f = f1, w = 1:3)
[1] y ~ a + b
答案 1 :(得分:0)
我不确定除了使用
之外你还需要做什么glm.binomial(formula=Top10~.-wghts,data=MissUSA,num.trials=9)
您对train
的来电包括指定weights=wghts
。 train
使用&#34;标准惯例&#34;用于创建设计矩阵的术语,并且与获得权重向量无关。
如果您有兴趣,这里有一段train.formula
引言:
<snip>
x <- model.matrix(Terms, m, contrasts, na.action = na.action)
cons <- attr(x, "contrast")
xint <- match("(Intercept)", colnames(x), nomatch = 0)
if (xint > 0) x <- x[, -xint, drop = FALSE]
y <- model.response(m)
w <- as.vector(model.weights(m))
res <- train(x, y, weights = w, ...)
<snip>
此处的对象x
将包含指定公式的rhs,model.weights
独立于此工作。 (另一方面,我试图在早期的S +中说明所有这些,并且我希望有人已经完成了这段代码的演练以解释它。如果它看起来很神奇和含糊......那就是)。
您应该测试上面的代码,以确保它能为您提供所期望的结果。如果是这样,我会在caret website for train上做一个说明,以显示使用glm
和train
的分组二项数据的示例。
谢谢,
最高