2014-09-18 4 views
1

Я пытаюсь написать функцию, которая будет соответствовать в 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 в кадре данных при установке модель векторных символов также становится объясняющей переменной. Можно ли изменить формулу перед тем, как поместить ее в поезд(), чтобы wghts не был в модели? Или, альтернативно, я могу хранить wghts в другом месте? Я также думал о том, чтобы положить if (formula [[3]] == '.') И заменить «.» Всеми другими факторами, однако я не уверен, как это сделать. Благодаря!

ответ

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 
+0

Спасибо за ваш комментарий. К сожалению, это не сработает, если с правой стороны у меня есть ». вместо факторов, сгруппированных вместе, и это моя фактическая проблема. Если у меня есть определенные факторы, входящие в формулу, моя функция работает отлично, но если «.» присутствует, он ломается. Считаете ли вы, что есть другой способ хранения данных в кадре данных, не считая его фактором? – Dean

0

Я не уверен, что вам нужно сделать что-либо за помощью

glm.binomial(formula=Top10~.-wghts,data=MissUSA,num.trials=9) 

Ваш вызов train включает указания weights=wghts. train использует «стандартное соглашение» терминов для создания проектной матрицы, и это делается независимо от получения вектора весов.

В случае, если вы заинтересованы, вот фрагмент из-под капотом 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 здесь будет содержать то, что правая часть формулы определены и model.weights работы независимо от этого. (На стороне записки, я пытался понять все это во время раннего говорит о S +, и я хотел бы, чтобы кто-то сделал прохождение этого кода, чтобы объяснить это тогда. Если это кажется волшебным и расплывчатым ... это).

Вы должны проверить приведенный выше код, чтобы убедиться, что он дает вам результат, который вы ожидаете. Если да, я сделаю заметку на caret website for train, чтобы показать и пример использования сгруппированных биномиальных данных с glm и train.

Спасибо,

Max

+0

Благодарим вас за это понимание. Моя функция дает те же результаты, что и glm(), поэтому она отлично работает (в последней строке требуется только «результат», чтобы гарантировать, что результат будет напечатан, и trControl = trctr при вызове поезда). Моя идея состояла в том, чтобы функция автоматически удаляла wghts вместо того, чтобы просить пользователя вручную вычитать ее, но я не смог изменить формулу и все еще сделать ее узнаваемой поезда(). – Dean

Смежные вопросы