2

我正在尝试制作一个最终将在我的数据集上运行多种机器学习算法的函数。我在下面有我的函数的第一个小部分和一小部分数据样本。

我遇到的问题是将我的数据采样到四个不同的数据帧中,然后将它们应用于给定的函数。在第一个函数上,我正在测试数据运行抛出逻辑回归模型,但在输出上它使用该模型的所有数据,而不仅仅是我想要的数据帧 df 的 1/4。我检查了 <<- 以查看传递的数据类型,它发送的数据集是我正在寻找的数据帧 df 的 1/4。问题为什么将它以正确的方式传递给我的全局环境而不是我的回归函数,我将如何纠正这个问题?

数据:

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)
4

2 回答 2

2

train中,列名不是您所期望的(“zeroFac”、“goal”和“City_Pop”);它们是“X1”、“X2”和“X3”。

根据glm帮助,当公式中的变量在数据中不可用时,它们是从environment(formula). 因此,它使用的是全球环境中的数据 - 创建公式的地方。

来自?glm

data 包含模型中变量的可选数据框、列表或环境(或由 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
于 2018-05-28T05:43:03.557 回答
2

您必须在函数中更改公式并命名训练数据集的列。方程从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)
于 2018-05-28T05:43:26.260 回答