Estimació de la massa d'un porc a partir de l'anàlisi d'imatges digitals

Clàudia Climent i Pere Alemany
Departament de Química Física i 
 Institut de Química Teòrica i Computacional (IQTCUB)
  Universitat de Barcelona
Martí i Franquès 1-11, Barcelona 08028

Mesures experimentals

En aquest estudi estadístic es correlaciona el pes d'un porc amb mesures corporals per establir un model matemàtic que permeti una estimació fiable del pes del porc a partir de les mesures obtingudes a partir de l'anàlisi d'una fotografia digital.
En aquest cas ens hem centrat en una fotografia presa en un pla zenital a partir de la qual s'identifiquen un conjunt de punts que permeten determinar les distàncies clau que s'inclouran al model matemàtic que s'usa per predir el pes a partir de informació sobre les dimensions del cos de l'animal. El procediment seguit es mostra en la fotografia següent:

Emprant el programa de tractament d'imatges ImageJ (http://rsbweb.nih.gov/ij/index.html) es superposen tres el·lipses sobre la imatge del porc intentant cobrir al màxim l'area ocupada pel porc (excloent en tots els casos el cap). El criteri bàsic per a establir les dimensions de les el·lipses es que s'ajustin al perfil del porc, marcant l'amplada màxima a l'espatlla, la panxa i el maluc. A partir de la imatge amb les tres el·lipses es determinen les longituds dels segments identificats a la fotografia com a (Subscript[d, 1]), ..., (Subscript[d, 6])i per comparació amb la fotografia d'un rectangle de fusta de dimensions conegudes es fa la conversió de pixels sobre la fotografia a cm. S'han fet proves a partir de fotografies on s'havia situat el rectangle de fusta al terra de la gabia, a dalt de la reixa i a una alçada intermèdia i s'ha optat per usar aquesta darrera opció ja que en situar la referencia a una alçada similar a la que es troba l'esquena del porc s'obtenen els valors per a les diferents longituds més semblants amb els que es mesuren sobre l'animal mort.
En aquest procediment, si be la definició de les amplades de les el·lipses (Subscript[d, 2]), (Subscript[d, 4]), (Subscript[d, 6]) és força evident (si es disposa d'una fotografia de prou qualitat per distingir bé els punts d'amplada màxima), hi ha una certa arbitrarietat en l'elecció de l'eix major de les el·lipses corresponents al torax i l'abdomen. Aquesta indefinició afecta la determinació de la longitud del porc, (Subscript[d, 1]), ja que la localització del clatell és força arbitraria i s'ha pres usant la primera l'el·lipse com a referència. Les dues mesures restants, (Subscript[d, 3])i  (Subscript[d, 5]), s'obtenen buscant els punts on canvia la corbatura del perfil del porc i, per tant, requereixen disposar de fotografies en el qual l'animal es trobi en una posició amb la columna vertebral el més estrirada possible.
L'obtenció de dades sobre cada porc a partir de les imatges es va relitzar sel·leccionant manualment quatre imatges del porc a partir d'un video enregistrat durant el procés de pesatge, intentant escollir imatges on el porc estés en una posició òptima dins la gàvia que permetes identificar el seu perfil amb la major nitidesa possible i intentant també que estés el més estrirat possible en la seva direcció longitudinal. A partrir de les mesures preses sobre aquestes quatre fotografies per a cada porc es determinen els valors mitjans de les variables  (Subscript[d, 1]), ..., (Subscript[d, 6]) i un cop vist que els errors comesos en les estimacions dels sis paràmetres per a cada porc a partir de les quatre fotografies diferents no són importants, es fa tota l'analisi estadística usant els valors mitjans  de (Subscript[d, 1]), ..., (Subscript[d, 6]) per a cada porc. 
Per altra banda, es van pesar tots els porcs en el moment de prendre les imatges (pes viu, variable pv en els càlculs) i un cop sacrificats (pes canal,variable pc en els càlculs). Un cop sacrificats es van prendre també mesures de les dimensions del porc identificades d'ara en endavant com a (Subscript[m, 1]), ..., (Subscript[m, 6]). Per motius tècnics no va ser possible obtenir la mesura  (Subscript[m, 4]) corresponent a l'amplada del porc un cop mort a l'alçada de la panxa.

Lectura de dades

En primer lloc llegim les dades bàsiques per a cada lot de porcs. Aquestes es troben en un fitxer de tipus .csv que conté la informació següent:

Porc N,Xip,Sexe,pviu,pcanal,m1,d1,m2,d2,m3,d3,d4,m5,d5,m6,d6
1,6311,F,102,83.4,103,97.8,34,34.9,25.9,30.6,29.8,27.4,29.1,35.5,36.7
2,6292,F,108.5,86.7,104,102.8,29.6,35.3,25.1,31.6,31.4,26.3,29.5,35.1,37.2
...
22,6216,M,111.5,90.4,103,102.4,31.2,35.9,24.2,29.6,29.8,26.4,29.2,33.6,36.2

En una primera fila hi ha els encapçalaments indicant a que correspon cadascuna de les variables: número de porc, nombre de xip identificador, sexe (M o F), pes mesurat en viu, pes mesurat un cop sacrificat i les distàncies esmentades anteriorment. A a continuació hi ha una fila de dades per a cada porc que conté els valors numèrics de les variables. Cada entrada en el fitxer es separa per comes i els decimals s'indiquen mitjançant un punt.

(* Esborrem la memòria i suprimim missatges d'error *)

ClearAll["Global`*"];
Off[General::spell,General::spell1];

(* Importem el fitxer .csv d'excel  s'ha de vigilar de canviar "," per "." i després  ";" per "," *)

SetDirectory[];
dades =Import["Lot1_dades.csv"] ;


(* definim vectors a partir de les columnes de la taula excel 
  eliminant la primera entrada de l'array dades (encapçalament)
  i agafem el 1, 2, 3, ... 16. element de cada fila  *)

porc=Drop[dades[[All,1]],1] ;
xip=Drop[dades[[All,2]],1];
sexe=Drop[dades[[All,3]],1];
pviu=Drop[dades[[All,4]],1];
pcanal=Drop[dades[[All,5]],1];
m1=Drop[dades[[All,6]],1];
d1=Drop[dades[[All,7]],1];
m2=Drop[dades[[All,8]],1];
d2=Drop[dades[[All,9]],1];
m3=Drop[dades[[All,10]],1];
d3=Drop[dades[[All,11]],1];
d4=Drop[dades[[All,12]],1];
m5=Drop[dades[[All,13]],1];
d5=Drop[dades[[All,14]],1];
m6=Drop[dades[[All,15]],1];
d6=Drop[dades[[All,16]],1];

(* calculem la dimensió dels vectors *)

dim = Length[porc];
Print [" Nombre de porcs a analitzar: ", dim]


(* escrivim valors extrems i mitjanes per a les mesures *)


Print[ " "]
Print [" Valor mínim per al pes viu: ", Min[pviu]," kg    Valor màxim per al pes viu: ", Max[pviu]," kg"]
Print [" Valor mitjà per al pes viu: ", Mean[pviu]," kg"]
Print[ " "]
Print [" Valor mínim per al pes canal: ", Min[pcanal]," kg    Valor màxim per al pes canal: ", Max[pcanal]," kg"]
Print [" Valor mitjà per al pes canal: ", Mean[pcanal]," kg"]
Print[ " "]
Print [" Valor mínim per a d1 (foto): ", Min[d1]," cm    Valor màxim per a d1 (foto): ", Max[d1]," cm"]
Print [" Valor mitjà per a d1 (foto): ", Mean[d1]," cm"]
Print[ " "]
Print [" Valor mínim per a m1 (canal): ", Min[m1]," cm    Valor màxim per a m1 (foto): ", Max[m1]," cm"]
Print [" Valor mitjà per a m1 (canal): ", N[Mean[m1]]," cm"]
Print[ " "]
Print [" Valor mínim per a d2 (foto): ", Min[d2]," cm    Valor màxim per a d2 (foto): ", Max[d2]," cm"]
Print [" Valor mitjà per a d2 (foto): ", Mean[d2]," cm"]
Print[ " "]
Print [" Valor mínim per a m2 (canal): ", Min[m2]," cm    Valor màxim per a m2 (foto): ", Max[m2]," cm"]
Print [" Valor mitjà per a m2 (canal): ", N[Mean[m2]]," cm"]
Print[ " "]
Print [" Valor mínim per a d3 (foto): ", Min[d3]," cm    Valor màxim per a d3 (foto): ", Max[d3]," cm"]
Print [" Valor mitjà per a d3 (foto): ", Mean[d3]," cm"]
Print[ " "]
Print [" Valor mínim per a m3 (canal): ", Min[m3]," cm    Valor màxim per a m3 (foto): ", Max[m3]," cm"]
Print [" Valor mitjà per a m3 (canal): ", N[Mean[m3]]," cm"]
Print[ " "]
Print [" Valor mínim per a d4 (foto): ", Min[d4]," cm    Valor màxim per a d4 (foto): ", Max[d4]," cm"]
Print [" Valor mitjà per a d4 (foto): ", Mean[d4]," cm"]
Print[ " "]
Print [" Valor mínim per a d5 (foto): ", Min[d5]," cm    Valor màxim per a d1 (foto): ", Max[d5]," cm"]
Print [" Valor mitjà per a d5 (foto): ", Mean[d5]," cm"]
Print[ " "]
Print [" Valor mínim per a m5 (canal): ", Min[m5]," cm    Valor màxim per a m5 (foto): ", Max[m5]," cm"]
Print [" Valor mitjà per a m5 (canal): ", N[Mean[m5]]," cm"]
Print[ " "]
Print [" Valor mínim per a d6 (foto): ", Min[d6]," cm    Valor màxim per a d6 (foto): ", Max[d6]," cm"]
Print [" Valor mitjà per a d6 (foto): ", Mean[d6]," cm"]
Print[ " "]
Print [" Valor mínim per a m6 (canal): ", Min[m6]," cm    Valor màxim per a m6 (foto): ", Max[m6]," cm"]
Print [" Valor mitjà per a m6 (canal): ", N[Mean[m6]]," cm"]

(* definim màxims i mínims per a cada variable amb un 5% afegit per
als límits dels gràfics  *)
minpv=Min[pviu]-0.05Min[pviu];
maxpv=Max[pviu]+0.05Max[pviu];
minpc=Min[pcanal]-0.05Min[pcanal];
maxpc=Max[pcanal]+0.05Max[pcanal];
minm1=Min[m1]-0.05Min[m1]; 
maxm1=Max[m1]+0.05Max[m1];
mind1=Min[d1]-0.05Min[d1];
maxd1=Max[d1]+0.05Max[d1];
minm2=Min[m2]-0.05Min[m2];
maxm2=Max[m2]+0.05Max[m2];
mind2=Min[d2]-0.05Min[d2];
maxd2=Max[d2]+0.05Max[d2];
minm3=Min[m3]-0.05Min[m3];
maxm3=Max[m3]+0.05Max[m3];
mind3=Min[d3]-0.05Min[d3];
maxd3=Max[d3]+0.05Max[d3];
mind4=Min[d4]-0.05Min[d4];
maxd4=Max[d4]+0.05Max[d4];
minm5=Min[m5]-0.05Min[m5];
maxm5=Max[m5]+0.05Max[m5];
mind5=Min[d5]-0.05Min[d5];
maxd5=Max[d5]+0.05Max[d5];
minm6=Min[m6]-0.05Min[m6];
maxm6=Max[m6]+0.05Max[m6];
mind6=Min[d6]-0.05Min[d6];
maxd6=Max[d6]+0.05Max[d6];

Anàlisi de correlació entre dades canal / viu

El primer que mirem d'esbrinar és si hi ha una bona correlació entre les dades preses a partir de l'animal viu i les que es van prendre sobre l'animal un cop sacrificat.

(* Correlació pes canal vs. pes viu *)

pcpv=Table [{pviu[[i]],pcanal[[i]]},{i,1,dim}];

Print ["Ajust lineal pes canal (en kg) vs pes en viu (en kg)"]
lmpcpv=LinearModelFit[pcpv,p,p];
af=lmpcpv["BestFitParameters"][[1]];
bf=lmpcpv["BestFitParameters"][[2]];
Print["Pes canal (kg) = ",af," + ",bf," Pes viu (kg)"]
Print ["(R^2) del ajust: ",lmpcpv["RSquared"]]


(* Representació pes canal vs. pes viu *)

Print [" "]
Print [" Pes canal vs pes en viu (en kg)"]

Show[ListPlot[pcpv, PlotStyle->Red], Plot[lmpcpv[p], {p, minpv,maxpv}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"pes viu (kg)","pes canal (kg)"}]

(* Càlcul de diferències pes canal estimat - pes canal mesurat *)

resid =Table [{pviu[[i]],lmpcpv["FitResiduals"][[i]]},{i,1,dim}];

Print [" "]
Print [" Pes canal estimat - pes canal mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"pes en viu (kg)","error estimació (kg)"},
PlotRange->{{minpv,maxpv},{-3,3}}
]

Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpcpv["FitResiduals"]]," kg     ", Max[lmpcpv["FitResiduals"]]," kg"]
Print["Error mitjà :   ",Mean[Abs[lmpcpv["FitResiduals"]]]," kg"]

