R语言条件概率计算函数的批量应用与扩展实现问询
R语言考试条件概率计算解决方案
数据预处理
首先建议一次性生成exam_number字段,避免在函数中重复计算,提升效率:
# 为每个学生的考试生成编号 my_data$exam_number <- ave(seq_len(nrow(my_data)), my_data$id, FUN = seq_along)
需求1:批量计算所有连续考试组合的条件概率
遍历所有存在的连续考试对(n, n+1),分别计算当前考试为PASS/FAIL时,下一次考试的通过/不及格概率。
实现代码
# 批量计算连续考试条件概率的函数 batch_continuous_probs <- function(data) { # 获取所有存在的考试编号 exam_nums <- sort(unique(data$exam_number)) # 筛选出有对应下一次考试的编号 valid_n <- exam_nums[exam_nums < max(exam_nums)] # 初始化结果存储数据框 result_df <- data.frame( current_exam = integer(), current_result = character(), next_pass_prob = numeric(), next_fail_prob = numeric(), stringsAsFactors = FALSE ) for(n in valid_n) { # 提取当前第n次和第n+1次考试数据 current_exam_data <- data[data$exam_number == n, ] next_exam_data <- data[data$exam_number == n+1, ] # 按学生ID合并两次考试数据 merged_data <- merge(current_exam_data, next_exam_data, by = "id", suffixes = c("_current", "_next")) # 分别计算当前结果为PASS和FAIL时的条件概率 for(res in c("PASS", "FAIL")) { subset_data <- merged_data[merged_data$results_current == res, ] total <- nrow(subset_data) if(total == 0) { # 无对应数据时概率设为NA pass_prob <- NA fail_prob <- NA } else { pass_count <- sum(subset_data$results_next == "PASS") pass_prob <- pass_count / total fail_prob <- 1 - pass_prob } # 写入结果 result_df <- rbind(result_df, data.frame( current_exam = n, current_result = res, next_pass_prob = pass_prob, next_fail_prob = fail_prob, stringsAsFactors = FALSE )) } } return(result_df) } # 调用函数获取结果 continuous_probs_result <- batch_continuous_probs(my_data) # 查看前几行结果示例 head(continuous_probs_result)
结果说明
返回的continuous_probs_result数据框包含所有连续考试对(如1→2、2→3等),以及当前考试为PASS/FAIL时,下一次考试的通过/不及格概率。
需求2:基于前两次考试结果计算第三次考试的条件概率
通过关联每个学生的前两次考试结果,统计不同结果组合下第三次考试的概率分布。
实现代码
# 基于前两次结果计算第三次考试概率的函数 two_step_probs <- function(data) { # 使用dplyr处理分组移位操作,需提前安装包:install.packages("dplyr") library(dplyr) # 为每条记录关联前一次、前两次的考试结果 data_with_prev <- data %>% group_by(id) %>% mutate( prev_result = lag(results, 1), # 前一次考试结果 prev_prev_result = lag(results, 2) # 前两次考试结果 ) %>% ungroup() # 筛选出有完整前两次结果的记录(至少是第3次考试) valid_data <- data_with_prev[!is.na(data_with_prev$prev_prev_result) & !is.na(data_with_prev$prev_result), ] # 统计不同前两次结果组合下的第三次考试概率 result_summary <- valid_data %>% group_by(prev_prev_result, prev_result) %>% summarise( total_samples = n(), pass_count = sum(results == "PASS"), pass_prob = pass_count / total_samples, fail_prob = 1 - pass_prob, .groups = "drop" ) return(result_summary) } # 调用函数获取结果 two_step_probs_result <- two_step_probs(my_data) # 查看所有组合的概率 print(two_step_probs_result)
结果说明
返回的two_step_probs_result包含所有可能的前两次考试结果组合(如PASS+PASS、PASS+FAIL等),以及对应第三次考试的通过/不及格概率,同时给出了每个组合的样本量。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

