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 创建
我在 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 创建