在函数中使用时,使用MASS::polr()生成的模型上的profile()无法找到数据的错误

pxy2qtax  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(86)

我希望使用profile()将汇总数据从函数内部使用MASS::polr()创建的模型中隔离出来。它在函数外部工作,如果使用glm()而不是polr(),该函数就可以工作。有人能解释为什么吗?

可复制数据

# for polr() example
df2 <- data.frame(
  a = ordered(c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5), levels = 1:5),
  b = ordered(c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4), levels = 1:4))

# for glm() example
df3 <- data.frame(
  a = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
  b = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4))

字符串
这就是我想在函数中返回汇总数据的内容。

model <- polr(a ~ b, data = df2)
summary <- attr(profile(model), "summary")
summary

我试过什么

fun_polr <- function(x){
  model <- polr(a ~ b, data = x)
  summary <- attr(profile(model), "summary")
  return(summary)
}


当我运行fun_polr(df2)时,我得到错误“Error in eval(expr,p):object 'x' not found”。
如果我用glm()在df3数据集上运行一个类似的函数,我不会得到错误。

fun_glm <- function(x){
  model <- glm(a ~ b, data = x)
  summary <- attr(profile(model), "summary")
  return(summary)
}


如果我创建函数而不使用profile()来简单地返回模型,它运行得很好。所以我得出结论,是profile()与polr()的交互方式导致了问题。fun_polr2(df2)运行没有任何问题。

fun_polr2 <- function(x){
  model <- polr(a ~ b, data = x)
  return(model)
}

进一步的见解我还发现,当输入模型的数据是由创建 Dataframe 时的函数生成时,profile(polr.model)不起作用。

set.seed(123)
df <- data.frame(
  a = ordered(sample(1:5, 100, replace = TRUE), levels = 1:5),
  b = ordered(sample(1:4, 100, replace = TRUE), levels = 1:4))

model <- polr(a ~ b, data = df)
summary <- attr(profile(model), "summary")

模型生成了,但是profile()步骤导致了一个错误,“'data' must be a data.frame,environment,or list.”我对glm()模型的生成数据尝试了同样的方法,没有遇到同样的问题。

df4 <- data.frame(
  a = sample(1:5, 100, replace = TRUE),
  b = sample(1:4, 100, replace = TRUE))

model <- glm(a ~ b, data = df4)
summary <- attr(profile(model), "summary")

我希望这些观察结果是相关的,但不确定如何解决。我将感谢任何解释或帮助。是否有任何替代方法可以使用profile()来隔离汇总数据?

dffbzjpn

dffbzjpn1#

解决方法是将Hess = TRUE添加到函数调用中。

fun_polr <- function(x){
  model <- polr(a ~ b, data = x, Hess = TRUE)
  summary <- attr(profile(model), "summary")
  return(summary)
}

字符串
默认值是Hess = Hess。问题是summary.polr()调用的vcov.polr()中的这段代码。

if (is.null(object$Hessian)) {
    message("\nRe-fitting to get Hessian\n")
    utils::flush.console()
    object <- update(object, Hess = TRUE, start = c(object$coefficients, 
                                                    object$zeta))


如果Hess为TRUE,则使用update()重新运行模型。“object”只有数据的值“x”,因此将其踢出。从一开始就将值设置为TRUE将避免调用update()。

相关问题