【发布时间】:2021-12-04 02:55:20
【问题描述】:
我正在使用 R 编程语言。我有一个数据集,其中包含一个人的身高以及他们是否打篮球。
我想看看平均而言,80% 以上(身高)的人是否会打篮球。
为此,我:
- 我将数据随机分成 70% 组(训练)和 30% 组(测试)
- 我计算了训练组的第 80 个百分位:使用这个第 80 个百分位,我看到测试组中有多少人打篮球
- 我计算出我的平均准确度(在测试组中)
- 我多次重复此过程(例如 100 次)并计算总平均值。
这里是为这个例子生成数据的 R 代码:
set.seed(123)
height <- rnorm(1000,210,5)
status <- c("basketball", "not_basketball")
basketball_status <- as.character(sample(status, 1000, replace=TRUE, prob=c(0.80, 0.20)))
data_1 <- data.frame(height, basketball_status)
height <- rnorm(1000,190,1)
status <- c("basketball", "not_basketball")
basketball_status <- as.character(sample(status, 1000, replace=TRUE, prob=c(0.8, 0.2)))
data_2 <- data.frame(height, basketball_status)
height <- rnorm(1000,170,5)
status <- c("basketball", "not_basketball")
basketball_status <- as.character(sample(status, 1000, replace=TRUE, prob=c(0.20, 0.80)))
data_3 <- data.frame(height, basketball_status)
my_data <- rbind(data_1, data_2, data_3)
这是迭代过程:
library(dplyr)
results <- list()
for (i in 1:100) {
train_i<-sample_frac(my_data, 0.7)
sid<-as.numeric(rownames(train_i))
test_i<-my_data[-sid,]
quantiles = data.frame( train_i %>% summarise (quant_1 = quantile(height, 0.80)))
test_i$basketball_pred = as.character(ifelse(test_i$height > quantiles$quant_1 , "basketball", "not_basketball" ))
test_i$accuracy = ifelse(test_i$basketball_pred == test_i$basketball_status, 1, 0)
results_tmp = data.frame(test_i %>%
dplyr::summarize(Mean = mean(accuracy, na.rm=TRUE)))
results_tmp$iteration = i
results_tmp$total_mean = mean(test_i$accuracy)
results[[i]] <- results_tmp
}
results
results_df <- do.call(rbind.data.frame, results)
但是当我运行迭代过程时,所有平均值看起来都一样:
head(results_df)
Mean iteration total_mean
1 0.8344444 1 0.8344444
2 0.8344444 2 0.8344444
3 0.8344444 3 0.8344444
4 0.8344444 4 0.8344444
5 0.8344444 5 0.8344444
6 0.8344444 6 0.8344444
问题:有人知道为什么会这样吗?
谢谢
【问题讨论】:
标签: r function loops dplyr data-manipulation