Столбец P-значения в table1 - с помощью функции table1 - PullRequest
0 голосов
/ 01 марта 2019

ПРИМЕЧАНИЕ - я имею в виду функцию «table1», а не «tableOne»

Как вы, возможно, знаете, пакет table1 суммирует данные в таблицу, помещая некоторую переменную во все остальные (например, сколько мужчин против женщин)- курили, получали наркотики и т. д.)

Очень хорошие рекомендации по поводу функции table1 здесь.

https://cran.r -project.org / web / packages / table1 / vignettes/table1-examples.html

В самой нижней части сайта ссылок выше вы можете увидеть писателя, создающего столбец p-значения, используя трюк, поскольку команда не встроена в table1.Дело в том, что с его кодом нет проблем, поскольку он имеет дело только с «мужским» и «женским» (2 переменные) .. и я пытаюсь сделать это с 4 переменными.

Я подгоняю его так, чтобы онмогу использовать мои переменные, я получаю ошибку и нуждаюсь в помощи

ОШИБКА

"Аргумент не числовой или логический: возврат NACalling var (x) для множителя x устарел и станет ошибкой.Используйте что-то вроде 'all (duplicated (x) [- 1L])', чтобы проверить постоянный вектор. Ошибка в if (stderr <10 * .Machine $ double.eps * max (abs (mx), abs (my))) stop («данные по существу постоянны»): пропущенное значение там, где требуется ИСТИНА / ЛОЖЬ »</p>

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("<", "&lt;", 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)

1 Ответ

0 голосов
/ 02 марта 2019

Возможно, вам придется проверить ваши данные.У меня нет вашего набора данных, поэтому я не могу воспроизвести вашу ошибку.Единственная проблема, которую я вижу, имея 4 группы для сравнения вместо 2, это то, что вы не можете использовать T-тест для непрерывных переменных, вам нужно выбрать подходящий тест, такой как ANOVA или Kruskal-Wallis, чтобы получить P-значение (в общемзначение P зависит от используемого теста; выбор подходящего теста является важным фактором, но выходит за рамки текущего вопроса).

Здесь я адаптировал пример из виньетки (Я не повторяю весь код, только соответствующие изменения):

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("<", "&lt;", 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, которую удобно использовать для создания групп одинакового размера, таких как тертили, квартили и т. д.

...