【问题标题】:Multiple sampling inside an R functionR函数内的多重采样
【发布时间】:2018-11-06 15:14:42
【问题描述】:

我正在尝试创建一个函数,最终将在我的数据集上运行多种机器学习算法。下面是我的函数的第一个部分和一小部分数据。

我遇到的问题是将我的数据采样到四个不同的数据帧中,然后将它们应用于给定的函数。在第一个函数上,我正在测试数据运行抛出逻辑回归模型,但在输出上它使用该模型的所有数据,而不仅仅是我想要的数据帧 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)

【问题讨论】:

  • 在逻辑回归的输出中,它告诉我它正在使用所有观察结果,而不仅仅是其中的四分之一。

标签: r function dataframe statistical-sampling


【解决方案1】:

您必须在函数中更改公式并命名训练数据集的列。 等式从eq1 &lt;- df$zeroFac ~ df$goal + df$City_Pop 变为eq1 &lt;- 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)

【讨论】:

  • 你对这个错误是正确的。但是,它仍然不会给出正确的答案。请参阅下面的答案。
  • 我认为它确实给出了正确的结果。检查摘要的 deviance.resid 给我的元素少于 20 个(少于原始 data.frame)
  • 我发表评论时没有注意到colnames(train) &lt;- c("zeroFac", "goal", "City_Pop")。我同意 - 它应该工作。我认为以下陈述不正确否则它还包含对数据框的调用,而不仅仅是对列名的调用。即使您正确使用了公式,如eq1 &lt;- zeroFac ~ goal + City_Pop,它仍然会在全球环境中使用数据。
  • 一个问题出现了。正如我正在使用的那样...如果要在不更改函数的情况下将新变量添加到方程中,您将如何更改列名?
  • @Suren。您可以尝试使用这两个公式方程,一次使用df$...,一次仅使用列名。输出会有所不同。 @克林顿。我试图弄清楚这一点,尽管我没有经常使用省略号函数。
【解决方案2】:

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

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

来自?glm

data 可选的数据框、列表或环境(或对象强制 通过 as.data.frame 到一个数据框)包含变量 模型。如果在数据中找不到,则变量取自 environment(formula),通常是 glm 所在的环境 调用。

您的公式也不正确。它应该是eq1 &lt;- 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2020-07-04
    • 2017-10-09
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多