我希望使用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()来隔离汇总数据?
1条答案
按热度按时间dffbzjpn1#
解决方法是将Hess = TRUE添加到函数调用中。
字符串
默认值是Hess = Hess。问题是summary.polr()调用的vcov.polr()中的这段代码。
型
如果Hess为TRUE,则使用update()重新运行模型。“object”只有数据的值“x”,因此将其踢出。从一开始就将值设置为TRUE将避免调用update()。