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

pxy2qtax  于 2024-01-03  发布在  其他
关注(0)|答案(1)|浏览(108)

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

可复制数据

  1. # for polr() example
  2. df2 <- data.frame(
  3. 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),
  4. 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))
  5. # for glm() example
  6. df3 <- data.frame(
  7. a = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
  8. b = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4))

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

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

我试过什么

  1. fun_polr <- function(x){
  2. model <- polr(a ~ b, data = x)
  3. summary <- attr(profile(model), "summary")
  4. return(summary)
  5. }


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

  1. fun_glm <- function(x){
  2. model <- glm(a ~ b, data = x)
  3. summary <- attr(profile(model), "summary")
  4. return(summary)
  5. }


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

  1. fun_polr2 <- function(x){
  2. model <- polr(a ~ b, data = x)
  3. return(model)
  4. }

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

  1. set.seed(123)
  2. df <- data.frame(
  3. a = ordered(sample(1:5, 100, replace = TRUE), levels = 1:5),
  4. b = ordered(sample(1:4, 100, replace = TRUE), levels = 1:4))
  5. model <- polr(a ~ b, data = df)
  6. summary <- attr(profile(model), "summary")

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

  1. df4 <- data.frame(
  2. a = sample(1:5, 100, replace = TRUE),
  3. b = sample(1:4, 100, replace = TRUE))
  4. model <- glm(a ~ b, data = df4)
  5. summary <- attr(profile(model), "summary")

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

dffbzjpn

dffbzjpn1#

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

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

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

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


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

展开查看全部

相关问题