{
"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
}