{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [Phystech@DataScience](https://thetahat.ru/courses/ph-ds-2025-spr)\n", "## Домашнее задание 10\n", "\n", "**Правила, прочитайте внимательно:**\n", "\n", "* Выполненную работу нужно отправить телеграм-боту `@thetahat_pds_bot`. Для начала работы с ботом каждый раз отправляйте `/start`. Дождитесь подтверждения от бота, что он принял файл. Если подтверждения нет, то что-то не так. **Работы, присланные иным способом, не принимаются.**\n", "* Дедлайн см. в боте. После дедлайна работы не принимаются кроме случаев наличия уважительной причины.\n", "* Прислать нужно **ноутбук в формате `ipynb`**. Если вы строите интерактивные графики, их стоит прислать в формате html.\n", "* Следите за размером файлов. **Бот не может принимать файлы весом более 20 Мб.** Если файл получается больше, заранее разделите его на несколько.\n", "* Выполнять задание необходимо полностью самостоятельно. **При обнаружении списывания всем участникам списывания дается штраф -2 балла к итоговой оценке за семестр.**\n", "* Решения, размещенные на каких-либо интернет-ресурсах, не принимаются. Кроме того, публикация решения в открытом доступе может быть приравнена к предоставлении возможности списать.\n", "* Обратите внимание на правила использования ИИ-инструментов при решении домашнего задания.\n", "* **Код из рассказанных на занятиях ноутбуков** можно использовать без ограничений.\n", "* Для выполнения задания используйте этот ноутбук в качестве основы, ничего не удаляя из него. Можно добавлять необходимое количество ячеек.\n", "* Комментарии к решению пишите в markdown-ячейках.\n", "* Выполнение задания (ход решения, выводы и пр.) должно быть осуществлено на русском языке.\n", "* Решение проверяется системой ИИ-проверки **ThetaGrader**. Результат проверки валидируется и исправляется человеком, после чего комментарии отправляются студентам.\n", "* Если код будет не понятен проверяющему, оценка может быть снижена.\n", "* Никакой код из данного задания при проверке запускаться не будет. *Если код студента не выполнен, недописан и т.д., то он не оценивается.*\n", "\n", "Важно!!! Правила заполнения ноутбука:\n", "* Запрещается удалять имеющиеся в ноутбуке ячейки, менять местами положения задач.\n", "* Сохраняйте естественный линейный порядок повествования в ноутбуке сверху-вниз.\n", "* Отвечайте на вопросы, а также добавляйте новые ячейки в предложенных местах, которые обозначены `<...>`.\n", "* В markdown-ячейках, содержащих описание задачи, находятся специальные отметки, которые запрещается модифицировать.\n", "* При нарушении данных правил работа может получить 0 баллов.\n", "\n", "**Баллы за задание:**\n", "\n", "Легкая часть (достаточно на \"хор\"):\n", "* Задача 1 — 20 баллов\n", "\n", "Сложная часть (необходимо на \"отл\"):\n", "* Задача 2 — 30 баллов\n", "\n", "Легкая часть (достаточно на \"хор\"):\n", "* Задача 3 — 35 баллов\n", "* Задача 4 — 30 баллов\n", "\n", "Сложная часть (необходимо на \"отл\"):\n", "* Задача 5 — 25 баллов\n", "\n", "\n", "\n", "-----" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Bot check\n", "\n", "# HW_ID: phds_hw10\n", "# Бот проверит этот ID и предупредит, если случайно сдать что-то не то.\n", "\n", "# Status: not final\n", "# Перед отправкой в финальном решении удали \"not\" в строчке выше.\n", "# Так бот проверит, что ты отправляешь финальную версию, а не промежуточную.\n", "# Никакие значения в этой ячейке не влияют на факт сдачи работы." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "pwOeZYydbPOU" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import scipy.stats as sps\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from scipy.special import gamma, loggamma\n", "\n", "sns.set_style(\"whitegrid\")\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "id": "d8Q8Vda0J1LB" }, "source": [ "## Теоретическая часть\n", "### Легкая часть " ] }, { "cell_type": "markdown", "metadata": { "id": "-wCMvSpMJ1LB" }, "source": [ "### Задание 1\n", "\n", "Пусть $x_1, \\dots, x_n$ — реализация выборки, $X^{*}_1, X^{*}_2, \\dots, X^{*}_n$ — построенная по ней бутстрепная выборка. С какой вероятностью элемент $x_i$ исходной выборки попадёт в бутстрепную? Посчитайте среднее число уникальных (попарно различных) элементов в бутстрепной выборке, если в исходной выборке все элементы различны? К какой функции от $n$ стремится это количество при $n \\rightarrow \\infty$?\n" ] }, { "cell_type": "markdown", "metadata": { "id": "od4vuw6aJ1LC" }, "source": [ "### Сложная часть\n" ] }, { "cell_type": "markdown", "metadata": { "id": "YFeHj5-kcNbS" }, "source": [ "### Задание 2\n", "\n", "Рассмотрим модель линейной регрессии\n", "\n", "$$Y = X \\theta + ɛ,$$\n", "\n", "где $Y \\in \\mathbb{R}^n$ - отклик, $X \\in \\mathbb{R}^{n \\times d}$, $\\theta \\in \\mathbb{R}^d$, $ɛ \\in \\mathbb{R}^n$ - шум, $n > d$, $rk X = d$.\n", "\n", "Будем рассматривать нормальный и гомоскедастичный шум, т.е. $ɛ \\sim \\mathcal{N}(0, 1)$\n", "\n", "1. Получите выражение для функции правдоподобия в данной модели. Минимизации какой функции потерь эквивалента максимизация правдоподобия в данной задаче?\n", "2. Найдите оценку максимального правдоподобия для $(\\theta, \\sigma^2)$.\n", "\n", "3. Пусть $x_{new} \\in \\mathbb{R}^{d}$ - новый объект. Постройте асимптотический доверительный интервал для ожидаемого значения отклика на этом объекте $y_{new} = x_{new}^T \\theta$.\n", "
*Указание:* используя модель регрессии, получите распределение, которое имеет величина $\\widehat{\\theta}_{\\text{МНК}}$. Учитывая свойства, данные в домашнем задании №6, получите распределение для $x_{new}^T\\widehat{\\theta}_{\\text{МНК}}$. Считая величину $\\sigma^2$ известной, запишите интервал. Далее замените дисперсию $\\sigma^2$ на ее состоятельную оценку.\n", "\n", "4. Также постройте точный доверительный интервал для ожидаемого значения отклика на том же новом объекте $x_{new}$." ] }, { "cell_type": "markdown", "metadata": { "id": "atZ399yebzJ7" }, "source": [ "## Практическая часть\n", "### Легкая часть \n", "### Задание 3\n", "Cкачайте данные `wine dataset` и рассмотрите столбцы `Alcalinity of ash`, `Nonflavanoid phenols`, `Proanthocyanins` и `Hue` для вина *первого типа*. Тип вина указан в первом столбце. Для работы с табличными данными используйте библиотеку `pandas`.\n", "\n", "Постройте доверительные интервалы для параметров сдвига каждого из столбцов, предполагая, что столбцы имеют нормальное распределение.\n", "Требуется построить:\n", " * асимтотические доверительные интервалы при помощи центральной предельной теоремы;\n", " * точные неасимптотические при помощи распределений хи-квадрат, Стьюдента.\n", "\n", "\n", " Запишите их в виде таблицы." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "id": "uOUuOB8WbzJ7", "scrolled": true }, "outputs": [], "source": [ "# ваш код" ] }, { "cell_type": "markdown", "metadata": { "id": "RtyJNb4vbzJ7" }, "source": [ "Сделайте выводы по полученной таблице." ] }, { "cell_type": "markdown", "metadata": { "id": "dABEgOOxbzJ7" }, "source": [ "**Вывод:**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 4\n", "\n", "**Профиль Физика**\n", "\n", "Скачайте данные столкновениях частиц и оставьте следующие признаки:\n", "* `E1`, `E2` — полная энергия электронов (ГэВ);\n", "* `M` — инвариантная масса двух электронов (ГэВ).\n", "\n", "Датасет большой, поэтому для ускорения расчетов можно взять подвыборку размера ~ 1000 \n", "\n", "**Профиль биология**\n", "\n", "Скачайте данные экспрессии белков у белых мышей и оставьте следующие белки для анализа:\n", "* `ITSN1_N`\n", "* `DYRK1A_N`\n", "* `ELK_N`\n", "\n", "\n", "\n", "\n", "**1.** Постройте для каждого из них гистограммы. Что можно сказать о характере распределения?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(\"your/data/path\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ответ:** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.** Пусть есть выборка $X_1, ..., X_n$. Опишите процедуру бутстрепа построения доверительного интервала для величины $\\theta = \\mathsf{E} X_1$. Рассмотрите три типа бутстрепных доверительных интервалов.\n", "Выпишите соответствующие формулы. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Описание**:\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**3.** Реализуйте функцию вычисления выборки оценок $\\theta^*_1, \\ldots \\theta^*_B$ для оценки $\\widehat \\theta$ методом бутстрепа. Функция должна принимать на вход выборку и количество бутстрепных выборок $B$. \n", "\n", "Для ускорения расчетов можете использовать broadcasting (не является обязательным требованием). Учите, что в таком случае внутри функции у вас могут получиться очень большие матрицы, из-за которых может кончиться оперативная память. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def bootstrap(sample, B=100_000): \n", " '''\n", " Считает бутстрепные оценки для исходной выборки\n", "\n", " :param sample: исходная выборка\n", " :param B: количество бутстрепных \n", " :return bootstrap_estimations: оценки по бутстрепным выборкам\n", " ''' \n", " \n", " return\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4.** Реализуйте три типа бутстрепных доверительных интервалы в виде функций, принимающих на вход выборку оценок, полученных с помощью бутстрепа. Реализовывать вычисление бутстрепных интервалов для подвыборок размера от 1 до n не нужно, только для всей выборки. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def bootstrap_normal_confidence_interval(theta, bootstrap_estimations, alpha=0.95):\n", " '''\n", " Считает левую и правую границу нормального бутстрепного интервала\n", "\n", " :param theta: оценка параметра\n", " :param bootstrap_estimations: массив бутстрепных оценок\n", " :return left: левая граница бутстрепного интервала\n", " :return right: правая граница бутстрепного интервала\n", " ''' \n", "\n", " return\n", "\n", " \n", "def bootstrap_central_confidence_interval(theta, bootstrap_estimations, alpha=0.95):\n", " '''\n", " Считает левую и правую границу центрального бутстрепного интервала\n", "\n", " :param theta: оценка параметра\n", " :param bootstrap_estimations: массив бутстрепных оценок\n", " :return left: левая граница бутстрепного интервала\n", " :return right: правая граница бутстрепного интервала\n", " ''' \n", "\n", " return\n", "\n", " \n", "def bootstrap_quantile_confidence_interval(theta, bootstrap_estimations, alpha=0.95):\n", " '''\n", " Считает левую и правую границу квантильного бутстрепного интервала\n", "\n", " :param theta: оценка параметра\n", " :param bootstrap_estimations: массив бутстрепных оценок\n", " :return left: левая граница бутстрепного интервала\n", " :return right: правая граница бутстрепного интервала\n", " ''' \n", " \n", " return" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**5.** Для каждого признака постройте бутстрепные доверительные интервалы для $\\theta = \\mathsf{E} X_1$ и сравните их." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = pd.DataFrame(index = ['normal', 'central', 'quantile', 'theta', 'interval_length'], columns=df.columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вывод:** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Визуализируйте бутстрепные интервалы для каждого признака. Для этого сгенерируйте выборку $X_1, ... X_{N}, N = 100$ и постройте график доверительных интервалов уровня доверия $0.95$, вычисленных для всех подвыборок размера $n$ вида $X_1, ... X_n$, $1 \\le n \\le 100$, используя написанную ниже функцию" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def draw_confidence_interval(\n", " left,\n", " right,\n", " estimation=None,\n", " sample=None, \n", " ylim=(None, None), \n", " estim_label = '',\n", " sample_label='',\n", " color=None,\n", " interval_label=None\n", "):\n", " '''\n", " Рисует доверительный интервал и оценку в зависимости от размера выборки.\n", " \n", " :param left: левые границы интервалов (в зависимости от n)\n", " :param right: правые границы интервалов (в зависимости от n)\n", " :param estimation: оценки (в зависимости от n)\n", " :param sample: выборка\n", " :param ylim: ограничение вертикальной оси\n", " :param estim_label: подпись к оценке\n", " :param sample_label: подпись к выборке\n", " :param color: цвет, которым будет отображен доверительный интервал\n", " '''\n", " \n", " return\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Решение:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вывод:** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Сложная часть\n", "### Задача 5\n", "Как мы помним, асимпотические доверительные интервалы ничего не могут гарантировать на малых размерах выборки, а что насчет точных доверительных интервалов? В этом задании вновь необходимо посчитать реальный уровень доверия.\n", "\n", "Допустим, вы хотите оценить реальный уровень доверия интервала для $a$, если $X \\sim \\mathcal{N}(a, \\sigma^2)$.\n", "\n", "- Фиксируете истинные $(a, \\sigma^2)$, для которых будете делать оценку\n", "- Генерируете $B$ выборок из $\\mathcal{N}(a, \\sigma^2)$ с зафиксированными параметрами\n", "- По каждой выборке получаете ДИ для $a$ \n", "- Считаете долю случаев, когда истинное $a$ попадает в интервал\n", "\n", "Эта доля и будет оценкой доли покрытия интервала.\n", "\n", "**Важно:** вы симулируете реальную ситуацию, когда вы не знаете ни $a$, ни $\\sigma$, поэтому в формулах для ДИ их **использовать нельзя**!\n", "\n", "**Важно:** при такой оценке реального уровня доверия вы используете метод Монте-Карло. Погрешность этого метода составляет $\\sim \\frac{1}{\\sqrt{n}}$, где $n$ - количество выборок, по которым осуществляется оценка. \n", "\n", "*Вопрос:* какое $n$ нужно брать, если вы хотите оценить реальный уровень доверия с точностью до 2 знаков ($\\delta = 0.01$)? \n", "\n", "**Ваш ответ:**\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1.** Генерация выборок для оценки" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сгенерируйте набор выборок из нормального распределения $\\mathcal{N}(\\theta, 1)$ при $\\theta=0$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "theta = 0 # истинное значение параметра\n", "sample_size = 300\n", "sample_count = <...>\n", "X = <...>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2.** Построение ТДИ\n", "\n", "На лекции вы получали формулу для точного доверительного интервала для $a$ в нормальной модели\n", "\n", "Точный доверительный интервал: $\\theta \\in $ <...>\n", "\n", "**Вопрос:** чем этот интервал лучше предыдущего?\n", "\n", "**Ваш ответ:** \n", "\n", "Постройте график реального уровня доверия интервала от размера выборки для этого вида интервала. График начинайте с $n=2$. Сравните его поведение с асимптотическим ДИ. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Вывод:** " ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.6" } }, "nbformat": 4, "nbformat_minor": 1 }