R: чтобы цикл проходил по регрессионным моделям с разными весами и сохранял название модели - PullRequest
0 голосов
/ 24 апреля 2018

Очень простая проблема, но я не могу ее найти или найти решение в режиме онлайн. Я хочу перебрать регрессию, используя разные веса, и мне не нужен вывод в списке, я хочу, чтобы каждая модель представляла собой отдельный объект glm. Я не уверен, как перебрать вес по столбцам, которые я хочу.

data1 <- mtcars
data1$weight1<- runif(1.5, .9,1.8)
data1$weight_2<- runif(1.5, .9,1.8)
coln<-data1[, c("weight1","weight_2")]

for(i in seq_along(coln)){
  fit[[i]] <- glm(factor(vs) ~ mpg,data=data1,family=quasibinomial,weights = coln[i])
}

Я думаю, мне нужно было бы добавить paste0("fit", names(col)), чтобы получить правильные имена, но я не уверен, как это сделать. В результате я хочу получить следующие две модели glm в глобальной среде, а не в списке.

    > fitweight1

Call:  glm(formula = factor(vs) ~ mpg, family = quasibinomial, data = data1, 
    weights = weight1)

Coefficients:
(Intercept)          mpg  
      -8.83         0.43  

Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
Null Deviance:      50 
Residual Deviance: 29.1     AIC: NA


> fitweight_2

Call:  glm(formula = factor(vs) ~ mpg, family = quasibinomial, data = data1, 
    weights = weight_2)

Coefficients:
(Intercept)          mpg  
      -8.83         0.43  

Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
Null Deviance:      54.2 
Residual Deviance: 31.5     AIC: NA

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Подумайте о создании списка моделей с lapply, передав в качестве аргумента имена столбцов веса. А поскольку вы динамически передаете строку, не используйте data аргумент glm, а векторы, вызываемые с квалификаторами $ или [[ (напомним: столбцы данных - это векторы).

Кроме того, рассмотрите replicate (обертка для sapply), чтобы построить вашу рандомизированную выборку весов, если спецификации runif должны остаться такими же:

data1 <- mtcars

# LONG FORM
set.seed(123)
weights <- list(runif(1.5, .9, 1.8), runif(1.5, .9, 1.8))

# SHORT FORM
set.seed(123)
weights <- replicate(n=2, runif(1.5, .9, 1.8), simplify = FALSE)

# ASSIGN NEW COLUMNS
data1[paste0("weight", 1:length(weights))] <- weights     
# RETRIEVE COLUMN NAMES
weight_cols <- names(data1)[grep("weight", names(data1))]

# LIST OF GLM FITTED MODELS
fit_list <- lapply(weight_cols, function(wgt) 
                      glm(factor(data1$vs) ~ data1$mpg,
                          family = quasibinomial, weights = data1[[wgt]])
                  )

# NAME LIST ITEMS
fit_list <- setNames(fit_list, paste0("fit_", weight_cols))

выход

fit_list

$fit_weight1

Call:  glm(formula = factor(data1$vs) ~ data1$mpg, family = quasibinomial, 
    weights = data1[[wgt]])

Coefficients:
(Intercept)    data1$mpg  
    -8.8331       0.4304  

Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
Null Deviance:      50.83 
Residual Deviance: 29.59    AIC: NA

$fit_weight2

Call:  glm(formula = factor(data1$vs) ~ data1$mpg, family = quasibinomial, 
    weights = data1[[wgt]])

Coefficients:
(Intercept)    data1$mpg  
    -8.8331       0.4304  

Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
Null Deviance:      70.59 
Residual Deviance: 41.1     AIC: NA
0 голосов
/ 24 апреля 2018

Попробуйте:

fit <- lapply(coln, function(x) glm(factor(vs) ~ mpg,data=data1,family=quasibinomial,weights = x))
names(fit) <- paste0("fit_", 1:2)             
list2env(fit, globalenv())
print(fit_1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...