Использование tabular(){tables: как определить функцию (например, для значения p) для нескольких выборок?

Мне часто приходится создавать таблицы, содержащие, например, среднее значение, стандартное отклонение и результат простого теста. Чтобы иметь воспроизводимый и общедоступный рабочий процесс, я попытался сделать это с помощью tables::tabular . (См. здесь о том, как включить тест как функцию.)

Это работает:

nicetable <- tabular(sampling~treatment*var1*(mean+sd), data=tab)

Однако мне не удалось определить функцию, например, для парного знакового рангового теста Уилкоксона для сравнения методов лечения в случае множественной выборки: похоже, я не могу передать функции правильные аргументы или данные.

Кто-нибудь, кто менее глуп, чем я, может помочь?

Вот некоторые данные для воспроизводимости, если вам интересно:

structure(list(plot = structure(c(6L, 9L, 6L, 9L, 6L, 9L, 6L, 
9L, 12L, 15L, 12L, 15L, 12L, 15L, 12L, 15L, 5L, 16L, 5L, 16L, 
5L, 16L, 5L, 16L, 8L, 17L, 8L, 17L, 8L, 17L, 8L, 17L, 4L, 10L, 
4L, 10L, 4L, 10L, 4L, 10L, 2L, 11L, 2L, 11L, 2L, 11L, 2L, 11L, 
3L, 13L, 3L, 13L, 3L, 13L, 3L, 13L, 1L, 14L, 1L, 14L, 1L, 14L, 
1L, 14L, 24L, 19L, 24L, 19L, 24L, 19L, 24L, 19L, 22L, 23L, 22L, 
23L, 22L, 23L, 22L, 23L, 20L, 21L, 20L, 21L, 20L, 21L, 20L, 21L, 
7L, 18L, 7L, 18L, 7L, 18L, 7L, 18L), .Label = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "18", "19", "20", "21", "22", "23", "24"), class = "factor"), 
    sampling = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 
    1L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 
    1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 
    4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 
    4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 
    3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 
    3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), .Label = c("1", 
    "2", "3", "4"), class = "factor"), pairs = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 
    6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 
    8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 
    10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
    11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L), .Label = c("pair_1", 
    "pair_10", "pair_11", "pair_12", "pair_2", "pair_3", "pair_4", 
    "pair_5", "pair_6", "pair_7", "pair_8", "pair_9"), class = "factor"), 
    treatment = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("A", 
    "B"), class = "factor"), var1 = c(4, 6, 21, 11, 6, 11, 21, 
    16, 2, 5, 18, 18, 8, 5, 26, 24, 0, 4, 28, 26, 7, 11, 20, 
    29, 1, 4, 17, 28, 20, 11, 20, 24, 11, 8, 19, 15, 11, 10, 
    16, 17, 7, 4, 18, 21, 6, 6, 18, 16, 7, 2, 17, 15, 3, 12, 
    18, 26, 8, 5, 23, 17, 9, 8, 24, 20, 7, 7, 1, 17, 9, 10, 7, 
    0, 0, 5, 18, 0, 8, 10, 15, 17, 5, 7, 24, 19, 13, 8, 20, 17, 
    1, 2, 22, 19, 6, 8, 17, 13), var2 = c(0.531857406453951, 
    0.99147016935005, 0.978386084625517, 0.547701177005542, 0.557590884845267, 
    0.986951076487171, 0.562417675727868, 0.986951076487171, 
    0.483984835736487, 0.726909676798849, 0.388579012270421, 
    0.745553604701919, 0.465094116634877, 0.726909676798849, 
    0.488003757207879, 0.557184406817338, 0.701676487711027, 
    0.869080260649975, 0.720173845681177, 0.750917673793786, 
    0.755303408639525, 0.506987878760014, 0.686245881868453, 
    0.60763119427203, 0.548453587721443, 0.703832816328718, 0.412731402996848, 
    0.717973047643672, 0.550210159561483, 0.671791216125084, 
    0.361548563337832, 0.606668062640702, 0.518806412571116, 
    0.742554357381421, 0.507677339941509, 0.923200219631054, 
    0.341071242549443, 0.681636160803754, 0.384435345144425, 
    0.61998338971563, 0.557812388143911, 0.632317782224629, 0.603677751166685, 
    0.632317782224629, 0.624604514381939, 0.623183042284434, 
    0.589665731283708, 0.338738325837909, 0.448751068565499, 
    0.620695986589587, 0.412147458001507, 0.354008373981433, 
    0.444023865279733, 0.366742726110414, 0.368307839974067, 
    0.338054566392881, 0.492950438718815, 0.722825772176568, 
    0.529502336899605, 0.834207208644564, 0.523569852219379, 
    0.834207208644564, 0.591655754114154, 0.725359004030846, 
    0.604856790039767, 0.787389376103932, 0.491331714116263, 
    0.828838159960298, 0.506594233666576, 0.75537998521935, 0.477785779781003, 
    0.925304881641062, 0.425400499022199, 0.537980402016095, 
    0.443113792876767, 0.991210220561304, 0.366372451776005, 
    0.585051630458758, 0.363869227771921, 0.67007984346546, 0.37054162796269, 
    0.574771389575503, 0.446535654066238, 0.700306153200489, 
    0.358793598876081, 0.309159322200134, 0.372983177758783, 
    0.353384010493424, 0.492456412584678, 0.359873708654463, 
    0.436447650900556, 0.591291884661869, 0.436447650900556, 
    0.603360031882414, 0.453002902987777, 0.370462648444931)), .Names = c("plot", 
"sampling", "pairs", "treatment", "var1", "var2"), row.names = c(NA, 
96L), class = "data.frame")

