Created
January 31, 2021 20:45
-
-
Save RuolinZheng08/86518fbf0d7ef2cc7c7cb63cb49fd32b to your computer and use it in GitHub Desktop.
[Python, Statistics] Permutation Test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from itertools import combinations\n", | |
| "from collections import Counter" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def two_sample_permutation_test(arr, start, size):\n", | |
| " target = arr[start : start + size]\n", | |
| " arr_counter = Counter(arr)\n", | |
| " target_diff = sum(target) - sum((arr_counter - Counter(target)).elements())\n", | |
| " print('target: ', target_diff)\n", | |
| " count = 0\n", | |
| " for curr in combinations(arr, size):\n", | |
| " curr_counter = Counter(curr)\n", | |
| " complement = list((arr_counter - curr_counter).elements())\n", | |
| " diff = sum(curr) - sum(complement)\n", | |
| " if diff >= target_diff:\n", | |
| " print(curr, diff)\n", | |
| " count += 1\n", | |
| " return count" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 60, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "arr = [111, 56, 86, 92, 104, 118, 117, 111]\n", | |
| "two_sample_permutation_test(arr, 4, 4)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 72, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "(4.5, 3, 7, 6) 13.0\n", | |
| "(4.5, 7, 6, 4.5) 16.0\n", | |
| "(3, 7, 6, 4.5) 13.0\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "3" | |
| ] | |
| }, | |
| "execution_count": 72, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "two_sample_permutation_test([4.5, 0, 1, 2, 3, 7, 6, 4.5], 4, 4)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "target: 42\n", | |
| "(25, 31, 46) 42\n", | |
| "(25, 46, 31) 42\n", | |
| "(31, 46, 31) 54\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "3" | |
| ] | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "two_sample_permutation_test([25, 31, 46, 10, 19, 31], 0, 3)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 76, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def two_sample_permutation_test_two_sided(arr, start, size):\n", | |
| " target = arr[start : start + size]\n", | |
| " arr_counter = Counter(arr)\n", | |
| " target_diff = abs(sum(target) - sum((arr_counter - Counter(target)).elements()))\n", | |
| " print('target: ', target_diff)\n", | |
| " count = 0\n", | |
| " for curr in combinations(arr, size):\n", | |
| " curr_counter = Counter(curr)\n", | |
| " complement = list((arr_counter - curr_counter).elements())\n", | |
| " diff = abs(sum(curr) - sum(complement))\n", | |
| " if diff >= target_diff:\n", | |
| " print(curr, diff)\n", | |
| " count += 1\n", | |
| " return count" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 79, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "target: 3.299999999999999\n", | |
| "(3.4, 2.8, 1.9, 2.6) 3.299999999999999\n", | |
| "(3.4, 2.8, 2.6, 2.4) 4.299999999999999\n", | |
| "(3.4, 2.8, 2.6, 2.1) 3.6999999999999993\n", | |
| "(3.4, 2.8, 2.4, 2.1) 3.299999999999999\n", | |
| "(1.9, 2.6, 1.4, 1.5) 3.299999999999999\n", | |
| "(1.9, 1.4, 2.4, 1.5) 3.6999999999999993\n", | |
| "(1.9, 1.4, 2.1, 1.5) 4.299999999999999\n", | |
| "(1.4, 2.4, 2.1, 1.5) 3.299999999999999\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "8" | |
| ] | |
| }, | |
| "execution_count": 79, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "two_sample_permutation_test_two_sided([3.4, 2.8, 1.9, 2.6, 1.4, 2.4, 2.1, 1.5], 4, 4)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 80, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "target: 12\n", | |
| "(8, 7, 6, 3) 12\n", | |
| "(8, 7, 6, 5) 16\n", | |
| "(8, 7, 6, 4) 14\n", | |
| "(8, 7, 5, 4) 12\n", | |
| "(6, 3, 2, 1) 12\n", | |
| "(3, 5, 2, 1) 14\n", | |
| "(3, 4, 2, 1) 16\n", | |
| "(5, 4, 2, 1) 12\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "8" | |
| ] | |
| }, | |
| "execution_count": 80, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "two_sample_permutation_test_two_sided([8, 7, 6, 3, 5, 4, 2, 1], 4, 4)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def matched_pair_permutation_test(arr):\n", | |
| " count = 0\n", | |
| " neg_sum = sum([elm for elm in arr if elm < 0])\n", | |
| " if neg_sum < 0: \n", | |
| " # at least one entry negative, should count the all positive array\n", | |
| " print('[], 0')\n", | |
| " count += 1\n", | |
| " arr = sorted([-abs(elm) for elm in arr], reverse=True)\n", | |
| " \n", | |
| " for i in range(1, len(arr)):\n", | |
| " for nums in combinations(arr, i):\n", | |
| " curr_sum = sum(nums)\n", | |
| " if curr_sum >= neg_sum:\n", | |
| " print(nums, curr_sum)\n", | |
| " count += 1\n", | |
| " return count" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 91, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[], 0\n", | |
| "(-1,) -1\n", | |
| "(-2,) -2\n", | |
| "(-3,) -3\n", | |
| "(-4,) -4\n", | |
| "(-1, -2) -3\n", | |
| "(-1, -3) -4\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "7" | |
| ] | |
| }, | |
| "execution_count": 91, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "arr = [-1, 6, 4, 6, 2, -3, 5]\n", | |
| "matched_pair_permutation_test(arr)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 83, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[], 0\n", | |
| "[-1.0] -1.0\n", | |
| "[-2.0] -2.0\n", | |
| "[-3.0] -3.0\n", | |
| "[-4.0] -4.0\n", | |
| "[-1.0, -2.0] -3.0\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "6" | |
| ] | |
| }, | |
| "execution_count": 83, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "matched_pair_permutation_test([-1.0, 6.5, 4.0, 6.5, 2.0, -3.0, 5.0])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[], 0\n", | |
| "[-0.25] -0.25\n", | |
| "[-0.33] -0.33\n", | |
| "[-0.25, -0.33] -0.5800000000000001\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "4" | |
| ] | |
| }, | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "matched_pair_permutation_test([1.85, -0.25, 0.88, 1.46, 1.05, 1.67, 1.74, -0.33])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 42, | |
| "metadata": { | |
| "scrolled": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[], 0\n", | |
| "[-1] -1\n", | |
| "[-2] -2\n", | |
| "[-3] -3\n", | |
| "[-1, -2] -3\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "5" | |
| ] | |
| }, | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "matched_pair_permutation_test([-1, -2, 3, 4, 5, 6, 7, 8])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[], 0\n", | |
| "(-1,) -1\n", | |
| "(-1,) -1\n", | |
| "(-1,) -1\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "4" | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "matched_pair_permutation_test([1, 6, 1, 7, -1, 2, 8])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[], 0\n", | |
| "(-2,) -2\n", | |
| "(-2,) -2\n", | |
| "(-2,) -2\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "4" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "matched_pair_permutation_test([2, 5, 2, 6, -2, 4, 7])" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.8.0" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment