Hatena::ブログ(Diary)

驚異のアニヲタ社会復帰への道

Prima Project

2018-07-17

レプリカ交換法

読んだ。

Bayesian estimation of phase response curves. Neural Netw. 2010 Aug;23(6):752-63.

 

Phase response curve (PRC) という神経細胞の発火の記録を推定したいが、周期のズレや発火タイミングの変化などで普通にやったら推定が収束しないらしい。

レプリカ交換法は現時点でRstan では実装されていないので、コードをコンパイルしたものを使いまわして各iteration の最終サンプリング結果から取り出してきてやる方法がある。

StanとRでレプリカ交換MCMC(parallel tempering) を実行する - StatModeling Memorandum

 

曲線の推定は2階差分としてなめらかになるようにしている。prior に z_{j-1}-2z_j + z_{j+1}=(z_{j-1}-z_j)-(z_j-z_{j+1}) とする。

2018-07-03

MikuHatsune2018-07-03

VARで本当にPKが多くなっているのか

ロシアW杯でVAR が導入されたことにより、PK の数が多いような印象である。実際、予選リーグの時点で過去最高だとか、いろいろ言われている。毎日新聞によると

https://mainichi.jp/articles/20180703/ddm/035/050/161000c

VARは、得点▽PK▽レッドカード▽警告などの選手間違い−−の4項目に関わるものに適用されるが、1次リーグではPKに関わるものが最も多かった。VARによりPKが認められたケースは7件で、PK回数は24件。逆に、VARによってPKが取り消されたケースは2件あった。

 1大会で実施されたPKの最多記録18(1990年イタリア、98年フランス、2002年日韓大会)を既に更新している。このほか、レッドカードの扱いが覆ったケースが2件あった。

ということである。

しかし、PK というのは1試合中にそうそう起こることではないので、単純にポアソン分布に従うと考えられる。とすると、ポアソン分布の平均は¥lambda で、分散¥lambda であるので、いままでの平均を超えたからと言ってそんなに簡単に分布の裾にならないのである。

というわけでデータを取ってみる。RSSSF というサイトに2014から1930年大会の試合記録があって、そこにはPKでの得点だけではなく、PKの失敗(外した、セーブした)まで残っている。これを一生懸命見てみると、こんな感じのデータになる(ポアソン分布での解析をしたかったので、1試合中に複数回PKがあった場合も調べた)。

836試合で218回のPK があったようである。

year goal nogoal match pk2 pk3
2014 12 1 64 0 0
2010 9 6 64 1 0
2006 16 0 64 0 0
2002 13 5 64 1 0
1998 17 1 64 0 0
1994 15 0 52 0 0
1990 13 5 52 2 0
1986 12 4 52 1 0
1982 8 3 52 0 0
1978 12 2 38 0 0
1974 6 2 38 0 0
1970 5 0 32 0 0
1966 8 0 32 0 0
1962 8 1 32 0 0
1958 7 3 35 0 0
1954 7 1 26 0 0
1950 3 0 22 0 0
1938 3 2 18 0 0
1934 3 1 17 1 0
1930 1 3 18 0 1

 

さて、単純に、予選リーグ48試合で24回のPKがあったようなので、

poisson.test(c(24, sum(s1)), c(48, sum(s2)), alternative="greater")

	Comparison of Poisson rates

data:  c(24, sum(s1)) time base: c(48, sum(s2))
count1 = 24, expected count1 = 13.14, p-value = 0.003486
alternative hypothesis: true rate ratio is greater than 1
95 percent confidence interval:
 1.297443      Inf
sample estimates:
rate ratio 
  1.917431 

確かにPK は多いようである。

64試合すべて消化するまでに、何回PKがあれば有意に多そうだ、と言えるかというと、25回あると0.05 を下回る。

VAR によりPK が認められたのは予選リーグ48試合までで7回あるので、7回の上乗せ効果はやはりPK の回数増加に寄与してそうな感じはある。

g <- 0:40
pv <- mapply(function(z) poisson.test(c(z, sum(s1)), c(64, sum(s2)), alternative="greater")$p.value, g)

plot(g, pv, type="o", pch=15, xlab="1大会64試合中のPK回数", ylab="p value", lwd=3)
abline(h=0.05, lty=3)

