Modèle linéaire où les données sont incertaines, en utilisant R


9

Disons que j'ai des données qui ont une certaine incertitude. Par exemple:

X  Y
1  10±4
2  50±3
3  80±7
4  105±1
5  120±9

La nature de l'incertitude pourrait être des mesures ou des expériences répétées, ou la mesure de l'incertitude des instruments par exemple.

Je voudrais lui adapter une courbe en utilisant R, quelque chose que je ferais normalement avec lm. Cependant, cela ne prend pas en compte l'incertitude dans les données lorsqu'elle me donne l'incertitude sur les coefficients d'ajustement, et par conséquent les intervalles de prédiction. En regardant la documentation, la lmpage a ceci:

... les poids peuvent être utilisés pour indiquer que différentes observations ont des variances différentes ...

Cela me fait donc penser que cela a peut-être quelque chose à voir avec cela. Je connais la théorie de le faire manuellement, mais je me demandais s'il était possible de le faire avec la lmfonction. Sinon, existe-t-il une autre fonction (ou package) capable de le faire?

ÉDITER

En voyant certains des commentaires, voici quelques éclaircissements. Prenez cet exemple:

x <- 1:10
y <- c(131.4,227.1,245,331.2,386.9,464.9,476.3,512.2,510.8,532.9)
mod <- lm(y ~ x + I(x^2))
summary(mod)

Donne moi:

Residuals:
    Min      1Q  Median      3Q     Max 
-32.536  -8.022   0.087   7.666  26.358 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  39.8050    22.3210   1.783  0.11773    
x            92.0311     9.3222   9.872 2.33e-05 ***
I(x^2)       -4.2625     0.8259  -5.161  0.00131 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 18.98 on 7 degrees of freedom
Multiple R-squared:  0.986, Adjusted R-squared:  0.982 
F-statistic: 246.7 on 2 and 7 DF,  p-value: 3.237e-07

Donc, fondamentalement, mes coefficients sont a = 39,8 ± 22,3, b = 92,0 ± 9,3, c = -4,3 ± 0,8. Disons maintenant que pour chaque point de données, l'erreur est de 20. J'utiliserai weights = rep(20,10)dans l' lmappel et j'obtiens ceci à la place:

Residual standard error: 84.87 on 7 degrees of freedom

mais les erreurs std sur les coefficients ne changent pas.

Manuellement, je sais comment le faire en calculant la matrice de covariance en utilisant l'algèbre matricielle et en y mettant les poids / erreurs, et en dérivant les intervalles de confiance en utilisant cela. Existe-t-il un moyen de le faire dans la fonction lm elle-même, ou dans toute autre fonction?


Si vous connaissez la distribution des données, vous pouvez l'amorcer à l'aide du bootpackage dans R. Ensuite, vous pouvez laisser une régression linéaire s'exécuter sur l'ensemble de données amorcé.
Ferdi

