Многократная выборка внутри функции R - PullRequest
0 голосов
/ 28 мая 2018

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

Проблема, с которой я сталкиваюсь, заключается в том, чтобы собрать мои данные в четыре различных фрейма данных и затем применить их к заданным функциям.Здесь, в первой функции, которую я тестирую, данные запускаются с использованием модели логистической регрессии, но на выходе она использует все данные для этой модели, а не только 1/4 кадра данных df, как я намереваюсь.Я проверил с помощью << -, чтобы увидеть, какие данные были переданы, и он отправляет набор данных, который составляет 1/4 от кадра данных df, который я ищу.Вопрос, почему это правильно передается в мою глобальную среду, а не в мою регрессионную функцию, и как мне это исправить?</p>

Данные:

zeroFac <- c(1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1)

goal <- c(8.412055,  7.528869,  8.699681, 10.478752,  9.210440, 10.308986, 10.126671, 11.002117, 10.308986,  7.090910, 10.819798,  7.824446,  8.612685,
7.601402, 10.126671,  7.313887,  5.993961,  7.313887,  8.517393, 12.611541)

City_Pop <- c( 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613,
11.64613, 11.64613, 11.64613, 11.64613, 11.64613, 11.64613)

df <- data.frame(zeroFac,goal,City_Pop)

Функция:

forestModel <- function(eq1, ...){

  #making our origenal data frame
  train <- data.frame(cbind(...))

  ################

    #splitting into 4 data sets
    set.seed(123)

    ss <- sample(1:4, size = nrow(train), replace=TRUE, prob = c(0.25,0.25,0.25,0.25))

    t1 <- train[ss==1,]
    t2 <- train[ss==2,]
    t3 <- train[ss==3,]
    t4 <- train[ss==4,]

  ################

  m <- glm(eq1, family = binomial(link = 'logit'), data = t1)
  summary(m)

}

eq1 <- df$zeroFac ~ df$goal + df$City_Pop


forestModel(eq1, df$zeroFac, df$goal, df$City_Pop)

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы должны изменить формулу и назвать столбцы набора данных поезда в функции.Уравнение изменяется от eq1 <- df$zeroFac ~ df$goal + df$City_Pop до eq1 <- zeroFac ~ goal + City_Pop.В противном случае он также содержит вызов к фрейму данных, а не только к именам столбцов.И после связывания данных поезда вместе вы должны назвать их столбцы, чтобы функция glm знала, к каким столбцам вы обращаетесь в уравнении.

 forestModel <- function(eq1, ...){

  #making our origenal data frame

  train <- data.frame(cbind(...))
  colNames <- colnames(data.frame(...))
  coln <- do.call(cbind, lapply(X = strsplit(colNames, "\\."), FUN = function(X) X[[2]]))
  colnames(train) <- coln

  ################

  #splitting into 4 data sets
  set.seed(123)

  ss <- sample(1:4, size = nrow(train), replace=TRUE, prob = c(0.25,0.25,0.25,0.25))

  t1 <- train[ss==1,]
  ################

  m <- glm(eq1, family = binomial(link = 'logit'), data = t1)
  summary(m)
}

eq1 <- zeroFac ~ goal + City_Pop
forestModel(eq1, df$zeroFac, df$goal, df$City_Pop)
0 голосов
/ 28 мая 2018

В train имена столбцов не совпадают с ожидаемыми («zeroFac», «goal» и «City_Pop»);это «X1», «X2» и «X3».

Согласно справке glm, когда переменные в формуле отсутствуют в данных, они берутся из environment(formula).Следовательно, он использует данные в глобальной среде - где создается формула.

Из данных ?glm

необязательный фрейм данных, список или среда (или объект, приводимый as.data.frame во фрейм данных), содержащий переменные в модели,Если данные не найдены, переменные берутся из environment(formula), обычно из среды, из которой вызывается glm.

Ваша формула также неверна.Он должен иметь форму eq1 <- zeroFac ~ goal + City_Pop.Но исправление этого само по себе НЕ решит вашу проблему.

РЕДАКТИРОВАТЬ

Один из вариантов - передать имена переменных отдельно, как в

forestModel <- function(eq1, colnam, ...) {

  train <- data.frame(cbind(...))
  colnames(train) <- colnam

  # splitting the data
  set.seed(123)

  ss <- sample(1:4, size = nrow(train), replace=TRUE, 
                    prob = c(0.25,0.25,0.25,0.25))

  t1 <- train[ss==1,]

  m <- glm(eq1, family = binomial(link = 'logit'), data = t1)
  summary(m)
}

eq1 <- zeroFac ~ goal + City_Pop
colnam <- c("zeroFac", "goal", "City_Pop")

forestModel(eq1, colnam, df$zeroFac, df$goal, df$City_Pop)

# Call:
#   glm(formula = eq1, family = binomial(link = "logit"), data = t1)
# 
# Deviance Residuals: 
#   2           4           5           8          11          16  
# 9.915e-06   2.110e-08  -1.080e-05  -2.110e-08   2.110e-08   2.110e-08  
# 20  
# 6.739e-06  
# 
# Coefficients:
#   Estimate Std. Error z value Pr(>|z|)
# (Intercept)    -960.87 2187192.38       0        1
# goal             12.32   41237.80       0        1
# City_Pop         74.28  166990.04       0        1
# 
# (Dispersion parameter for binomial family taken to be 1)
# Null deviance: 8.3758e+00  on 6  degrees of freedom
# Residual deviance: 2.6043e-10  on 4  degrees of freedom
# AIC: 6
# Number of Fisher Scoring iterations: 25
...