(* Relació pes canal / pes viu *)

relpcpv=Table [{pviu[[i]],100*pcanal[[i]]/pviu[[i]]},{i,1,dim}];

pviumig=Mean[pviu];
pcmig=Mean[pcanal];
quocmig=Mean[relpcpv][[2]];

Print[]
Print["Pes viu mitjà :   ",pviumig, " kg"]
Print["Pes canal mitjà :   ",pcmig, " kg"]
Print["pviu/pcanal mitjà :   ",quocmig," %" ]
Print[]

Com era d'esperar, s'obté una bona correlació entre el pes mesurat per a l'animal viu i el que s'obté per a la canal. La relació trobada indica que el pes de la canal és d'aproximadament el 81% del pes de l'animal viu.

A continuació s'analitza la correlació entre les mesures de distància preses a partir de l'analisi d'imatges i les mesures post-mortem sobre la carcassa de l'animal.

(* Correlació m1 vs. d1 *)

m1d1=Table [{d1[[i]],m1[[i]]},{i,1,dim}];

Print[]
Print ["Ajust lineal m1 (en cm) vs d1 (en cm)"]
lmm1d1=LinearModelFit[m1d1,d,d];
af=lmm1d1["BestFitParameters"][[1]];
bf=lmm1d1["BestFitParameters"][[2]];
Print["m1 (cm) = ",af," + ",bf," d1 (cm)"]
Print ["(R^2) del ajust: ",lmm1d1["RSquared"]]


(* Representació m1 vs d1 *)

Print[]
Print [" m1 vs d1 (en cm)"]

