```{r global_options, include=FALSE}
knitr::opts_chunk$set(eval = TRUE, results = FALSE, fig.show = "hide", message = FALSE)
```

母集団全体に関するデータ、たとえば、気候変動が彼らの地域社会に影響を与えていると考えるかどうかの米国成人全員の意見にアクセスできる場合、「米国成人の何パーセントが気候変動が彼らの地域社会に影響を与えていると考えているか？」といった質問に答えるのは簡単です。同様に、母集団に関する人口統計情報があれば、この意見が老若男女や異なる傾向を持つ大人の間でどのように異なるかを調べることができます。多くの場合のように、母集団のごく一部のサンプルにしかアクセスできない場合、タスクはより複雑になります。少数の成人サンプルからのデータしかない場合、この割合について最善の推測は何ですか？この種の状況では、サンプルを使用して母集団がどのように見えるかを推論する必要があります。

::: {#boxedtext}
**シードの設定:** このラボではランダムサンプルを取り、標本分布を構築します。これは、ラボの開始時にシードを設定する必要があることを意味します。この概念が初めての場合は、確率に関するラボをレビューしてください。
:::

## はじめに

### パッケージの読み込み

このラボでは、**tidyverse** スイートのパッケージを使用してデータを探索および視覚化し、**infer** を使用して統計的推論を実行します。

パッケージを読み込みましょう。

```{r load-packages, message=FALSE}
library(tidyverse)
library(openintro)
library(infer)
```

### 再現可能なラボレポートの作成

新しいラボレポートを作成するには、RStudioで「New File」->「R Markdown...」に移動し、「From Template」を選択してから、テンプレートのリストから「Lab Report for OpenIntro Statistics Labs」を選択します。

### データ

2019年のピュー・リサーチの報告書は次のように述べています。

計算を簡単にするために、総人口サイズを100,000と仮定します（米国の全成人の人口サイズよりも小さいですが）。

> 新しいピュー・リサーチ・センターの調査によると、米国の成人の約6割（62%）が、気候変動が現在、彼らの地域社会に大きく、またはある程度影響を与えていると答えています。
>
> **出典:** [ほとんどの米国人が気候変動が彼らのコミュニティに影響を与えていると答えているが、その影響は地域によって異なる](https://www.pewresearch.org/fact-tank/2019/12/02/most-americans-say-climate-change-impacts-their-community-but-effects-vary-by-region/)

このラボでは、この62%が真の母集団の割合であると仮定し、母集団から小さなサンプルを取ることで、サンプル比率がサンプルごとにどのように異なるかを学びます。まず、母集団サイズを100,000と仮定して、母集団を作成します。これは、成人人口の62,000人（62%）が気候変動が彼らのコミュニティに影響を与えていると考えており、残りの38,000人はそう考えていないことを意味します。

```{r}
us_adults <- tibble(
  climate_change_affects = c(rep("Yes", 62000), rep("No", 38000))
)
```

データフレームの名前は`us_adults`で、「気候変動があなたの地域社会に影響を与えていると思いますか？」という質問への回答を含む変数の名前は`climate_change_affects`です。

棒グラフを使用して、これらの回答の分布を素早く視覚化できます。

```{r bar-plot-pop, fig.height=2.5, fig.width=10}
ggplot(us_adults, aes(x = climate_change_affects)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Do you think climate change is affecting your local community?"
  ) +
  coord_flip()
```

データフレームが正しく構築されたことを確認するために、要約統計量も取得できます。

```{r summ-stat-pop, results = TRUE}
us_adults |>
  count(climate_change_affects) |>
  mutate(p = n /sum(n))
```

このラボでは、母集団からサイズ60の単純ランダムサンプルから始めます。

```{r sample}
n <- 60
samp <- us_adults |>
  sample_n(size = n)
```

1.  あなたのサンプル中の成人の何パーセントが、気候変動が彼らの地域社会に影響を与えていると考えていますか？
    **ヒント:** 母集団で行ったのと同様に、**このサンプル中の**気候変動が彼らの地域社会に影響を与えていると考えている人の割合を計算できます。

2.  他の学生のサンプル比率があなたと全く同じであると予想しますか？似ていると予想しますか？その理由は何ですか？

## 信頼区間

このラボの最初の動機となった質問に戻りましょう。このサンプルに基づいて、母集団について何を推測できますか？たった1つのサンプルから、気候変動が彼らの地域社会に影響を与えていると考える米国成人の割合の最良の推定値は、通常$\hat{p}$と表記される標本比率（ここでは`p_hat`と呼んでいます）です。それは良い**点推定値**として機能しますが、その推定値についてどれだけ不確実であるかを伝えることも役立ちます。この不確実性は**信頼区間**を使用して定量化できます。

母集団の割合の信頼区間を計算する1つの方法は、中心極限定理に基づいて、$\hat{p} \pm z^\star SE_{\hat{p}}$、またはより正確には $$ \hat{p} \pm z^\star \sqrt{ \frac{\hat{p} (1-\hat{p})}{n} } $$ として計算されます。

別の方法はシミュレーション、より具体的には**ブートストラップ**を使用することです。**ブートストラップ**という用語は、「自力で立ち上がる」というフレーズに由来しており、外部の助けなしに不可能なタスクを達成するという比喩です。この場合、不可能なタスクとは母集団パラメータ（未知の母集団比率）を推定することであり、与えられたサンプルからのデータのみを使用してそれを達成します。観測されたサンプルからの情報のみを使用して母集団パラメータについて何かを言うというこの概念は、統計的推論の核心であり、ブートストラップに限定されません。

本質的に、ブートストラップは、観測されたサンプル内の観測値と同じように、母集団にはより多くの観測値があると仮定します。したがって、私たちはサンプルの再サンプリング（置換あり）によって母集団を「再構築」します。ブートストラップのスキームは次のとおりです。

-   **ステップ1.** ブートストラップサンプルを抽出する - 元のサンプルから、元のサンプルと同じサイズのランダムサンプルを**置換ありで**抽出する。
-   **ステップ2.** ブートストラップ統計量を計算する - ブートストラップサンプルで計算された平均、中央値、割合、傾きなどの統計量。
-   **ステップ3.** ステップ (1) と (2) を何度も繰り返し、ブートストラップ分布を作成する - ブートストラップ統計量の分布。
-   **ステップ4.** ブートストラップ分布の中央XX%として、XX%信頼区間の境界を計算する。

これらの各ステップをコーディングする代わりに、**infer**パッケージを使用して信頼区間を構築します。

以下は、この信頼区間を構築するために使用する関数の概要です。

+-------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| 関数        | 目的                                                                                                                                       |
+=============+============================================================================================================================================+
| `specify`   | 関心のある変数を特定する                                                                                                                   |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| `generate`  | 生成したいサンプルの数                                                                                                                     |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| `calculate` | 推論を行いたい標本統計量、または推論を行いたい母集団パラメータと考えることもできます                                                         |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| `get_ci`    | 信頼区間を見つける                                                                                                                         |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------+

このコードは、気候変動が彼らの地域社会に影響を与えていると考える米国成人の割合の95%信頼区間を見つけます。

```{r confidence interval infer}
samp |>
  specify(response = climate_change_affects, success = "Yes") |>
  generate(reps = 1000, type = "bootstrap") |>
  calculate(stat = "prop") |>
  get_ci(level = 0.95)
```

-   `specify`では、`response`変数と、`success`と呼ぶその変数のレベルを指定します。
-   `generate`では、`reps`引数で母集団から再サンプリングしたい回数（これは合理的に大きな数であるべきです）と、実行したい再サンプリングの種類（信頼区間を構築する場合は`"bootstrap"`）を指定します。
-   次に、これらの各再サンプリングに対して関心のある標本統計量（`prop`ortion）を`calculate`します。

これらのコマンドは残りの学期を通して信頼区間を計算し、推論問題を解決するために一緒に使用されるので、これらの関数の残りの引数を自由に試してみてください。しかし、今後の章ではさらに多くの例を説明します。

まとめると、完全な母集団がどのようになっているかはわかりませんが、気候変動が彼らの地域社会に影響を与えていると考える米国成人の真の割合が、このパイプラインの結果として報告された2つの境界の間にあると95%確信しています。

## 信頼水準

3.  上記の解釈で、「95%信頼」というフレーズを使用しました。「95%信頼」とは何を意味しますか？

この場合、母集団全体に関するデータを持っているため、真の母集団の割合（62%）を知るという稀な贅沢があります。

4.  あなたの信頼区間は、気候変動が彼らの地域社会に影響を与えていると考える米国成人の真の母集団比率を捉えていますか？教室でこのラボに取り組んでいる場合、隣の人の区間はこの値を捉えていますか？

5.  各学生はわずかに異なる信頼区間を得たはずです。これらの区間のうち、真の母集団平均を捉えるのはどのくらいの割合だと思いますか？理由は何ですか？

ラボの次の部分では、標本比率と、それらの標本に基づいて構築された信頼区間がサンプルごとにどのように異なるかについて詳しく学ぶために、多くのサンプルを収集します。

-   ランダムサンプルを取得します。
-   標本比率を計算し、これらを使用して信頼区間の下限と上限を計算して保存します。
-   これらのステップを50回繰り返します。

これを行うには、これまでに開発したコードを何度も実行して多くの（50個の）信頼区間を得るために、反復のようなプログラミング概念を学ぶ必要があります。プログラミングをより簡単にするために、この機能を基本的に実行し、[OpenIntro Statistics, 第4版 (182ページ)](https://www.openintro.org/os)の図5.6と同様のプロットを作成するインタラクティブなアプリを以下に提供します。

```{r shiny, echo=FALSE, eval=TRUE, results = TRUE}
store_ci <- function(i, n, reps, conf_level, success) {
  us_adults |>
    sample_n(size = n) |>
    specify(response = climate_change_affects, success = success) |>
    generate(reps, type = "bootstrap") |>
    calculate(stat = "prop") |>
    get_ci(level = conf_level) |>
    rename(
      x_lower = names(.)[1],
      x_upper = names(.)[2]
    )
}

shinyApp(
  ui <- fluidPage(
    h4("Confidence intervals for the proportion of US adults who think 
     climate change"),

    h4(selectInput("success", "",
      choices = c(
        "is affecting their local community" = "Yes",
        "is not affecting their local community" = "No"
      ),
      selected = "Yes", width = "50%"
    )),

    # Sidebar with a slider input for number of bins
    sidebarLayout(
      sidebarPanel(
        numericInput("n_samp",
          "Sample size for a single sample from the population:",
          min = 1,
          max = 1000,
          value = 60
        ),

        hr(),

        numericInput("n_rep",
          "Number of resamples for each bootstrap confidence interval:",
          min = 1,
          max = 15000,
          value = 1000
        ),

        numericInput("conf_level",
          "Confidence level",
          min = 0.01,
          max = 0.99,
          value = 0.95,
          step = 0.05
        ),

        hr(),

        radioButtons("n_ci",
          "Number of confidence intervals:",
          choices = c(10, 25, 50, 100),
          selected = 50, inline = TRUE
        ),

        actionButton("go", "Go")
      ),

      # Show a plot of the generated distribution
      mainPanel(
        plotOutput("ci_plot")
      )
    )
  ),

  server <- function(input, output) {

    # set true p
    p <- reactive(ifelse(input$success == "Yes", 0.62, 0.38))

    # create df_ci when go button is pushed
    df_ci <- eventReactive(input$go, {
      map_dfr(1:input$n_ci, store_ci,
        n = input$n_samp,
        reps = input$n_rep, conf_level = input$conf_level,
        success = input$success
      ) |>
        mutate(
          y_lower = 1:input$n_ci,
          y_upper = 1:input$n_ci,
          capture_p = ifelse(x_lower < p() & x_upper > p(), "Yes", "No")
        )
    })

    # plot df_ci
    output$ci_plot <- renderPlot({
      ggplot(df_ci()) +
        geom_segment(aes(x = x_lower, y = y_lower, xend = x_upper, yend = y_upper, color = capture_p)) +
        geom_point(aes(x = x_lower, y = y_lower, color = capture_p)) +
        geom_point(aes(x = x_upper, y = y_upper, color = capture_p)) +
        geom_vline(xintercept = p(), color = "darkgray") +
        labs(
          y = "", x = "Bounds of the confidence interval",
          color = "Does the interval capture the true population proportion?"
        ) +
        theme(legend.position = "bottom")
    })
  },
  options = list(height = 700)
)
```

6.  上記のアプリのデフォルト値であるサンプルサイズ60、各区間のブートストラップサンプル数1000、構築された信頼区間数50の場合、あなたの信頼区間のうち真の母集団比率を含む割合はどのくらいですか？この割合は信頼水準と正確に一致しますか？一致しない場合、その理由を説明してください。回答にプロットを含めるようにしてください。

------------------------------------------------------------------------

## さらなる演習

7.  95%以外の信頼水準を選択してください。この水準での信頼区間は、95%信頼水準で計算した信頼区間よりも広くなると予想しますか、狭くなると予想しますか？理由を説明してください。

8.  **infer**パッケージのコードと、あなたが持っている1つのサンプル（`samp`）のデータを使用して、気候変動が彼らの地域社会に影響を与えていると考える米国成人の割合の信頼区間を、あなたが選んだ信頼水準（95%以外）で求め、それを解釈してください。

9.  アプリを使用して、前の質問で選択した信頼水準で50個の信頼区間を計算し、すべての区間を1つのプロットに描き、真の母集団比率を含む区間の割合を計算してください。このパーセンテージは、区間に選択された信頼水準とどのように比較されますか？

10. 最後に、もう1つ（異なる）信頼水準を試してください。まず、この区間の幅が以前に計算した区間とどのように比較されるかを述べてください。次に、**infer**パッケージと`samp`のデータを使用して区間の境界を計算し、それを解釈してください。最後に、アプリを使用して多くの区間を生成し、真の母集団比率を捉える区間の割合を計算してください。

11. アプリを使用して、さまざまなサンプルサイズを試行し、サンプルサイズの変化（増減）に伴って区間の幅がどのように変化するかについてコメントしてください。

12. 最後に、与えられたサンプルサイズ（例えば60）の場合、ブートストラップサンプルの数を増やすと区間の幅はどのように変化しますか？ **ヒント:** ブートストラップサンプルの数を変更すると、標準誤差に影響しますか？

------------------------------------------------------------------------

<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png){style="border-width:0"}</a><br />この作品は、<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際ライセンス</a>の下に提供されています。
