库“ TableOne”的多个比较。逐行计算p值

时间:2018-08-26 09:16:43

标签: r statistics comparison p-value demographics

我收到了一位审阅者的评论,他希望在人口统计特征表(表1)中包含每行特定变量水平的所有p值。即使这个请求对我来说似乎很奇怪(而且不精确),但我还是同意他的建议。

    library(tableone)
## Load data
library(survival); data(pbc)

# drop ID from variable list
vars <- names(pbc)[-1]

## Create Table 1 stratified by trt (can add more stratifying variables)
tableOne <- CreateTableOne(vars = vars, strata = c("trt"), data = pbc, factorVars = c("status","edema","stage"))

print(tableOne, nonnormal = c("bili","chol","copper","alk.phos","trig"), exact = c("status","stage"),  smd = TRUE)

输出: enter image description here

我需要具有Bonferroni校正的变量statusedemastage的每个级别的p值。我经历了documentation,但没有成功。 另外,使用卡方比较行之间的样本大小是否正确?

更新:

我不确定我的方法是否正确,但是我想与您分享。我为变量status生成了每个阶层的虚拟变量,然后计算了chisq

    library(tableone)
    ## Load data
    library(survival); data(pbc)

    d <- pbc[,c("status", "trt")]

    # Convert dummy variables
    d$status.0 <- ifelse(d$status==0, 1,0)
    d$status.1 <- ifelse(d$status==1, 1,0)
    d$status.2 <- ifelse(d$status==2, 1,0)

t <- rbind(    
    chisq.test(d$status.0, d$trt),
    # p-value = 0.7202

    chisq.test(d$status.1, d$trt),
    # p-value = 1

    chisq.test(d$status.2, d$trt)
    #p-value = 0.7818
)
t

BONFERRONI ADJ进行多次比较:

p <- t[,"p.value"]

p.adjust(p, method = "bonferroni")

1 个答案:

答案 0 :(得分:0)

这个问题是前一段时间发布的,所以我想你已经回答了审稿人。

我真的不明白为什么只为三个变量计算调整后的p值。实际上,调整p值取决于进行比较的次数。如果您将p.adjust()与3个p值的向量一起使用,则不会真正根据比较的结果来“调整”结果(您确实做了十二个以上!)

我展示了如何提取所有p值,以便您可以计算调整后的值。 要从软件包tableOne中提取pValue,有一种方法可以调用对象属性(首先说明),有两种快速而肮脏的方法(在底部)。< / p>

要提取它们,首先我复制您的代码以创建tableOne:

library(tableone)
## Load data
library(survival); data(pbc)

# drop ID from variable list
vars <- names(pbc)[-1]

## Create Table 1 stratified by trt (can add more stratifying variables)
tableOne <- CreateTableOne(vars = vars, strata = c("trt"), data = pbc, factorVars = c("status","edema","stage"))

您可以通过attributes()来查看“ tableOne”对象的内容

attributes(tableOne)

您可以看到一个表通常一个表用于连续和分类变量。您也可以在其中使用attributes()

attributes(tableOne$CatTable)
# you can notice $pValues

现在您知道pValue的“位置”,您可以使用attr()

提取它们。
attr(tableOne$CatTable, "pValues")

与数字变量类似的东西

attributes(tableOne$ContTable)
# $pValues are there
attr(tableOne$ContTable, "pValues")

您具有Normal和NonNormal变量的pValue。 如前所述,您可以同时提取它们

mypCont <- attr(tableOne$ContTable, "pValues") # put them in an object
nonnormal = c("bili","chol","copper","alk.phos","trig") # copied from your code

mypCont[rownames(mypCont) %in% c(nonnormal), "pNonNormal"] # extract NonNormal

"%!in%" <- Negate("%in%")
mypCont[rownames(mypCont) %!in% c(nonnormal), "pNonNormal"] # extract Normal

所有这些,并提取了您的pValues,我认为有两种更方便​​快捷的方法来完成此操作:

快速而肮脏的方法A :将dput()与已打印的tableOne一起使用。然后在控制台中搜索pValue所在的位置,并将其复制粘贴到脚本中,以将其存储在对象中

快速而肮脏的方式B :如果您在tableOne vignette中查看“导出”部分,则可以使用print(tableOne, quote = TRUE),然后将其复制并粘贴到电子表格中(例如LibreOffice,Excel ...)。 然后,我将选择带有pValue的列,对其进行转置,然后将其返回给R,以使用p.adjust()计算调整后的p值,然后将其复制回电子表格以进行日记提交