GLM 模型在交互式代码中运行,但在我使用 knitr 时不运行

mma*_*rks 3 r glm knitr

我有问题knitr。具体来说,我有一个模型在控制台中运行得非常好,但是当我尝试编织文档时,R 会引发错误。

加载数据集(此处可用以方便复制

scabies <- read.csv(file = "S1-Dataset_CSV.csv", header = TRUE, sep = ",")
scabies$agegroups <- as.factor(cut(scabies$age, c(0,10,20,Inf), labels = c("0-10","11-20","21+"), include.lowest = TRUE)) 
scabies$agegroups <-relevel(scabies$agegroups, ref = "21+")
scabies$house_cat <- as.factor(cut(scabies$house_inhabitants, c(0,5,10,Inf), labels = c("0-5","6-10","10+"), include.lowest = TRUE))
scabies$house_cat <- relevel(scabies$house_cat, ref = "0-5")
scabies <- scabies %>% mutate(scabies = case_when(scabies_infestation=="yes"~1,
                                                  scabies_infestation=="no"~0)) %>%
                      mutate(impetigo = case_when(impetigo_active=="yes" ~1,
                                                  impetigo_active=="no" ~0))
Run Code Online (Sandbox Code Playgroud)

拟合模型

scabiesrisk <- glm(scabies~agegroups+gender+house_cat,data=scabies,family=binomial())
scabiesrisk_OR <- exp(cbind(OR= coef(scabiesrisk), confint(scabiesrisk)))
scabiesrisk_summary <- summary(scabiesrisk)
scabiesrisk_summary <- cbind(scabiesrisk_OR, scabiesrisk_summary$coefficients)
scabiesrisk_summary
Run Code Online (Sandbox Code Playgroud)

这段代码在控制台中运行得非常好。但是当我尝试时,knitr我得到:

model.frame.default(formula = scabies ~ agegroups + sex + : invalid type(list) for variable 'scabies Calls: ... glm -> eval -> eval -> -> model.frame.default 中的错误

Wal*_*ldi 5

我能够重现您描述的问题,但还没有完全理解幕后发生的事情。
这个 Markdown 大块很有趣:

```{r}
scabiesrisk_OR <- exp(cbind(OR= coef(scabiesrisk), confint((scabiesrisk))))
scabiesrisk_summary <- summary(scabiesrisk)
scabiesrisk_summary <- cbind(scabiesrisk_OR, scabiesrisk_summary$coefficients)
scabiesrisk_summary
```
Run Code Online (Sandbox Code Playgroud)

如果我手动快速地一个接一个地快速执行 chunck 中的行(ctrl+Enter x 4),有时我会收到两条分析消息:

Waiting for profiling to be done...
Waiting for profiling to be done...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,summary(scabiesrisk)是一个矩阵:

> class(scabiesrisk_summary)
[1] "matrix" "array" 
Run Code Online (Sandbox Code Playgroud)

如果我手动缓慢地执行块中的行,我只会收到一条分析消息:

Waiting for profiling to be done...
Run Code Online (Sandbox Code Playgroud)

summary(scabiesrisk)是一个summary.glm

> class(scabiesrisk_summary)
[1] "summary.glm"
Run Code Online (Sandbox Code Playgroud)

看起来分析是在一个单独的线程上启动的,并且取决于它是否完成,摘要函数没有相同的行为。如果分析完成,它返回预期的summary.glm对象,但如果不是这种情况,它会启动另一个分析并返回一个矩阵。
特别是,矩阵scabiesrisk_summary$coefficients不可用,在这种情况下我收到以下错误消息:

Error in scabiesrisk_summary$coefficients : 
  $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

编织时也可能发生这种情况:编织头顶是否会使分析速度变慢从而出现问题?

使用此处找到的解决方法(使用confint.default而不是confint),我无法重现上述问题:

scabiesrisk_OR <- exp(cbind(OR= coef(scabiesrisk), confint.default((scabiesrisk))))
scabiesrisk_summary <- summary(scabiesrisk)
scabiesrisk_summary <- cbind(scabiesrisk_OR, scabiesrisk_summary$coefficients)
scabiesrisk_summary
                       OR      2.5 %    97.5 %   Estimate Std. Error
(Intercept)    0.09357141 0.06984512 0.1253575 -2.3690303  0.1492092
agegroups0-10  2.20016940 1.60953741 3.0075383  0.7885344  0.1594864
agegroups11-20 2.53291768 1.79985894 3.5645415  0.9293719  0.1743214
gendermale     1.44749159 1.13922803 1.8391682  0.3698321  0.1221866
house_cat6-10  1.30521927 1.02586104 1.6606512  0.2663710  0.1228792
house_cat10+   1.17003712 0.67405594 2.0309692  0.1570355  0.2813713
                   z value     Pr(>|z|)
(Intercept)    -15.8772359 9.110557e-57
agegroups0-10    4.9442116 7.645264e-07
agegroups11-20   5.3313714 9.747386e-08
gendermale       3.0267824 2.471718e-03
house_cat6-10    2.1677478 3.017788e-02
house_cat10+     0.5581076 5.767709e-01
Run Code Online (Sandbox Code Playgroud)

所以你也可以在你的情况下尝试这个。

confint.defaut直接可读的 R 函数相反的confint是 S3 调度方法(感谢 @Ben Bolker 在评论中提供内部参考),我还没有进一步调查什么可以解释这种令人惊讶的行为。

另一种选择似乎保存scabiesrisk_summary在另一个变量中。
我努力尝试,但这样做后永远无法重现问题:

```{r}
scabiesrisk_OR <- exp(cbind(OR= coef(scabiesrisk), confint((scabiesrisk))))
scabiesrisk_summary <- summary(scabiesrisk)
scabiesrisk_final <- cbind(scabiesrisk_OR, scabiesrisk_summary$coefficients)
scabiesrisk_final
```
Run Code Online (Sandbox Code Playgroud)