person aae    schedule 22.07.2014    source источник
comment
Возможно, вам нужно написать sampling~I(wilcox_function(treatment))..., чтобы ваша функция была преобразована в формат formula (я просто для примера добавил фальшивое имя функции).   -  person Carl Witthoft    schedule 22.07.2014


Ответы (1)


Может помочь, если вы покажете, какой синтаксис вы хотели бы использовать и как должен выглядеть результат. Проблема с тем, как в настоящее время работает tabular, заключается в том, что он передает одиночный вектор (подмножество обрабатываемого столбца данных, соответствующее текущей ячейке таблицы) в итоговую функцию и никаких других аргументов. Но Wilcox.test и другим функциям тестирования требуется несколько аргументов, которые tabular в настоящее время не может передать.

Добавлена ​​возможность вычисления процентов (используя Percent в формуле), поэтому запрос функции к автору/мейнтейнеру может дать аналогичную возможность для тестов в будущем, но это будет намного сложнее со всеми возможными аргументами прошел в.

Вы можете создать свою собственную функцию с дополнительными аргументами, жестко закодированными, как в предыдущем ответе, но это может вызвать трудности с попыткой поддерживать воспроизводимый и совместно используемый рабочий процесс.

Другой вариант — предварительно вычислить p-значение и любые другие интересующие сводки и прикрепить их к фрейму данных, а затем просто включить термин в формулу, чтобы получить 1-й элемент вычисляемого столбца (столбцов). Вот пример, который использует ddply для выполнения вычислений и возвращает расширенный фрейм данных, а затем вызывает tabular для отображения:

library(plyr)

tab2 <- ddply(tab, .(sampling), function(df) {
    x <- df$var1
    g <- df$treatment
    df$P.value <- wilcox.test(x[g=='A'], x[g=='B'], paired=TRUE)$p.value
    df$diff <- x[g=='A'] - x[g=='B']
    df
})

` ` <- function(x) x[1]

tabular(sampling ~ treatment*var1*(mean+sd) + 
     ` `*diff +(Wilcoxon = ` `*P.value), data=tab2)

Это не так приятно, как возможность просто добавить термин в формулу для tabular, но вы можете контролировать, что именно вы хотите вычислить, а затем отобразить.

person Greg Snow    schedule 22.07.2014