You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:05:18