【问题标题】:Bootstrap Multinomial regression in RR中的引导多项式回归
【发布时间】:2016-01-15 04:45:16
【问题描述】:

我正在尝试在 R 中引导一个简单的多项式回归,但出现错误:

is.data.frame(data) 中的错误:找不到对象“d”

真正奇怪的是,我使用的代码(针对这个特定问题进行了调整)与引导包 at Quick-R 的教程中的代码相同,并且当我使用不同的函数(如 lm() )。当然,我在做一些愚蠢的事情,但我看不出是什么。请,如果有人可以提供帮助,我将不胜感激。

这是一个例子:

require(foreign)
require(nnet)
require(boot)

# an example for multinomial logistic regression
ml = read.dta('http://www.ats.ucla.edu/stat/data/hsbdemo.dta')
ml = ml[,c(5,7,3)]

bs <- function(formula, data, indices) {
    d = data[indices,] # allows boot to select sample
    fit = multinom(formula, data=d)
    s = summary(fit)
    return(list(fit$coefficients, fit$standard.errors))
}

# 5 replications
results = list()
results <- boot(
    data=ml, statistic=bs, R=5, parallel='multicore',
    formula=prog~write
)

【问题讨论】:

  • 请在您的问题中发布traceback() 的输出。
  • 我做了一些调查,这可能会导致解决方案:环境中有一些东西(通过从bs-函数内部打印 str(fit) 可以看到。它设置为全局,当您传递一个公式时,公式具有创建它们的环境(请参阅?公式)。不过现在不知道如何修复它。

标签: r logistic-regression statistics-bootstrap


【解决方案1】:

多项逻辑回归使用coef() 函数返回一个系数矩阵。这与返回系数向量的lmglm 模型不同。

library(foreign)     # read.dta()
library(nnet)        # multinom()
require(boot)        # boot()

# an example for multinomial logistic regression
ml = read.dta('http://www.ats.ucla.edu/stat/data/hsbdemo.dta')
ml = ml[,c(5,7,3)]

names(ml)

bs <- function(formula, data, indices) {
  d = data[indices,] # allows boot to select sample
  fit = multinom(formula, data=d, maxit=1000, trace=FALSE)
  #s = summary(fit)
  #return(list(fit$coefficients, fit$standard.errors))

  estimates <- coef(fit)
  return(t(estimates))
}

# enable parallel

library(parallel)
cl <- makeCluster(2)
clusterExport(cl, "multinom")

# 10000 replications
set.seed(1984)

results <- boot(
  data=ml, statistic=bs, R=10000, parallel = "snow", ncpus=2, cl=cl,
  formula=prog~write
)

# label the estimates

subModelNames <- colnames(results$t0)
varNames <- rownames(results$t0)

results$t0

estNames <- apply(expand.grid(varNames,subModelNames),1,function(x) paste(x,collapse="_"))

estNames

colnames(results$t) <- estNames

# summary of results

library(car)

summary(results)

confint(results, level=0.95, type="norm")
confint(results, level=0.95, type="perc")
confint(results, level=0.95, type="bca")

# plot the results

hist(results, legend="separate")

【讨论】:

    【解决方案2】:

    错误发生在summary()部分,同样multinom()返回的对象没有coefficientsstandard.errors。看来,summary.multinom() 反过来从您的数据中计算粗麻布,d,由于某种原因(可能是范围问题)无法找到。快速解决方法是添加Hess = TRUE

    bs <- function(formula, data, indices) {
      d = data[indices,] # allows boot to select sample
      fit = multinom(formula, data=d, Hess = TRUE)
      s = summary(fit)
      return( cbind(s$coefficients, s$standard.errors) )
    }
    
    # 5 replications
    results = list()
    results <- boot(
      data=ml, statistic=bs, R=5, parallel='multicore',
      formula=prog~write
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2014-01-09
      • 2020-05-08
      • 1970-01-01
      • 2021-06-03
      • 2014-06-13
      相关资源
      最近更新 更多