f:id:MikuHatsune:20180703193751p:image

2018-06-25

MikuHatsune2018-06-25

W杯の試合観戦中にトイレはいついくべきか

こんなツイートを観測した。

 

ハーフタイムに水道使用料が増えているのがわかる。

試合中に離席すると一番盛り上がる得点シーンを見逃してしまうため、試合中はなかなかトイレやお風呂にいけない。

というわけで試合中に離席するにはどの時間帯が一番よいかを調べる。

 

高校サッカーの点差を解析したときと同様に、過去のW杯の試合結果から得点が入った時刻を取得する。ここで、1930年から2014年大会までの20大会(1942年と1946年は中止)について、836試合あり、得点シーンは2373だった(wikiのFIFA W杯のページをパースしたため、本当にそうなのかはわからない)。

1970年大会が6ゴール取得できてなかったようである。

1930 1934 1938 1950 1954 1958 1962 1966 1970 1974 1978 1982 1986 1990 1994 1998 2002 2006 2010 2014 
  70   70   84   88  140  126   89   89   89   97  102  146  132  115  141  171  161  147  145  171 

 

いつ得点が入るかをベタに分布をとると、高校サッカー選手権とほぼ同様で、どの時間帯でもほぼ一様な感じである。ただし、アディショナルタイムはすべて45分もしくは90分に換算しており、後半90分はほかの時間帯に比べて突出して得点が入っているので、試合終了間際は離席せずに見届けたほうがよい。

前半では全体の44%、後半では56% の得点が分布するので、どちらかというと前半のほうに離席するのがよい。

f:id:MikuHatsune:20180625210132p:image

 

ある時間帯に得点が入ってから、次の得点が入るまでの時間の分布は、ガンマ分布のようになる。このため、ガンマ分布で推定すると、パラメータ(1.266, 0.0554) をもつ以下のようなガンマ分布になる。

得点が入ってから17分間で、50% の確率で次の点がはいるようなので、得点が入った直後は油断しないほうがよい。

f:id:MikuHatsune:20180625210136p:image

 

ある時間帯にN点差がついているときに、そのままリードして試合終了する確率も選手権の解析と同様にしてみたが、ほとんど高校サッカーと同じ結果になった。試合終了間際まで1点リードしているとき、劇的ゴールで追いつくのは2.4% しかない(89分時点で1点リードしてそのまま90分=試合終了までリードを保つ確率が97.6%)。

勝ったな(確信)と思って風呂にはいったり寝たりするのは、90%の確信度でいくならば1点差なら後半75分あたり、2点差なら前半30分あたりでよい。

f:id:MikuHatsune:20180625210139p:image

 

今回のデータ取りはstringr を使ってR 内で完結させた。

# データとり
# wiki から
# W杯のトップページより、各グループステージ、決勝トーナメントの
# ページからデータをパースするほうが、フォーマットが整っていて効率がよい

url <- NULL
y1 <- seq(2014, 1998, -4)
lab <- c(sprintf("_Group_%s", LETTERS[1:8]), "_knockout_stage")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))

y1 <- seq(1994, 1986, -4)
lab <- c(sprintf("_Group_%s", LETTERS[1:6]), "_knockout_stage")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))

y1 <- 1982
lab <- c(sprintf("_Group_%s", c(1:6, LETTERS[1:4])), "_knockout_stage")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))

y1 <- c(1978, 1974)
lab <- c(sprintf("_Group_%s", c(1:4, LETTERS[1:2])), "_knockout_stage")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))

y1 <- c(seq(1970, 1954, -4), 1930)
lab <- c(sprintf("_Group_%s", 1:4), "_knockout_stage")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))

y1 <- 1950
lab <- c(sprintf("_Group_%s", 1:4), "_final_round")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))

y1 <- c(1938, 1934)
lab <- c(sprintf("_Group_%s", 1:4), "_final_tournament")
url <- c(url, mapply(function(z) sprintf("https://en.wikipedia.org/wiki/%d_FIFA_World_Cup%s", z, lab), y1))
write(url, "list.txt")

