您的问题中缺少的信息是如何在您的表格中定义关联或缺乏关联。这将是任何通用解决方案的特定案例部分。
我假设您最终要分析的“表格”包含按两个因素分类的汇总数据。
generateData <- function(nRow, nCol, f, ...) {
df <- tibble() %>%
expand(
Row=1:nRow,
Col=1:nCol
)
df <- df %>%
f(...) %>%
pivot_wider(
names_from=Col,
values_from=Value,
names_prefix="Col"
)
return(df)
}
这里,nCol 和 nRow 具有明显的含义,f 是一个必须定义的函数,它在一个长标题中填充一个名为 Value 的列,其中包含名为 Row 和 @987654327 的列@。省略号... 允许您在需要时将任意附加参数传递给f。
要生成在行和列之间没有关联的表,只需用随机数据填充Value。例如:
randomCells <- function(df, ...){
df %>% mutate(Value=5 + floor(runif(df %>% nrow(), max=10)))
}
这样
x <- generateRawData(3, 5, randomCells)
x
# A tibble: 3 x 6
Row Col1 Col2 Col3 Col4 Col5
<int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 9 11 11 14 8
2 2 13 11 12 5 14
3 3 8 11 14 13 10
和
chisq.test(as.matrix(x))
Pearson's Chi-squared test
data: as.matrix(x)
X-squared = 8.8907, df = 10, p-value = 0.5425
现在假设您想要跨列的线性趋势,但行之间没有关联:
linearColumns <- function(df, ...){
df %>% mutate(Value=4*Col + floor(runif(df %>% nrow(), max=25)))
}
x <- generateRawData(3, 6, linearColumns)
x
# A tibble: 3 x 6
Row Col1 Col2 Col3 Col4 Col5
<int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 20 12 31 24 46
2 2 9 25 39 46 38
3 3 6 20 35 36 49
给予
chisq.test(as.matrix(x))
Pearson's Chi-squared test
data: as.matrix(x)
X-squared = 22.63, df = 10, p-value = 0.0122
你只需要定义f 来给出你想要的模式。在更复杂的情况下,在实验单元级别定义响应可能更容易,然后聚合观察到的数据以形成您的模拟数据。
抱歉,在生成示例之前我忘了set.seed()。