Show[ListPlot[m1d1, PlotStyle->Red,PlotRange->{{mind1,maxd1},{minm1,maxm1}}], Plot[lmm1d1[d], {d, mind1,maxd1},PlotRange->{{mind1,maxd1},{minm1,maxm1}}] ,Plot[x, {x, mind1,maxd1}, PlotRange->{{mind1,maxd1},{minm1,maxm1}},PlotStyle->{Black, Dashed}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d1 (cm)","m1 (cm)"}]

(* Càlcul de diferències m1 estimat - m1 mesurat *)

resid =Table [{d1[[i]],lmm1d1["FitResiduals"][[i]]},{i,1,dim}];

Print[]
Print [" m1 estimat - m1 mesurat (en cm)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d1 (cm)","error estimació (cm)"},
PlotRange->{{mind1,maxd1},{-6,6}}
]
Print[]
Print["Errors màxims i mínim :   ",Min[lmm1d1["FitResiduals"]]," cm  i  ", Max[lmm1d1["FitResiduals"]]," cm "]
Print["Error mitjà :   ",Mean[Abs[lmm1d1["FitResiduals"]]]," cm "]

(* Relació d1 / m1 *)

relm1d1=Table [{d1[[i]],100*d1[[i]]/m1[[i]]},{i,1,dim}];

d1mig=Mean[d1];
m1mig=Mean[m1];
quocm1d1=Mean[relm1d1][[2]];

Print[]
Print["Distància d1 mitjana :   ",d1mig, " cm"]
Print["Distància m1 mitjana :   ",N[m1mig], " cm"]
Print["d1/m1 mitjà :   ",quocm1d1," %" ]


(* Representació d1/m1 vs d1 *)

Print[]
Print ["Ajust lineal d1/m1 (en %) vs d1 (en cm)"]

lmrelm1d1=LinearModelFit[relm1d1,p,p];
af=lmrelm1d1["BestFitParameters"][[1]];
bf=lmrelm1d1["BestFitParameters"][[2]];
Print["d1/m1 (en %) = ",af," + ",bf," d1 (cm)"]
Print ["(R^2) del ajust: ",lmrelm1d1["RSquared"]]


Print[]
Print [" d1/m1 (en %) vs d1 (en cm)"]

Show[ListPlot[relm1d1, PlotStyle->Red], Plot[lmrelm1d1[p], {p, mind1,maxd1}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d1 (cm)","d1/m1 (%)"},PlotRange->{{mind1,maxd1},{90.,105.}}]

Comparant les longituds dels porcs obtingudes a partir del tractament d'imatges i les mesurades a partir de la canal es veu que, en general, hi ha una subestimació de la longitud del porc quan es mesura a partir de les fotografies, trobant-se que les distancies (Subscript[d, 1])són aproximadament un 97% de les (Subscript[m, 1]). Aquesta discrepància és probablement deguda a que en la fotografia tenim una projecció de l'esquena del porc que si està amb l'esquena arquejada és menor que la mesurada sobre la canal perfectament estirada. Aparentment aquesta diferència és major en els porcs més petits encara que la dispersió de dades és important.

(* Correlació m2 vs. d2 *)

m2d2=Table [{d2[[i]],m2[[i]]},{i,1,dim}];

Print ["Ajust lineal m2 (en cm) vs d2 (en cm)"]
lmm2d2=LinearModelFit[m2d2,d,d]; 
af=lmm2d2["BestFitParameters"][[1]];
bf=lmm2d2["BestFitParameters"][[2]];
Print["m2 (cm) = ",af," + ",bf," d2 (cm)"]
Print ["(R^2) del ajust: ",lmm2d2["RSquared"]]


(* Representació m2 vs d2 *)

Print[]
Print [" m2 vs d2 (en cm)"]

Show[
ListPlot[m2d2, PlotStyle->Red,PlotRange->{{mind2,maxd2},{minm2,maxm2}}], Plot[lmm2d2[d], {d, mind2,maxd2},PlotRange->{{mind2,maxd2},{minm2,maxm2}}] ,Plot[x, {x, mind2,maxd2}, PlotRange->{{mind2,maxd2},{minm2,maxm2}},PlotStyle->{Black, Dashed}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d2","m2"}
]

(* Càlcul de diferències m2 estimat - m2 mesurat *)

resid =Table [{d2[[i]],lmm2d2["FitResiduals"][[i]]},{i,1,dim}];

Print [" m2 estimat - m2 mesurat (en cm)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d2 (cm)","error estimació (cm)"},
PlotRange->{{mind2,maxd2},{-4,4}}
]

Print["Errors màxims i mínim :   ",Min[lmm2d2["FitResiduals"]]," cm   ", Max[lmm2d2["FitResiduals"]]," cm"]
Print["Error mitjà :   ",Mean[Abs[lmm2d2["FitResiduals"]]]," cm"]

(* Relació d2 / m2 *)

relm2d2=Table [{d2[[i]],100*d2[[i]]/m2[[i]]},{i,1,dim}];

d2mig=Mean[d2];
m2mig=Mean[m2];
quocm2d2=Mean[relm2d2][[2]];

Print[]
Print["Distància d2 mitjana :   ",d2mig, " cm"]
Print["Distància m2 mitjana :   ",N[m2mig], " cm"]
Print["d2/m2 mitjà :   ",quocm2d2," %" ]
Print[]

(* Representació d2/m2 vs d2 *)

Print ["Ajust lineal d2/m2 (en %) vs d2 (en cm)"]

lmrelm2d2=LinearModelFit[relm2d2,p,p];
af=lmrelm2d2["BestFitParameters"][[1]];
bf=lmrelm2d2["BestFitParameters"][[2]];
Print["d2/m2 (en %) = ",af," + ",bf," d2 (cm)"]
Print ["(R^2) del ajust: ",lmrelm2d2["RSquared"]]


Print[]
Print [" d2/m2 (en %) vs d2 (en cm)"]

Show[ListPlot[relm2d2, PlotStyle->Red], Plot[lmrelm2d2[p], {p, mind2,maxd2}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d2 (cm)","d2/m2 (%)"},PlotRange->{{mind2,maxd2},{105.,125.}}]

Comparant les amplades dels porcs obtingudes a partir del tractament d'imatges i les mesurades a partir de la canal es veu que les distancies (Subscript[d, 2])són aproximadament un 115% de les (Subscript[m, 2]). Aparentment aquesta diferència és major en els porcs més grans, encara que la dispersió de dades és considerable.

(* Correlació m3 vs. d3 *)

m3d3=Table [{d3[[i]],m3[[i]]},{i,1,dim}];
Print[]
Print ["Ajust lineal m3 (en cm) vs d3 (en cm)"]
lmm3d3=LinearModelFit[m3d3,d,d];
af=lmm3d3["BestFitParameters"][[1]];
bf=lmm3d3["BestFitParameters"][[2]];
Print["m3 (cm) = ",af," + ",bf," d3 (cm)"]
Print ["(R^2) del ajust: ",lmm3d3["RSquared"]]


(* Representació m3 vs d3 *)

Print[]
Print [" m3 vs d3 (en cm)"]

Show[
ListPlot[m3d3, PlotStyle->Red,PlotRange->{{mind3,maxd3},{minm3,maxm3}}], Plot[lmm3d3[d], {d, mind3,maxd3},PlotRange->{{mind3,maxd3},{minm3,maxm3}}] ,Plot[x, {x, mind3,maxd3}, PlotRange->{{mind3,maxd3},{minm3,maxm3}},PlotStyle->{Black, Dashed}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d3","m3"}
]

(* Càlcul de diferències m3 estimat - m3 mesurat *)

resid =Table [{d3[[i]],lmm3d3["FitResiduals"][[i]]},{i,1,dim}];

Print[]
Print [" m3 estimat - m3 mesurat (en cm)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d3 (cm)","error estimació (cm)"},
PlotRange->{{mind3,maxd3},{-2,2}}
]

Print["Errors màxims i mínim :   ",Min[lmm3d3["FitResiduals"]]," cm  ", Max[lmm3d3["FitResiduals"]], " cm"]
Print["Error mitjà :   ",Mean[Abs[lmm3d3["FitResiduals"]]], " cm"]

(* Relació d3 / m3 *)

relm3d3=Table [{d3[[i]],100*d3[[i]]/m3[[i]]},{i,1,dim}];

d3mig=Mean[d3];
m3mig=Mean[m3];
quocm3d3=Mean[relm3d3][[2]];

Print[]
Print["Distància d3 mitjana :   ",d3mig, " cm"]
Print["Distància m3 mitjana :   ",N[m3mig], " cm"]
Print["d3/m3 mitjà :   ",quocm3d3," %" ]


(* Representació d3/m3 vs d3 *)

Print[]
Print ["Ajust lineal d3/m3 (en %) vs d3 (en cm)"]

lmrelm3d3=LinearModelFit[relm3d3,p,p];
af=lmrelm3d3["BestFitParameters"][[1]];
bf=lmrelm3d3["BestFitParameters"][[2]];
Print["d3/m3 (en %) = ",af," + ",bf," d3 (cm)"]
Print ["(R^2) del ajust: ",lmrelm3d3["RSquared"]]

Print[]
Print [" d3/m3 (en %) vs d3 (en cm)"]

Show[ListPlot[relm3d3, PlotStyle->Red], Plot[lmrelm3d3[p], {p, mind3,maxd3}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d3 (cm)","d3/m3 (%)"},PlotRange->{{mind3,maxd3},{110.,130.}}]

Comparant les amplades dels porcs obtingudes a partir del tractament d'imatges i les mesurades a partir de la canal es veu que les distancies (Subscript[d, 3])són aproximadament un 121% de les (Subscript[m, 3]). Aparentment aquesta diferència és major en els porcs més grans, encara que la dispersió de dades és considerable.

(* Correlació m5 vs. d5 *)

m5d5=Table [{d5[[i]],m5[[i]]},{i,1,dim}];
Print[]
Print ["Ajust lineal m5 (en cm) vs d5 (en cm)"]
lmm5d5=LinearModelFit[m5d5,d,d];
af=lmm5d5["BestFitParameters"][[1]];
bf=lmm5d5["BestFitParameters"][[2]];
Print["m5 (cm) = ",af," + ",bf," d5 (cm)"]
Print ["(R^2) del ajust: ",lmm5d5["RSquared"]]

(* Representació m5 vs d5 *)

Print[]
Print [" m5 vs d5 (en cm)"]

Show[
ListPlot[m5d5, PlotStyle->Red,PlotRange->{{mind5,maxd5},{minm5,maxm5}}], Plot[lmm5d5[d], {d, mind5,maxd5},PlotRange->{{mind5,maxd5},{minm5,maxm5}}] ,Plot[x, {x, mind5,maxd5}, PlotRange->{{mind5,maxd5},{minm5,maxm5}},PlotStyle->{Black, Dashed}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d5","m5"}
]

(* Càlcul de diferències m5 estimat - m5 mesurat *)

resid =Table [{d5[[i]],lmm5d5["FitResiduals"][[i]]},{i,1,dim}];

Print [" m5 estimat - m5 mesurat (en cm)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d5 (cm)","error estimació (cm)"},
PlotRange->{{mind5,maxd5},{-2,2}}
]

Print["Errors màxims i mínim :   ",Min[lmm5d5["FitResiduals"]]," cm   ", Max[lmm5d5["FitResiduals"]], " cm"]
Print["Error mitjà :   ",Mean[Abs[lmm5d5["FitResiduals"]]], " cm"]

(* Relació d5 / m5 *)

relm5d5=Table [{d5[[i]],100*d5[[i]]/m5[[i]]},{i,1,dim}];

d5mig=Mean[d5];
m5mig=Mean[m5];
quocm5d5=Mean[relm5d5][[2]];

Print[]
Print["Distància d5 mitjana :   ",d5mig, " cm"]
Print["Distància m5 mitjana :   ",N[m5mig], " cm"]
Print["d5/m5 mitjà :   ",quocm5d5," %" ]
Print[]

(* Representació d5/m5 vs d5 *)

Print[]
Print ["Ajust lineal d5/m5 (en %) vs d5 (en cm)"]

lmrelm5d5=LinearModelFit[relm5d5,p,p];
af=lmrelm5d5["BestFitParameters"][[1]];
bf=lmrelm5d5["BestFitParameters"][[2]];
Print["d5/m5 (en %) = ",af," + ",bf," d5 (cm)"]
Print ["(R^2) del ajust: ",lmrelm5d5["RSquared"]]

Print[]
Print [" d5/m5 (en %) vs d5 (en cm)"]

Show[ListPlot[relm5d5, PlotStyle->Red], Plot[lmrelm5d5[p], {p, mind5,maxd5}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d5 (cm)","d5/m5 (%)"},PlotRange->{{mind5,maxd5},{105.,125.}}]

Comparant les amplades dels porcs obtingudes a partir del tractament d'imatges i les mesurades a partir de la canal es veu que les distancies (Subscript[d, 5])són aproximadament un 112% de les (Subscript[m, 5]). En aquest cas aquesta diferència és major en els porcs més petits, encara que la dispersió de dades és considerable.

(* Correlació m6 vs. d6 *)

m6d6=Table [{d6[[i]],m6[[i]]},{i,1,dim}];

Print[]
Print ["Ajust lineal m6 (en cm) vs d6 (en cm)"]
lmm6d6=LinearModelFit[m6d6,d,d];
af=lmm5d5["BestFitParameters"][[1]];
bf=lmm5d5["BestFitParameters"][[2]];
Print["m5 (cm) = ",af," + ",bf," d5 (cm)"]
Print ["(R^2) del ajust: ",lmm5d5["RSquared"]]

(* Representació m6 vs d6 *)

Print[]
Print [" m6 vs d6 (en cm)"]

Show[
ListPlot[m6d6, PlotStyle->Red,PlotRange->{{mind6,maxd6},{minm6,maxm6}}], Plot[lmm6d6[d], {d, mind6,maxd6},PlotRange->{{mind6,maxd6},{minm6,maxm6}}] ,Plot[x, {x, mind6,maxd6}, PlotRange->{{mind6,maxd6},{minm6,maxm6}},PlotStyle->{Black, Dashed}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d6","m6"}
]

(* Càlcul de diferències m6 estimat - m6 mesurat *)

resid =Table [{d6[[i]],lmm6d6["FitResiduals"][[i]]},{i,1,dim}];

Print [" m6 estimat - m6 mesurat (en cm)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d6 (cm)","error estimació (cm)"},
PlotRange->{{mind6,maxd6},{-2,2}}
]

Print[]
Print["Errors màxims i mínim :   ",Min[lmm6d6["FitResiduals"]]," cm  ", Max[lmm6d6["FitResiduals"]], " cm"]
Print["Error mitjà :   ",Mean[Abs[lmm6d6["FitResiduals"]]], " cm"]


(* Relació d6 / m6 *)

relm6d6=Table [{d6[[i]],100*d6[[i]]/m6[[i]]},{i,1,dim}];

d6mig=Mean[d6];
m6mig=Mean[m6];
quocm6d6=Mean[relm6d6][[2]];

Print[]
Print["Distància d6 mitjana :   ",d6mig, " cm"]
Print["Distància m6 mitjana :   ",N[m6mig], " cm"]
Print["d6/m6 mitjà :   ",quocm6d6," %" ]


(* Representació d6/m6  vs d5 *)

Print[]
Print ["Ajust lineal d5/m5 (en %) vs d5 (en cm)"]

lmrelm6d6=LinearModelFit[relm6d6,p,p];
af=lmrelm6d6["BestFitParameters"][[1]];
bf=lmrelm6d6["BestFitParameters"][[2]];
Print["d6/m6 (en %) = ",af," + ",bf," d6 (cm)"]
Print ["(R^2) del ajust: ",lmrelm6d6["RSquared"]]


Print[]
Print [" d6/m6 (en %) vs d6 (en cm)"]

Show[ListPlot[relm5d5, PlotStyle->Red], Plot[lmrelm5d5[p], {p, mind5,maxd5}], Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d5 (cm)","d5/m5 (%)"},PlotRange->{{mind5,maxd5},{105.,125.}}]

Comparant les amplades dels porcs obtingudes a partir del tractament d'imatges i les mesurades a partir de la canal es veu que les distancies (Subscript[d, 6])són aproximadament un 107% de les (Subscript[m, 6]). En aquest cas aquesta diferència és major en els porcs més petits, encara que la dispersió de dades és considerable.

Anàlisi de correlació entre pes viu / distancies imatge (d)

(* Correlació pv vs. d1 *)

pvd1=Table [{d1[[i]],pviu[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal pv (en kg) vs d1 (en cm)"]
lmpvd1=LinearModelFit[pvd1,d,d];
af=lmpvd1["BestFitParameters"][[1]];
bf=lmpvd1["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," d1 (cm)"]
Print ["(R^2) del ajust: ",lmpvd1["RSquared"]]


(* Representació pv vs d1 *)

Print [" "]
Print [" pes viu (kg) vs d1 (en cm)"]

Show[
ListPlot[pvd1, PlotStyle->Red,PlotRange->{{mind1,maxd1},{minpv,maxpv}}], Plot[lmpvd1[d], {d, mind1,maxd1},PlotRange->{{mind1,maxd1},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d1(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{d1[[i]],lmpvd1["FitResiduals"][[i]]},{i,1,dim}];

Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d1 (cm)","error estimació pes viu (kg)"},
PlotRange->{{mind1,maxd1},{-20,20}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvd1["FitResiduals"]],"  kg   ", Max[lmpvd1["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvd1["FitResiduals"]]],"  kg"]

(* Càlcul de la densitat lineal (pv/d1 i de l'index de massa corporal pv/(d1^2) *)

Print [" "]
Print ["Pes viu mitjà pv  (en kg)"]
pviuav=Mean[pviu];
stdevpviu=StandardDeviation[pviu];
Print [pviuav," ± ",stdevpviu]

Print [" "]
Print ["Longitud mitjana d1  (en cm)"]
d1av=Mean[d1];
stdevd1=StandardDeviation[d1];
Print [d1av," ± ",stdevd1]

denlin=pviu/d1;
Print [" "]
Print ["Densitat lineal mitjana pv/d1 (en kg/cm)"]
denlinav=Mean[denlin];
stdevdenlin=StandardDeviation[denlin];
Print [denlinav," ± ",stdevdenlin]

bmi=pviu/((((d1/100)))^2);
Print [" "]
Print ["Index de massa corporal mitjà pv/(d1^2) (en kg/(m^2))"]
bmiav=Mean[bmi];
stdevbmi=StandardDeviation[bmi];
Print [bmiav," ± ",stdevbmi]

La correlació entre el pes viu li la llargada del porc (Subscript[d, 1 ])no és massa bona. Tot i que s'observa la tendència esperada d'un augment de pes amb la longitud del porc, no és massa clar que la correlació sigui una relació simplement lineal.

La longitud mitjana, el pes, la densitat lineal i l'index de massa corporal estan en bon acord amb els valors donats per a porcs de 177 dies de diferents races donades per Johnson i Nugent ( Z.B. Johnson, R.A. Nugent III, J. Anim. Sci. 2003, 81:1943-1949).

(* Correlació pv vs. d2 *)

pvd2=Table [{d2[[i]],pviu[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal pv (en kg) vs d2 (en cm)"]
lmpvd2=LinearModelFit[pvd2,d,d];
af=lmpvd2["BestFitParameters"][[1]];
bf=lmpvd2["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," d2 (cm)"]
Print ["(R^2) del ajust: ",lmpvd1["RSquared"]]


(* Representació pv vs d2 *)

Print [" "]
Print [" pes viu (kg) vs d2 (en cm)"]

Show[
ListPlot[pvd2, PlotStyle->Red,PlotRange->{{mind2,maxd2},{minpv,maxpv}}], Plot[lmpvd2[d], {d, mind2,maxd1},PlotRange->{{mind2,maxd2},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d2(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{d2[[i]],lmpvd2["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d2 (cm)","error estimació pes viu (kg)"},
PlotRange->{{mind2,maxd2},{-15,15}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvd2["FitResiduals"]],"  kg   ", Max[lmpvd2["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvd2["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. d3 *)

pvd3=Table [{d3[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs d3 (en cm)"]
lmpvd3=LinearModelFit[pvd3,d,d];
af=lmpvd3["BestFitParameters"][[1]];
bf=lmpvd3["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," d3 (cm)"]
Print ["(R^2) del ajust: ",lmpvd3["RSquared"]]

(* Representació pv vs d3 *)
Print [" "]
Print [" pes viu (kg) vs d3 (en cm)"]

Show[
ListPlot[pvd3, PlotStyle->Red,PlotRange->{{mind3,maxd3},{minpv,maxpv}}], Plot[lmpvd3[d], {d, mind3,maxd3},PlotRange->{{mind3,maxd3},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d3(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{d3[[i]],lmpvd3["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d3 (cm)","error estimació pes viu (kg)"},
PlotRange->{{mind3,maxd3},{-12,12}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvd3["FitResiduals"]],"  kg   ", Max[lmpvd3["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvd3["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. d4 *)

pvd4=Table [{d4[[i]],pviu[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal pv (en kg) vs d4 (en cm)"]
lmpvd4=LinearModelFit[pvd4,d,d];
af=lmpvd4["BestFitParameters"][[1]];
bf=lmpvd4["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," d4 (cm)"]
Print ["(R^2) del ajust: ",lmpvd4["RSquared"]]

(* Representació pv vs d4 *)

Print [" "]
Print [" pes viu (kg) vs d4 (en cm)"]

Show[
ListPlot[pvd4, PlotStyle->Red,PlotRange->{{mind4,maxd4},{minpv,maxpv}}], Plot[lmpvd4[d], {d, mind4,maxd4},PlotRange->{{mind4,maxd4},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d4(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{d4[[i]],lmpvd4["FitResiduals"][[i]]},{i,1,dim}];

Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d4 (cm)","error estimació pes viu (kg)"},
PlotRange->{{mind4,maxd4},{-10,10}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvd4["FitResiduals"]]," kg  ", Max[lmpvd4["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvd4["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. d5 *)

pvd5=Table [{d5[[i]],pviu[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal pv (en kg) vs d5 (en cm)"]
lmpvd5=LinearModelFit[pvd5,d,d];
af=lmpvd5["BestFitParameters"][[1]];
bf=lmpvd5["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," d5 (cm)"]
Print ["(R^2) del ajust: ",lmpvd5["RSquared"]]


(* Representació pv vs d5 *)
Print [" "]
Print [" pes viu (kg) vs d5 (en cm)"]

Show[
ListPlot[pvd5, PlotStyle->Red,PlotRange->{{mind5,maxd5},{minpv,maxpv}}], Plot[lmpvd5[d], {d, mind5,maxd5},PlotRange->{{mind5,maxd5},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d5(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{d5[[i]],lmpvd1["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d5 (cm)","error estimació pes viu (kg)"},
PlotRange->{{mind5,maxd5},{-10,10}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvd5["FitResiduals"]]," kg    ", Max[lmpvd5["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvd5["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. d6 *)

pvd6=Table [{d6[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs d6 (en cm)"]
lmpvd6=LinearModelFit[pvd6,d,d];
af=lmpvd6["BestFitParameters"][[1]];
bf=lmpvd6["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," d6 (cm)"]
Print ["(R^2) del ajust: ",lmpvd6["RSquared"]]

(* Representació pv vs d6 *)
Print [" "]
Print [" pes viu (kg) vs d6 (en cm)"]

Show[
ListPlot[pvd6, PlotStyle->Red,PlotRange->{{mind6,maxd6},{minpv,maxpv}}], Plot[lmpvd6[d], {d, mind6,maxd6},PlotRange->{{mind6,maxd6},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"d6(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{d6[[i]],lmpvd6["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"d6 (cm)","error estimació pes viu (kg)"},
PlotRange->{{mind6,maxd6},{-12,12}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvd6["FitResiduals"]]," kg  ", Max[lmpvd6["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvd6["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. amplada mitjana *)

dam = Mean[{d2,d3,d4,d5,d6}];
mindam=Min[dam]-0.05Min[dam]; 
maxdam=Max[dam]+0.05Max[dam];

pvdam=Table [{dam[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs amplada mitjana (en cm)"]
lmpvdam=LinearModelFit[pvdam,d,d];
af=lmpvdam["BestFitParameters"][[1]];
bf=lmpvdam["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," amplada mitjana (cm)"]
Print ["(R^2) del ajust: ",lmpvdam["RSquared"]]


(* Representació pv vs dam *)
Print [" "]
Print [" pes viu (kg) vs dam (en cm)"]

Show[
ListPlot[pvdam, PlotStyle->Red,PlotRange->{{mindam,maxdam},{minpv,maxpv}}], Plot[lmpvdam[d], {d, mindam,maxdam},PlotRange->{{mindam,maxdam},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"amplada mitjana(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{dam[[i]],lmpvdam["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"amplada mitjana (cm)","error estimació pes viu (kg)"},
PlotRange->{{mindam,maxdam},{-10,10}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvdam["FitResiduals"]]," kg    ", Max[lmpvdam["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvdam["FitResiduals"]]],"  kg"]
Print [" "]

En general la correlació entre el pes del porc i qualsevol de les amplades  (Subscript[d, 2]), ..., (Subscript[d, 6])no és massa bona en cap cas (valors d' (R^2) entre 0.27 i 0.57). L'error mitjà en els ajustos està al voltant dels 5 kg (un 5% tenin en compte del valor de la mitjana al voltant dels 100 kg) que no és massa dolent, però els errors màxims es situen al voltant dels 10 kg tant per excés com per defecte.
La correlació amb l'amplada mitjana és, però, sensiblement millor amb un valor  d' (R^2) de 0.70, un error mitjà de 3.6 kg i uns errors màxims (per excés i per defecte) inferiors als 7 kg. La correlació és millor que la que s'obté amb la longitud, però de cara a aplicacions pràctiques és més complexa ja que implica la mesura simultània de 5 dades.

Anàlisi de correlació entre pes viu / distancies canal (m)

(* Correlació pv vs. m1 *)

pvm1=Table [{m1[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs m1 (en cm)"]
lmpvm1=LinearModelFit[pvm1,d,d];
af=lmpvm1["BestFitParameters"][[1]];
bf=lmpvm1["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," m1 (cm)"]
Print ["(R^2) del ajust: ",lmpvm1["RSquared"]]


(* Representació pv vs m1 *)
Print [" "]
Print [" pes viu (kg) vs m1 (en cm)"]

Show[
ListPlot[pvm1, PlotStyle->Red,PlotRange->{{minm1,maxm1},{minpv,maxpv}}], Plot[lmpvm1[d], {d, minm1,maxm1},PlotRange->{{minm1,maxm1},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"m1(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{m1[[i]],lmpvm1["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"m1 (cm)","error estimació pes viu (kg)"},
PlotRange->{{minm1,maxm1},{-25,25}}
]

Print["Errors màxims i mínim :   ",Min[lmpvm1["FitResiduals"]],"  kg   ", Max[lmpvm1["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvm1["FitResiduals"]]],"  kg"]

(* Càlcul de la densitat lineal (pv/m1 i de l'index de massa corporal pv/(m1^2) *)

Print [" "]
Print ["Pes viu mitjà pv  (en kg)"]
pviuav=Mean[pviu];
stdevpviu=StandardDeviation[pviu];
Print [pviuav," ± ",stdevpviu]

Print [" "]
Print ["Longitud mitjana m1  (en cm)"]
m1av=Mean[m1];
stdevm1=StandardDeviation[m1];
Print [N[m1av]," ± ",N[stdevm1]]

denlinm=pviu/m1;
Print [" "]
Print ["Densitat lineal mitjana pv/m1 (en kg/cm)"]
denlinmav=Mean[denlinm];
stdevdenlinm=StandardDeviation[denlinm];
Print [denlinmav," ± ",stdevdenlinm]

bmim=pviu/((((m1/100)))^2);
Print [" "]
Print ["Index de massa corporal mitjà pv/(m1^2) (en kg/(m^2))"]
bmimav=Mean[bmim];
stdevbmim=StandardDeviation[bmim];
Print [bmimav," ± ",stdevbmim]
Print [" "]

La correlació entre el pes viu i la llargada del porc (Subscript[m, 1 ])és pràcticament igual que la que s'ha trobat amb (Subscript[d, 1 ])(valors d'(R^2)al voltant de 0.55). En ser les mesures (Subscript[m, 1 ])una mica més grans que (Subscript[d, 1 ]) la densitat lineal i l'índex de massa corporal calculats amb (Subscript[m, 1 ])són lleugerament menors.

(* Correlació pv vs. m2 *)

pvm2=Table [{m2[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs m2 (en cm)"]
lmpvm2=LinearModelFit[pvm2,d,d];
af=lmpvm2["BestFitParameters"][[1]];
bf=lmpvm2["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," m2 (cm)"]
Print ["(R^2) del ajust: ",lmpvm2["RSquared"]]


(* Representació pv vs m2 *)
Print [" "]
Print [" pes viu (kg) vs m2 (en cm)"]

Show[
ListPlot[pvm2, PlotStyle->Red,PlotRange->{{minm2,maxm2},{minpv,maxpv}}], Plot[lmpvm2[d], {d, minm2,maxm2},PlotRange->{{minm2,maxm2},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"m2(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{m2[[i]],lmpvm2["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"m2 (cm)","error estimació pes viu (kg)"},
PlotRange->{{minm2,maxm2},{-18,18}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvm2["FitResiduals"]],"  kg   ", Max[lmpvm2["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvm2["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. m3 *)

pvm3=Table [{m3[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs m3 (en cm)"]
lmpvm3=LinearModelFit[pvm3,d,d];
af=lmpvm3["BestFitParameters"][[1]];
bf=lmpvm3["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," m3 (cm)"]
Print ["(R^2) del ajust: ",lmpvm3["RSquared"]]


(* Representació pv vs m3 *)
Print [" "]
Print [" pes viu (kg) vs m3 (en cm)"]

Show[
ListPlot[pvm3, PlotStyle->Red,PlotRange->{{minm3,maxm3},{minpv,maxpv}}], Plot[lmpvm3[d], {d, minm3,maxm3},PlotRange->{{minm3,maxm3},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"m3(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{m3[[i]],lmpvm3["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"m3 (cm)","error estimació pes viu (kg)"},
PlotRange->{{minm3,maxm3},{-25,25}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvm3["FitResiduals"]],"  kg   ", Max[lmpvm3["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvm3["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. m5 *)

pvm5=Table [{m5[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs m5 (en cm)"]
lmpvm5=LinearModelFit[pvm5,d,d];
af=lmpvm5["BestFitParameters"][[1]];
bf=lmpvm5["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," m5 (cm)"]
Print ["(R^2) del ajust: ",lmpvm5["RSquared"]]

(* Representació pv vs m3 *)
Print [" "]
Print [" pes viu (kg) vs m5 (en cm)"]

Show[
ListPlot[pvm5, PlotStyle->Red,PlotRange->{{minm5,maxm5},{minpv,maxpv}}], Plot[lmpvm5[d], {d, minm5,maxm5},PlotRange->{{minm5,maxm5},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"m5(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{m5[[i]],lmpvm5["FitResiduals"][[i]]},{i,1,dim}];

Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"m5 (cm)","error estimació pes viu (kg)"},
PlotRange->{{minm5,maxm5},{-15,15}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvm5["FitResiduals"]],"  kg   ", Max[lmpvm5["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvm5["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. m6 *)

pvm6=Table [{m6[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs m6 (en cm)"]
lmpvm6=LinearModelFit[pvm6,d,d];
af=lmpvm6["BestFitParameters"][[1]];
bf=lmpvm6["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," m6(cm)"]
Print ["(R^2) del ajust: ",lmpvm6["RSquared"]]


(* Representació pv vs m6 *)
Print [" "]
Print [" pes viu (kg) vs m6 (en cm)"]

Show[
ListPlot[pvm6, PlotStyle->Red,PlotRange->{{minm6,maxm6},{minpv,maxpv}}], Plot[lmpvm6[d], {d, minm6,maxm6},PlotRange->{{minm6,maxm6},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"m6(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{m6[[i]],lmpvm6["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"m6 (cm)","error estimació pes viu (kg)"},
PlotRange->{{minm6,maxm6},{-15,15}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvm6["FitResiduals"]],"  kg   ", Max[lmpvm6["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvm6["FitResiduals"]]],"  kg"]
Print [" "]

(* Correlació pv vs. amplada mitjana mesurada m *)

mam = Mean[{m2,m3,m5,m6}] ;
minmam=Min[mam]-0.05Min[mam]; 
maxmam=Max[mam]+0.05Max[mam];

pvmam=Table [{mam[[i]],pviu[[i]]},{i,1,dim}];
Print [" "]
Print ["Ajust lineal pv (en kg) vs amplada mitjana m (en cm)"]
lmpvmam=LinearModelFit[pvmam,d,d];
af=lmpvmam["BestFitParameters"][[1]];
bf=lmpvmam["BestFitParameters"][[2]];
Print["Pes viu(kg) = ",af," + ",bf," amplada mitjada canal (cm)"]
Print ["(R^2) del ajust: ",lmpvmam["RSquared"]]


(* Representació pv vs mam *)
Print [" "]
Print [" pes viu (kg) vs mam (en cm)"]

Show[
ListPlot[pvmam, PlotStyle->Red,PlotRange->{{minmam,maxmam},{minpv,maxpv}}], Plot[lmpvmam[d], {d, minmam,maxmam},PlotRange->{{minmam,maxmam},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"amplada mitjana m(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{mam[[i]],lmpvmam["FitResiduals"][[i]]},{i,1,dim}];
Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"amplada mitjana m (cm)","error estimació pes viu (kg)"},
PlotRange->{{minmam,maxmam},{-17,16}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvmam["FitResiduals"]],"  kg   ", Max[lmpvmam["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvmam["FitResiduals"]]],"  kg"]
Print [" "]

En general la correlació entre el pes del porc i qualsevol de les amplades (Subscript[m, 2]), ..., (Subscript[m, 6]) és pitjor que la s'obtè a partir de les mesures a partir de les imatges (valors d' (R^2) entre 0.09 i 0.31). L'error mitjà en els ajustos està al voltant dels 5 kg (un 5% tenin en compte del valor de la mitjana al voltant dels 100 kg) que no és massa dolent, però els errors màxims es situen al voltant dels 13 kg tant per excés com per defecte, un valor superior al que es troba per a les distàncies obtingudes a partir de les imatges. La conclusió general és que la manca de correlació entre el pes i les amplades no es pot associar a errors en el procés d'estimació de les distàncies a partir de les imatges sinó que és inherent a la naturalesa de les variables ( pes vs amplada) que s'intenten correlacionar. En el cas de les mesures sobre la canal la correlació entre el pes viu i l'amplada mitjana no és gaire millor que la trobada per a les amplades individuals.

La conclusió general és que tant per a les dades estimades a partir de fotografies com  partir de mesures sobre la canal la millor correlació amb el pes es troba amb la longitud del porc, tot i que la correlació és força pobra (valors d' (R^2) al voltant de 0.55 independentment del mètode usat per a la determinació de les distàncies).

Hi ha correlació entre les mesures?

L'experiència mostra que és relativament fàcil estimar amplades a partir de les fotografies i, en canvi, l'estimació de la longitud és més complicada ja que per un costat no és senzill decidir el punt del clatell a partir d'on es mesura la longitud del cos del porc descartant el cap i per altre, degut a l'arquejament de l'esquena, (Subscript[d, 1]) sol ser força més curta que (Subscript[m, 1]). Si la longitud del porc estés correlacionada amb l'amplada, llavors seria factible poder estimar les dimensions del porc a partir d'una única mesura, una amplada, representativa de l'amplada mitjana.

(* Correlació entre la llargada i l'amplada mitjana a partir de fotografies*)

dam = Mean[{d2,d3,d4,d5,d6}];
mindam=Min[dam]-0.05Min[dam]; 
maxdam=Max[dam]+0.05Max[dam];

damd1=Table [{dam[[i]],d1[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal d1 (en cm) vs amplada mitjana (en cm)"]
lmdamd1=LinearModelFit[damd1,d,d];
af=lmdamd1["BestFitParameters"][[1]];
bf=lmdamd1["BestFitParameters"][[2]];
Print["amplada mitjana (cm) = ",af," + ",bf," d1 (cm)"]
Print ["(R^2) del ajust: ",lmdamd1["RSquared"]]


(* Representació amplada mitjana vs d1 *)

Print [" "]
Print [" amplada mitjana vs longitud (en cm) a partir de fotografies en viu"]

Show[ListPlot[damd1, PlotStyle->Red,PlotRange->{{mindam,maxdam},{mind1,maxd1}}], Plot[lmdamd1[d], {d, mindam,maxdam},PlotRange->{{mindam,maxdam},{mind1,maxd1}}] , 
Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"amplada mitjana (cm)","d1 (cm)"}]



(* Correlació entre la llargada i l'amplada mitjana a partir de mesures*)

mam = Mean[{m2,m3,m5,m6}];
minmam=Min[mam]-0.05Min[mam]; 
maxmam=Max[mam]+0.05Max[mam];

mamm1=Table [{mam[[i]],m1[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal m1 (en cm) vs amplada mitjana (en cm)"]
lmmamm1=LinearModelFit[mamm1,d,d];
af=lmmamm1["BestFitParameters"][[1]];
bf=lmmamm1["BestFitParameters"][[2]];
Print["amplada mitjana canal (cm) = ",af," + ",bf," m1 (cm)"]
Print ["(R^2) del ajust: ",lmmamm1["RSquared"]]


(* Representació m1 vs amplada mitjana m *)

Print [" "]
Print [" amplada mitjana vs longitud (en cm)a partir de mesures en canal"]

Show[ListPlot[mamm1, PlotStyle->Red,PlotRange->{{minmam,maxmam},{minm1,maxm1}}], Plot[lmmamm1[d], {d, minmam,maxmam},PlotRange->{{minmam,maxmam},{minm1,maxm1}}] , 
Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"amplada mitjana (cm)","m1 (cm)"}]

(* Càlcul de diferències longitud estimada - longitud mesurada *)

resid =Table [lmdamd1["FitResiduals"][[i]],{i,1,dim}];
resim =Table [lmmamm1["FitResiduals"][[i]],{i,1,dim}];

Print [" "]
Print [" longitud estimada - longitud mesurada (en cm)"]

Show[
ListPlot[resid, Filling->Axis],
ListPlot[resim, Filling->Axis, PlotStyle->Red], 
Frame->True,
Axes->{True,False},
FrameLabel->{"n. porc","error en longitud (cm)"},
PlotRange->{-16,16}
]

Print [" "]
Print["Dades a partir de fotografies"]
Print["Errors màxims i mínim :   ",Min[lmdamd1["FitResiduals"]],"  cm   ", Max[lmdamd1["FitResiduals"]]," cm"]
Print["Error mitjà :   ",Mean[Abs[lmdamd1["FitResiduals"]]]," cm"]

Print[" "]
Print["Dades a partir de mesures"]
Print["Errors màxims i mínim :   ",Min[lmmamm1["FitResiduals"]],"  cm   ", Max[lmmamm1["FitResiduals"]]," cm"]
Print["Error mitjà :   ",Mean[Abs[lmmamm1["FitResiduals"]]]," cm"]
Print [" "]

No es troben bones correlacions entre la longitud i l'amplada mitjana, ja sigui usant dades estimades a partir de fotografies o dades mesurades sobre la canal.

(* Correlació entre l'amplada a l'espatlla (d2) i l'amplada al maluc (d6) a partir de fotografies*)

d2d6=Table [{d2[[i]],d6[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal maluc d5 (en cm) vs espatlla d2 (en cm)"]
lmd2d6=LinearModelFit[d2d6,d,d];
af=lmd2d6["BestFitParameters"][[1]];
bf=lmd2d6["BestFitParameters"][[2]];
Print["d6 (cm) = ",af," + ",bf," d2 (cm)"]
Print ["(R^2) del ajust: ",lmd2d6["RSquared"]]


(* Representació d6 vs d2 *)

Print [" "]
Print [" amplada maluc vs amplada espatlla (en cm) a partir de fotografies en viu"]

Show[ListPlot[d2d6, PlotStyle->Red,PlotRange->{{mind2,maxd2},{mind6,maxd6}}], Plot[lmd2d6[d], {d, mind2,maxd2},PlotRange->{{mind2,maxd2},{mind6,maxd6}}] , 
Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"amplada espatlla (cm)","amplada maluc (cm)"}]

(* Correlació entre l'amplada a l'espatlla (m2) i l'amplada al maluc (m6)  a partir de mesures*)

m2m6=Table [{m2[[i]],m6[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal maluc m6 (en cm) vs espatlla m2 (en cm)"]
lmm2m6=LinearModelFit[m2m6,d,d];
af=lmm2m6["BestFitParameters"][[1]];
bf=lmm2m6["BestFitParameters"][[2]];
Print["m6 (cm) = ",af," + ",bf," m2 (cm)"]
Print ["(R^2) del ajust: ",lmm2m6["RSquared"]]


(* Representació m6 vs m2 *)

Print [" "]
Print [" amplada maluc vs amplada espatlla  (en cm) a partir de fotografies en viu"]

Show[ListPlot[m2m6, PlotStyle->Red,PlotRange->{{minm2,maxm2},{minm6,maxm6}}], Plot[lmm2m6[d], {d, minm2,maxm2},PlotRange->{{minm2,maxm2},{minm6,maxm6}}] , 
Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"amplada espatlla (cm)","amplada maluc (cm)"}]

(* Càlcul de diferències longitud estimada - longitud mesurada *)

resid =Table [lmd2d6["FitResiduals"][[i]],{i,1,dim}];
resim =Table [lmm2m6["FitResiduals"][[i]],{i,1,dim}];

Print [" longitud estimada - longitud mesurada (en cm)"]

Show[
ListPlot[resid, Filling->Axis],
ListPlot[resim, Filling->Axis, PlotStyle->Red], 
Frame->True,
Axes->{True,False},
FrameLabel->{"n. porc","error en longitud (cm)"},
PlotRange->{-4,4}
]

Print [" "]
Print["Dades a partir de fotografies"]
Print["Errors màxims i mínim :   ",Min[lmd2d6["FitResiduals"]],"  cm   ", Max[lmd2d6["FitResiduals"]],"  cm"]
Print["Error mitjà :   ",Mean[Abs[lmd2d6["FitResiduals"]]],"  cm"]

Print[" "]
Print["Dades a partir de mesures"]
Print["Errors màxims i mínim :   ",Min[lmm2m6["FitResiduals"]],"  cm   ", Max[lmm2m6["FitResiduals"]],"  cm"]
Print["Error mitjà :   ",Mean[Abs[lmm2m6["FitResiduals"]]],"  cm"]
Print [" "]

No es troben bones correlacions entre l'amplada mesurada a l'espatlla (Subscript[d, 2]) i la mesurada a l'alçada del maluc (Subscript[d, 6]), ja sigui usant dades estimades a partir de fotografies o dades mesurades sobre la canal.

Model de porc esfèric

Hem vist que la correlació entre el pes dels porcs i les diferents distàncies ja siguin longitud o diferents amplades no és massa satisfactòria. Aquesta constatació no hauria de ser sorprenent. L'estimació del pes del porc a partir de mesures de distàncies sobre una imatge es basa en la suposició de que podem considerar la densitat mitjana ϱ del porc constant i independent de la mida del porc i, per tant, el que hauriem de fer en realitat és intentar estimar el volum d'un porc a partir de mesures de distàncies:
m = ϱ V((Subscript[d, 1])... (Subscript[d, 6]))
Aixó presuposa partir d'un model per al volum. En qualsevol model necessitarem com a mínim tres distàncies en direccions ortogonals per poder estimar el volum i, per tant, no té massa sentit físic intentar correlacionar el pes amb una única distància i d'aquí es dedueix que les correlacions que hem trobat fins ara no siguin massa bones.
El model més senzill per al volum que podem suposar és el d'un porc perfectament esfèric on tindriem que la massa del porc hauria de ser proporcional al cub del radi de l'esfera:

                                                                                   

                                                                                                     m = ϱ (4/3)ℼ (r^3)
Malgrat que aquest model no sembla massa escaient ja que tenim una distància, (Subscript[d, 1]), apròximadament el triple de llarga que les altres distàncies (amplades) i de que només disposem (de moment) de distàncies en un pla (tenim llargada i amplada, falten dades relatives a l'alçada del porc que són força més difícils d'obtenir a partir de les fotografies que es van prendre), podem intentar una aproximació esfèrica considerant la distància mitjana com a diametre de l'esfera.
Abans farem una prova, intentant ajustar el pes viu en funció del radi mitjà de l'esfera, obtingut fent la mitjana de les distàncies (Subscript[d, 1]) a (Subscript[d, 6]).
Com que hem comprovat que la bondat dels ajustos era independent de si s'usaven distàncies estimades a partir d'imatges o distàncies mesurades sobre la canal, ens limitarem a fer les anàlisis usant les distàncies estimades a partir de fotografies.

(* Correlació pes viu vs radi mitja *)

rm = 0.5*Mean[{d1,d2,d3,d4,d5,d6}] ;
minrm=Min[rm]-0.1Min[rm]; 
maxrm=Max[rm]+0.1Max[rm];

pvrm=Table [{rm[[i]],pviu[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal pv (en kg) vs radi mitja = 1/2 * mitja de (Subscript[d, 1]) ... (Subscript[d, 6]) (en cm)"]
lmpvrm=LinearModelFit[pvrm,r,r];
aesf=lmpvrm["BestFitParameters"][[1]];
besf=lmpvrm["BestFitParameters"][[2]];
Print["Pes viu (kg) = ",aesf," + ",besf," (Subscript[r, esf]) (cm)"]
Print ["(R^2) del ajust: ",lmpvrm["RSquared"]]

(* Representació pv vs radi mitja d *)

Print [" "]
Print [" pes viu (kg) vs (Subscript[r, esf]) (en cm)"]

Show[
ListPlot[pvrm, PlotStyle->Red,PlotRange->{{minrm,maxrm},{minpv,maxpv}}], Plot[lmpvrm[d], {d, minrm,maxrm},PlotRange->{{minrm,maxrm},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"radi mitjà(cm)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{rm[[i]],lmpvrm["FitResiduals"][[i]]},{i,1,dim}];

Print [" "]
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"radi mitjà (cm)","error estimació pes viu (kg)"},
PlotRange->{{minrm+1,maxrm-1},{-7,7}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvrm["FitResiduals"]],"  kg   ", Max[lmpvrm["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvrm["FitResiduals"]]],"  kg"]
Print [" "]

Tot i ser un ajust que no és dimensionalment correcte, la inclusió de la longitud (Subscript[d, 1])en el càlcul del radi mitjà permet millorar sensiblement l'estimació del pes (valor d' (R^2) de 0.84) respecte del que s'obtenia usant la longitud (valor d' (R^2) de 0.55) o l'amplada mitjana (valor d' (R^2) de 0.70). L'error mitjà baixa als 2.5 kg (4.0 i 3.6 kg per a estimacions a partir de la longitud i l'amplada mitjana, respectivament) i els errors màxims es situen al voltant dels 6-7 kg tant per excés com per defecte.

(* Correlació pes viu vs volum de l'esfera (en L) amb radi mitjà *)

ve=(1/1000)((4π)/3)(rm^3);
veav=Mean[ve];

Print [" "]
Print [" Volum mitjà de l'esfera (en L) ", veav]
Print []

minve=(Min[ve]-0.1Min[ve]); 
maxve=(Max[ve]+0.1Max[ve]);


pvve=Table [{ve[[i]],pviu[[i]]},{i,1,dim}];

Print [" "]
Print ["Ajust lineal pv (en kg) vs volum esfera (en L)"]
lmpvve=LinearModelFit[pvve,v,v];
avesf=lmpvve["BestFitParameters"][[1]];
bvesf=lmpvve["BestFitParameters"][[2]];
Print["Pes viu (kg) = ",avesf," + ",bvesf," (Subscript[V, esf]) (L)"]
Print ["(R^2) del ajust: ",lmpvve["RSquared"]]


(* Representació pv vs volum esfera *)

Print [" "]
Print [" pes viu (kg) vs volum esfera de radi mitja (en L)"]

Show[
ListPlot[pvve, PlotStyle->Red,PlotRange->{{minve,maxve},{minpv,maxpv}}], Plot[lmpvve[v], {v, minve,maxve},PlotRange->{{minve,maxve},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"volum esfera (L)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{ve[[i]],lmpvve["FitResiduals"][[i]]},{i,1,dim}];

Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum esfera (L)","error estimació pes viu (kg)"},
PlotRange->{{minve,maxve},{-12,12}}
]
Print [" "]
Print["Errors màxims i mínim :   ",Min[lmpvve["FitResiduals"]],"  kg   ", Max[lmpvve["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvve["FitResiduals"]]],"  kg"]
Print [" "]

(* calcul de la densitat en kg/L *)

rho = pviu/ve;
rhot =Table [{ve[[i]],rho[[i]]},{i,1,dim}];

Print []
Print [" Densitat(en kg/L) calculada a partir de pes viu / volum esfera"]

rhoav=Mean[rho];
stdevrho=StandardDeviation[rho];


rhop={{minve,rhoav},{maxve,rhoav}};

Show[
ListPlot[rhot, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum esfera (L)","densitat (kg/L)"},
PlotRange->{{minve,maxve},{2.2,2.8}}
],
 ListLinePlot[rhop,PlotStyle->{Black, Dashed}]
]
 
Print []
Print [" Densitat mitjana (en kg/L): ", rhoav," ± ",stdevrho]
Print []

En aquest cas usar un model dimensionalment correcte no aporta cap millora respecte a considerar la correlació amb el valor del radi mitjà (valor d' (R^2) de 0.84 en tots dos casos). El càlcul de la densitat mitjana dóna un valor massa elevat, d'uns 2.5 kg/L, cosa que no hauria de ser sorprenent ja que en estimar el volum del proc usem un radi mitjà en el qual es fa la mitja de la longitud amb cinc amplades donant lloc a un valor del radi i per tant del volum de l'esfera massa petit.

Model de porc cilindric

Tot i donar una bona correlació entre pes i volum, l'aproximació d'un porc esfèric amb un volum corresponent a l'esfera de radi mitjà és molt grollera i dóna un volum massa petit per als porcs (al voltant dels 45 L) que tenint en compte el pes real, dóna una densitat massa elevada (uns 2.5 kg/L). Sembla  doncs que el model podria millorar tractant per separat la longitud del porc i les mesures de l'amplada. En aquest cas considerem el volum d'un cilindre d'alçada (Subscript[d, 1])i com a radi la meitat de la mitjana de les amplades (Subscript[r, m]) =(1/2)(Subscript[d, m]):

                                                                                
                    
                                                                                                       V = (Subscript[d, 1])ℼ (Subscript[r, m]^2)

(* Correlació pes viu vs volum del cilindre (en L) amb radi igual a amplada mitjana *)

rcm = 0.5*Mean[{d2,d3,d4,d5,d6}];

vc=0.001*d1*π*(rcm^2);

minvc=(Min[vc]-0.1Min[vc]); 
maxvc=(Max[vc]+0.1Max[vc]);

vcav=Mean[vc];

Print []
Print [" Volum mitjà del cilindre(en L) ", vcav]
Print []

pvvc=Table [{vc[[i]],pviu[[i]]},{i,1,dim}];

Print []
Print ["Ajust lineal pv (en kg) vs volum cilindre (en L)"]
lmpvvc=LinearModelFit[pvvc,v,v];
avcil=lmpvvc["BestFitParameters"][[1]];
bvcil=lmpvvc["BestFitParameters"][[2]];
Print["Pes viu (kg) = ",avcil," + ",bvcil," (Subscript[V, cil]) (L)"]
Print ["(R^2) del ajust: ",lmpvvc["RSquared"]]

(* Representació pv vs volum poliedre *)

Print []
Print [" pes viu (kg) vs volum cilindre (en L)"]

Show[
ListPlot[pvvc, PlotStyle->Red,PlotRange->{{minvc,maxvc},{minpv,maxpv}}], Plot[lmpvvc[v], {v, minvc,maxvc},PlotRange->{{minvc,maxvc},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"volum cilindre (L)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{vc[[i]],lmpvvc["FitResiduals"][[i]]},{i,1,dim}];

Print []
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum cilindre (L)","error estimació pes viu (kg)"},
PlotRange->{{minvc,maxvc},{-12,12}}
]

Print []
Print["Errors màxims i mínim :   ",Min[lmpvvc["FitResiduals"]],"  kg   ", Max[lmpvvc["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvvc["FitResiduals"]]],"  kg"]

(* calcul de la densitat en kg/L *)

rhoc = pviu/vc;
rhotc =Table [{vc[[i]],rhoc[[i]]},{i,1,dim}];

Print []
Print []
Print [" Densitat(en kg/L) calculada a partir de pes viu / volum cilindre"]

rhocav=Mean[rhoc];
stdevrhoc=StandardDeviation[rhoc];

rhocp={{minvc,rhocav},{maxvc,rhocav}};

Show[
ListPlot[rhotc, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"Volum cilindre (L)","densitat (kg/L)"},
PlotRange->{{minvc,maxvc},{1.15,1.45}}
],
 ListLinePlot[rhocp,PlotStyle->{Black, Dashed}]
]

Print []
Print [" Densitat mitjana (en kg/L): ", rhocav," ± ",stdevrhoc]
Print []

La qualitat de l'ajust amb un model de porc cilíndric és pràcticament igual que amb el porc esfèric (valor d'(R^2) de 0.83). El càlcul de la densitat mitjana és pero millor donant uns 1.3 kg/L valor més proper al de l'aigua al qual suposo que s'hauria d'acostar el d'un porc ja que suposo que serà similar al valor de la densitat en humans (aprox. 1.062 kg/L).

Model de porc amb secció polièdrica

Un model lleugerament més sofisticat és considerar el volum del porc com el sòlid de revolució generat per la secció polièdrica que es mostra a continuació:



La partició en fraccions de la longitud ((Subscript[d, 1])) del porc s'ha obtingut a partir d'una fotografia per a la qual es van mesurar els factors següents: 0.211, 0.096, 0.2, 0.178, 0.119 i 0.196 que s'han aproximat per 0.2, 0.1, 0.2, 0.2, 0.1 i 0.2, respectivament.
L'area d'aquesta secció és:
  A = (1/2)0.2(Subscript[d, 1])(Subscript[d, 2])+ 0.1(Subscript[d, 1])(((Subscript[d, 2])+(Subscript[d, 3]))/2)+ 0.2(Subscript[d, 1])(((Subscript[d, 3])+(Subscript[d, 4]))/2)+ 0.2(Subscript[d, 1])(((Subscript[d, 4])+(Subscript[d, 5]))/2)+ 0.1(Subscript[d, 1])(((Subscript[d, 5])+(Subscript[d, 6]))/2)+(1/2)0.2(Subscript[d, 1])(Subscript[d, 6])
 Per calcular el volum prendrem, de manera aproximada, com a radi la meitat de l'amplada mitjana
  V = A ℼ ((Subscript[d, m])/2)

(* Correlació pes viu vs volum del poliedre (en L) amb radi igual a amplada mitjana *)


rpm = 0.5*Mean[{d2,d3,d4,d5,d6}];

area= ((0.2d1*d2)/2)+0.1d1((d2+d3)/2)+0.2d1((d3+d4)/2)+0.2d1((d4+d5)/2)+0.1d1((d5+d6)/2)+((0.2d1*d6)/2);

vs=0.001*π*area*rpm ;

minvs=(Min[vs]-0.1Min[vs]); 
maxvs=(Max[vs]+0.1Max[vs]);

pvvs=Table [{vs[[i]],pviu[[i]]},{i,1,dim}];

vsav=Mean[vs];

Print []
Print [" Volum mitjà del poliedre (en L) ", vsav]
Print []


pvvs=Table [{vs[[i]],pviu[[i]]},{i,1,dim}];

Print []
Print ["Ajust lineal pv (en kg) vs volum poliedre (en L)"]
lmpvvs=LinearModelFit[pvvs,v,v];
avpol=lmpvvs["BestFitParameters"][[1]];
bvpol=lmpvvs["BestFitParameters"][[2]];
Print["Pes viu (kg) = ",avpol," + ",bvpol," (Subscript[V, pol]) (L)"]
Print ["(R^2) del ajust: ",lmpvvs["RSquared"]]


(* Representació pv vs volum poliedre *)

Print []
Print [" pes viu (kg) vs volum ploiedre (en L)"]

Show[
ListPlot[pvvs, PlotStyle->Red,PlotRange->{{minvs,maxvs},{minpv,maxpv}}], Plot[lmpvvs[v], {v, minvs,maxvs},PlotRange->{{minvs,maxvs},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"volum poliedre (L)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{vs[[i]],lmpvvs["FitResiduals"][[i]]},{i,1,dim}];

Print []
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum poliedre (L)","error estimació pes viu (kg)"},
PlotRange->{{minvs,maxvs},{-13,13}}
]

Print []
Print["Errors màxims i mínim :   ",Min[lmpvvs["FitResiduals"]],"  kg   ", Max[lmpvvs["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvvs["FitResiduals"]]],"  kg"]
Print []

(* calcul de la densitat en kg/L *)

rhos = pviu/vs;
rhots =Table [{vs[[i]],rhos[[i]]},{i,1,dim}];

 Print ["  "]
Print [" Densitat(en kg/L) calculada a partir de pes viu / volum poliedre"]

rhosav=Mean[rhos];
stdevrhos=StandardDeviation[rhos];

rhosp={{minvs,rhosav},{maxvs,rhosav}};

Show[
ListPlot[rhots, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum poliedre (L)","densitat (kg/L)"},
PlotRange->{{minvs,maxvs},{0.7,0.9}}
],
 ListLinePlot[rhosp,PlotStyle->{Black, Dashed}]
]

 Print ["  "]
Print [" Densitat mitjana (en kg/L)"]

Print []
Print [" Densitat mitjana (en kg/L): ", rhosav," ± ",stdevrhos]

Tot i complicar el model no s'arriba a una millor qualitat de l'ajust  (valor d'(R^2) de 0.83). El càlcul de la densitat mitjana és en aquest cas un pel baix 0.81 kg/L indicant que s'està sobreestimant lleugerament el volum.

La conclusió general a la que s'arriba és que utilitzant qualsevol model que inclogui una correlació en la que es tingui en compte tant la longitud com l'amplada del porc dóna uns resultats sensiblement millors que intentar estimar el pes usant només alguna de les dues dimensions lineals (longitud i amplada) que s'han mesurat. Per la seva senzillesa possiblement el millor és el model de porc cilíndric que a més dóna un ordre de magnitud força correcte per a la densitat. A la pràctica es podria proposar un model cilíndric calculat amb una sola amplada, per exemple d6 o les dues amplades més fàcils de mesurar, d2 i d6, encara que en aquests casos la qualitat dels ajustos és força més pobra:

(* Correlació pes viu vs volum del cilindre (en L) amb radi igual a d6 *)

rcs = 0.5*d6;

vc=0.001*d1*π*(rcs^2);

minvc=(Min[vc]-0.1Min[vc]); 
maxvc=(Max[vc]+0.1Max[vc]);

vcav=Mean[vc];

Print []
Print [" Volum mitjà del cilindre(en L) ", vcav]
Print []

pvvc=Table [{vc[[i]],pviu[[i]]},{i,1,dim}];

Print []
Print ["Ajust lineal pv (en kg) vs volum cilindre (en L)"]
lmpvvc=LinearModelFit[pvvc,v,v];
avc1=lmpvvc["BestFitParameters"][[1]];
bvc1=lmpvvc["BestFitParameters"][[2]];
Print["Pes viu (kg) = ",avc1," + ",bvc1," (Subscript[V, cil]) (L)"]
Print ["(R^2) del ajust: ",lmpvvc["RSquared"]]


(* Representació pv vs volum poliedre *)

Print []
Print [" pes viu (kg) vs volum cilindre (en L)"]

Show[
ListPlot[pvvc, PlotStyle->Red,PlotRange->{{minvc,maxvc},{minpv,maxpv}}], Plot[lmpvvc[v], {v, minvc,maxvc},PlotRange->{{minvc,maxvc},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"volum cilindre (L)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{vc[[i]],lmpvvc["FitResiduals"][[i]]},{i,1,dim}];

Print []
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum cilindre (L)","error estimació pes viu (kg)"},
PlotRange->{{minvc,maxvc},{-12,12}}
]

Print []
Print["Errors màxims i mínim :   ",Min[lmpvvc["FitResiduals"]],"  kg   ", Max[lmpvvc["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvvc["FitResiduals"]]],"  kg"]
Print []

(* calcul de la densitat en kg/L *)

rhoc = pviu/vc;
rhotc =Table [{vc[[i]],rhoc[[i]]},{i,1,dim}];

Print []
Print [" Densitat(en kg/L) calculada a partir de pes viu / volum cilindre"]
Print []

rhocav=Mean[rhoc];
stdevrhoc=StandardDeviation[rhoc];

rhocp={{minvc,rhocav},{maxvc,rhocav}};

Show[
ListPlot[rhotc, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum cilindre (L)","densitat (kg/L)"},
PlotRange->{{minvc,maxvc},{0.85,1.15}}
],
 ListLinePlot[rhocp,PlotStyle->{Black, Dashed}]
]

Print []
Print [" Densitat mitjana (en kg/L): ", rhocav," ± ",stdevrhoc]
Print []

(* Correlació pes viu vs volum del cilindre (en L) amb radi igual a mitjana d2 i d6 *)

rcm = 0.5*Mean[{d2,d6}];

vc=0.001*d1*π*(rcm^2);

minvc=(Min[vc]-0.1Min[vc]); 
maxvc=(Max[vc]+0.1Max[vc]);

vcav=Mean[vc];

Print []
Print [" Volum mitjà del cilindre(en L) ", vcav]
Print []

pvvc=Table [{vc[[i]],pviu[[i]]},{i,1,dim}];

Print []
Print ["Ajust lineal pv (en kg) vs volum cilindre (en L)"]
lmpvvc=LinearModelFit[pvvc,v,v];
avc1=lmpvvc["BestFitParameters"][[1]];
bvc1=lmpvvc["BestFitParameters"][[2]];
Print["Pes viu (kg) = ",avc1," + ",bvc1," (Subscript[V, cil]) (L)"]
Print ["(R^2) del ajust: ",lmpvvc["RSquared"]]

(* Representació pv vs volum poliedre *)

Print [" pes viu (kg) vs volum cilindre (en L)"]

Show[
ListPlot[pvvc, PlotStyle->Red,PlotRange->{{minvc,maxvc},{minpv,maxpv}}], Plot[lmpvvc[v], {v, minvc,maxvc},PlotRange->{{minvc,maxvc},{minpv,maxpv}}] ,Frame->True,AspectRatio->1,Axes->{False,False},FrameLabel->{"volum cilindre (L)","pes en viu (kg)"}
]

(* Càlcul de diferències pv estimat - pv mesurat *)

resid =Table [{vc[[i]],lmpvvc["FitResiduals"][[i]]},{i,1,dim}];

Print []
Print [" pes en viu estimat - pes en viu mesurat (en kg)"]

ListPlot[resid, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum cilindre (L)","error estimació pes viu (kg)"},
PlotRange->{{minvc,maxvc},{-12,12}}
]

Print []
Print["Errors màxims i mínim :   ",Min[lmpvvc["FitResiduals"]],"  kg   ", Max[lmpvvc["FitResiduals"]],"  kg"]
Print["Error mitjà :   ",Mean[Abs[lmpvvc["FitResiduals"]]],"  kg"]

(* calcul de la densitat en kg/L *)

rhoc = pviu/vc;
rhotc =Table [{vc[[i]],rhoc[[i]]},{i,1,dim}];

Print []
Print [" Densitat(en kg/L) calculada a partir de pes viu / volum cilindre"]

rhocav=Mean[rhoc];
stdevrhoc=StandardDeviation[rhoc];

rhocp={{minvc,rhocav},{maxvc,rhocav}};

Show[
ListPlot[rhotc, 
Filling->Axis, 
Frame->True,
Axes->{True,False},
FrameLabel->{"volum cilindre (L)","densitat (kg/L)"},
PlotRange->{{minvc,maxvc},{0.95,1.15}}
],
 ListLinePlot[rhocp,PlotStyle->{Black, Dashed}]
]

Print []
Print [" Densitat mitjana (en kg/L): ", rhocav," ± ",stdevrhoc]
Print []

(* Estimació del pes d'un porc segons els diferents models `proposats *)

(* Valors distancies obtingudes de fotografia *)

q1=97.8;
q2=34.9;
q3=30.6;
q4=29.8;
q5=29.1;
q6=35.5;

(* Porc esferic, calculem radi mitja i volum esfera *)

rm = 0.5*Mean[{q1,q2,q3,q4,q5,q6}] ;
ve=(1/1000)((4π)/3)(rm^3);
pesf=avesf+bvesf*ve;

(* Porc cilindric, calculem radi mitja i volum cilindre *)

rcm = 0.5*Mean[{q2,q3,q4,q5,q6}];

vc=0.001*q1*π*(rcm^2);
pcil=avcil+bvcil*vc;

(* Escrivim pes estimat *)

Print["Per a un porc amb dimensions"]
Print ["d1 =",q1," cm"]
Print ["d2 =",q2," cm"]
Print ["d3 =",q3," cm"]
Print ["d4 =",q4," cm"]
Print ["d5 =",q5," cm"]
Print ["d6 =",q6," cm"]
Print[]

Print["El model de porc esferic prediu un pes de  : ",pesf," kg"]
Print["El model de porc cilindric prediu un pes de: ",pcil," kg"]