# パース
library(stringr)
fi <- list.files(pattern="FIFA")
Res <- NULL
g <- 0
for(f in fi){
  txt <- readLines(f)
  flag <- c("score"=0, "right"=1)
  res <- NULL
  for(tmp in txt){
    #if(str_detect(tmp, "<th style.*\\d+&#8211;\\d+.*</th>")){
    if(str_detect(tmp, "<th style.*&#8211;.*</th>")){ # 1986年のグループステージが半角スペースがあっておかしい
      flag["score"] <- 1
      goaltime <- vector("list", 2)
    }
    if(flag["score"] == 1){
      if(str_detect(tmp, "[\\d+]+'")){
        goaltime[[ flag["right"] ]] <- c(goaltime[[ flag["right"] ]], gsub("'", "", str_extract_all(tmp, "[\\d+]+'")[[1]]))
      }
      if(str_detect(tmp, "Report")){
        flag["right"] <- 2
      }
      if(str_detect(tmp, "</table>")){
        res <- c(res, list(goaltime))
        flag <- c("score"=0, "right"=1)
      }
    }
  }
  year <- as.numeric(str_extract(f, "\\d+"))
  for(i in seq(res)){
    g <- g + 1
    for(j in seq(res[[i]])){
      for(k in res[[i]][[j]]){
        l <- as.numeric(strsplit(k, "\\+")[[1]])
        hoge <- c(year, g, j, l, rep(0, 2-length(l)))
        Res <- rbind(Res, hoge)
      }
    }
  }
}
colnames(Res) <- c("year", "gameID", "HA", "time", "extra")
# 解析
dat <- read.table("score.txt", header=TRUE)
# 試合数の確認
Ngame <- c(18, 17, 18, 22, 26, 35, rep(32, 3), 38, 38, rep(52, 4), rep(64, 5))
mapply(function(z) length(unique(z$gameID)), split(dat, dat$year))

# 得点時間分布
sb <- subset(dat, time <= 90)
t1 <- 1:45
t2 <- 46:90
tab <- table(factor(sb$time, c(t1, t2)))/nrow(sb) * 100

cols <- c("red", "green")
par(mar=c(5, 5, 2, 2), cex.lab=1.6, cex.main=2)
b <- barplot(tab, col=c(mapply(rep, cols, each=sapply(list(t1, t2), length))), las=1, main="得点時間分布", ylab="頻度[%]", ylim=c(0, 3))
mtext("前半(分)", 1, line=3, at=mean(t1))
mtext("後半(分)", 1, line=3, at=mean(t2)+15)

# 得点間隔
sb <- dat
Tgoal <- lapply(split(sb$time, sb$gameID), sort)
difftime <- lapply(Tgoal, function(z) tail(c(0, z), -1) - head(c(0, z), -1))
difftime <- unlist(difftime)

library(rstan)
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())

# ガンマ分布による得点時間間隔
code <- "
data{
  int N;
  vector<lower=0>[N] Time;
}
parameters{
  real<lower=0, upper=50> p[2];
}
model{
  Time ~ gamma(p[1], p[2]);
}
"

m <- stan_model(model_code=code)
standata <- list(N=length(difftime), Time=difftime)
fit <- sampling(m, data=standata, iter=6000, warmup=1500, seed=1234)
ex <- extract(fit)

tab <- table(factor(difftime, 0:max(difftime)))/length(difftime) * 100
b <- barplot(tab, las=1)
ps <- apply(ex$p, 2, median)
x0 <- seq(0, max(difftime), length=1000)
y0 <- dgamma(x0, ps[1], ps[2])

alpha <- c(0.25, 0.5, 0.75, 0.9)
d0 <- c(5, 0.2)
par(mar=c(5, 5, 2, 2), cex.lab=1.6, cex.main=2)
plot(tab, xlab="前の得点からの経過時間(分)", ylab="頻度[%]", las=1)
lines(x0, y0*100, col=2, lwd=3)
for(i in seq(alpha)){
  x1 <- qgamma(alpha[i], ps[1], ps[2])
  y1 <- dgamma(x1, ps[1], ps[2])*100
  arrows(x1+d0[1], y1+d0[2], x1, y1, length=0.1, lwd=3, col=4)
  points(x1, y1, pch=16, col=4)
  text(x1+d0[1], y1+d0[2], sprintf("%2d %s (%.1f min)", alpha[i]*100, "%", x1), pos=4)
  title("次の得点の時間の分布")
}

