pushing final oblig
7
.gitignore
vendored
@@ -2,10 +2,3 @@
|
|||||||
.Rhistory
|
.Rhistory
|
||||||
.RData
|
.RData
|
||||||
.Ruserdata
|
.Ruserdata
|
||||||
.codex
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
=======
|
|
||||||
.env
|
|
||||||
.vscode
|
|
||||||
.DS_Store
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|||||||
BIN
Oblig/3c/Oblig 3c - Lineær regresjon med usikkerhet.pdf
Normal file
36
Oblig/3c/latex/main.tex
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
\documentclass[11pt,a4paper]{article}
|
||||||
|
|
||||||
|
\usepackage[norsk]{babel}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{amsmath, amssymb}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{booktabs}
|
||||||
|
\usepackage{geometry}
|
||||||
|
\usepackage{float}
|
||||||
|
\usepackage{hyperref}
|
||||||
|
\usepackage[newfloat]{minted}
|
||||||
|
\geometry{margin=2.5cm}
|
||||||
|
\setminted{
|
||||||
|
fontsize=\small,
|
||||||
|
linenos,
|
||||||
|
breaklines,
|
||||||
|
frame=lines
|
||||||
|
}
|
||||||
|
|
||||||
|
\title{Oblig 3c\\Lineær regresjon med usikkerhet}
|
||||||
|
\author{Navn: \underline{\hspace{6cm}}}
|
||||||
|
\date{\today}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
\tableofcontents
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
\input{sections/task1_kap17_1c}
|
||||||
|
\input{sections/task2_kap17_1d}
|
||||||
|
\input{sections/task3_terningdropp}
|
||||||
|
\input{sections/task4_utvalgsforsok}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
18
Oblig/3c/latex/sections/innledning.tex
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
\section{Innledning}
|
||||||
|
|
||||||
|
I denne rapporten ser vi på lineær regresjon med usikkerhet i en Bayesiansk ramme.
|
||||||
|
Målet er å bruke teorien fra kapittel 17 til å beskrive både selve regresjonslinjen og
|
||||||
|
usikkerheten rundt den. Det innebærer at vi ikke bare finner ett enkelt uttrykk for en
|
||||||
|
linje, men også undersøker hvordan usikkerheten i dataene påvirker stigningstall,
|
||||||
|
standardavvik, posteriorfordelinger og intervallestimater.
|
||||||
|
|
||||||
|
Rapporten er delt i to hoveddeler. Først løses to bokoppgaver fra kapittel 17, der vi
|
||||||
|
bruker de generelle formlene for posterior- og prediktive fordelinger i lineær regresjon.
|
||||||
|
Deretter brukes de samme ideene på terningdropp-dataene fra oppgavesettet, hvor vi
|
||||||
|
analyserer sammenhengen mellom dropphøyde og sprettlengde. Til slutt undersøker vi
|
||||||
|
hvordan regresjonslinjer og intervallestimater varierer når vi bare bruker tilfeldige
|
||||||
|
delutvalg av observasjonene.
|
||||||
|
|
||||||
|
I arbeidet brukes R til å beregne regresjonslinjer, posteriorfordelinger, kredibilitetsintervall
|
||||||
|
og figurer. Figurene brukes videre for å synliggjøre både mønsteret i dataene og hvordan
|
||||||
|
usikkerheten endrer seg når datagrunnlaget blir større eller mindre.
|
||||||
103
Oblig/3c/latex/sections/task1_kap17_1c.tex
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
\section{Oppgave 1: Kapittel 17, oppgave 1c}
|
||||||
|
|
||||||
|
I denne oppgaven bruker vi observasjonene
|
||||||
|
\[
|
||||||
|
\{(2,10), (3,8), (4,8), (6,7)\},
|
||||||
|
\]
|
||||||
|
og vi er gitt \(\sigma_0 = 0.5\) og \(n_0 = 4\).
|
||||||
|
|
||||||
|
\subsection{Tema}
|
||||||
|
Temaet er Bayesiansk lineær regresjon med informativ prior for usikkerheten. Vi skal
|
||||||
|
finne posteriorfordelingen til \(\tau\), posteriorfordelingen til \(y(x)\),
|
||||||
|
prediktiv fordeling for \(Y_+(x)\), samt tilhørende intervallestimater.
|
||||||
|
|
||||||
|
\subsection{Prior og hyperparametre}
|
||||||
|
Siden \(\sigma_0 = 0.5\) og \(n_0 = 4\), får vi
|
||||||
|
\[
|
||||||
|
\nu_0 = n_0 - 2 = 2,
|
||||||
|
\qquad
|
||||||
|
SS_0 = \sigma_0^2 \nu_0 = 0.5^2 \cdot 2 = 0.5.
|
||||||
|
\]
|
||||||
|
Dette brukes videre sammen med regresjonsstatistikkene fra datasettet.
|
||||||
|
|
||||||
|
\subsection{Posterior for \(\tau\)}
|
||||||
|
Når regresjonslinjen er estimert, får vi posteriorfordelingen
|
||||||
|
\[
|
||||||
|
\tau \mid \text{data} \sim \Gamma\!\left(\frac{\nu_1}{2}, \frac{SS_1}{2}\right).
|
||||||
|
\]
|
||||||
|
Her settes de konkrete tallene inn fra R-skriptet.
|
||||||
|
|
||||||
|
\subsection{Posterior for \(y(x)\)}
|
||||||
|
For en vilkårlig verdi \(x\) får vi
|
||||||
|
\[
|
||||||
|
y(x)\mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\alpha_0 + \beta x,\;
|
||||||
|
s_1\sqrt{\frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},\;
|
||||||
|
\nu_1\right).
|
||||||
|
\]
|
||||||
|
De konkrete parameterverdiene kan hentes fra skriptet og settes inn her.
|
||||||
|
|
||||||
|
\subsection{Prediktiv fordeling for \(Y_+(x)\)}
|
||||||
|
Den prediktive fordelingen for en ny observasjon er
|
||||||
|
\[
|
||||||
|
Y_+(x)\mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\alpha_0 + \beta x,\;
|
||||||
|
s_1\sqrt{1 + \frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},\;
|
||||||
|
\nu_1\right).
|
||||||
|
\]
|
||||||
|
|
||||||
|
\subsection{Intervallestimater}
|
||||||
|
Et \(95\%\)-kredibilitetsintervall for regresjonslinjen er
|
||||||
|
\[
|
||||||
|
I_{0.05}(x)
|
||||||
|
=
|
||||||
|
\alpha_0 + \beta x
|
||||||
|
\pm
|
||||||
|
t_{\nu_1,0.025}\,
|
||||||
|
s_1\sqrt{\frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}}.
|
||||||
|
\]
|
||||||
|
Et \(95\%\)-prediktivt intervall fås tilsvarende ved å legge til \(1\) inne i roten.
|
||||||
|
|
||||||
|
\subsection{Kommentar}
|
||||||
|
Denne oppgaven er en direkte anvendelse av formlene i kapittel 17. Hovedpoenget er
|
||||||
|
at vi kombinerer observasjonene med en svak informativ prior for usikkerheten, og
|
||||||
|
deretter leser av posterior- og prediktive fordelinger fra de oppdaterte hyperparametrene.
|
||||||
|
|
||||||
|
\subsection{R-kode}
|
||||||
|
Listing~\ref{lst:task12-r} viser delen av R-skriptet som løser bokoppgavene 1c og 1d.
|
||||||
|
|
||||||
|
\begin{listing}[H]
|
||||||
|
\begin{minted}{r}
|
||||||
|
task_1c <- data.frame(
|
||||||
|
x = c(2, 3, 4, 6),
|
||||||
|
y = c(10, 8, 8, 7)
|
||||||
|
)
|
||||||
|
|
||||||
|
fit_1c <- fit_simple_regression(task_1c$x, task_1c$y, nu0 = 4 - 2, SS0 = 0.5^2 * (4 - 2))
|
||||||
|
print_regression_summary(
|
||||||
|
label = "Task 1: Chapter 17, problem 1c",
|
||||||
|
fit = fit_1c,
|
||||||
|
x_eval = mean(task_1c$x),
|
||||||
|
level_y = 0.95,
|
||||||
|
level_pred = 0.95
|
||||||
|
)
|
||||||
|
|
||||||
|
task_1d <- data.frame(
|
||||||
|
x = c(0, 1, 2, 3),
|
||||||
|
y = c(0, 2, 7, 5)
|
||||||
|
)
|
||||||
|
|
||||||
|
fit_1d <- fit_simple_regression(task_1d$x, task_1d$y, nu0 = -2, SS0 = 0)
|
||||||
|
print_regression_summary(
|
||||||
|
label = "Task 2: Chapter 17, problem 1d",
|
||||||
|
fit = fit_1d,
|
||||||
|
x_eval = mean(task_1d$x),
|
||||||
|
level_y = 0.90,
|
||||||
|
level_pred = 0.95
|
||||||
|
)
|
||||||
|
\end{minted}
|
||||||
|
\caption{R-kode for bokoppgavene 17.1c og 17.1d}
|
||||||
|
\label{lst:task12-r}
|
||||||
|
\end{listing}
|
||||||
72
Oblig/3c/latex/sections/task2_kap17_1d.tex
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
\section{Oppgave 2: Kapittel 17, oppgave 1d}
|
||||||
|
|
||||||
|
I denne oppgaven bruker vi observasjonene
|
||||||
|
\[
|
||||||
|
\{(0,0), (1,2), (2,7), (3,5)\},
|
||||||
|
\]
|
||||||
|
og vi antar nøytral prior for usikkerheten.
|
||||||
|
|
||||||
|
\subsection{Tema}
|
||||||
|
Temaet er Bayesiansk lineær regresjon når \(\sigma\) er ukjent. Da bruker vi de nøytrale
|
||||||
|
hyperparametrene fra boka.
|
||||||
|
|
||||||
|
\subsection{Prior og hyperparametre}
|
||||||
|
Ved nøytral prior setter vi
|
||||||
|
\[
|
||||||
|
\nu_0 = -2,
|
||||||
|
\qquad
|
||||||
|
SS_0 = 0.
|
||||||
|
\]
|
||||||
|
Dermed er det dataene alene som bestemmer posterioren.
|
||||||
|
|
||||||
|
\subsection{Posterior for \(\tau\)}
|
||||||
|
Posteriorfordelingen blir igjen
|
||||||
|
\[
|
||||||
|
\tau \mid \text{data} \sim \Gamma\!\left(\frac{\nu_1}{2}, \frac{SS_1}{2}\right),
|
||||||
|
\]
|
||||||
|
der \(\nu_1 = \nu_0 + n\) og \(SS_1 = SS_0 + SSe\).
|
||||||
|
|
||||||
|
\subsection{Posterior for \(y(x)\)}
|
||||||
|
For regresjonslinjen får vi
|
||||||
|
\[
|
||||||
|
y(x)\mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\alpha_0 + \beta x,\;
|
||||||
|
s_1\sqrt{\frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},\;
|
||||||
|
\nu_1\right).
|
||||||
|
\]
|
||||||
|
|
||||||
|
\subsection{Prediktiv fordeling for \(Y_+(x)\)}
|
||||||
|
For en ny observasjon får vi
|
||||||
|
\[
|
||||||
|
Y_+(x)\mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\alpha_0 + \beta x,\;
|
||||||
|
s_1\sqrt{1 + \frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},\;
|
||||||
|
\nu_1\right).
|
||||||
|
\]
|
||||||
|
|
||||||
|
\subsection{Intervallestimater}
|
||||||
|
Oppgaven ber om \(90\%\)-kredibilitetsintervall og \(95\%\)-prediktivt intervall. Disse blir
|
||||||
|
\[
|
||||||
|
I_{0.10}(x)
|
||||||
|
=
|
||||||
|
\alpha_0 + \beta x
|
||||||
|
\pm
|
||||||
|
t_{\nu_1,0.05}\,
|
||||||
|
s_1\sqrt{\frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},
|
||||||
|
\]
|
||||||
|
og
|
||||||
|
\[
|
||||||
|
I^+_{0.05}(x)
|
||||||
|
=
|
||||||
|
\alpha_0 + \beta x
|
||||||
|
\pm
|
||||||
|
t_{\nu_1,0.025}\,
|
||||||
|
s_1\sqrt{1 + \frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}}.
|
||||||
|
\]
|
||||||
|
|
||||||
|
\subsection{Kommentar}
|
||||||
|
Forskjellen fra oppgave 1c er at vi nå ikke legger inn noen forhåndsinformasjon om
|
||||||
|
usikkerheten. Det gir en mer datadrevet analyse, og intervallene blir derfor bestemt av
|
||||||
|
spredningen i observasjonene alene.
|
||||||
197
Oblig/3c/latex/sections/task3_terningdropp.tex
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
\section{Oppgave 3: Terningdropp}
|
||||||
|
|
||||||
|
\subsection{Tema}
|
||||||
|
Her studerer vi sammenhengen mellom dropphøyde \(x\) og hvor langt terningen spretter
|
||||||
|
ut fra veggen \(y\). Vi bruker nøytrale priorhyperparametre og analyserer datasettet med
|
||||||
|
Bayesiansk lineær regresjon.
|
||||||
|
|
||||||
|
\subsection{Datagrunnlag}
|
||||||
|
Dataene er hentet fra alle CSV-filene i mappen \texttt{terningDroppFiler}. Siden filene
|
||||||
|
bruker litt ulike kolonnenavn, er de først normalisert i R-skriptet slik at vi får felles
|
||||||
|
variabler for dropphøyde \(x\), sprettlengde \(y\) og terningverdi \(z\).
|
||||||
|
|
||||||
|
Listing~\ref{lst:task3-import} viser delen av skriptet som leser inn filene og standardiserer
|
||||||
|
kolonnenavnene før analysen.
|
||||||
|
|
||||||
|
\begin{listing}[H]
|
||||||
|
\begin{minted}{r}
|
||||||
|
read_dice_file <- function(path) {
|
||||||
|
raw_df <- read.csv(path, check.names = FALSE, fileEncoding = "UTF-8-BOM")
|
||||||
|
raw_df <- raw_df[, colSums(!is.na(raw_df)) > 0, drop = FALSE]
|
||||||
|
|
||||||
|
original_names <- names(raw_df)
|
||||||
|
clean_names <- vapply(original_names, standardize_name, character(1))
|
||||||
|
|
||||||
|
rename_map <- c(
|
||||||
|
"k" = "k",
|
||||||
|
"dropp" = "x",
|
||||||
|
"dropphoyde" = "x",
|
||||||
|
"x" = "x",
|
||||||
|
"lengde" = "y",
|
||||||
|
"sprettlengde" = "y",
|
||||||
|
"y" = "y",
|
||||||
|
"verdi" = "z",
|
||||||
|
"terningverdi" = "z",
|
||||||
|
"z" = "z",
|
||||||
|
"tid" = "t",
|
||||||
|
"t" = "t"
|
||||||
|
)
|
||||||
|
|
||||||
|
mapped_names <- rename_map[clean_names]
|
||||||
|
names(raw_df) <- ifelse(is.na(mapped_names), clean_names, mapped_names)
|
||||||
|
|
||||||
|
keep <- intersect(c("k", "x", "y", "z", "t"), names(raw_df))
|
||||||
|
out <- raw_df[, keep, drop = FALSE]
|
||||||
|
out$source_file <- basename(path)
|
||||||
|
|
||||||
|
for (name in setdiff(names(out), "source_file")) {
|
||||||
|
out[[name]] <- suppressWarnings(as.numeric(out[[name]]))
|
||||||
|
}
|
||||||
|
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
read_all_dice_data <- function(folder) {
|
||||||
|
files <- list.files(folder, pattern = "\\.csv$", full.names = TRUE)
|
||||||
|
df_list <- lapply(files, read_dice_file)
|
||||||
|
combined <- do.call(rbind, df_list)
|
||||||
|
rownames(combined) <- NULL
|
||||||
|
combined
|
||||||
|
}
|
||||||
|
\end{minted}
|
||||||
|
\caption{R-kode for innlesing og standardisering av terningdropp-data}
|
||||||
|
\label{lst:task3-import}
|
||||||
|
\end{listing}
|
||||||
|
|
||||||
|
\subsection{a) Punktsky og regresjonslinje}
|
||||||
|
Først tegnes alle datapunktene i et spredningsdiagram, og den lineære regresjonslinjen
|
||||||
|
legges oppå.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task3_scatter_regression.png}
|
||||||
|
\caption{Punktsky for terningdropp med regresjonslinje.}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{b) Posterior- og prediktive fordelinger}
|
||||||
|
Med nøytral prior setter vi
|
||||||
|
\[
|
||||||
|
\nu_0 = -2,
|
||||||
|
\qquad
|
||||||
|
SS_0 = 0.
|
||||||
|
\]
|
||||||
|
Da får vi posteriorfordelingene
|
||||||
|
\[
|
||||||
|
\tau \mid \text{data} \sim \Gamma\!\left(\frac{\nu_1}{2}, \frac{SS_1}{2}\right),
|
||||||
|
\]
|
||||||
|
\[
|
||||||
|
b \mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\beta,\; s_1 \sqrt{\frac{1}{SS_x}},\; \nu_1\right),
|
||||||
|
\]
|
||||||
|
\[
|
||||||
|
y(x)\mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\alpha_0 + \beta x,\;
|
||||||
|
s_1\sqrt{\frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},\; \nu_1\right),
|
||||||
|
\]
|
||||||
|
og
|
||||||
|
\[
|
||||||
|
Y_+(x)\mid \text{data}
|
||||||
|
\sim
|
||||||
|
t\!\left(\alpha_0 + \beta x,\;
|
||||||
|
s_1\sqrt{1 + \frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}},\; \nu_1\right).
|
||||||
|
\]
|
||||||
|
Siden \(\sigma = 1/\sqrt{\tau}\), kan vi også utlede posterior usikkerhet for \(\sigma\).
|
||||||
|
|
||||||
|
\subsection{c) 80\% kredibilitetsintervall for stigningstallet \(b\)}
|
||||||
|
Intervallestimatet finnes fra posteriorfordelingen til \(b\):
|
||||||
|
\[
|
||||||
|
b \in
|
||||||
|
\left[
|
||||||
|
\beta - t_{\nu_1,0.1}\, s_1 \sqrt{\frac{1}{SS_x}},
|
||||||
|
\;
|
||||||
|
\beta + t_{\nu_1,0.1}\, s_1 \sqrt{\frac{1}{SS_x}}
|
||||||
|
\right].
|
||||||
|
\]
|
||||||
|
De numeriske verdiene leses ut fra R-skriptet.
|
||||||
|
|
||||||
|
\subsection{d) 80\% kredibilitetsintervall for standardavviket \(\sigma\)}
|
||||||
|
Her bruker vi sammenhengen mellom \(\sigma^2\) og \(\chi^2\)-fordelingen. Intervallet
|
||||||
|
kan beregnes direkte i R ut fra \(SS_1\) og \(\nu_1\).
|
||||||
|
|
||||||
|
\subsection{e) 80\% kredibilitetsintervall for \(y(x)\)}
|
||||||
|
For hver verdi av \(x\) får vi
|
||||||
|
\[
|
||||||
|
I_{0.20}(x)
|
||||||
|
=
|
||||||
|
\alpha_0 + \beta x
|
||||||
|
\pm
|
||||||
|
t_{\nu_1,0.1}\,
|
||||||
|
s_1\sqrt{\frac{1}{n} + \frac{(x-\bar{x})^2}{SS_x}}.
|
||||||
|
\]
|
||||||
|
|
||||||
|
\subsection{f) Kurver over og under regresjonslinjen}
|
||||||
|
Intervallet i punkt e) gir to kurver: en øvre og en nedre. Disse plottes sammen med
|
||||||
|
regresjonslinjen.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task3_credible_band.png}
|
||||||
|
\caption{80\% kredibilitetsbånd for \(y(x)\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{g) Forklaringsgrad \(R^2\)}
|
||||||
|
Forklaringsgraden
|
||||||
|
\[
|
||||||
|
R^2 = 1 - \frac{SSe}{SS_y}
|
||||||
|
\]
|
||||||
|
forteller hvor stor del av variasjonen i \(y\) som forklares av regresjonslinjen. Denne
|
||||||
|
kan enten beregnes direkte fra sums of squares eller hentes fra \texttt{lm()} i R.
|
||||||
|
|
||||||
|
\subsection{h) Regresjon mellom \(z\) og \(x\), og mellom \(t\) og \(x\)}
|
||||||
|
Oppgaven ber om en sammenligning av \(R^2\) for
|
||||||
|
\[
|
||||||
|
z \text{ mot } x
|
||||||
|
\qquad \text{og} \qquad
|
||||||
|
t \text{ mot } x.
|
||||||
|
\]
|
||||||
|
I de tilgjengelige CSV-filene finnes det tydelige kolonner for \(x\), \(y\) og \(z\), men
|
||||||
|
ingen entydig kolonne for \(t\). Derfor kan analysen for \(z\) gjennomføres direkte, mens
|
||||||
|
delen om \(t\) må enten utelates eller suppleres dersom tidsmålingene finnes i en annen fil.
|
||||||
|
|
||||||
|
\subsection{R-kode}
|
||||||
|
Listing~\ref{lst:task3-r} viser delen av skriptet som utfører regresjonen, skriver ut
|
||||||
|
intervallene og lager figurene til oppgave 3.
|
||||||
|
|
||||||
|
\begin{listing}[H]
|
||||||
|
\begin{minted}{r}
|
||||||
|
dice_df <- read_all_dice_data(file.path(script_dir, "terningDroppFiler"))
|
||||||
|
dice_df <- dice_df[complete.cases(dice_df[, intersect(c("x", "y", "z"), names(dice_df)), drop = FALSE]), ]
|
||||||
|
|
||||||
|
dice_fit <- fit_simple_regression(dice_df$x, dice_df$y, nu0 = -2, SS0 = 0)
|
||||||
|
x_grid <- seq(min(dice_df$x), max(dice_df$x), length.out = 300)
|
||||||
|
cred_band_80 <- credible_band(dice_fit, x_grid, level = 0.80)
|
||||||
|
pred_band_80 <- predictive_band(dice_fit, x_grid, level = 0.80)
|
||||||
|
|
||||||
|
cat("\nTask 3: Dice drop data\n")
|
||||||
|
cat("----------------------\n")
|
||||||
|
cat("Number of observations =", nrow(dice_df), "\n")
|
||||||
|
cat("Regression line: y =", round(dice_fit$alpha0, 4), "+", round(dice_fit$beta, 4), "* x\n")
|
||||||
|
cat("80% interval for b:", paste(round(b_interval(dice_fit, 0.80), 4), collapse = " to "), "\n")
|
||||||
|
cat("80% interval for sigma:", paste(round(sigma_interval(dice_fit, 0.80), 4), collapse = " to "), "\n")
|
||||||
|
cat("R^2 for y on x =", round(r_squared(dice_df$x, dice_df$y), 4), "\n")
|
||||||
|
cat("R^2 for z on x =", round(r_squared(dice_df$x, dice_df$z), 4), "\n")
|
||||||
|
|
||||||
|
plot_regression_with_band(
|
||||||
|
df = dice_df,
|
||||||
|
fit = dice_fit,
|
||||||
|
band_df = cred_band_80,
|
||||||
|
file_name = "task3_credible_band.png",
|
||||||
|
ylab = "Sprettlengde",
|
||||||
|
band_label = "Dice drop data with 80% credible band"
|
||||||
|
)
|
||||||
|
\end{minted}
|
||||||
|
\caption{R-kode for analyse og figurer i terningdropp-oppgaven}
|
||||||
|
\label{lst:task3-r}
|
||||||
|
\end{listing}
|
||||||
131
Oblig/3c/latex/sections/task4_utvalgsforsok.tex
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
\section{Oppgave 4: Utvalgsforsøk}
|
||||||
|
|
||||||
|
\subsection{Tema}
|
||||||
|
I denne delen undersøker vi hvordan regresjonslinjen og intervallestimatene endrer seg
|
||||||
|
når vi bare bruker tilfeldige delutvalg av observasjonene.
|
||||||
|
|
||||||
|
\subsection{a) 50 runder med \(N = 5\)}
|
||||||
|
Vi trekker 50 tilfeldige utvalg med \(N = 5\), finner regresjonslinjen for hvert utvalg,
|
||||||
|
og tegner alle linjene i samme figur.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4a_lines_N5.png}
|
||||||
|
\caption{50 regresjonslinjer basert på utvalg med \(N=5\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Det vi forventer å se, er stor variasjon fra linje til linje fordi utvalgene er små.
|
||||||
|
|
||||||
|
\subsection{b) 50 runder med \(N = 15, 50, 200\)}
|
||||||
|
Vi gjentar samme prosedyre for større utvalg. Når \(N\) øker, bør linjene samle seg mer
|
||||||
|
rundt regresjonslinjen for hele datasettet.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4b_lines_N15.png}
|
||||||
|
\caption{Regresjonslinjer for \(N=15\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4b_lines_N50.png}
|
||||||
|
\caption{Regresjonslinjer for \(N=50\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4b_lines_N200.png}
|
||||||
|
\caption{Regresjonslinjer for \(N=200\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{c) Oppgave 3c gjentatt 50 ganger med \(N = 5\)}
|
||||||
|
Her beregner vi 80\%-intervallestimatet for stigningstallet \(b\) i 50 runder med
|
||||||
|
\(N=5\), og tegner intervallene samlet i én figur.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4c_b_intervals_N5.png}
|
||||||
|
\caption{50 intervallestimater for \(b\) når \(N=5\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Små utvalg vil typisk gi brede intervaller og stor variasjon mellom rundene.
|
||||||
|
|
||||||
|
\subsection{d) Samme analyse for \(N = 15, 50, 200\)}
|
||||||
|
Når vi øker \(N\), blir intervallene vanligvis smalere, og estimatene for \(b\) blir mer
|
||||||
|
stabile.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4d_b_intervals_N15.png}
|
||||||
|
\caption{Intervallestimater for \(b\) når \(N=15\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4d_b_intervals_N50.png}
|
||||||
|
\caption{Intervallestimater for \(b\) når \(N=50\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4d_b_intervals_N200.png}
|
||||||
|
\caption{Intervallestimater for \(b\) når \(N=200\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{e) Illustrasjoner som i oppgave 3f}
|
||||||
|
Til slutt lager vi figurer med regresjonslinje og tilhørende 80\%-kredibilitetsbånd for
|
||||||
|
utvalg med \(N = 5, 15, 50\) og \(200\).
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4e_bands_N5.png}
|
||||||
|
\caption{Kredibilitetsbånd for \(N=5\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4e_bands_N15.png}
|
||||||
|
\caption{Kredibilitetsbånd for \(N=15\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4e_bands_N50.png}
|
||||||
|
\caption{Kredibilitetsbånd for \(N=50\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.8\textwidth]{images/task4e_bands_N200.png}
|
||||||
|
\caption{Kredibilitetsbånd for \(N=200\).}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Kommentar}
|
||||||
|
Hovedpoenget i denne oppgaven er å se hvordan usikkerheten minker når utvalgsstørrelsen
|
||||||
|
øker. Små utvalg gir mer ustabile linjer og bredere intervaller, mens store utvalg gir mer
|
||||||
|
presise estimater og tydeligere mønstre.
|
||||||
|
|
||||||
|
\subsection{R-kode}
|
||||||
|
Listing~\ref{lst:task4-r} viser delen av skriptet som trekker delutvalg og lager figurene
|
||||||
|
for oppgave 4.
|
||||||
|
|
||||||
|
\begin{listing}[H]
|
||||||
|
\begin{minted}{r}
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 5, rounds = 50, file_name = "task4a_lines_N5.png")
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 15, rounds = 50, file_name = "task4b_lines_N15.png")
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 50, rounds = 50, file_name = "task4b_lines_N50.png")
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 200, rounds = 50, file_name = "task4b_lines_N200.png")
|
||||||
|
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 5, rounds = 50, level = 0.80, file_name = "task4c_b_intervals_N5.png")
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 15, rounds = 50, level = 0.80, file_name = "task4d_b_intervals_N15.png")
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 50, rounds = 50, level = 0.80, file_name = "task4d_b_intervals_N50.png")
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 200, rounds = 50, level = 0.80, file_name = "task4d_b_intervals_N200.png")
|
||||||
|
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 5, rounds = 50, level = 0.80, file_name = "task4e_bands_N5.png")
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 15, rounds = 50, level = 0.80, file_name = "task4e_bands_N15.png")
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 50, rounds = 50, level = 0.80, file_name = "task4e_bands_N50.png")
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 200, rounds = 50, level = 0.80, file_name = "task4e_bands_N200.png")
|
||||||
|
\end{minted}
|
||||||
|
\caption{R-kode for gjentatte delutvalg og intervallillustrasjoner}
|
||||||
|
\label{lst:task4-r}
|
||||||
|
\end{listing}
|
||||||
394
Oblig/3c/oblig3c_analysis.R
Normal file
@@ -0,0 +1,394 @@
|
|||||||
|
# Oblig 3c: Linear regression with uncertainty
|
||||||
|
|
||||||
|
options(stringsAsFactors = FALSE)
|
||||||
|
|
||||||
|
script_path_arg <- grep("^--file=", commandArgs(trailingOnly = FALSE), value = TRUE)
|
||||||
|
script_dir <- if (length(script_path_arg) > 0) {
|
||||||
|
dirname(normalizePath(sub("^--file=", "", script_path_arg[1])))
|
||||||
|
} else {
|
||||||
|
getwd()
|
||||||
|
}
|
||||||
|
|
||||||
|
output_dir <- file.path(script_dir, "output")
|
||||||
|
if (!dir.exists(output_dir)) {
|
||||||
|
dir.create(output_dir, recursive = TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Generic helper functions
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
strip_bom <- function(x) {
|
||||||
|
sub("^\ufeff", "", x)
|
||||||
|
}
|
||||||
|
|
||||||
|
standardize_name <- function(x) {
|
||||||
|
cleaned <- tolower(strip_bom(iconv(x, to = "ASCII//TRANSLIT")))
|
||||||
|
cleaned <- gsub("[^a-z0-9]+", "", cleaned)
|
||||||
|
cleaned
|
||||||
|
}
|
||||||
|
|
||||||
|
read_dice_file <- function(path) {
|
||||||
|
raw_df <- read.csv(path, check.names = FALSE, fileEncoding = "UTF-8-BOM")
|
||||||
|
raw_df <- raw_df[, colSums(!is.na(raw_df)) > 0, drop = FALSE]
|
||||||
|
|
||||||
|
original_names <- names(raw_df)
|
||||||
|
clean_names <- vapply(original_names, standardize_name, character(1))
|
||||||
|
|
||||||
|
rename_map <- c(
|
||||||
|
"k" = "k",
|
||||||
|
"dropp" = "x",
|
||||||
|
"dropphoyde" = "x",
|
||||||
|
"x" = "x",
|
||||||
|
"lengde" = "y",
|
||||||
|
"sprettlengde" = "y",
|
||||||
|
"y" = "y",
|
||||||
|
"verdi" = "z",
|
||||||
|
"terningverdi" = "z",
|
||||||
|
"z" = "z",
|
||||||
|
"tid" = "t",
|
||||||
|
"t" = "t"
|
||||||
|
)
|
||||||
|
|
||||||
|
mapped_names <- rename_map[clean_names]
|
||||||
|
names(raw_df) <- ifelse(is.na(mapped_names), clean_names, mapped_names)
|
||||||
|
|
||||||
|
keep <- intersect(c("k", "x", "y", "z", "t"), names(raw_df))
|
||||||
|
out <- raw_df[, keep, drop = FALSE]
|
||||||
|
out$source_file <- basename(path)
|
||||||
|
|
||||||
|
for (name in setdiff(names(out), "source_file")) {
|
||||||
|
out[[name]] <- suppressWarnings(as.numeric(out[[name]]))
|
||||||
|
}
|
||||||
|
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
read_all_dice_data <- function(folder) {
|
||||||
|
files <- list.files(folder, pattern = "\\.csv$", full.names = TRUE)
|
||||||
|
df_list <- lapply(files, read_dice_file)
|
||||||
|
combined <- do.call(rbind, df_list)
|
||||||
|
rownames(combined) <- NULL
|
||||||
|
combined
|
||||||
|
}
|
||||||
|
|
||||||
|
fit_simple_regression <- function(x, y, nu0 = -2, SS0 = 0) {
|
||||||
|
stopifnot(length(x) == length(y))
|
||||||
|
|
||||||
|
n <- length(x)
|
||||||
|
x_bar <- mean(x)
|
||||||
|
x_centered <- x - x_bar
|
||||||
|
SSx <- sum(x_centered^2)
|
||||||
|
|
||||||
|
beta_hat <- sum(x_centered * y) / SSx
|
||||||
|
alpha_star <- mean(y)
|
||||||
|
alpha0 <- alpha_star - beta_hat * x_bar
|
||||||
|
|
||||||
|
fitted <- alpha0 + beta_hat * x
|
||||||
|
residuals <- y - fitted
|
||||||
|
SSe <- sum(residuals^2)
|
||||||
|
|
||||||
|
nu1 <- nu0 + n
|
||||||
|
SS1 <- SS0 + SSe
|
||||||
|
s1 <- sqrt(SS1 / nu1)
|
||||||
|
|
||||||
|
list(
|
||||||
|
n = n,
|
||||||
|
x = x,
|
||||||
|
y = y,
|
||||||
|
x_bar = x_bar,
|
||||||
|
SSx = SSx,
|
||||||
|
alpha0 = alpha0,
|
||||||
|
alpha_star = alpha_star,
|
||||||
|
beta = beta_hat,
|
||||||
|
fitted = fitted,
|
||||||
|
residuals = residuals,
|
||||||
|
SSe = SSe,
|
||||||
|
nu0 = nu0,
|
||||||
|
SS0 = SS0,
|
||||||
|
nu1 = nu1,
|
||||||
|
SS1 = SS1,
|
||||||
|
s1 = s1
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
tau_posterior_parameters <- function(fit) {
|
||||||
|
list(shape = fit$nu1 / 2, rate = fit$SS1 / 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
sigma_interval <- function(fit, level = 0.80) {
|
||||||
|
alpha <- 1 - level
|
||||||
|
lower_var <- fit$SS1 / qchisq(1 - alpha / 2, df = fit$nu1)
|
||||||
|
upper_var <- fit$SS1 / qchisq(alpha / 2, df = fit$nu1)
|
||||||
|
c(lower = sqrt(lower_var), upper = sqrt(upper_var))
|
||||||
|
}
|
||||||
|
|
||||||
|
b_interval <- function(fit, level = 0.80) {
|
||||||
|
alpha <- 1 - level
|
||||||
|
t_crit <- qt(1 - alpha / 2, df = fit$nu1)
|
||||||
|
margin <- t_crit * fit$s1 / sqrt(fit$SSx)
|
||||||
|
c(lower = fit$beta - margin, upper = fit$beta + margin)
|
||||||
|
}
|
||||||
|
|
||||||
|
y_posterior_parameters <- function(fit, x_new) {
|
||||||
|
scale <- fit$s1 * sqrt(1 / fit$n + (x_new - fit$x_bar)^2 / fit$SSx)
|
||||||
|
list(mean = fit$alpha0 + fit$beta * x_new, scale = scale, df = fit$nu1)
|
||||||
|
}
|
||||||
|
|
||||||
|
y_predictive_parameters <- function(fit, x_new) {
|
||||||
|
scale <- fit$s1 * sqrt(1 + 1 / fit$n + (x_new - fit$x_bar)^2 / fit$SSx)
|
||||||
|
list(mean = fit$alpha0 + fit$beta * x_new, scale = scale, df = fit$nu1)
|
||||||
|
}
|
||||||
|
|
||||||
|
t_interval <- function(mean, scale, df, level) {
|
||||||
|
alpha <- 1 - level
|
||||||
|
t_crit <- qt(1 - alpha / 2, df = df)
|
||||||
|
c(lower = mean - t_crit * scale, upper = mean + t_crit * scale)
|
||||||
|
}
|
||||||
|
|
||||||
|
credible_band <- function(fit, x_grid, level = 0.80) {
|
||||||
|
alpha <- 1 - level
|
||||||
|
t_crit <- qt(1 - alpha / 2, df = fit$nu1)
|
||||||
|
mean_curve <- fit$alpha0 + fit$beta * x_grid
|
||||||
|
margin <- t_crit * fit$s1 * sqrt(1 / fit$n + (x_grid - fit$x_bar)^2 / fit$SSx)
|
||||||
|
data.frame(x = x_grid, mean = mean_curve, lower = mean_curve - margin, upper = mean_curve + margin)
|
||||||
|
}
|
||||||
|
|
||||||
|
predictive_band <- function(fit, x_grid, level = 0.80) {
|
||||||
|
alpha <- 1 - level
|
||||||
|
t_crit <- qt(1 - alpha / 2, df = fit$nu1)
|
||||||
|
mean_curve <- fit$alpha0 + fit$beta * x_grid
|
||||||
|
margin <- t_crit * fit$s1 * sqrt(1 + 1 / fit$n + (x_grid - fit$x_bar)^2 / fit$SSx)
|
||||||
|
data.frame(x = x_grid, mean = mean_curve, lower = mean_curve - margin, upper = mean_curve + margin)
|
||||||
|
}
|
||||||
|
|
||||||
|
r_squared <- function(x, y) {
|
||||||
|
fit <- lm(y ~ x)
|
||||||
|
summary(fit)$r.squared
|
||||||
|
}
|
||||||
|
|
||||||
|
print_regression_summary <- function(label, fit, x_eval = NULL, level_y = 0.80, level_pred = 0.80) {
|
||||||
|
tau_post <- tau_posterior_parameters(fit)
|
||||||
|
|
||||||
|
cat("\n", label, "\n", sep = "")
|
||||||
|
cat(strrep("-", nchar(label)), "\n", sep = "")
|
||||||
|
cat("n =", fit$n, "\n")
|
||||||
|
cat("x_bar =", fit$x_bar, "\n")
|
||||||
|
cat("alpha0 =", fit$alpha0, "\n")
|
||||||
|
cat("alpha* =", fit$alpha_star, "\n")
|
||||||
|
cat("beta =", fit$beta, "\n")
|
||||||
|
cat("SSe =", fit$SSe, "\n")
|
||||||
|
cat("Posterior tau ~ Gamma(shape =", tau_post$shape, ", rate =", tau_post$rate, ")\n")
|
||||||
|
|
||||||
|
if (!is.null(x_eval)) {
|
||||||
|
y_post <- y_posterior_parameters(fit, x_eval)
|
||||||
|
y_pred <- y_predictive_parameters(fit, x_eval)
|
||||||
|
|
||||||
|
cat("Posterior y(", x_eval, ") ~ t(mean =", y_post$mean, ", scale =", y_post$scale, ", df =", y_post$df, ")\n", sep = "")
|
||||||
|
cat("Predictive Y+(", x_eval, ") ~ t(mean =", y_pred$mean, ", scale =", y_pred$scale, ", df =", y_pred$df, ")\n", sep = "")
|
||||||
|
cat(level_y * 100, "% credible interval for y(", x_eval, "): ", paste(round(t_interval(y_post$mean, y_post$scale, y_post$df, level_y), 4), collapse = " to "), "\n", sep = "")
|
||||||
|
cat(level_pred * 100, "% predictive interval for Y+(", x_eval, "): ", paste(round(t_interval(y_pred$mean, y_pred$scale, y_pred$df, level_pred), 4), collapse = " to "), "\n", sep = "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plot_regression_with_band <- function(df, fit, band_df, file_name, ylab, band_label) {
|
||||||
|
png(file.path(output_dir, file_name), width = 1200, height = 900, res = 150)
|
||||||
|
plot(df$x, df$y,
|
||||||
|
pch = 19, col = "black",
|
||||||
|
xlab = "x", ylab = ylab,
|
||||||
|
main = band_label)
|
||||||
|
lines(band_df$x, band_df$mean, col = "blue", lwd = 2)
|
||||||
|
lines(band_df$x, band_df$lower, col = "red", lwd = 2, lty = 2)
|
||||||
|
lines(band_df$x, band_df$upper, col = "red", lwd = 2, lty = 2)
|
||||||
|
dev.off()
|
||||||
|
}
|
||||||
|
|
||||||
|
plot_regression_only <- function(df, fit, file_name, ylab, plot_title) {
|
||||||
|
x_grid <- seq(min(df$x), max(df$x), length.out = 300)
|
||||||
|
png(file.path(output_dir, file_name), width = 1200, height = 900, res = 150)
|
||||||
|
plot(df$x, df$y,
|
||||||
|
pch = 19, col = "black",
|
||||||
|
xlab = "Dropphoyde", ylab = ylab,
|
||||||
|
main = plot_title)
|
||||||
|
lines(x_grid, fit$alpha0 + fit$beta * x_grid, col = "blue", lwd = 2)
|
||||||
|
dev.off()
|
||||||
|
}
|
||||||
|
|
||||||
|
plot_many_sample_lines <- function(df, sample_size, rounds, file_name) {
|
||||||
|
x_grid <- seq(min(df$x), max(df$x), length.out = 200)
|
||||||
|
full_fit <- fit_simple_regression(df$x, df$y)
|
||||||
|
|
||||||
|
png(file.path(output_dir, file_name), width = 1200, height = 900, res = 150)
|
||||||
|
plot(df$x, df$y,
|
||||||
|
pch = 19, col = "grey60",
|
||||||
|
xlab = "Dropphoyde", ylab = "Sprettlengde",
|
||||||
|
main = paste("Regression lines from", rounds, "random samples of size", sample_size))
|
||||||
|
|
||||||
|
for (i in seq_len(rounds)) {
|
||||||
|
sample_index <- sort(sample(seq_len(nrow(df)), sample_size))
|
||||||
|
sample_fit <- fit_simple_regression(df$x[sample_index], df$y[sample_index])
|
||||||
|
y_grid <- sample_fit$alpha0 + sample_fit$beta * x_grid
|
||||||
|
lines(x_grid, y_grid, col = rgb(1, 0, 0, alpha = 0.18), lwd = 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
lines(x_grid, full_fit$alpha0 + full_fit$beta * x_grid, col = "blue", lwd = 3)
|
||||||
|
dev.off()
|
||||||
|
}
|
||||||
|
|
||||||
|
plot_many_b_intervals <- function(df, sample_size, rounds, level = 0.80, file_name) {
|
||||||
|
png(file.path(output_dir, file_name), width = 1200, height = 900, res = 150)
|
||||||
|
plot(NA,
|
||||||
|
xlim = c(0.5, rounds + 0.5),
|
||||||
|
ylim = range(vapply(seq_len(rounds), function(i) {
|
||||||
|
sample_index <- sort(sample(seq_len(nrow(df)), sample_size))
|
||||||
|
fit <- fit_simple_regression(df$x[sample_index], df$y[sample_index])
|
||||||
|
b_interval(fit, level)
|
||||||
|
}, numeric(2))),
|
||||||
|
xlab = "Runde", ylab = "Stigningstall b",
|
||||||
|
main = paste(round(level * 100), "% credible intervals for b,", "N =", sample_size))
|
||||||
|
|
||||||
|
for (i in seq_len(rounds)) {
|
||||||
|
sample_index <- sort(sample(seq_len(nrow(df)), sample_size))
|
||||||
|
fit <- fit_simple_regression(df$x[sample_index], df$y[sample_index])
|
||||||
|
interval <- b_interval(fit, level)
|
||||||
|
segments(i, interval["lower"], i, interval["upper"], col = "red", lwd = 2)
|
||||||
|
points(i, fit$beta, pch = 19, col = "blue")
|
||||||
|
}
|
||||||
|
|
||||||
|
abline(h = fit_simple_regression(df$x, df$y)$beta, col = "darkgreen", lwd = 2, lty = 2)
|
||||||
|
dev.off()
|
||||||
|
}
|
||||||
|
|
||||||
|
plot_many_credible_bands <- function(df, sample_size, rounds, level = 0.80, file_name) {
|
||||||
|
x_grid <- seq(min(df$x), max(df$x), length.out = 200)
|
||||||
|
|
||||||
|
png(file.path(output_dir, file_name), width = 1200, height = 900, res = 150)
|
||||||
|
plot(df$x, df$y,
|
||||||
|
pch = 19, col = "grey70",
|
||||||
|
xlab = "Dropphoyde", ylab = "Sprettlengde",
|
||||||
|
main = paste(round(level * 100), "% credible bands for y(x), N =", sample_size))
|
||||||
|
|
||||||
|
for (i in seq_len(rounds)) {
|
||||||
|
sample_index <- sort(sample(seq_len(nrow(df)), sample_size))
|
||||||
|
fit <- fit_simple_regression(df$x[sample_index], df$y[sample_index])
|
||||||
|
band <- credible_band(fit, x_grid, level)
|
||||||
|
lines(band$x, band$lower, col = rgb(1, 0, 0, alpha = 0.12), lwd = 1)
|
||||||
|
lines(band$x, band$upper, col = rgb(1, 0, 0, alpha = 0.12), lwd = 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
full_fit <- fit_simple_regression(df$x, df$y)
|
||||||
|
lines(x_grid, full_fit$alpha0 + full_fit$beta * x_grid, col = "blue", lwd = 3)
|
||||||
|
dev.off()
|
||||||
|
}
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Book task 17.1c
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
task_1c <- data.frame(
|
||||||
|
x = c(2, 3, 4, 6),
|
||||||
|
y = c(10, 8, 8, 7)
|
||||||
|
)
|
||||||
|
|
||||||
|
fit_1c <- fit_simple_regression(task_1c$x, task_1c$y, nu0 = 4 - 2, SS0 = 0.5^2 * (4 - 2))
|
||||||
|
print_regression_summary(
|
||||||
|
label = "Task 1: Chapter 17, problem 1c",
|
||||||
|
fit = fit_1c,
|
||||||
|
x_eval = mean(task_1c$x),
|
||||||
|
level_y = 0.95,
|
||||||
|
level_pred = 0.95
|
||||||
|
)
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Book task 17.1d
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
task_1d <- data.frame(
|
||||||
|
x = c(0, 1, 2, 3),
|
||||||
|
y = c(0, 2, 7, 5)
|
||||||
|
)
|
||||||
|
|
||||||
|
fit_1d <- fit_simple_regression(task_1d$x, task_1d$y, nu0 = -2, SS0 = 0)
|
||||||
|
print_regression_summary(
|
||||||
|
label = "Task 2: Chapter 17, problem 1d",
|
||||||
|
fit = fit_1d,
|
||||||
|
x_eval = mean(task_1d$x),
|
||||||
|
level_y = 0.90,
|
||||||
|
level_pred = 0.95
|
||||||
|
)
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Dice-drop assignment
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
dice_df <- read_all_dice_data(file.path(script_dir, "terningDroppFiler"))
|
||||||
|
dice_df <- dice_df[complete.cases(dice_df[, intersect(c("x", "y", "z"), names(dice_df)), drop = FALSE]), ]
|
||||||
|
|
||||||
|
dice_fit <- fit_simple_regression(dice_df$x, dice_df$y, nu0 = -2, SS0 = 0)
|
||||||
|
x_grid <- seq(min(dice_df$x), max(dice_df$x), length.out = 300)
|
||||||
|
cred_band_80 <- credible_band(dice_fit, x_grid, level = 0.80)
|
||||||
|
pred_band_80 <- predictive_band(dice_fit, x_grid, level = 0.80)
|
||||||
|
|
||||||
|
cat("\nTask 3: Dice drop data\n")
|
||||||
|
cat("----------------------\n")
|
||||||
|
cat("Number of observations =", nrow(dice_df), "\n")
|
||||||
|
cat("Regression line: y =", round(dice_fit$alpha0, 4), "+", round(dice_fit$beta, 4), "* x\n")
|
||||||
|
cat("80% interval for b:", paste(round(b_interval(dice_fit, 0.80), 4), collapse = " to "), "\n")
|
||||||
|
cat("80% interval for sigma:", paste(round(sigma_interval(dice_fit, 0.80), 4), collapse = " to "), "\n")
|
||||||
|
cat("R^2 for y on x =", round(r_squared(dice_df$x, dice_df$y), 4), "\n")
|
||||||
|
cat("R^2 for z on x =", round(r_squared(dice_df$x, dice_df$z), 4), "\n")
|
||||||
|
|
||||||
|
if ("t" %in% names(dice_df)) {
|
||||||
|
cat("R^2 for t on x =", round(r_squared(dice_df$x, dice_df$t), 4), "\n")
|
||||||
|
} else {
|
||||||
|
cat("No time variable t was found in the CSV files, so task 3h can only be completed for z versus x with the current dataset.\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
plot_regression_with_band(
|
||||||
|
df = dice_df,
|
||||||
|
fit = dice_fit,
|
||||||
|
band_df = cred_band_80,
|
||||||
|
file_name = "task3_credible_band.png",
|
||||||
|
ylab = "Sprettlengde",
|
||||||
|
band_label = "Dice drop data with 80% credible band"
|
||||||
|
)
|
||||||
|
|
||||||
|
plot_regression_only(
|
||||||
|
df = dice_df,
|
||||||
|
fit = dice_fit,
|
||||||
|
file_name = "task3_scatter_regression.png",
|
||||||
|
ylab = "Sprettlengde",
|
||||||
|
plot_title = "Dice drop data with regression line"
|
||||||
|
)
|
||||||
|
|
||||||
|
plot_regression_with_band(
|
||||||
|
df = dice_df,
|
||||||
|
fit = dice_fit,
|
||||||
|
band_df = pred_band_80,
|
||||||
|
file_name = "task3_predictive_band.png",
|
||||||
|
ylab = "Sprettlengde",
|
||||||
|
band_label = "Dice drop data with 80% predictive band"
|
||||||
|
)
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Repeated subsample experiments
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
set.seed(1234)
|
||||||
|
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 5, rounds = 50, file_name = "task4a_lines_N5.png")
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 15, rounds = 50, file_name = "task4b_lines_N15.png")
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 50, rounds = 50, file_name = "task4b_lines_N50.png")
|
||||||
|
plot_many_sample_lines(dice_df, sample_size = 200, rounds = 50, file_name = "task4b_lines_N200.png")
|
||||||
|
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 5, rounds = 50, level = 0.80, file_name = "task4c_b_intervals_N5.png")
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 15, rounds = 50, level = 0.80, file_name = "task4d_b_intervals_N15.png")
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 50, rounds = 50, level = 0.80, file_name = "task4d_b_intervals_N50.png")
|
||||||
|
plot_many_b_intervals(dice_df, sample_size = 200, rounds = 50, level = 0.80, file_name = "task4d_b_intervals_N200.png")
|
||||||
|
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 5, rounds = 50, level = 0.80, file_name = "task4e_bands_N5.png")
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 15, rounds = 50, level = 0.80, file_name = "task4e_bands_N15.png")
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 50, rounds = 50, level = 0.80, file_name = "task4e_bands_N50.png")
|
||||||
|
plot_many_credible_bands(dice_df, sample_size = 200, rounds = 50, level = 0.80, file_name = "task4e_bands_N200.png")
|
||||||
|
|
||||||
|
cat("\nTask 4 plots written to:", normalizePath(output_dir), "\n")
|
||||||
BIN
Oblig/3c/output/task3_credible_band.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
Oblig/3c/output/task3_predictive_band.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
Oblig/3c/output/task3_scatter_regression.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
Oblig/3c/output/task4a_lines_N5.png
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
Oblig/3c/output/task4b_lines_N15.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
BIN
Oblig/3c/output/task4b_lines_N200.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
Oblig/3c/output/task4b_lines_N50.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
Oblig/3c/output/task4c_b_intervals_N5.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
Oblig/3c/output/task4d_b_intervals_N15.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
Oblig/3c/output/task4d_b_intervals_N200.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
Oblig/3c/output/task4d_b_intervals_N50.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
Oblig/3c/output/task4e_bands_N15.png
Normal file
|
After Width: | Height: | Size: 214 KiB |
BIN
Oblig/3c/output/task4e_bands_N200.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
Oblig/3c/output/task4e_bands_N5.png
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
Oblig/3c/output/task4e_bands_N50.png
Normal file
|
After Width: | Height: | Size: 180 KiB |
31
Oblig/3c/terningDroppFiler/TerningDropp10.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
K,Dropphoyde,Sprettlengde,Terningverdi
|
||||||
|
1,20,12.3,5
|
||||||
|
2,30,48.3,4
|
||||||
|
3,40,74.2,3
|
||||||
|
4,50,72.5,2
|
||||||
|
5,60,84.5,3
|
||||||
|
6,70,54.4,1
|
||||||
|
7,20,18.8,4
|
||||||
|
8,70,29.5,3
|
||||||
|
9,40,62.1,4
|
||||||
|
10,30,37.6,1
|
||||||
|
11,50,21.1,3
|
||||||
|
12,60,61.2,5
|
||||||
|
13,60,21.1,2
|
||||||
|
14,40,21.2,4
|
||||||
|
15,70,91.1,2
|
||||||
|
16,20,14.7,4
|
||||||
|
17,30,18.2,2
|
||||||
|
18,50,22.3,5
|
||||||
|
19,60,20.7,3
|
||||||
|
20,20,13.9,1
|
||||||
|
21,40,36.7,2
|
||||||
|
22,50,49.5,5
|
||||||
|
23,60,53.1,1
|
||||||
|
24,70,27.3,1
|
||||||
|
25,70,56.9,1
|
||||||
|
26,30,38.3,5
|
||||||
|
27,20,17.2,2
|
||||||
|
28,30,28.9,3
|
||||||
|
29,40,25.7,4
|
||||||
|
30,50,42.3,1
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp01.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,5,19,2
|
||||||
|
2,5,21,3
|
||||||
|
3,5,16,1
|
||||||
|
4,5,19,5
|
||||||
|
5,5,21,2
|
||||||
|
6,10,34,6
|
||||||
|
7,10,41,2
|
||||||
|
8,10,40,5
|
||||||
|
9,10,37,5
|
||||||
|
10,10,30,3
|
||||||
|
11,15,47,1
|
||||||
|
12,15,39,3
|
||||||
|
13,15,46,5
|
||||||
|
14,15,50,3
|
||||||
|
15,15,44,4
|
||||||
|
16,20,59,4
|
||||||
|
17,20,47,6
|
||||||
|
18,20,64,3
|
||||||
|
19,20,52,3
|
||||||
|
20,20,60,1
|
||||||
|
21,25,57,4
|
||||||
|
22,25,74,5
|
||||||
|
23,25,79,6
|
||||||
|
24,25,69,2
|
||||||
|
25,25,86,3
|
||||||
|
26,30,73,4
|
||||||
|
27,30,112,5
|
||||||
|
28,30,104,1
|
||||||
|
29,30,129,1
|
||||||
|
30,30,117,2
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp02.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,20,38,5
|
||||||
|
2,50,112,1
|
||||||
|
3,30,78,5
|
||||||
|
4,45,71,3
|
||||||
|
5,40,64,4
|
||||||
|
6,35,47,2
|
||||||
|
7,20,52,5
|
||||||
|
8,20,57,4
|
||||||
|
9,20,43,2
|
||||||
|
10,20,30,3
|
||||||
|
11,30,68,4
|
||||||
|
12,30,46,6
|
||||||
|
13,30,51,2
|
||||||
|
14,30,55,3
|
||||||
|
15,35,65,5
|
||||||
|
16,35,75,1
|
||||||
|
17,35,50,5
|
||||||
|
18,35,56,6
|
||||||
|
19,40,65,4
|
||||||
|
20,40,76,3
|
||||||
|
21,40,56,4
|
||||||
|
22,40,79,2
|
||||||
|
23,45,89,1
|
||||||
|
24,45,77,2
|
||||||
|
25,45,78,6
|
||||||
|
26,45,70,3
|
||||||
|
27,50,89,1
|
||||||
|
28,50,96,4
|
||||||
|
29,50,108,1
|
||||||
|
30,50,98,3
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp06.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,20,40.5,2
|
||||||
|
2,20,52,5
|
||||||
|
3,20,33,2
|
||||||
|
4,20,42.5,2
|
||||||
|
5,20,51,6
|
||||||
|
6,30,70.5,2
|
||||||
|
7,30,53.5,1
|
||||||
|
8,30,63,4
|
||||||
|
9,30,59,2
|
||||||
|
10,30,49.5,1
|
||||||
|
11,25,48.5,1
|
||||||
|
12,25,60.5,5
|
||||||
|
13,25,40,1
|
||||||
|
14,25,37.5,5
|
||||||
|
15,25,48,3
|
||||||
|
16,40,50,3
|
||||||
|
17,40,52.5,3
|
||||||
|
18,40,89.5,5
|
||||||
|
19,40,38.5,1
|
||||||
|
20,40,52.5,3
|
||||||
|
21,35,88,2
|
||||||
|
22,35,29,3
|
||||||
|
23,35,73,1
|
||||||
|
24,35,99.5,4
|
||||||
|
25,35,73,3
|
||||||
|
26,50,66,5
|
||||||
|
27,50,67,5
|
||||||
|
28,50,49,3
|
||||||
|
29,50,59,2
|
||||||
|
30,50,37.5,5
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp08.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,x,y,z
|
||||||
|
1,5,13,1
|
||||||
|
2,8,32,1
|
||||||
|
3,10,30,2
|
||||||
|
4,10,25,1
|
||||||
|
5,10,35.5,4
|
||||||
|
6,10,26,4
|
||||||
|
7,10,20,3
|
||||||
|
8,11,22.5,2
|
||||||
|
9,12,26,6
|
||||||
|
10,13,31.5,2
|
||||||
|
11,13,24,4
|
||||||
|
12,14,30,6
|
||||||
|
13,15,34,2
|
||||||
|
14,15,40.5,1
|
||||||
|
15,16,45.5,3
|
||||||
|
16,17,24.5,4
|
||||||
|
17,18,40.5,6
|
||||||
|
18,18,46,2
|
||||||
|
19,19,50.5,3
|
||||||
|
20,20,66.5,6
|
||||||
|
21,21,87,4
|
||||||
|
22,21,39,6
|
||||||
|
23,22,57,1
|
||||||
|
24,23,67.5,5
|
||||||
|
25,24,34.5,1
|
||||||
|
26,25,45.5,6
|
||||||
|
27,26,63,3
|
||||||
|
28,27,61,5
|
||||||
|
29,30,61,1
|
||||||
|
30,30,86,5
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp09.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,40,155,5
|
||||||
|
2,40,60,4
|
||||||
|
3,40,60,6
|
||||||
|
4,40,100,2
|
||||||
|
5,40,37,1
|
||||||
|
6,30,47,1
|
||||||
|
7,30,112,1
|
||||||
|
8,30,112,6
|
||||||
|
9,30,110,6
|
||||||
|
10,30,121,1
|
||||||
|
11,20,133,3
|
||||||
|
12,20,104,4
|
||||||
|
13,20,91,5
|
||||||
|
14,20,70,6
|
||||||
|
15,20,58,3
|
||||||
|
16,10,17,6
|
||||||
|
17,10,75,3
|
||||||
|
18,10,55,3
|
||||||
|
19,10,34,3
|
||||||
|
20,10,34,6
|
||||||
|
21,5,47,5
|
||||||
|
22,5,18,2
|
||||||
|
23,5,12,4
|
||||||
|
24,5,30,3
|
||||||
|
25,5,24,4
|
||||||
|
26,25,107,5
|
||||||
|
27,25,67,2
|
||||||
|
28,25,75,3
|
||||||
|
29,25,112,3
|
||||||
|
30,25,46,1
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp12.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,50,77,5
|
||||||
|
2,50,72.5,2
|
||||||
|
3,50,67,2
|
||||||
|
4,45,46,6
|
||||||
|
5,45,73.5,3
|
||||||
|
6,45,52,1
|
||||||
|
7,40,57,2
|
||||||
|
8,40,49,5
|
||||||
|
9,40,70,4
|
||||||
|
10,35,47.5,4
|
||||||
|
11,35,60,1
|
||||||
|
12,35,61,6
|
||||||
|
13,30,48,3
|
||||||
|
14,30,42,4
|
||||||
|
15,30,50,1
|
||||||
|
16,25,46,5
|
||||||
|
17,25,51,3
|
||||||
|
18,25,40,2
|
||||||
|
19,20,50,1
|
||||||
|
20,20,34,5
|
||||||
|
21,20,46,5
|
||||||
|
22,15,30,6
|
||||||
|
23,15,26,2
|
||||||
|
24,15,17,4
|
||||||
|
25,10,20,6
|
||||||
|
26,10,24,2
|
||||||
|
27,10,22,4
|
||||||
|
28,5,17,5
|
||||||
|
29,5,20,3
|
||||||
|
30,5,8,6
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp13.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,20,38,5
|
||||||
|
2,50,112,1
|
||||||
|
3,30,78,5
|
||||||
|
4,45,71,3
|
||||||
|
5,40,64,4
|
||||||
|
6,35,47,2
|
||||||
|
7,20,52,5
|
||||||
|
8,20,57,4
|
||||||
|
9,20,43,2
|
||||||
|
10,20,30,3
|
||||||
|
11,30,68,4
|
||||||
|
12,30,46,6
|
||||||
|
13,30,51,2
|
||||||
|
14,30,55,3
|
||||||
|
15,35,65,5
|
||||||
|
16,35,75,1
|
||||||
|
17,35,50,5
|
||||||
|
18,35,56,6
|
||||||
|
19,40,65,4
|
||||||
|
20,40,76,3
|
||||||
|
21,40,56,4
|
||||||
|
22,40,79,2
|
||||||
|
23,45,89,1
|
||||||
|
24,45,77,2
|
||||||
|
25,45,78,6
|
||||||
|
26,45,70,3
|
||||||
|
27,50,89,1
|
||||||
|
28,50,96,4
|
||||||
|
29,50,108,1
|
||||||
|
30,50,98,3
|
||||||
|
31
Oblig/3c/terningDroppFiler/Terningdropp17.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,10,34,2
|
||||||
|
2,10,47,6
|
||||||
|
3,10,33.5,6
|
||||||
|
4,10,39,2
|
||||||
|
5,10,33,2
|
||||||
|
6,15,63.5,3
|
||||||
|
7,15,45,5
|
||||||
|
8,15,43.5,3
|
||||||
|
9,15,75,2
|
||||||
|
10,15,76,1
|
||||||
|
11,20,43,1
|
||||||
|
12,20,75,1
|
||||||
|
13,20,49,4
|
||||||
|
14,20,48.5,4
|
||||||
|
15,20,45,4
|
||||||
|
16,25,59,2
|
||||||
|
17,25,49,4
|
||||||
|
18,25,63,4
|
||||||
|
19,25,59,5
|
||||||
|
20,25,63,5
|
||||||
|
21,30,66,2
|
||||||
|
22,30,85,3
|
||||||
|
23,30,74,1
|
||||||
|
24,30,72,1
|
||||||
|
25,30,72.5,2
|
||||||
|
26,35,77,1
|
||||||
|
27,35,64,5
|
||||||
|
28,35,64.5,1
|
||||||
|
29,35,51.5,5
|
||||||
|
30,35,61.5,5
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp04.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,5,16,5
|
||||||
|
2,5,27,2
|
||||||
|
3,5,18,1
|
||||||
|
4,5,29,1
|
||||||
|
5,5,20,2
|
||||||
|
6,7,26,1
|
||||||
|
7,7,37,1
|
||||||
|
8,7,29,5
|
||||||
|
9,7,46,2
|
||||||
|
10,7,33,4
|
||||||
|
11,10,33,5
|
||||||
|
12,10,39,1
|
||||||
|
13,10,15,2
|
||||||
|
14,10,32,6
|
||||||
|
15,10,28,1
|
||||||
|
16,12,42,1
|
||||||
|
17,12,40,2
|
||||||
|
18,12,48,2
|
||||||
|
19,12,41,4
|
||||||
|
20,12,35,6
|
||||||
|
21,15,43,4
|
||||||
|
22,15,50,2
|
||||||
|
23,15,45,3
|
||||||
|
24,15,48,2
|
||||||
|
25,15,45,4
|
||||||
|
26,17,55,6
|
||||||
|
27,17,70,3
|
||||||
|
28,17,60,1
|
||||||
|
29,17,58,3
|
||||||
|
30,17,70,5
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp05.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,5,16,5
|
||||||
|
2,5,27,2
|
||||||
|
3,5,18,1
|
||||||
|
4,5,29,1
|
||||||
|
5,5,20,2
|
||||||
|
6,7,26,1
|
||||||
|
7,7,37,1
|
||||||
|
8,7,29,5
|
||||||
|
9,7,46,2
|
||||||
|
10,7,33,4
|
||||||
|
11,10,33,5
|
||||||
|
12,10,39,1
|
||||||
|
13,10,15,2
|
||||||
|
14,10,32,6
|
||||||
|
15,10,28,1
|
||||||
|
16,12,42,1
|
||||||
|
17,12,40,2
|
||||||
|
18,12,48,2
|
||||||
|
19,12,41,4
|
||||||
|
20,12,35,6
|
||||||
|
21,15,43,4
|
||||||
|
22,15,50,2
|
||||||
|
23,15,45,3
|
||||||
|
24,15,48,2
|
||||||
|
25,15,45,4
|
||||||
|
26,17,55,6
|
||||||
|
27,17,70,3
|
||||||
|
28,17,60,1
|
||||||
|
29,17,58,3
|
||||||
|
30,17,70,5
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp21.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,x,y,z
|
||||||
|
1,35,115,5
|
||||||
|
2,15,23,2
|
||||||
|
3,10,23,6
|
||||||
|
4,30,79,3
|
||||||
|
5,25,65,3
|
||||||
|
6,20,27,2
|
||||||
|
7,25,48,6
|
||||||
|
8,35,91,4
|
||||||
|
9,20,73,1
|
||||||
|
10,25,31,6
|
||||||
|
11,30,88,1
|
||||||
|
12,25,36,4
|
||||||
|
13,10,27,2
|
||||||
|
14,25,40,3
|
||||||
|
15,35,75,2
|
||||||
|
16,15,60,1
|
||||||
|
17,10,18,6
|
||||||
|
18,30,65,3
|
||||||
|
19,20,30,1
|
||||||
|
20,35,55,6
|
||||||
|
21,15,25,2
|
||||||
|
22,15,45,1
|
||||||
|
23,30,50,5
|
||||||
|
24,35,118,3
|
||||||
|
25,10,18,4
|
||||||
|
26,20,40,6
|
||||||
|
27,20,25,6
|
||||||
|
28,15,59,2
|
||||||
|
29,10,29,2
|
||||||
|
30,30,50,3
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp25.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropphoyde,Sprettlengde,Terningverdi
|
||||||
|
1,18,64,1
|
||||||
|
2,34,98,6
|
||||||
|
3,9,39,5
|
||||||
|
4,34,120,5
|
||||||
|
5,15,36,1
|
||||||
|
6,18,63,1
|
||||||
|
7,34,87,2
|
||||||
|
8,5,29,5,
|
||||||
|
9,18,66,5
|
||||||
|
10,34,84,2
|
||||||
|
11,15,89,6
|
||||||
|
12,15,43,4
|
||||||
|
13,21,88,3
|
||||||
|
14,9,34,2
|
||||||
|
15,21,64,3
|
||||||
|
16,5,37,2
|
||||||
|
17,9,33,4
|
||||||
|
18,5,46,5
|
||||||
|
19,18,61,6
|
||||||
|
20,15,36,1
|
||||||
|
21,21,80,3
|
||||||
|
22,21,73,1
|
||||||
|
23,9,31,3
|
||||||
|
24,5,35,5,
|
||||||
|
25,34,121,1
|
||||||
|
26,18,63,5
|
||||||
|
27,5,37,5,
|
||||||
|
28,9,26,6
|
||||||
|
29,21,93,6
|
||||||
|
30,15,39,6
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp31.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropphoyde,Lengde,Verdi
|
||||||
|
1,25,34,5
|
||||||
|
2,40,39,3
|
||||||
|
3,10,11.3,2
|
||||||
|
4,15,16.8,2
|
||||||
|
5,30,35,4
|
||||||
|
6,10,13.3,1
|
||||||
|
7,10,8.8,4
|
||||||
|
8,10,9.9,4
|
||||||
|
9,15,19.8,2
|
||||||
|
10,15,15.7,5
|
||||||
|
11,15,20.6,2
|
||||||
|
12,20,18.8,3
|
||||||
|
13,20,26.7,4
|
||||||
|
14,20,24.4,1
|
||||||
|
15,20,25.5,4
|
||||||
|
16,25,24.8,1
|
||||||
|
17,25,19.1,2
|
||||||
|
18,25,19.8,1
|
||||||
|
19,30,37.6,2
|
||||||
|
20,30,43.9,5
|
||||||
|
21,30,49.7,5
|
||||||
|
22,35,47.4,1
|
||||||
|
23,35,35.3,6
|
||||||
|
24,35,35.6,1
|
||||||
|
25,35,44.2,4
|
||||||
|
26,40,57.6,1
|
||||||
|
27,40,33.9,2
|
||||||
|
28,40,40.2,3
|
||||||
|
29,5,9.7,3
|
||||||
|
30,5,12,1
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp36.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi,
|
||||||
|
1,27.50,27,4,
|
||||||
|
2,9.5,38,1,
|
||||||
|
3,24,128,3,
|
||||||
|
4,45,59,1,
|
||||||
|
5,42,76,1,
|
||||||
|
6,27.50,59.5,3,
|
||||||
|
7,27.5,99.5,4,
|
||||||
|
8,27.5,66,2,
|
||||||
|
9,27.5,85.5,5,
|
||||||
|
10,9.5,22,6,
|
||||||
|
11,9.5,37,5,
|
||||||
|
12,9.5,48.5,6,
|
||||||
|
13,9.5,57.5,1,
|
||||||
|
14,24,77.5,4,
|
||||||
|
15,24,104,6,
|
||||||
|
16,24,93.5,3,
|
||||||
|
17,24,84,2,
|
||||||
|
18,42,105,4,
|
||||||
|
19,42,59,1,
|
||||||
|
20,42,66,2,
|
||||||
|
21,42,240,2,
|
||||||
|
22,14,52.5,3,
|
||||||
|
23,14,46,1,
|
||||||
|
24,14,42,2,
|
||||||
|
25,14,67,5,
|
||||||
|
26,14,48,1,
|
||||||
|
27,4.5,18,4,
|
||||||
|
28,4.5,21,2,
|
||||||
|
29,4.5,20,2,
|
||||||
|
30,4.5,27,5,
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp37.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,5,24.2,1
|
||||||
|
2,5,19.4,1
|
||||||
|
3,5,22,4
|
||||||
|
4,5,16.8,6
|
||||||
|
5,5,21.2,3
|
||||||
|
6,10,44.8,4
|
||||||
|
7,10,31.5,2
|
||||||
|
8,10,33.6,5
|
||||||
|
9,10,28,3
|
||||||
|
10,10,32.5,6
|
||||||
|
11,15,60,6
|
||||||
|
12,15,72.4,4
|
||||||
|
13,15,55.9,6
|
||||||
|
14,15,47.3,6
|
||||||
|
15,15,44.8,5
|
||||||
|
16,20,56.5,3
|
||||||
|
17,20,49.7,1
|
||||||
|
18,20,74.6,5
|
||||||
|
19,20,63,1
|
||||||
|
20,20,68.8,2
|
||||||
|
21,25,89,1
|
||||||
|
22,25,71.3,3
|
||||||
|
23,25,95.8,4
|
||||||
|
24,25,76.1,3
|
||||||
|
25,25,64.5,3
|
||||||
|
26,30,101.5,6
|
||||||
|
27,30,110,5
|
||||||
|
28,30,74.5,6
|
||||||
|
29,30,110.5,6
|
||||||
|
30,30,75.4,4
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp40.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,5,36,5
|
||||||
|
2,10,57,5
|
||||||
|
3,15,50,4
|
||||||
|
4,20,87,4
|
||||||
|
5,25,78,4
|
||||||
|
6,5,26,3
|
||||||
|
7,10,61,4
|
||||||
|
8,10,32,5
|
||||||
|
9,10,52,3
|
||||||
|
10,5,24,1
|
||||||
|
11,15,67,2
|
||||||
|
12,15,49,3
|
||||||
|
13,15,60,6
|
||||||
|
14,15,38,3
|
||||||
|
15,5,27,5
|
||||||
|
16,20,107,4
|
||||||
|
17,20,91,4
|
||||||
|
18,20,118,3
|
||||||
|
19,20,57,2
|
||||||
|
20,10,31,2
|
||||||
|
21,25,77,4
|
||||||
|
22,25,77,5
|
||||||
|
23,25,98,6
|
||||||
|
24,25,109,1
|
||||||
|
25,5,26,5
|
||||||
|
26,30,75,3
|
||||||
|
27,30,128,5
|
||||||
|
28,30,144,2
|
||||||
|
29,30,94,3
|
||||||
|
30,30,125,5
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningDropp59.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,Dropp,Lengde,Verdi
|
||||||
|
1,50,111,2
|
||||||
|
2,45,101,3
|
||||||
|
3,40,51,3
|
||||||
|
4,35,50,1
|
||||||
|
5,30,45.5,6
|
||||||
|
6,33,50.5,3
|
||||||
|
7,26,77.5,1
|
||||||
|
8,15,20,3
|
||||||
|
9,23,45,5
|
||||||
|
10,42,97.5,4
|
||||||
|
11,58,89,4
|
||||||
|
12,27,62,2
|
||||||
|
13,17,47,3
|
||||||
|
14,19,37.5,3
|
||||||
|
15,37,57,6
|
||||||
|
16,50,135,6
|
||||||
|
17,45,69,6
|
||||||
|
18,40,51,3
|
||||||
|
19,35,85.2,2
|
||||||
|
20,30,65,3
|
||||||
|
21,33,25.5,3
|
||||||
|
22,26,33,3
|
||||||
|
23,15,23,2
|
||||||
|
24,23,64,4
|
||||||
|
25,42,60.5,2
|
||||||
|
26,58,65.5,4
|
||||||
|
27,27,42,3
|
||||||
|
28,17,27.5,6
|
||||||
|
29,19,13.5,1
|
||||||
|
30,37,68,1
|
||||||
|
31
Oblig/3c/terningDroppFiler/terningdropp07.csv
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
k,x,y,z
|
||||||
|
1,20,42,1
|
||||||
|
2,10,41,3
|
||||||
|
3,50,45,2
|
||||||
|
4,30,34,4
|
||||||
|
5,20,37,3
|
||||||
|
6,40,73,4
|
||||||
|
7,50,171,3
|
||||||
|
8,60,137,4
|
||||||
|
9,10,39,4
|
||||||
|
10,40,57,1
|
||||||
|
11,30,122,4
|
||||||
|
12,30,75,5
|
||||||
|
13,10,26,6
|
||||||
|
14,60,102,5
|
||||||
|
15,40,160,3
|
||||||
|
16,20,50,5
|
||||||
|
17,60,63,1
|
||||||
|
18,50,90,5
|
||||||
|
19,40,104,3
|
||||||
|
20,30,128,2
|
||||||
|
21,20,75,6
|
||||||
|
22,10,37,4
|
||||||
|
23,50,48,4
|
||||||
|
24,40,86,3
|
||||||
|
25,60,72,4
|
||||||
|
26,10,43,4
|
||||||
|
27,20,68,1
|
||||||
|
28,30,44,5
|
||||||
|
29,50,107,1
|
||||||
|
30,60,65,5
|
||||||
|