Det er ikke alle typer målinger som har en direkte lineær sammenheng. For eksempel vet vi fra fysikken at volumet $v$ av en kule med radius $r$ er gitt ved $v = \tfrac{4}{3} \pi r^3$. La oss si at vi har glemt hva konstanten $\pi$ er, og vil gjøre et lite eksperiment for å estimere $\pi$. Vi tar de kulene vi har tilgjengelig i huset; en sprettball, en tennisball, to lekeballer, en liten fotball, en volleyball og en stor fotball. Vi måler radius til hver kule og vi måler kulenes volum ved å senke dem ned i et desilitermål eller badebalje og måler hvor mye vann som forflyttes. Merk at alle disse målingene er forbundet med usikkerhet, så vi bør nok ikke bli for skråsikre på resultatet av analysen vår.
# Målinger
# Målt radius (fra minste til største)
r = [1.5 , 3.5, 4.5, 5.0, 6.5, 10.0, 11.0] # cm
# Målt volum
v = [13.8, 181.6, 380.1, 521.7, 1149.6, 4195.4, 5574.3] # cm^3
Vi kan nå plotte estimert volum mot estimert radius i et kryssplott.
import pandas as pd # lese data fra csv-fil og bruke DataFrames
import seaborn as sns; sns.set_style('whitegrid') # plotting
sns.set(style = 'whitegrid', font_scale = 1.5) # utseende av plott
import matplotlib.pyplot as plt # mer plotting
import numpy as np # matematikk
import statsmodels.api as sms # regresjonen
import statsmodels.formula.api as smf # formel for regresjonen
sns.relplot(x=r, y=v)
plt.xlim(0,12); plt.ylim(-20,6000)
plt.ylabel('Beregnet volum [cm^3]'); plt.xlabel('Målt radius [cm]')
Text(0.5, 15.440000000000012, 'Målt radius [cm]')
Som vi vet så er ikke sammenhengen mellom disse to målingene lineær. Dermed kan det ved første øyekast virke som om verktøyene vi har lært hjelper oss (minste kvadratsums rette linje) ikke er til nytte.
Men la oss på x-aksen heller plotte radius opphøyd i tredje!
r3 = [r ** 3 for r in r]
sns.relplot(x=r3, y=v)
plt.xlim(-5,1500); plt.ylim(-20,6000)
plt.ylabel('Beregnet volum [cm^3]'); plt.xlabel('Målt radius^3 [cm^3]')
Text(0.5, 15.440000000000012, 'Målt radius^3 [cm^3]')
Nå ser vi med en gang en linær trend. I dette plottet har vi altså $y = v$ og $x = r^3$ og vi kan tilpasse en regresjonslinje med minste kradratsums metode for å finne den lineære sammenhengen mellom $x$ og $y$.
data = {'r3': r3, 'v': v}
df = pd.DataFrame(data, columns=['r3','v'])
sns.lmplot(x='r3', y='v', ci = None, data = df)
plt.xlim(-5,1500); plt.ylim(-20,6000)
plt.ylabel('Beregnet volum [cm^3]'); plt.xlabel('Målt radius^3 [cm^3]')
Text(0.5, 15.440000000000012, 'Målt radius^3 [cm^3]')
regresjon = smf.ols('v~r3', data=df).fit()
regresjon.params
Intercept -0.421698 r3 4.190883 dtype: float64
Estimert regresjonslinje: $y = -0.4 + 4.2 x$. Som forventet er kryssningspunktet på y-aksen omtrent lik null (men pga mye usikkerhet i målingene våre er det ikke overraskende at det blir noe ulikt null). Stigningstallet er 4.2. Fra den fysiske loven for sammenheng mellom radius i tredje og volum, kan vi da gjette på $\pi$ ved å løse ligningen $4.2 \approx \tfrac{4}{3} \pi$, som gir $\pi \approx 3.15$.
Merk: Andre vanlige triks du kan møte på i en laboratorieøvelse er for eksempel å ta logaritmen av målingen på x- eller y-aksen, eller begge.