1

背景: 2x2 の要素 (前景の黒と背景の白、オフカラーと通常の色) を使用して、簡単な A/B テストを実行しています。Analyticsは、4 つの条件のそれぞれのヒット数と、それらが「変換されたレート」を報告します。 ' (ページで少なくとも 40 秒を費やすと定義するバイナリ変数)。少し編集して素敵な R データフレームを取得するのは簡単です。

rates <- read.csv(stdin(),header=TRUE)
Black,White,N,Rate
TRUE,FALSE,512,0.2344
FALSE,TRUE,529,0.2098
TRUE,TRUE,495,0.1919
FALSE,FALSE,510,0.1882

当然のことながら、次のようなロジスティック回帰を見たいと思いますRate ~ Black * Whiteが、Rglmは 2046 行のデータフレームを必要としており、それぞれが aTRUEまたはFALSEコンバージョン値と および の値をBlack報告していますWhite。これは...もう少しトリッキーです。私はグーグルで検索してSOをチェックしましたが、不測の事態の数のテーブルをデータフレームに変換する方法についていくつかの不格好なコードを見つけましたが、パーセンテージ/レートについては何も見つかりませんでした。

多くの問題の後、rate * n関連する条件値と結果Trueを使用してデータフレームを繰り返し、 for と result を除いて同じことを(1 - rate) * n行い、False8 つのデータフレームすべてをつなぎ合わせる 4 つの条件のループを思いつきました。 1 つの巨大なデータフレームに:

ground <- NULL
for (i in 1:nrow(rates)) {
        x <- rates[i,]
        y <- do.call("rbind", replicate((x$N * x$Rate),     data.frame(Black=c(x$Black),White=c(x$White),Conversion=c(TRUE)),  simplify = FALSE))
        z <- do.call("rbind", replicate((x$N * (1-x$Rate)), data.frame(Black=c(x$Black),White=c(x$White),Conversion=c(FALSE)), simplify = FALSE))
        ground <- rbind(ground,y,z)
}

結果のデータフレームは正しくground見えます:

sum(rates$N)
[1] 2046
nrow(ground)
[1] 2042
# the missing 4 are probably from the rounding-off of the reported conversion rate
summary(ground); head(ground, n=20)
   Black           White         Conversion     
 Mode :logical   Mode :logical   Mode :logical  
 FALSE:1037      FALSE:1020      FALSE:1623     
 TRUE :1005      TRUE :1022      TRUE :419      
 NA's :0         NA's :0         NA's :0        
   Black White Conversion
1   TRUE FALSE       TRUE
2   TRUE FALSE       TRUE
3   TRUE FALSE       TRUE
4   TRUE FALSE       TRUE
5   TRUE FALSE       TRUE
6   TRUE FALSE       TRUE
7   TRUE FALSE       TRUE
8   TRUE FALSE       TRUE
9   TRUE FALSE       TRUE
10  TRUE FALSE       TRUE
11  TRUE FALSE       TRUE
12  TRUE FALSE       TRUE
13  TRUE FALSE       TRUE
14  TRUE FALSE       TRUE
15  TRUE FALSE       TRUE
16  TRUE FALSE       TRUE
17  TRUE FALSE       TRUE
18  TRUE FALSE       TRUE
19  TRUE FALSE       TRUE
20  TRUE FALSE       TRUE

同様に、ロジスティック回帰は正気の答えを吐き出します。

g <- glm(Conversion ~ Black*White, family=binomial, data=ground); summary(g)
...
Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-0.732  -0.683  -0.650  -0.643   1.832  

Coefficients:
                    Estimate Std. Error z value Pr(>|z|)
(Intercept)           -1.472      0.114  -12.94   <2e-16
BlackTRUE              0.291      0.154    1.88    0.060
WhiteTRUE              0.137      0.156    0.88    0.381
BlackTRUE:WhiteTRUE   -0.404      0.220   -1.84    0.066

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2072.7  on 2041  degrees of freedom
Residual deviance: 2068.2  on 2038  degrees of freedom
AIC: 2076

Number of Fisher Scoring iterations: 4

私の質問は、Analytics のレート データをglm入力に変換する、ひどいループよりも洗練された方法はありますか?

4

3 に答える 3

1

1 つのことは、データを変換する方法です。もう一つは理由です。From ?glm: "[f]or binomial [...] famil[y] 反応は [...] 因子として (最初のレベルが失敗を表し、他のすべてが成功を表す場合)、または次の 2 列の行列として指定できます。成功と失敗の数を示す列。". 最初の方法は、「R の glm は、それぞれが TRUE または FALSE 変換を報告する 2046 行のデータフレームを必要とする」に対応します。2 番目の方法は、基本的に元のデータ セットに対応し、「成功」はレートと N から簡単に計算できます。3 番目の方法は、治療の組み合わせごとの成功の割合を応答変数として使用することです。この場合、試行回数はweights引数として指定する必要があります。

set.seed(1)
 # one row per observation
 df1 <- data.frame(x = sample(c("yes", "no"), 40, replace = TRUE),
                 y = sample(c("yes", "no"), 40, replace = TRUE),
                 z = rbinom(n = 40, size = 1, prob = 0.5))
df1

library(plyr)
# aggregated data with one row per treatment combination
df2 <- ddply(.data = df1, .variables = .(x, y), summarize,
             n = length(z),
             rate = sum(z)/n,
             success = n*rate,
             failure = n - success)  
df2

# three different ways to specify the models,
# which all give the same parameter estimates for x, y and x*y
mod1 <- glm(z ~ x * y, data = df1, family = binomial) 
mod2 <- glm(cbind(success, failure) ~ x * y, data = df2, family = binomial)
mod3 <- glm(rate ~ x * y, data = df2, weights = n, family = binomial)

summary(mod1)
summary(mod2)
summary(mod3) 
于 2013-09-13T19:27:56.070 に答える
1
rates$counts <- rates$N*rates$Rate
rates$counts <- round(rates$counts,0)
 rates
#----------
  Black White   N   Rate counts
1  TRUE FALSE 512 0.2344    120
2 FALSE  TRUE 529 0.2098    111
3  TRUE  TRUE 495 0.1919     95
4 FALSE FALSE 510 0.1882     96

> rates$failures <-rates$N -rates$counts    s
> glm(cbind(counts,failures)~Black*White, data=rates, family="binomial")

Call:  glm(formula = cbind(counts, failures) ~ Black * White, family = "binomial", 
    data = rates)

Coefficients:
        (Intercept)            BlackTRUE            WhiteTRUE  
            -1.4615               0.2777               0.1356  
BlackTRUE:WhiteTRUE  
            -0.3894  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      4.104 
Residual Deviance: -7.461e-14   AIC: 33.05 
于 2013-09-13T19:20:59.143 に答える