# 得点差勝利確率
sb <- subset(dat, time <= 90)
mat <- mat0 <- mat1 <- mat2 <- matrix(0, max(dat$gameID), 90)
idx <- c(1, -1)
for(i in unique(sb$gameID)){
  tmp <- subset(sb, gameID==i)
  tmp <- tmp[order(tmp$time),]
  for(j in 1:nrow(tmp)){
    mat[i, tmp$time[j] ] <- mat[i, tmp$time[j]] + idx[tmp$HA[j]]
  }
}

mat0[,1] <- mat[,1]
for(j in 2:ncol(mat)){
  mat0[,j] <- mat0[, j-1] + mat[, j]
}

# 1点差以上
mat1[abs(mat0) > 0] <- 1
prob1 <- prob2 <- rep(0, 89)
for(j in 1:89){
  j1 <- mat1[, j] > 0
  prob1[j] <- mean(sapply(apply(mat1[j1, j:90], 1, unique), length) <= 1)
}

mat2 <- abs(mat0)
for(j in 1:89){
  j1 <- mat2[, j] > 1
  prob2[j] <- mean(apply(mat2[j1, j:90] > 0, 1, all))
}

p <- cbind(prob1, prob2)
par(mar=c(5, 5, 2, 4), cex.lab=1.6, cex.main=2, las=1)
matplot(p, xlab="時間", ylab="勝利確率", col=cols, pch=16, xaxp=c(0, 90, 6))
abline(v=45, lty=3)
legend("bottomright", legend=sprintf("%d 点差", 2:1), col=rev(cols), pch=16, cex=2)
text(par()$usr[2], tail(p[,1], 1), sprintf("%.1f %s", tail(p[,1], 1)*100, "%"), pos=4, xpd=TRUE)

2018-06-22

single cell の分化系統樹解析

読んだ。

A comparison of single-cell trajectory inference methods: towards more accurate and robust tools.

 

single cell のRNAseq などからデータを取得して、細胞分化系統樹を解析するのに多種多様な手法やパッケージが出ている。

59手法を試してみて、分化系統樹にどのような仮定をおくかをフローチャート形式にして、どういう場合にどういう手法を使うのがよいか、まで提言している。

とりあえずSlingshot, monocle, TSCAN, cellTree あたりを使っておけばよさそうである。

2018-06-14

MikuHatsune2018-06-14

決勝トーナメントに向けて初戦が大事というが初戦はどれくらい大事なのか

2018FIFAワールドカップが始まった。日本の決勝トーナメント進出は初戦に勝利できるかにかかっている! とかなんとかよく聞くが、実際に初戦に勝利するのはどれだけ大事かは定量的に言われていない気がする。

2002年と2010年に決勝トーナメントに進出したので8年周期のジンクスがある! みたいに言っていたTV があったが何を言っているのかさっぱりわからなかった。

 

というわけで、32チームを4チーム8グループに分けて、上位2チームが決勝トーナメントに進出するような仕様になった1998年から2014年まで5大会分の延べ160チームの勝敗表から、初戦に勝利すると決勝トーナメント進出にどれだけ有利になるかを調べる。

初戦に勝つのをW、決勝トーナメントに進出するのをT とすると、初戦に勝って決勝トーナメントに進出するのはP(T|W) である。

地味に数えればよい。行は初戦での勝点、つまり上から負け、引き分け、勝ち、であり、列は決勝トーナメントに進出したからのFalse/True である。

初戦に勝ったうえで、決勝トーナメントに進出しているかは、3の行を見ればいいから、51/(9+51) の0.85 の確率で決勝トーナメントに進出している。逆に、初戦に勝っても0.15 は決勝トーナメントに進出できていない。

     0  1
  0 53  7
  1 18 22
  3  9 51

逆に、初戦で負けた場合に決勝トーナメントに進出できるかどうかは、0 の行を見ればよい。初戦で負けると 7/(53+7) の0.12 程度しか決勝トーナメントに進出できない。

 

勝点をどれくらいとれば決勝トーナメントに進出できるかを見てみると、勝点3 でも決勝トーナメントに進出したことが1回だけある(1998年Bグループのチリ)。

