R:自定义随机化测试函数来测试数据框中的变量

R: Custom randomization test function to test variables in a data frame

我在 R 中做一个赋值,我需要获取一个包含多个变量的数据框并创建一个 function() 来重新采样数据框中两个类别之间的绝对平均差。

为了我的问题,我将添加一个示例数据框:

Variable 1 Variable 2 Variable 3 Category
1 2 3 1
4 5 6 1
7 8 9 2
10 11 12 2

该函数需要接受三个参数:一个数值向量、数据框中的两个类别和 nsim(随机重采样的次数)。输出应该是一个长度为 nsim 的向量,带有重采样的绝对均值差。

这是我试过的函数,但在测试时输出总是“Nan”。

setseed(12345)
test<-function(x, category1, category2, nsim){
 resampled<-sample(df, size=length(nrow(df)), replace=F)
 category1.mean<-sum(df$x[resampled=="category1"])/length(df$x[resampled=="category1"])
 category2.mean<-sum(df$x[resampled=="category2"])/length(df$x[resampled=="category2"])
 return(abs(category1.mean-category2.mean)}

我不确定我是否误解了 function() 的工作原理,或者我是否误解了问题或数据,但我已经尝试了一些方法来尝试修复 Nan 输出而无需成功。

谁能帮帮我?

下面的代码使用 replicate 到 运行 nsim 次重采样和计算函数 f.

x<-'Variable1   Variable2   Variable3   Category
1   2   3   1
4   5   6   1
7   8   9   2
10  11  12  2'
df1 <- read.table(textConnection(x), header = TRUE)

test <- function(data, x, category1, category2, nsim){
  f <- function(data, x, category1, category2) {
    i <- sample(nrow(data), replace = TRUE)
    d <- data[i, ]
    j1 <- which(d[["Category"]] == category1)
    j2 <- which(d[["Category"]] == category2)
    v1 <- d[j1, x, drop = TRUE]
    v2 <- d[j2, x, drop = TRUE]
    diff_means <- if(length(v1) == 0 & length(v2) == 0) {
      NaN
    } else if(length(v1) == 0) {
      mean(v2)
    } else if(length(v2) == 0) {
      mean(v1)
    } else mean(v1) - mean(v2)
    abs(diff_means)
  }
  replicate(nsim, f(data, x, category1, category2))
}

set.seed(2022)

# amd: absolute mean differences
amd <- test(df1, "Variable1", 1, 2, nsim = 1e3)
hist(amd)

reprex package (v2.0.1)

于 2022-05-26 创建