table1 中的 P 值列 - 使用 table1 函数
P-value column in table1 - using table1 function
注意 - 我指的是 "table1" 函数,而不是 "tableOne"
如您所知,table1 包将数据汇总到 table 中,方法是将一些变量与所有其他变量进行比较(例如男性与女性的数量——吸烟、吸毒等。 .)
这里有关于 table1 函数的非常好的指南。
https://cran.r-project.org/web/packages/table1/vignettes/table1-examples.html
在上面 link 站点的最低部分,您可以看到作者使用技巧制作 p 值列,因为该命令未内置到 table1 中。问题是他的代码没有问题,因为他只处理 "male" 和 "female" (2 个变量)..我试图用 4 个变量来做。
我正在调整它以便它可以使用我的变量,我收到错误并需要帮助
错误
“参数不是数字或逻辑:返回 NACalling var(x) 对因子 x 已弃用,将成为错误。
在 if (stderr < 10 * .Machine$double.eps * max(abs(mx), abs(my))) stop("data are essentially constant") :
TRUE/FALSE 需要的缺失值
a <- c(0,13.3,14.0,14.7,15.8,999.0)
dat1$RDWquintiles<-cut(dat1$RDW_pre,a,include.lowest = TRUE)
z <- levels(dat1$RDWquintiles)
dat1$RDWquintiles <- factor(dat1$RDWquintiles,levels=c(z,factor("P-value")),labels=c("0,13.3","13.3,14","14,14.7","14.7,15.8","15.8,999","P-values" ))
dat1$RDWquintiles
table(dat1$RDWquintiles)
rndr <- function(x, name, ...) {
if (length(x) == 0) {
y <- dat1[[name]]
s <- rep("", length(render.default(x=y, name=name, ...)))
if (is.numeric(y)) {
p <- t.test(y, dat1$RDWquintiles)$p.value
} else {
p <- chisq.test(table(y, droplevels(dat1$RDWquintiles)))$p.value
}
s[2] <- sub("<", "<", format.pval(p, digits=3, eps=0.001))
s
} else {
render.default(x=x, name=name, ... ,)
}
}
rndr.strat <- function(label, n, ...) {
ifelse(n==0, label, render.strat.default(label, n, ...))
}
table1(~ Age + Sex + LOS + Open + adm_PE |RDWquintiles,data=dat1, droplevels=F, render=rndr, render.strat=rndr.strat, overall=F)
您可能需要检查您的数据。我没有您的数据集,因此无法重现您的错误。我看到有 4 个组而不是 2 个进行比较的唯一问题是您不能对连续变量使用 T 检验,您需要选择适当的检验,如 ANOVA 或 Kruskal-Wallis 来得出 P 值(通常, P 值取决于所使用的测试;选择合适的测试是一个重要的考虑因素,但不在当前问题的范围内)。
这里我改编了vignette的例子(我不重复整个代码,只重复相关的变化):
lalonde$age.quartiles <- eqcut(lalonde$age, 4, varlabel="Age")
lalonde$age.quartiles <- factor(lalonde$age.quartiles,
levels=c(levels(lalonde$age.quartiles), "P-value"))
rndr <- function(x, name, ...) {
if (length(x) == 0) {
y <- lalonde[[name]]
s <- rep("", length(render.default(x=y, name=name, ...)))
if (is.numeric(y)) {
p <- kruskal.test(y ~ lalonde$age.quartiles)$p.value
} else {
p <- chisq.test(table(y, droplevels(lalonde$age.quartiles)))$p.value
}
s[2] <- sub("<", "<", format.pval(p, digits=3, eps=0.001))
s
} else {
render.default(x=x, name=name, ...)
}
}
table1(~ black + hispan + married + nodegree + re74 + re75 + re78 | age.quartiles,
data=lalonde, droplevels=F, render=rndr, render.strat=rndr.strat, overall=F)
注意:这不是原始问题的一部分,但我想我会提到 table1
包包含函数 eqcut
,可以方便地用于创建大小相等的组,例如作为三分位数、四分位数等
注意 - 我指的是 "table1" 函数,而不是 "tableOne"
如您所知,table1 包将数据汇总到 table 中,方法是将一些变量与所有其他变量进行比较(例如男性与女性的数量——吸烟、吸毒等。 .)
这里有关于 table1 函数的非常好的指南。
https://cran.r-project.org/web/packages/table1/vignettes/table1-examples.html
在上面 link 站点的最低部分,您可以看到作者使用技巧制作 p 值列,因为该命令未内置到 table1 中。问题是他的代码没有问题,因为他只处理 "male" 和 "female" (2 个变量)..我试图用 4 个变量来做。
我正在调整它以便它可以使用我的变量,我收到错误并需要帮助
错误
“参数不是数字或逻辑:返回 NACalling var(x) 对因子 x 已弃用,将成为错误。 在 if (stderr < 10 * .Machine$double.eps * max(abs(mx), abs(my))) stop("data are essentially constant") : TRUE/FALSE 需要的缺失值
a <- c(0,13.3,14.0,14.7,15.8,999.0)
dat1$RDWquintiles<-cut(dat1$RDW_pre,a,include.lowest = TRUE)
z <- levels(dat1$RDWquintiles)
dat1$RDWquintiles <- factor(dat1$RDWquintiles,levels=c(z,factor("P-value")),labels=c("0,13.3","13.3,14","14,14.7","14.7,15.8","15.8,999","P-values" ))
dat1$RDWquintiles
table(dat1$RDWquintiles)
rndr <- function(x, name, ...) {
if (length(x) == 0) {
y <- dat1[[name]]
s <- rep("", length(render.default(x=y, name=name, ...)))
if (is.numeric(y)) {
p <- t.test(y, dat1$RDWquintiles)$p.value
} else {
p <- chisq.test(table(y, droplevels(dat1$RDWquintiles)))$p.value
}
s[2] <- sub("<", "<", format.pval(p, digits=3, eps=0.001))
s
} else {
render.default(x=x, name=name, ... ,)
}
}
rndr.strat <- function(label, n, ...) {
ifelse(n==0, label, render.strat.default(label, n, ...))
}
table1(~ Age + Sex + LOS + Open + adm_PE |RDWquintiles,data=dat1, droplevels=F, render=rndr, render.strat=rndr.strat, overall=F)
您可能需要检查您的数据。我没有您的数据集,因此无法重现您的错误。我看到有 4 个组而不是 2 个进行比较的唯一问题是您不能对连续变量使用 T 检验,您需要选择适当的检验,如 ANOVA 或 Kruskal-Wallis 来得出 P 值(通常, P 值取决于所使用的测试;选择合适的测试是一个重要的考虑因素,但不在当前问题的范围内)。
这里我改编了vignette的例子(我不重复整个代码,只重复相关的变化):
lalonde$age.quartiles <- eqcut(lalonde$age, 4, varlabel="Age")
lalonde$age.quartiles <- factor(lalonde$age.quartiles,
levels=c(levels(lalonde$age.quartiles), "P-value"))
rndr <- function(x, name, ...) {
if (length(x) == 0) {
y <- lalonde[[name]]
s <- rep("", length(render.default(x=y, name=name, ...)))
if (is.numeric(y)) {
p <- kruskal.test(y ~ lalonde$age.quartiles)$p.value
} else {
p <- chisq.test(table(y, droplevels(lalonde$age.quartiles)))$p.value
}
s[2] <- sub("<", "<", format.pval(p, digits=3, eps=0.001))
s
} else {
render.default(x=x, name=name, ...)
}
}
table1(~ black + hispan + married + nodegree + re74 + re75 + re78 | age.quartiles,
data=lalonde, droplevels=F, render=rndr, render.strat=rndr.strat, overall=F)
注意:这不是原始问题的一部分,但我想我会提到 table1
包包含函数 eqcut
,可以方便地用于创建大小相等的组,例如作为三分位数、四分位数等