基本的には勝点5、つまり1勝2分ならば他のチームの星の取り合いを考慮しても決勝トーナメントには進出できる。勝点4の1勝1分1敗パターンは微妙で、決勝トーナメントに進出できるかどうかは5分5分である。というのも、このときは他のチームの勝敗パターンが同様に勝点4のチームがいることが多くて、2位と3位になっていることが多い。

points  0  1
     0 12  0
     1 24  0
     2  8  0
     3 22  1
     4 14 15
     5  0 15
     6  0 14
     7  0 21
     9  0 14

ROC をしたけどあまり意味がない。

f:id:MikuHatsune:20180614142431p:image

 

dat <- read.table(text=txt, header=TRUE)
# 初戦の勝敗と決勝トーナメント進出
tab <- table(dat$g1, dat$final)

library(pROC)
points <- rowSums(dat[, grep("g[1-3]", colnames(dat))])
# 勝点と決勝トーナメントの進出
table(points, dat$final)

r <- roc(dat$final, points)
thres <- coords(r, c(0:7, 9), "threshold")

lot(r, lwd=3)
points(thres[2,], thres[3,], pch=15, cex=1.5)
text(thres[2,1:4], thres[3,1:4], colnames(thres)[1:4], adj=c(NA, 1.8), cex=1.5)
text(thres[2,5:9], thres[3,5:9], colnames(thres)[5:9], adj=c(-1, 1.8), cex=1.5)