lmutilisera les variances normalisées comme poids, puis supposera que votre modèle est statistiquement valide pour estimer l'incertitude des paramètres. Si vous pensez que ce n'est pas le cas (barres d'erreur trop petites ou trop grandes), vous ne devriez pas faire confiance à une estimation d'incertitude.
Pascal

Réponses:


14

Ce type de modèle est en réalité beaucoup plus courant dans certaines branches de la science (par exemple la physique) et de l'ingénierie que la régression linéaire "normale". Donc, dans les outils de physique comme ROOT, faire ce type d'ajustement est trivial, tandis que la régression linéaire n'est pas implémentée en mode natif! Les physiciens ont tendance à appeler cela juste un "ajustement" ou un ajustement minimisant le chi carré.

σ

Lie12(yi(axi+b)σ)2
log(L)=constant12σ2i(yi(axi+b))2
σ
Le12(y(ax+b)σi)2
log(L)=constant12(yi(axi+b)σi)2
1/σi2log(L)

F=maF=ma+ϵlmσ2lm

poids lm et l'erreur standard

Il y a quelques solutions possibles données dans les réponses. En particulier, une réponse anonyme suggère d'utiliser

vcov(mod)/summary(mod)$sigma^2

lmσ

ÉDITER

Si vous faites beaucoup de choses de ce genre, vous pourriez envisager d'utiliser ROOT(ce qui semble le faire nativement pendant lmet glmnon). Voici un bref exemple de la façon de procéder dans ROOT. Tout d'abord, ROOTpeut être utilisé via C ++ ou Python, et c'est un énorme téléchargement et installation. Vous pouvez l'essayer dans le navigateur à l'aide d'un bloc-notes Jupiter, en suivant le lien ici , en choisissant "Binder" à droite et "Python" à gauche.

import ROOT
from array import array
import math
x = range(1,11)
xerrs = [0]*10
y = [131.4,227.1,245,331.2,386.9,464.9,476.3,512.2,510.8,532.9]
yerrs = [math.sqrt(i) for i in y]
graph = ROOT.TGraphErrors(len(x),array('d',x),array('d',y),array('d',xerrs),array('d',yerrs))
graph.Fit("pol2","S")
c = ROOT.TCanvas("test","test",800,600)
graph.Draw("AP")
c.Draw()

y

Welcome to JupyROOT 6.07/03

****************************************
Minimizer is Linear
Chi2                      =       8.2817
NDf                       =            7
p0                        =      46.6629   +/-   16.0838     
p1                        =       88.194   +/-   8.09565     
p2                        =     -3.91398   +/-   0.78028    

et une belle intrigue est produite:

quadfit

xlm

DEUXIÈME ÉDITION

L'autre réponse de la même question précédente de @Wolfgang donne une solution encore meilleure: l' rmaoutil du metaforpackage (j'ai à l'origine interprété le texte dans cette réponse pour signifier qu'il n'a pas calculé l'interception, mais ce n'est pas le cas). Prendre les variances dans les mesures y pour être simplement y:

> rma(y~x+I(x^2),y,method="FE")

Fixed-Effects with Moderators Model (k = 10)

Test for Residual Heterogeneity: 
QE(df = 7) = 8.2817, p-val = 0.3084

Test of Moderators (coefficient(s) 2,3): 
QM(df = 2) = 659.4641, p-val < .0001

Model Results:

         estimate       se     zval    pval    ci.lb     ci.ub     
intrcpt   46.6629  16.0838   2.9012  0.0037  15.1393   78.1866   **
x         88.1940   8.0956  10.8940  <.0001  72.3268  104.0612  ***
I(x^2)    -3.9140   0.7803  -5.0161  <.0001  -5.4433   -2.3847  ***

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

C'est certainement le meilleur outil R pur pour ce type de régression que j'ai trouvé.


Je pense qu'il est fondamentalement faux d'annuler la mise à l'échelle lm. Si vous faites cela, les statistiques de validation, telles que le chi carré, seront désactivées. Si la dispersion de vos résidus ne correspond pas à vos barres d'erreur, quelque chose ne va pas dans le modèle statistique (que ce soit le choix du modèle ou les barres d'erreur ou l'hypothèse normale ...). Dans les deux cas, les incertitudes des paramètres ne seront pas fiables !!!
Pascal

@PascalPERNOT Je n'y ai pas pensé; Je pense à vos commentaires. Pour être honnête, je suis d'accord dans un sens général en ce que je pense que la meilleure solution est d'utiliser un logiciel de physique ou d'ingénierie garanti pour résoudre correctement ce problème, plutôt que de pirater lmpour obtenir la sortie correcte. (Si quelqu'un est curieux, je vais vous montrer comment faire cela ROOT).
jwimberley

1
L'un des avantages potentiels de l'approche du statisticien à l'égard du problème est qu'elle permet de regrouper les estimations de la variance entre les observations à différents niveaux. Si la variance sous-jacente est constante ou a une relation définie avec les mesures comme dans les processus de Poisson, l'analyse sera généralement améliorée par rapport à ce que vous obtenez de l'hypothèse (généralement irréaliste) selon laquelle la variance mesurée pour chaque point de données est correcte et donc injustement pondérée certains points de données. Dans les données du PO, je suppose que l'hypothèse de variance constante pourrait être meilleure.
EdM

1
σσ2

1
Il y a une bonne discussion de ces questions dans le chapitre 8 d'Andreon, S. et Weaver, B. (2015) Méthodes bayésiennes pour les sciences physiques. Springer. springer.com/us/book/9783319152868
Tony Ladson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.