【问题标题】:Resampling in logistic regression逻辑回归中的重采样
【发布时间】:2016-02-22 16:46:03
【问题描述】:

我有一个简单的数据集,其中包含一个 Y 和 10 个预测变量 (X1-X10),编码为 0,1 或 2,用于 100 个观察。

 n <- 100
 Y <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
 X1 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.1,0.4,0.5))
 X2 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.5,0.25,0.25))
 X3 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.3,0.4,0.4))
 X4 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.35,0.35,0.3))
 X5 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.1,0.2,0.7))
 X6 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.8,0.1,0.1))
 X7 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.1,0.1,0.8))
 X8 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.35,0.35,0.3))
 X9 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.35,0.35,0.3))
X10 <- c(0,2,2,2,2,2,2,2,0,2,0,2,2,0,0,0,0,0,2,0,0,2,2,0,0,2,2,2,0,2,0,2,0,2,1,2,1,1,1,1,1,1,1,1,1,1,1,0,1,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0)

datasim <- data.frame(Y,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10)

我正在尝试按如下方式进行引导重采样,这可以为一个变量生成 100 组不同的样本。

 B <- 100
 n <- length(datasim$X1)
 boot.samples <- matrix(sample(datasim$X1, size=B*n, replace=TRUE),B,n)

现在,我正在尝试合并一个函数来使用 GLM 计算偏差差异。我的愿望是为每个引导样本(100 个值)生成 dDeviance。我尝试了以下函数,但它只给了我 100 个类似的 dDeviance 值。

 xfunction <- function(x){
 glmfit <- glm(Y~X1, family="binomial", data=datasim)
 dDeviance <- glmfit$null.deviance-glmfit$deviance
 return(dDeviance)
 }

 boot.statistics <- apply(boot.samples,1,xfunction)

【问题讨论】:

  • 没有 datasim 提供它很难知道,但是你的函数有一个参数,x,它似乎没有在函数中使用,而是你使用相同的数据集,'datasim',每次它被调用。
  • 在您的模型语句中,您需要定义 data = x 而不是 datasim。
  • 感谢两位指出这一点。我包括 datasim 只是也许你想运行它。我收到了应用功能的错误消息。 eval 中的错误(predvars,data,env):数字 'envir' arg 长度不是 1。

标签: r glm resampling statistics-bootstrap


【解决方案1】:

xfunction 的参数在这样的 apply 中使用时是矩阵中的一行。在您的原始代码中,该行没有被使用,并且您每次都针对相同的数据运行该函数。解决此类问题的一种方法是将 glm 中的 data 参数更改为每次建议的新数据(glmfit &lt;- glm(Y~X1, family="binomial", data=x)),但这假设 x 将是一个名为 Y 和 X1 的数据框,而你实际拥有的 x 是 X1 的值向量。最简单的解决方案是在每次拟合中更改 X1。

xfunction <- function(x){
  glmfit <- glm(Y~x, family="binomial")
  dDeviance <- glmfit$null.deviance-glmfit$deviance
  return(dDeviance)
}

boot.statistics <- apply(boot.samples,1,xfunction)

【讨论】:

    【解决方案2】:

    正如 Jeffrey 所说,数据应该 = x。

     xfunction <- function(x){
       glmfit <- glm(Y~X1, family="binomial", data=x)
       dDeviance <- glmfit$null.deviance-glmfit$deviance
       return(dDeviance)
     }
    
     boot.statistics <- apply(boot.samples,1,xfunction)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-20
      • 2020-01-31
      • 2018-02-22
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多