txt <- "
year group teamID g1 g2 g3 final
1998 A Brazil 3 3 0 1
1998 A Norway 1 1 3 1
1998 A Morocco 1 0 3 0
1998 A Scotland 0 1 0 0
1998 B Italy 1 3 3 1
1998 B Chile 1 1 1 1
1998 B Austria 1 1 0 0
1998 B Cameroon 1 0 1 0
1998 C France 3 3 3 1
1998 C Denmark 3 1 0 1
1998 C South_Africa 0 1 1 0
1998 C Saudi_Arabia 0 0 1 0
1998 D Nigeria 3 3 0 1
1998 D Paraguay 1 1 3 1
1998 D Spain 0 1 3 0
1998 D Bulgaria 1 0 0 0
1998 E Netherlands 1 3 1 1
1998 E Mexico 3 1 1 1
1998 E Melgium 1 1 1 0
1998 E South_Korea 0 0 1 0
1998 F Germany 3 1 3 1
1998 F Yugoslavia 3 1 3 1
1998 F Iran 0 3 0 0
1998 F United_States 0 0 0 0
1998 G Romania 3 3 1 1
1998 G England 3 0 3 1
1998 G Colombia 0 3 0 0
1998 G Tunisia 0 0 1 0
1998 H Argentina 3 3 3 1
1998 H Croatia 3 3 0 1
1998 H Jamica 0 0 3 0
1998 H Japan 0 0 1 0
2002 A Denmark 3 1 3 1
2002 A Senetal 3 1 1 1
2002 A Uruguay 0 1 1 0
2002 A France 0 1 0 0
2002 B Spain 3 3 3 1
2002 B Paraguay 1 0 3 1
2002 B South_Africa 1 3 0 0
2002 B Slovenia 0 0 0 0
2002 C Brazil 3 3 3 1
2002 C Turkey 0 1 3 1
2002 C Costa_Rica 3 1 0 0
2002 C China_PR 0 0 0 0
2002 D South_Korea 3 1 3 1
2002 D United_States 3 1 0 1
2002 D Portugal 0 3 0 0
2002 D Poland 0 0 3 0
2002 E Germany 3 1 3 1
2002 E Ireland 1 1 3 1
2002 E Cameroon 1 3 0 0
2002 E Saudi_Arabia 0 0 0 0
2002 F Sweden 1 3 1 1 
2002 F England 1 3 1 1
2002 F Argentina 3 0 1 0
2002 F Nigeria 0 0 1 0
2002 G Mexico 3 3 1 1
2002 G Italy 3 0 1 1
2002 G Croatia 0 3 0 0
2002 G Ecuador 0 0 3 0
2002 H Japan 1 3 3 1
2002 H Belgium 1 1 3 1
2002 H Russia 3 0 0 0
2002 H Tunisia 0 1 0 0
2006 A Germany 3 3 3 1
2006 A Ecuador 3 3 0 1
2006 A Poland 0 0 3 0
2006 A Costa_Rica 0 0 0 0
2006 B England 3 3 1 1
2006 B Sweden 1 3 1 1
2006 B Paraguay 0 0 3 0
2006 B Trinidad_and_Tobago 1 0 0 0
2006 C Argentina 3 3 1 1
2006 C Netherlands 3 3 1 1
2006 C Ivory_Coast 0 0 3 0
2006 C Serbia_and_Montenegro 0 0 0 0
2006 D Portugal 3 3 3 1
2006 D Mexico 3 1 0 1
2006 D Angola 0 1 1 0
2006 D Iran 0 0 1 0
2006 E Iraly 3 1 3 1
2006 E Ghana 0 3 3 1
2006 E Czech_Republic 3 0 0 0
2006 E United_States 0 1 0 0
2006 F Brazil 3 3 3 1
2006 F Australia 3 0 1 1
2006 F Croatia 0 1 1 0
2006 F Japan 0 1 0 0
2006 G Swizerland 1 3 3 1
2006 G France 1 1 3 1
2006 G South_Korea 3 1 0 0
2006 G Togo 0 0 0 0
2006 H Spain 3 3 3 1
2006 H Ukraine 0 3 3 1
2006 H Tunisia 1 0 0 0
2006 H Saudi_Arabia 1 0 0 0
2010 A Uruguay 1 3 3 1
2010 A Mexico 1 3 0 1
2010 A South_Africa 1 0 3 0
2010 A France 1 0 0 0
2010 B Argentina 3 3 3 1
2010 B South_Korea 3 0 1 1
2010 B Greece 0 3 0 0
2010 B Nigeria 0 0 1 0
2010 C United_States 1 1 3 1
2010 C England 1 1 3 1
2010 C Slovenia 3 1 0 0
2010 C Algeria 0 1 0 0
2010 D Germany 3 0 3 1
2010 D Ghana 3 1 0 1
2010 D Australia 0 1 3 0
2010 D Serbia 0 3 0 0
2010 E Netherlands 3 3 3 1
2010 E Japan 3 0 3 1
2010 E Denmark 0 3 0 0
2010 E Cameroon 0 0 0 0
2010 F Paraguay 1 3 1 1
2010 F Slovakia 1 0 3 1
2010 F New_Zealand 1 1 1 0
2010 F Italy 1 1 0 0
2010 G Brazil 3 3 1 1
2010 G Portugal 1 3 1 1
2010 G Ivory_Coast 1 0 3 0
2010 G North_Korea 0 0 0 0
2010 H Spain 0 3 3 1
2010 H Chile 3 3 0 1
2010 H Swizerland 3 0 1 0
2010 H Honduras 0 0 1 0
2014 A Brazil 3 1 3 1
2014 A Mexico 3 1 3 1
2014 A Croatia 0 3 0 0
2014 A Cameroon 0 0 0 0
2014 B Netherlands 3 3 3 1
2014 B Chile 3 3 0 1
2014 B Spain 0 0 3 0
2014 B Australia 0 0 0 0
2014 C Colombia 3 3 3 1
2014 C Greece 0 1 3 1
2014 C Ivory_Coast 3 0 0 0
2014 C Japan 0 1 0 0
2014 D Costa_Rica 3 3 1 1
2014 D Uruguay 0 3 3 1
2014 D Italy 3 0 0 0
2014 D England 0 0 1 0
2014 E France 3 3 1 1
2014 E Swizerland 3 0 3 1
2014 E Ecuador 0 3 1 0
2014 E Honduras 0 0 0 0
2014 F Argentina 3 3 3 1
2014 F Nigeria 1 3 0 1
2014 F Bosnia_and_Herzegovina 0 0 3 0
2014 F Iran 1 0 0 0
2014 G Germany 3 1 3 1
2014 G United_States 3 1 0 1
2014 G Portugal 0 1 3 0
2014 G Ghana 0 1 0 0
2014 H Belgium 3 3 3 1
2014 H Algeria 0 3 1 1
2014 H Russia 1 0 1 0
2014 H South_Korea 1 0 0 0
"