diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..e13c405 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,3 @@ +^.*\.Rproj$ +^\.Rproj\.user$ +^LICENSE\.md$ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..3cd6871 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1,4 @@ +*.html +*-tmp.yaml +depends.Rds +R-version diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..e5571a7 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,61 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master, devel] + pull_request: + branches: [main, master, devel] + schedule: + # (see https://crontab.guru) + - cron: "30 3 * */2 TUE" + workflow_dispatch: + +name: R-CMD-check + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + concurrency: + group: > + ${{ github.workflow }}-${{ matrix.config.os }}-${{ matrix.config.r }})- + ${{ github.event_name != 'pull_request' || github.run_id }} + cancel-in-progress: true + + name: ${{ matrix.config.os }} (R-${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'release'} + + env: + R_KEEP_PKG_SOURCE: yes + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v3 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + use-public-rspm: true + extra-repositories: "https://mokymai.github.io/download/" + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true diff --git a/.github/workflows/drat--publish-package.yaml b/.github/workflows/drat--publish-package.yaml new file mode 100644 index 0000000..b8c9816 --- /dev/null +++ b/.github/workflows/drat--publish-package.yaml @@ -0,0 +1,118 @@ +on: + push: + branches: [master, main] + workflow_dispatch: + +name: Publish package (drat) + +jobs: + drat: + runs-on: ${{ matrix.config.os }} + + name: "drat: ${{ matrix.config.os }} (R-${{ matrix.config.r }})" + + strategy: + fail-fast: false + matrix: + config: + - {os: windows-latest, r: 'release'} + - {os: windows-latest, r: 'oldrel'} + - {os: macOS-latest, r: 'release'} + - {os: macOS-latest, r: 'oldrel'} + # - {os: windows-latest, r: 'devel'} + # - {os: macOS-latest, r: 'devel'} + + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + SOURCE_REPO: ${{ github.repository }} + DEST_REPO: mokymai/download + TMP_DIR: tmp_dir + + steps: + - uses: actions/checkout@v3 + + - name: Info + run: | + echo "GitHub actor: ${{ github.actor }}" + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + use-public-rspm: true + extra-repositories: "https://mokymai.github.io/download/" + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + cache-version: 1 + extra-packages: | + roxygen2 + devtools + drat + + - name: Roxygenize + shell: Rscript {0} + run: roxygen2::roxygenize() + + - name: Build source package + if: runner.os == 'Windows' && matrix.config.r == 'release' + shell: Rscript {0} + run: | + dir.create("check", showWarnings = FALSE) + devtools::build(path = "check") + + - name: Build binary package + if: runner.os != 'Linux' + shell: Rscript {0} + run: | + dir.create("check", showWarnings = FALSE) + devtools::build(path = "check", binary = TRUE) + +# The steps to include the built package in ${DEST_REPO} + - name: Configure Git + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions | ${{ github.event.repository.name }}" + # git config --global url."https://${TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/" + env: + TOKEN: ${{ secrets.DEPLOY_DRAT_TOKEN }} + + - name: Git clone DEST_REPO + uses: actions/checkout@v3 + with: + repository: ${{ env.DEST_REPO }} # 'mokymai/download' + ref: 'master' + path: "${{ env.TMP_DIR }}" + token: "${{ secrets.DEPLOY_DRAT_TOKEN }}" + + - name: Drat -- insert + if: success() + shell: Rscript {0} + run: | + built_packages <- + list.files( + path = "check", + pattern = "[.]tar[.]gz$|[.]tgz$|[.]zip$", + full.names = TRUE + ) + + built_packages + + for (i in seq_along(built_packages)) { + drat::insertPackages( + file = built_packages[i], + repodir = Sys.getenv("TMP_DIR"), + action = "archive" + ) + } + + - name: Drat -- commit and push + if: success() + shell: bash + run: | + cd "${TMP_DIR}" # move into the subdir, which is Git controlled + git add * + git add -f *.tar.gz + git commit -m "Update from ${SOURCE_REPO} ${{ runner.os }} R-${{ matrix.config.r }}" || echo "Nothing to commit" + git push origin master || echo "Nothing to commit" + diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 0000000..efe23d3 --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,72 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + release: + types: [published] + workflow_dispatch: + +name: Update website (pkgdown) + +jobs: + pkgdown: + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: "release" + use-public-rspm: true + extra-repositories: "https://mokymai.github.io/download/" + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::pkgdown, any::devtools, local::. + needs: website + + - name: Configure Git + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + + - name: Update Rd files + run: | + devtools::document(roclets = c('rd', 'collate', 'namespace')) + shell: Rscript {0} + + - name: Commit documentation updates (if any) + run: | + git add --all + git commit -m 'Re-build documentation' || echo "No changes to commit" + git push origin || echo "No changes to commit (documentation)" + + - name: Render README + run: Rscript -e 'rmarkdown::render("README.Rmd")' + + - name: Commit README (if changed) + run: | + git commit README.md -m 'Re-build README.Rmd before pkgdown' || echo "No changes to commit (README)" + git push origin || echo "No changes to commit (README)" + + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages 🚀 + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e75435c --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# History files +.Rhistory +.Rapp.history + +# Session Data files +.RData +.RDataTmp + +# User-specific files +.Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# pkgdown site +docs/ + +# translation temp files +po/*~ + +# RStudio Connect folder +rsconnect/ diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..bbde1ca --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,23 @@ +Package: pi +Type: Package +Title: Confidence Intervals (CI) / Pasikliautinieji Intervalai (PI) +Version: 0.0.1 +Authors@R: + person("Vilmantas", "Gegzna", role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-9500-5167"), + email = "GegznaV@gmail.com" + ) +Description: Patogumo funkcijos, skirtos skaičiuoti pasikliautinuosius intervalus. +License: MIT + file LICENSE +Encoding: UTF-8 +LazyData: true +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.2 +Imports: + DescTools, + dplyr, + tidyr, + purrr, + forcats, + tibble, + checkmate diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e28f812 --- /dev/null +++ b/LICENSE @@ -0,0 +1,2 @@ +YEAR: 2024 +COPYRIGHT HOLDER: Vilmantas Gegzna diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..e294ff8 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Vilmantas Gegzna + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..3496648 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,9 @@ +# Generated by roxygen2: do not edit by hand + +export(ci_binom) +export(ci_boot) +export(ci_mean_t) +export(ci_mean_t_stat) +export(ci_multinom) +importFrom(stats,qt) +importFrom(utils,data) diff --git a/R/functions.R b/R/functions.R new file mode 100644 index 0000000..10ee0a1 --- /dev/null +++ b/R/functions.R @@ -0,0 +1,438 @@ +# ~~~ Vidurkio PI pagal vid., SD, n ------------------------------------------ + +#' Vidurkio PI, suskaičiuotas pagal aprašomąsias statistikas +#' +#' Funkcija `ci_mean_t_stat()` skaičiuoja vidurkio pasikliautinajį intervalą (PI) +#' pagal *klasikinę* formulę su t (Stjudento) koeficientu, kai duotos +#' *aprašomosios statistikos* (vidurkis, standartinis nuokrypis, imties dydis). +#' Naudinga, kai tokie dydžiai būna pateikti mokslinėje literatūroje. +#' +#' @param mean_ Vektorius su kiekvienos grupės vidurkiais. +#' @param sd_ Vektorius su kiekvienos grupės standartiniu nuokrypiu. +#' @param n Vektorius su kiekvienos grupės dydžiu. +#' @param group Grupės pavadinimas. +#' Numatytoji reikšmė – tuščia eilutė (`""`). +#' @param conf.level Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95. +#' +#' @note +#' Kiekvieno iš `mean_`, `sd_`, `n`, `group` ilgis (reikšmių skaičius) turi būti +#' (a) arba vieną reikšmė, +#' (b) arba sutapti su ilgiausiu šios argumentų grupės vektoriumi. +#' +#' Dėl aiškumo išnagrinėkite pavyzdžius. +#' +#' @return +#' Rezultatas – duomenų lentelė, su šiais stulpeliais: +#' +#' - `group` (``) – grupės pavadinimas; +#' - `mean` (``) – vidurkio įvertis; +#' - `lwr.ci` (``) – apatinė vidurkio PI riba (lwr. atitinka „lower“); +#' - `upr.ci` (``) – viršutinė vidurkio PI riba (upr. atitinka „upper“); +#' - `sd` (``) – standartinis nuokrypis; +#' - `n` (``) – imties/grupės dydis. +#' +#' Skaičiavimai gali būti atlikti ir rezultatai pateikti daugiau nei vienai +#' grupei. +#' +#' +#' @examples +#' # Pavyzdžiai +#' +#' # Nurodant argumentų pavadinimus: +#' ci_mean_t_stat(mean_ = 362, sd_ = 35, n = 100) +#' +#' # Nenurodant argumentų pavadinimų: +#' ci_mean_t_stat(362, 35, 100) +#' +#' +#' # Skaičiavimai kelioms grupėms: +#' vidurkis <- c(1, 2, 3) +#' st_nuokrypis <- c(3, 2, 3) +#' n <- c(50, 20, 40) +#' grupe <- c("A", "B", "C") +#' +#' ci_mean_t_stat(vidurkis, st_nuokrypis, n, grupe) +#' +#' +#' # Simuliacija su keliais imties dydžiais: +#' ci_mean_t_stat(mean_ = 362, sd_ = 35, n = c(10, 50, 100, 1000)) +#' +#' +#' # Jei norite, kad rodytų daugiau skaitmenų po kablelio: +#' rez_pi <- ci_mean_t_stat(362, 35, 100) +#' as.data.frame(rez_pi) +#' +#' # Arba +#' # View(rez_pi) +#' +#' @importFrom stats qt +#' @export +ci_mean_t_stat <- function(mean_, sd_, n, group = "", conf.level = 0.95) { + + Q <- conf.level + + # Taikome formulę su t koeficientu: + t <- qt(p = (1 - Q) / 2, df = n - 1, lower.tail = FALSE) + paklaida <- t * sd_ / sqrt(n) + + apatine_riba <- mean_ - paklaida + virsutine_riba <- mean_ + paklaida + + # Sudėliojame rezultatus + vidurkio_pi_t <- + tibble::tibble( + group = forcats::as_factor(group), + mean = mean_, + lwr.ci = apatine_riba, + upr.ci = virsutine_riba, + sd = sd_, + n = as.integer(n) + ) + + vidurkio_pi_t +} + +# ~~~ Vidurkio PI grupėms ---------------------------------------------------- + +#' Vidurkio PI, suskaičiuotas pagal duomenis +#' +#' Funkcija `ci_mean_t()` skaičiuoja vidurkio pasikliautinajį intervalą (PI) +#' pagal *klasikinę* formulę su t (Stjudento) koeficientu, kai duomenys +#' pateikti *duomenų lentelės pavidalu*. Ši funkcija yra patobulinta +#' [DescTools::MeanCI()], reaguojanti į [dplyr::group_by()], tad skaičiavimus +#' gali atlikti ir pogrupiams. Rezultatas – duomenų lentelė. +#' +#' @param .data Duomenų lentelė. +#' @param x Stulpelio pavadinimas (be kabučių). +#' @param conf.level Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95. +#' @param ... Kiti parametrai, kuriuos priima [DescTools::MeanCI()]. +#' Žiūrėti šios funkcijos dokumentaciją. +#' +#' @return +#' Rezultatas – duomenų lentelė, kurioje yra šie stulpeliai: +#' +#' - (jei yra) grupavimo kintamųjų pavadinimai; +#' - `mean` (``) – vidurkio įvertis; +#' - `lwr.ci`, `upr.ci` (``) – (lower CI, upper CI) apatinė ir viršutinė +#' pasikliautinojo intervalo ribos. +#' +#' @examples +#' # Pavyzdžiai +#' data(npk, package = "datasets") +#' head(npk) +#' +#' # Kintamojo `yield` vidurkio PI skaičiavimas +#' ci_mean_t(npk, yield) +#' +#' # PI skaičiavimas naudojant jungimo operatorių +#' npk |> ci_mean_t(yield) +#' +#' # PI skaičiavimas grupuojant pagal vieną kintamąjį +#' npk |> dplyr::group_by(N) |> ci_mean_t(yield) +#' +#' # PI skaičiavimas grupuojant pagal 3 kintamuosius +#' npk |> dplyr::group_by(N, P, K) |> ci_mean_t(yield) +#' +#' @importFrom utils data +#' @export + +ci_mean_t <- function(.data, x, conf.level = 0.95, ...) { + + vidurkio_pi <- function(x) { + # Rezultatas turi būti duomenų lentelė + DescTools::MeanCI(x, conf.level = conf.level, ...) |> + t() |> + as.data.frame() + } + + # Rezultatas + .data |> + tidyr::nest(data = c(dplyr::everything(), -dplyr::group_vars(.data))) |> + dplyr::mutate( + ci = purrr::map(data, ~ dplyr::pull(., {{ x }}) |> vidurkio_pi()) + ) |> + dplyr::select(-data) |> + tidyr::unnest(ci) |> + dplyr::ungroup() +} + +# ~~~ Proporcijos PI --------------------------------------------------------- + +#' Proporcijos PI: 2 grupės +#' +#' Dvireikšmio kintamojo mus dominančios reikšmės proporcijos pasikliautinojo +#' intervalo (PI) skaičiavimo funkcija, kuri yra patobulintas +#' [DescTools::BinomCI()] variantas. Rezultatas – duomenų lentelė. +#' +#' @details +#' Ši funkcija naudojama taip pat, kaip [DescTools::BinomCI()], tik numatytasis +#' metodas yra modifikuotasis Wilson metodas, o rezultatas – duomenų lentelė, +#' o ne vektorius. Todėl, pvz., rezultatą galima braižyti naudojant +#' \pkg{ggplot2}. +#' +#' @param x Mus dominančių +#' *arba* mums palankių įvykių skaičius +#' *arba* mus dominančios grupės dydis. +#' +#' @param n Įvykių skaičius iš viso. / Imties dydis. +#' @param conf.level Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95. +#' @param method,... Kiti parametrai, kuriuos priima +#' [DescTools::BinomCI()]. Žiūrėti šios funkcijos dokumentaciją. +#' +#' @return +#' Rezultatas – duomenų lentelė, kurios stulpeliai: +#' +#' - `est` (``) – proporcijos įvertis, +#' - `lwr.ci`, `upr.ci` (``) – (lower CI, upper CI) +#' apatinė ir viršutinė proporcijos pasikliautinojo intervalo ribos. +#' - `x` (``) – Mus dominančių įvykių skaičius / Mus dominančios grupės dydis. +#' - `n` (``) – Įvykių skaičius iš viso. / Imties dydis. +#' +#' @examples +#' x <- 54 # mus dominančių įvykių skaičius +#' n <- 80 # įvykių skaičius iš viso +#' ci_binom(x = 54, n = 80) +#' +#' # Simuliacija su skirtingais imties dydžiais +#' ci_binom(x = 54, n = c(80, 100, 512)) +#' +#' # PI skaičiavimas kiekvienai grupei atskirai +#' y = c(23, 45) +#' ci_binom(y, n = sum(y)) +#' +#' +#' @export + +ci_binom <- function(x, n, method = "modified wilson", conf.level = 0.95, ...) { + # Patikra + len_x <- length(x) + len_n <- length(n) + checkmate::assert_integerish(x, lower = 0, min.len = 1) + checkmate::assert_integerish(n, lower = 0, min.len = 1) + if (!len_x %in% c(1, max(len_x, len_n))) { + stop("lenght(x) must be either 1 or match length(n).") + } + if (!len_n %in% c(1, max(len_x, len_n))) { + stop("lenght(n) must be either 1 or match length(x).") + } + + # Skaičiavimai + proporcijos_pi <- DescTools::BinomCI( + x = x, n = n, conf.level = conf.level, method = method, ... + ) + dplyr::bind_cols( + tibble::as_tibble(proporcijos_pi), + tibble::tibble(x = as.integer(x), n = as.integer(n)) + ) +} + + +#' Proporcijos PI: 3 ar daugiau grupių +#' +#' Daugiareikšmio (k ≥ 3) kintamojo reikšmių proporcijų *vienu metu* skaičiuojamų +#' pasikliautinųjų intervalų (PI) skaičiavimo funkcija, kuri yra patobulintas +#' [DescTools::MultinomCI()] variantas. Rezultatas – duomenų lentelė. +#' +#' @details +#' Ši funkcija naudojama taip pat, kaip [DescTools::MultinomCI()], tik +#' numatytasis metodas yra Goodman metodas, o rezultatas – duomenų lentelė, +#' o ne vektorius. +#' Todėl rezultatą galima patogiai braižyti naudojant \pkg{ggplot2}. +#' +#' @param x Vektorius su grupių dydžiais. +#' Geriausia, jei vektoriaus elementai turėtų prasmingu pavadinimus +#' (žiūrėti pavyzdžius). +#' +#' @param conf.level Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95. +#' +#' @param method Skaičiavimo metodas (`"goodman"`, `"sisonglaz"`, `"cplus1"` +#' ir kiti variantai, aprašyti [DescTools::MultinomCI()] dokumentacijoje). +#' @param ... Kiti parametrai, kuriuos priima [DescTools::MultinomCI()]. +#' Žiūrėti šios funkcijos dokumentaciją. +#' +#' @param gr_colname Stulpelio pavadinimas (kabutėse), kuriame bus +#' parašyti grupių pavadinimai. Numatytoji reikšmė yra `"group"`. +#' +#' +#' @return +#' Rezultatas – duomenų lentelė, kurios stulpeliai: +#' +#' - `group` arba kitas vartotojo pasirinktas pavadinimas stulpeliui su grupių +#' pavadinimams, numatytoji reikšmė +#' (``). +#' - `est` (``) – proporcijos įvertis. +#' - `lwr.ci`, `upr.ci` (``) – (lower CI, upper CI) apatinė ir viršutinė +#' proporcijos pasikliautinojo intervalo ribos. +#' - `x` (``) – Grupės dydis. +#' - `n` (``) – Įvykių skaičius iš viso. / Imties dydis. +#' +#' @examples +#' # Dažniai be pavadinimų +#' ci_multinom(c(20, 35, 54)) +#' +#' # Nurodytas skaičiavimo metodas +#' ci_multinom(c(20, 35, 54), method = "goodman") +#' +#' # Dažniai su grupių pavadinimais +#' x <- c("dideli" = 20, "vidutiniai" = 35, "maži" = 54) +#' ci_multinom(x, method = "goodman") +#' +#' # Dažniai su grupių pavadinimais ir jungimo operatorius +#' c("dideli" = 20, "vidutiniai" = 35, "maži" = 54) |> +#' ci_multinom() +#' +#' # Kitas metodas +#' c("dideli" = 33, "vidutiniai" = 35, "maži" = 30) |> +#' ci_multinom(method = "sisonglaz") +#' +#' +#' @export + +ci_multinom <- function(x, method = "goodman", conf.level = 0.95, + gr_colname = "group", ...) { + checkmate::assert_integerish(x, lower = 0) + + x |> + DescTools::MultinomCI(method = method, conf.level = conf.level, ...) |> + as.data.frame() |> + tibble::rownames_to_column(gr_colname) |> + dplyr::mutate( + {{ gr_colname }} := forcats::as_factor(.data[[gr_colname]]), + x = as.integer(x), + n = sum(x) |> as.integer() + ) |> + tibble::as_tibble() +} + + +# ~~~ PI savirankos metodu ---------------------------------------------------- + +#' Pasikliautinieji intervalai (PI) savirankos metodais +#' +#' Pasikliautinųjų intervalų (PI) skaičiavimas pasirinktu savirankos metodu +#' (angl. *statistical bootstrap*). Funkcija `ci_boot()` yra patobulintas +#' [DescTools::BootCI()] variantas. Rezultatas – duomenų lentelė. +#' +#' @details +#' Ši funkcija naudojama panašiai, kaip [DescTools::BootCI()], bet: +#' +#' - pirmas argumentas yra duomenų lentelė; +#' - argumentai `x` (ir, jei reikia, `y`) – stulpelių pavadinimai – nurodomi +#' be kabučių; +#' - funkcija reaguoja į [dplyr::group_by()], tad skaičiavimus gali atlikti +#' pogrupiams; +#' - rezultatas – duomenų lentelė. +#' Todėl rezultatą galima patogiai braižyti naudojant \pkg{ggplot2}. +#' +#' @param .data Duomenų lentelė. +#' @param x,y Stulpelio pavadinimas (be kabučių). +#' @param conf.level Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95. +#' @param ... Kiti parametrai, kuriuos priima [DescTools::BootCI()], tarp kurių: +#' 1) `FUN` -- funkcija, kurios rezultatui skaičiuojami PI. +#' 2) `bci.method` -- intervalų sudarymo metodai: +#' + `"perc"` -- procentilių metodas, +#' + `"bca"` -- koreguotasis procentilių metodas BCa +#' (angl. bias-corrected and accelerated), +#' + kiti. +#' 3) `R` -- replikacijų (pakartojimų) skaičius. +#' Įprastai turi būti tarp 1'000 ir 10'000. +#' +#' @return +#' Rezultatas – duomenų lentelė, su pasikliautinaisiais intervalais. +#' Stulpelių skaičius ir pavadinimai priklauso nuo funkcijos argumentų reikšmių +#' ir sugrupavimo: +#' +#' - Jei duomenų lentelė grupuotoji, pirmųjų stulpelių pavadinimai sutampa su +#' grupavimo kintamųjų pavadinimais. +#' - Stulpelio pavadinimas, sutampantis su skaičiuojamos statistikos pavadinimu +#' (argumento `FUN` reikšme). +#' Jame yra skaičiuojamos statistikos įvertis. +#' - `lwr.ci`, `upr.ci` – (lower CI, upper CI) apatinė ir viršutinė +#' pasikliautinojo intervalo ribos. +#' @examples +#' data(iris, package = "datasets") +#' head(iris) +#' +#' set.seed(1) # Atkartojamumui +#' +#' # Medianos PI iš 1000 pakartojimų, +#' # BCa metodas +#' ci_boot(iris, Petal.Length, FUN = median, R = 1000, bci.method = "bca") +#' +#' # Naudojamas jungimo operatorius +#' iris |> +#' ci_boot(Petal.Length, FUN = median, R = 1000, bci.method = "bca") +#' +#' # PI skaičiavimas kiekvienai grupei atskirai +#' iris |> +#' dplyr::group_by(Species) |> +#' ci_boot(Petal.Length, FUN = median, R = 1000, bci.method = "bca") +#' +#' # Medianos PI iš 1000 pakartojimų, procentilių metodas +#' iris |> +#' dplyr::group_by(Species) |> +#' ci_boot(Petal.Length, FUN = median, R = 1000, bci.method = "perc") +#' +#' # PI skaičiavimas, nurodant funkcijos `median()` +#' # argumentą `na.rm = TRUE` +#' med_pi_gr <- +#' iris |> +#' dplyr::group_by(Species) |> +#' ci_boot( +#' Petal.Length, +#' FUN = median, na.rm = TRUE, +#' R = 1000, bci.method = "bca" +#' ) +#' med_pi_gr +#' +#' # Dviejų kintamųjų funkcijoms pavyzdys: +#' # Spearman koreliacijos koeficientas +#' # (method = "spearman" yra cor() argumentas) +#' spearman_pi_gr <- +#' iris |> +#' dplyr::group_by(Species) |> +#' ci_boot( +#' Petal.Length, Petal.Width, +#' FUN = cor, method = "spearman", +#' R = 1000, bci.method = "bca" +#' ) +#' spearman_pi_gr +#' +#' # Dviejų kintamųjų funkcijoms pavyzdys: +#' # Pearson koreliacijos koeficientas +#' # (method = "pearson" yra cor() argumentas) +#' pearson_pi_gr <- +#' iris |> +#' dplyr::group_by(Species) |> +#' ci_boot( +#' Petal.Length, Petal.Width, +#' FUN = cor, method = "pearson", +#' R = 1000, bci.method = "bca" +#' ) +#' pearson_pi_gr +#' +#' @export + +ci_boot <- function(.data, x, y = NULL, conf.level = 0.95, ...) { + + ci_function <- function(x, y) { + # Rezultatas turi būti duomenų lentelė + DescTools::BootCI(x = x, y = y, conf.level = conf.level, ...) |> + t() |> + as.data.frame() + } + + missing_y <- missing(y) + + .data |> + tidyr::nest(data = c(dplyr::everything(), -dplyr::group_vars(.data))) |> + dplyr::mutate(ci = + purrr::map(data, ~ ci_function( + x = dplyr::pull(., {{ x }}), + y = if (missing_y) NULL else dplyr::pull(., {{ y }}) + )) + ) |> + dplyr::select(-data) |> + tidyr::unnest(ci) |> + dplyr::ungroup() +} diff --git a/R/globals.R b/R/globals.R new file mode 100644 index 0000000..cf39608 --- /dev/null +++ b/R/globals.R @@ -0,0 +1 @@ +utils::globalVariables(c("ci", ".data", ":=")) diff --git a/man/ci_binom.Rd b/man/ci_binom.Rd new file mode 100644 index 0000000..d4583be --- /dev/null +++ b/man/ci_binom.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions.R +\name{ci_binom} +\alias{ci_binom} +\title{Proporcijos PI: 2 grupės} +\usage{ +ci_binom(x, n, method = "modified wilson", conf.level = 0.95, ...) +} +\arguments{ +\item{x}{Mus dominančių +\emph{arba} mums palankių įvykių skaičius +\emph{arba} mus dominančios grupės dydis.} + +\item{n}{Įvykių skaičius iš viso. / Imties dydis.} + +\item{method, ...}{Kiti parametrai, kuriuos priima +\code{\link[DescTools:BinomCI]{DescTools::BinomCI()}}. Žiūrėti šios funkcijos dokumentaciją.} + +\item{conf.level}{Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95.} +} +\value{ +Rezultatas – duomenų lentelė, kurios stulpeliai: +\itemize{ +\item \code{est} (\verb{}) – proporcijos įvertis, +\item \code{lwr.ci}, \code{upr.ci} (\verb{}) – (lower CI, upper CI) +apatinė ir viršutinė proporcijos pasikliautinojo intervalo ribos. +\item \code{x} (\verb{}) – Mus dominančių įvykių skaičius / Mus dominančios grupės dydis. +\item \code{n} (\verb{}) – Įvykių skaičius iš viso. / Imties dydis. +} +} +\description{ +Dvireikšmio kintamojo mus dominančios reikšmės proporcijos pasikliautinojo +intervalo (PI) skaičiavimo funkcija, kuri yra patobulintas +\code{\link[DescTools:BinomCI]{DescTools::BinomCI()}} variantas. Rezultatas – duomenų lentelė. +} +\details{ +Ši funkcija naudojama taip pat, kaip \code{\link[DescTools:BinomCI]{DescTools::BinomCI()}}, tik numatytasis +metodas yra modifikuotasis Wilson metodas, o rezultatas – duomenų lentelė, +o ne vektorius. Todėl, pvz., rezultatą galima braižyti naudojant +\pkg{ggplot2}. +} +\examples{ +x <- 54 # mus dominančių įvykių skaičius +n <- 80 # įvykių skaičius iš viso +ci_binom(x = 54, n = 80) + +# Simuliacija su skirtingais imties dydžiais +ci_binom(x = 54, n = c(80, 100, 512)) + +# PI skaičiavimas kiekvienai grupei atskirai +y = c(23, 45) +ci_binom(y, n = sum(y)) + + +} diff --git a/man/ci_boot.Rd b/man/ci_boot.Rd new file mode 100644 index 0000000..710aeee --- /dev/null +++ b/man/ci_boot.Rd @@ -0,0 +1,123 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions.R +\name{ci_boot} +\alias{ci_boot} +\title{Pasikliautinieji intervalai (PI) savirankos metodais} +\usage{ +ci_boot(.data, x, y = NULL, conf.level = 0.95, ...) +} +\arguments{ +\item{.data}{Duomenų lentelė.} + +\item{x, y}{Stulpelio pavadinimas (be kabučių).} + +\item{conf.level}{Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95.} + +\item{...}{Kiti parametrai, kuriuos priima \code{\link[DescTools:BootCI]{DescTools::BootCI()}}, tarp kurių: +\enumerate{ +\item \code{FUN} -- funkcija, kurios rezultatui skaičiuojami PI. +\item \code{bci.method} -- intervalų sudarymo metodai: +\itemize{ +\item \code{"perc"} -- procentilių metodas, +\item \code{"bca"} -- koreguotasis procentilių metodas BCa +(angl. bias-corrected and accelerated), +\item kiti. +} +\item \code{R} -- replikacijų (pakartojimų) skaičius. +Įprastai turi būti tarp 1'000 ir 10'000. +}} +} +\value{ +Rezultatas – duomenų lentelė, su pasikliautinaisiais intervalais. +Stulpelių skaičius ir pavadinimai priklauso nuo funkcijos argumentų reikšmių +ir sugrupavimo: +\itemize{ +\item Jei duomenų lentelė grupuotoji, pirmųjų stulpelių pavadinimai sutampa su +grupavimo kintamųjų pavadinimais. +\item Stulpelio pavadinimas, sutampantis su skaičiuojamos statistikos pavadinimu +(argumento \code{FUN} reikšme). +Jame yra skaičiuojamos statistikos įvertis. +\item \code{lwr.ci}, \code{upr.ci} – (lower CI, upper CI) apatinė ir viršutinė +pasikliautinojo intervalo ribos. +} +} +\description{ +Pasikliautinųjų intervalų (PI) skaičiavimas pasirinktu savirankos metodu +(angl. \emph{statistical bootstrap}). Funkcija \code{ci_boot()} yra patobulintas +\code{\link[DescTools:BootCI]{DescTools::BootCI()}} variantas. Rezultatas – duomenų lentelė. +} +\details{ +Ši funkcija naudojama panašiai, kaip \code{\link[DescTools:BootCI]{DescTools::BootCI()}}, bet: +\itemize{ +\item pirmas argumentas yra duomenų lentelė; +\item argumentai \code{x} (ir, jei reikia, \code{y}) – stulpelių pavadinimai – nurodomi +be kabučių; +\item funkcija reaguoja į \code{\link[dplyr:group_by]{dplyr::group_by()}}, tad skaičiavimus gali atlikti +pogrupiams; +\item rezultatas – duomenų lentelė. +Todėl rezultatą galima patogiai braižyti naudojant \pkg{ggplot2}. +} +} +\examples{ +data(iris, package = "datasets") +head(iris) + +set.seed(1) # Atkartojamumui + +# Medianos PI iš 1000 pakartojimų, +# BCa metodas +ci_boot(iris, Petal.Length, FUN = median, R = 1000, bci.method = "bca") + +# Naudojamas jungimo operatorius +iris |> + ci_boot(Petal.Length, FUN = median, R = 1000, bci.method = "bca") + +# PI skaičiavimas kiekvienai grupei atskirai +iris |> + dplyr::group_by(Species) |> + ci_boot(Petal.Length, FUN = median, R = 1000, bci.method = "bca") + +# Medianos PI iš 1000 pakartojimų, procentilių metodas +iris |> + dplyr::group_by(Species) |> + ci_boot(Petal.Length, FUN = median, R = 1000, bci.method = "perc") + +# PI skaičiavimas, nurodant funkcijos `median()` +# argumentą `na.rm = TRUE` +med_pi_gr <- + iris |> + dplyr::group_by(Species) |> + ci_boot( + Petal.Length, + FUN = median, na.rm = TRUE, + R = 1000, bci.method = "bca" + ) +med_pi_gr + +# Dviejų kintamųjų funkcijoms pavyzdys: +# Spearman koreliacijos koeficientas +# (method = "spearman" yra cor() argumentas) +spearman_pi_gr <- + iris |> + dplyr::group_by(Species) |> + ci_boot( + Petal.Length, Petal.Width, + FUN = cor, method = "spearman", + R = 1000, bci.method = "bca" + ) +spearman_pi_gr + +# Dviejų kintamųjų funkcijoms pavyzdys: +# Pearson koreliacijos koeficientas +# (method = "pearson" yra cor() argumentas) +pearson_pi_gr <- + iris |> + dplyr::group_by(Species) |> + ci_boot( + Petal.Length, Petal.Width, + FUN = cor, method = "pearson", + R = 1000, bci.method = "bca" + ) +pearson_pi_gr + +} diff --git a/man/ci_mean_t.Rd b/man/ci_mean_t.Rd new file mode 100644 index 0000000..0c2edad --- /dev/null +++ b/man/ci_mean_t.Rd @@ -0,0 +1,52 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions.R +\name{ci_mean_t} +\alias{ci_mean_t} +\title{Vidurkio PI, suskaičiuotas pagal duomenis} +\usage{ +ci_mean_t(.data, x, conf.level = 0.95, ...) +} +\arguments{ +\item{.data}{Duomenų lentelė.} + +\item{x}{Stulpelio pavadinimas (be kabučių).} + +\item{conf.level}{Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95.} + +\item{...}{Kiti parametrai, kuriuos priima \code{\link[DescTools:MeanCI]{DescTools::MeanCI()}}. +Žiūrėti šios funkcijos dokumentaciją.} +} +\value{ +Rezultatas – duomenų lentelė, kurioje yra šie stulpeliai: +\itemize{ +\item (jei yra) grupavimo kintamųjų pavadinimai; +\item \code{mean} (\verb{}) – vidurkio įvertis; +\item \code{lwr.ci}, \code{upr.ci} (\verb{}) – (lower CI, upper CI) apatinė ir viršutinė +pasikliautinojo intervalo ribos. +} +} +\description{ +Funkcija \code{ci_mean_t()} skaičiuoja vidurkio pasikliautinajį intervalą (PI) +pagal \emph{klasikinę} formulę su t (Stjudento) koeficientu, kai duomenys +pateikti \emph{duomenų lentelės pavidalu}. Ši funkcija yra patobulinta +\code{\link[DescTools:MeanCI]{DescTools::MeanCI()}}, reaguojanti į \code{\link[dplyr:group_by]{dplyr::group_by()}}, tad skaičiavimus +gali atlikti ir pogrupiams. Rezultatas – duomenų lentelė. +} +\examples{ +# Pavyzdžiai +data(npk, package = "datasets") +head(npk) + +# Kintamojo `yield` vidurkio PI skaičiavimas +ci_mean_t(npk, yield) + +# PI skaičiavimas naudojant jungimo operatorių +npk |> ci_mean_t(yield) + +# PI skaičiavimas grupuojant pagal vieną kintamąjį +npk |> dplyr::group_by(N) |> ci_mean_t(yield) + +# PI skaičiavimas grupuojant pagal 3 kintamuosius +npk |> dplyr::group_by(N, P, K) |> ci_mean_t(yield) + +} diff --git a/man/ci_mean_t_stat.Rd b/man/ci_mean_t_stat.Rd new file mode 100644 index 0000000..e458b98 --- /dev/null +++ b/man/ci_mean_t_stat.Rd @@ -0,0 +1,78 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions.R +\name{ci_mean_t_stat} +\alias{ci_mean_t_stat} +\title{Vidurkio PI, suskaičiuotas pagal aprašomąsias statistikas} +\usage{ +ci_mean_t_stat(mean_, sd_, n, group = "", conf.level = 0.95) +} +\arguments{ +\item{mean_}{Vektorius su kiekvienos grupės vidurkiais.} + +\item{sd_}{Vektorius su kiekvienos grupės standartiniu nuokrypiu.} + +\item{n}{Vektorius su kiekvienos grupės dydžiu.} + +\item{group}{Grupės pavadinimas. +Numatytoji reikšmė – tuščia eilutė (\code{""}).} + +\item{conf.level}{Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95.} +} +\value{ +Rezultatas – duomenų lentelė, su šiais stulpeliais: +\itemize{ +\item \code{group} (\verb{}) – grupės pavadinimas; +\item \code{mean} (\verb{}) – vidurkio įvertis; +\item \code{lwr.ci} (\verb{}) – apatinė vidurkio PI riba (lwr. atitinka „lower“); +\item \code{upr.ci} (\verb{}) – viršutinė vidurkio PI riba (upr. atitinka „upper“); +\item \code{sd} (\verb{}) – standartinis nuokrypis; +\item \code{n} (\verb{}) – imties/grupės dydis. +} + +Skaičiavimai gali būti atlikti ir rezultatai pateikti daugiau nei vienai +grupei. +} +\description{ +Funkcija \code{ci_mean_t_stat()} skaičiuoja vidurkio pasikliautinajį intervalą (PI) +pagal \emph{klasikinę} formulę su t (Stjudento) koeficientu, kai duotos +\emph{aprašomosios statistikos} (vidurkis, standartinis nuokrypis, imties dydis). +Naudinga, kai tokie dydžiai būna pateikti mokslinėje literatūroje. +} +\note{ +Kiekvieno iš \code{mean_}, \code{sd_}, \code{n}, \code{group} ilgis (reikšmių skaičius) turi būti +(a) arba vieną reikšmė, +(b) arba sutapti su ilgiausiu šios argumentų grupės vektoriumi. + +Dėl aiškumo išnagrinėkite pavyzdžius. +} +\examples{ +# Pavyzdžiai + +# Nurodant argumentų pavadinimus: +ci_mean_t_stat(mean_ = 362, sd_ = 35, n = 100) + +# Nenurodant argumentų pavadinimų: +ci_mean_t_stat(362, 35, 100) + + +# Skaičiavimai kelioms grupėms: +vidurkis <- c(1, 2, 3) +st_nuokrypis <- c(3, 2, 3) +n <- c(50, 20, 40) +grupe <- c("A", "B", "C") + +ci_mean_t_stat(vidurkis, st_nuokrypis, n, grupe) + + +# Simuliacija su keliais imties dydžiais: +ci_mean_t_stat(mean_ = 362, sd_ = 35, n = c(10, 50, 100, 1000)) + + +# Jei norite, kad rodytų daugiau skaitmenų po kablelio: +rez_pi <- ci_mean_t_stat(362, 35, 100) +as.data.frame(rez_pi) + +# Arba +# View(rez_pi) + +} diff --git a/man/ci_multinom.Rd b/man/ci_multinom.Rd new file mode 100644 index 0000000..4206833 --- /dev/null +++ b/man/ci_multinom.Rd @@ -0,0 +1,75 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions.R +\name{ci_multinom} +\alias{ci_multinom} +\title{Proporcijos PI: 3 ar daugiau grupių} +\usage{ +ci_multinom( + x, + method = "goodman", + conf.level = 0.95, + gr_colname = "group", + ... +) +} +\arguments{ +\item{x}{Vektorius su grupių dydžiais. +Geriausia, jei vektoriaus elementai turėtų prasmingu pavadinimus +(žiūrėti pavyzdžius).} + +\item{method}{Skaičiavimo metodas (\code{"goodman"}, \code{"sisonglaz"}, \code{"cplus1"} +ir kiti variantai, aprašyti \code{\link[DescTools:MultinomCI]{DescTools::MultinomCI()}} dokumentacijoje).} + +\item{conf.level}{Pasikliovimo lygmuo. Numatytoji reikšmė – 0.95.} + +\item{gr_colname}{Stulpelio pavadinimas (kabutėse), kuriame bus +parašyti grupių pavadinimai. Numatytoji reikšmė yra \code{"group"}.} + +\item{...}{Kiti parametrai, kuriuos priima \code{\link[DescTools:MultinomCI]{DescTools::MultinomCI()}}. +Žiūrėti šios funkcijos dokumentaciją.} +} +\value{ +Rezultatas – duomenų lentelė, kurios stulpeliai: +\itemize{ +\item \code{group} arba kitas vartotojo pasirinktas pavadinimas stulpeliui su grupių +pavadinimams, numatytoji reikšmė +(\verb{}). +\item \code{est} (\verb{}) – proporcijos įvertis. +\item \code{lwr.ci}, \code{upr.ci} (\verb{}) – (lower CI, upper CI) apatinė ir viršutinė +proporcijos pasikliautinojo intervalo ribos. +\item \code{x} (\verb{}) – Grupės dydis. +\item \code{n} (\verb{}) – Įvykių skaičius iš viso. / Imties dydis. +} +} +\description{ +Daugiareikšmio (k ≥ 3) kintamojo reikšmių proporcijų \emph{vienu metu} skaičiuojamų +pasikliautinųjų intervalų (PI) skaičiavimo funkcija, kuri yra patobulintas +\code{\link[DescTools:MultinomCI]{DescTools::MultinomCI()}} variantas. Rezultatas – duomenų lentelė. +} +\details{ +Ši funkcija naudojama taip pat, kaip \code{\link[DescTools:MultinomCI]{DescTools::MultinomCI()}}, tik +numatytasis metodas yra Goodman metodas, o rezultatas – duomenų lentelė, +o ne vektorius. +Todėl rezultatą galima patogiai braižyti naudojant \pkg{ggplot2}. +} +\examples{ +# Dažniai be pavadinimų +ci_multinom(c(20, 35, 54)) + +# Nurodytas skaičiavimo metodas +ci_multinom(c(20, 35, 54), method = "goodman") + +# Dažniai su grupių pavadinimais +x <- c("dideli" = 20, "vidutiniai" = 35, "maži" = 54) +ci_multinom(x, method = "goodman") + +# Dažniai su grupių pavadinimais ir jungimo operatorius +c("dideli" = 20, "vidutiniai" = 35, "maži" = 54) |> + ci_multinom() + +# Kitas metodas +c("dideli" = 33, "vidutiniai" = 35, "maži" = 30) |> + ci_multinom(method = "sisonglaz") + + +} diff --git a/pi.Rproj b/pi.Rproj new file mode 100644 index 0000000..270314b --- /dev/null +++ b/pi.Rproj @@ -0,0 +1,21 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace