如何使用anova()

时间:2019-11-26 12:37:12

标签: r anova interaction cox-regression

我使用两个分类变量(x1和x2)及其相互作用来进行Cox回归。我需要知道x1,x2以及交互作用的总体意义。

互动的总体效果:

我知道如何使用anova()找出互动的整体效果:

library(survival)
fit_x1_x2 <- coxph(Surv(time, death) ~ x1 + x2        , data= df)
fit_full <-  coxph(Surv(time, death) ~ x1 + x2 + x1:x2, data= df)
anova(fit_x1_x2, fit_full)

但是我们应该如何使用anova()来找出x1或x2的整体效果?我试过的是这个

x1的总体效果

fit_x2_ia <- coxph(Surv(time, death) ~      x2 + x1:x2, data= df)
fit_full <- coxph(Surv(time, death)  ~ x1 + x2 + x1:x2, data= df)
anova(fit_x2_ia, fit_full)

x2的总体效果

fit_x1_ia <- coxph(Surv(time, death) ~ x1 +      x1:x2, data= df)
fit_full <- coxph(Surv(time, death)  ~ x1 + x2 + x1:x2, data= df)
anova(fit_x1_ia, fit_full)

我不确定这是否应该使用anova()。输出显示自由度为零的事实使我感到怀疑。对于x1和x2的总体效果,这两次都使我感到很困惑,尽管模型的对数似然值相同且Chi值为零,但检验还是有意义的。

这是我使用的数据

set.seed(1) # make it reproducible
df <- data.frame(x1= rnorm(1000), x2= rnorm(1000)) # generate data         
df$death <- rbinom(1000,1, 1/(1+exp(-(1 + 2 * df$x1 + 3 * df$x2 + df$x1 * df$x2)))) # dead or not
library(tidyverse) # for cut_number() function
df$x1 <- cut_number(df$x1, 4); df$x2 <- cut_number(df$x2, 4) # make predictors to groups
df$time <- rnorm(1000); df$time[df$time<0] <- -df$time[df$time<0] # add survival times

2 个答案:

答案 0 :(得分:1)

您为“总体效果”构建的两个模型实际上似乎并不满足分层(即正确嵌套)的统计属性。具体来说,如果您查看使用该代码构建的实际模型,则应该看到它们实际上是相同的模型,但双向交叉效果具有不同的标签。在这两种情况下,您都有15个估计系数(因此自由度差为零),并且您不会认为完整模型中的x1参数与“精简”模型中的x2[-3.2532,-0.6843):x1[-0.6973,-0.0347)参数具有相同的系数寻找x1效果,即0.19729。交叉算子基本上是在所有缺少的单元格中填充具有交互结果的主要效果。

如果要保持在公认的统计实践的范围内,那么在没有所有主要影响的情况下查看交互模型的价值很小。

如果您输入:

fit_full

...您应该获得模型的摘要,该模型具有x1级,x2级和交互级的p值。因为您选择了按四个任意切点对它们进行分类,所以最终将得到总共15个参数估计值。相反,如果您不进行任何切割并为线性效果和线性线性交互建模,则可以直接获得三个p值。我猜想人们怀疑效果不是线性的,如果这样的话,我认为三次样条曲线模型可能更简化,并且将生物现实扭曲的程度小于离散化为4个不相交的水平。如果您认为影响可能是非线性的但是有序的,则有因子分类变量的有序版本,但是结果通常与未初始化的变量混淆。

答案 1 :(得分:0)

来自42-的答案是有用的,但是阅读后,我仍然不知道如何确定这三个p值,或者根本不可能。因此,我和我大学的生物统计学教授进行了交谈。他的回答很简单,如果其他人有类似的问题,我也愿意分享。

在此设计中,无法确定x1,x2及其相互作用的整体效果的三个p值。如果我们想知道三个整体效果的p值,则需要保持连续变量不变。但是将变量分为几组会回答一个不同的问题,因此,无论使用哪种统计模型,我们都无法检验总体影响的假设。