在 r 中为数据帧生成一列概率

问题描述 投票:0回答:1

我有一个足球比赛的数据框

df
以及每支球队相应的平均得分率。前两列是主队和客队,第三列和第四列分别是主队和客队的平均得分率。例如:

       Home      Away HomeRate AwayRate
1   Arsenal   Bristol      1.3      1.3
2   Chelsea Newcastle      2.4      2.3
3 Liverpool     Leeds      3.3      1.7
4    Bolton    Fulham      2.1      2.5

我想生成 3 个新列,“HomeWin”、“Draw”、“AwayWin”,分别为每场比赛提供主场获胜、平局、客场获胜的泊松概率,并将这些列添加到我的数据框中。我假设事件是独立的。

我可以单独为每场比赛手动执行此操作。但我不知道如何同时对整个表执行此操作。 以第二行为例(切尔西 vs 纽卡斯尔)。我可以创建一个概率矩阵,其中包含切尔西和纽卡斯尔之间每个比分线的概率(0-0、0-1 0-2 等):

H <- c(dpois(0:20, df[2,3]), ppois(20, df[2,3], lower.tail=FALSE))
A <- c(dpois(0:20, df[2,4]), ppois(20, df[2,3], lower.tail=FALSE))
ProbMatrix = outer(H, A)

在上面的块中,

df[2,3]
是切尔西平均得分率,
df[2,4]
是纽卡斯尔平均得分率,我假设每方可能进球的最大数量是20(因此我使用
dpois(0:20)
ppois(20)
)在上面,让概率总和尽可能接近1。

然后我可以简单地对上面矩阵的各个元素求和来生成主场、客场和平局获胜概率:

Prob_Home_Win = sum(ProbMatrix[lower.tri(ProbMatrix)])
Prob_Away_Win = sum(ProbMatrix[upper.tri(ProbMatrix)])
Prob_Draw = sum(diag(ProbMatrix))

但是我怎样才能有效地生成整个 HomeWin、AwayWin 和 Draw 列,从而生成

df
中每场比赛的概率?

r dataframe loops matrix poisson
1个回答
0
投票

apply
data.frame 的函数,例如像这样:

win_rate <- function(goal_rates) {
  H <- c(dpois(0:20, goal_rates[1]), ppois(20, goal_rates[1], lower.tail=FALSE)
  # !! note goal_rates[1] for `ppois`, not sure if you had a typo...
  A <- c(dpois(0:20, goal_rates[2]), ppois(20, goal_rates[2], lower.tail=FALSE)) 

  ProbMatrix = outer(H, A)
  Prob_Home_Win = sum(ProbMatrix[lower.tri(ProbMatrix)])
  Prob_Away_Win = sum(ProbMatrix[upper.tri(ProbMatrix)])
  Prob_Draw = sum(diag(ProbMatrix))

  return(c(Prob_Home_Win, Prob_Away_Win, Prob_Draw))
}
results <- apply(df[3:4], 1, win_rate) |> 
   t() |> as.data.frame() |> setNames(c('HomeWin', 'HomeLoss', 'Draw'))

cbind(df, results)
       Home      Away HomeRate AwayRate   HomeWin  HomeLoss      Draw
1   Arsenal   Bristol      1.3      1.3 0.3680430 0.3680430 0.2639140
2   Chelsea Newcastle      2.4      2.3 0.4231169 0.3873484 0.1895347
3 Liverpool     Leeds      3.3      1.7 0.6870952 0.1676645 0.1452403
4    Bolton    Fulham      2.1      2.5 0.3335564 0.4774577 0.1889859
© www.soinside.com 2019 - 2024. All rights reserved.