Modelo lineal donde los datos tienen incertidumbre, usando R

9

Digamos que tengo datos que tienen cierta incertidumbre. Por ejemplo:

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

La naturaleza de la incertidumbre podría ser repetir mediciones o experimentos, o medir la incertidumbre del instrumento, por ejemplo.

Me gustaría ajustar una curva con R, algo que normalmente haría con lm. Sin embargo, esto no tiene en cuenta la incertidumbre en los datos cuando me da la incertidumbre en los coeficientes de ajuste y, en consecuencia, los intervalos de predicción. Mirando la documentación, la lmpágina tiene esto:

... los pesos se pueden usar para indicar que diferentes observaciones tienen diferentes variaciones ...

Entonces me hace pensar que quizás esto tenga algo que ver con eso. Conozco la teoría de hacerlo manualmente, pero me preguntaba si es posible hacerlo con la lmfunción. Si no, ¿hay alguna otra función (o paquete) que sea capaz de hacer esto?

EDITAR

Al ver algunos de los comentarios, aquí hay algunas aclaraciones. Toma este ejemplo:

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)

Me da

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

Básicamente, mis coeficientes son a = 39.8 ± 22.3, b = 92.0 ± 9.3, c = -4.3 ± 0.8. Ahora digamos que para cada punto de datos, el error es 20. Usaré weights = rep(20,10)en la lmllamada y en su lugar obtendré esto:

Residual standard error: 84.87 on 7 degrees of freedom

pero los errores estándar en los coeficientes no cambian.

Manualmente, sé cómo hacerlo calculando la matriz de covarianza usando álgebra matricial y colocando los pesos / errores allí, y derivando los intervalos de confianza usando eso. Entonces, ¿hay alguna manera de hacerlo en la función lm misma o en cualquier otra función?

Gimelist
fuente
Si conoce la distribución de los datos, puede iniciarla utilizando el bootpaquete en R. Luego, puede dejar que una regresión lineal se ejecute sobre el conjunto de datos de inicialización.
Ferdi
lmutilizará las variaciones normalizadas como pesos y luego asumirá que su modelo es estadísticamente válido para estimar la incertidumbre de los parámetros. Si cree que este no es el caso (barras de error demasiado pequeñas o demasiado grandes), no debe confiar en ninguna estimación de incertidumbre.
Pascal
Vea también esta pregunta aquí: stats.stackexchange.com/questions/113987/…
jwimberley

Respuestas:

14

Este tipo de modelo es en realidad mucho más común en ciertas ramas de la ciencia (por ejemplo, física) e ingeniería que la regresión lineal "normal". Por lo tanto, en herramientas de física como ROOT, hacer este tipo de ajuste es trivial, ¡mientras que la regresión lineal no se implementa de forma nativa! Los físicos tienden a llamar a esto solo un "ajuste" o un chi-cuadrado que minimiza el ajuste.

σ

Lyomi-12(yyo-(unaXyo+si)σ)2
Iniciar sesión(L)=Conortestunanortet-12σ2yo(yyo-(unaXyo+si))2
σ
Lmi-12(y-(unaX+si)σyo)2
Iniciar sesión(L)=Conortestunanortet-12(yyo-(unaXyo+si)σyo)2
1/ /σyo2Iniciar sesión(L)

F=metrounaF=metrouna+ϵlmσ2lm

lm pesos y el error estándar

Hay un par de posibles soluciones en las respuestas allí. En particular, una respuesta anónima allí sugiere usar

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

lmσ

EDITAR

Si está haciendo mucho este tipo de cosas, podría considerar usarlas ROOT(lo que parece hacer de forma nativa lmy glmno). Aquí hay un breve ejemplo de cómo hacer esto ROOT. En primer lugar, ROOTse puede usar a través de C ++ o Python, y es una gran descarga e instalación. Puede probarlo en el navegador usando un cuaderno de Júpiter, siguiendo el enlace aquí , eligiendo "Binder" a la derecha y "Python" a la izquierda.

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    

y se produce una buena trama:

quadfit

Xlm

SEGUNDA EDICION

La otra respuesta de la misma pregunta anterior de @Wolfgang ofrece una solución aún mejor: la rmaherramienta del metaforpaquete (originalmente interpreté el texto en esa respuesta para significar que no calculó la intercepción, pero ese no es el caso). Tomando las variaciones en las medidas y como simplemente 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

Esta es definitivamente la mejor herramienta R pura para este tipo de regresión que he encontrado.

jwimberley
fuente
Creo que es básicamente incorrecto deshacer la escala lm. Si hace esto, las estadísticas de validación, como el chi-cuadrado, estarán desactivadas. Si la dispersión de sus residuos no coincide con sus barras de error, algo está mal en el modelo estadístico (ya sea la elección del modelo o las barras de error o la hipótesis normal ...). En cualquier caso, las incertidumbres de los parámetros no serán confiables.
Pascal
@PascalPERNOT No he pensado en esto; Pensaré en tus comentarios. Para ser honesto, estoy de acuerdo en un sentido general en que creo que la mejor solución es usar software de física o ingeniería garantizado para resolver este problema correctamente, en lugar de piratear lmpara obtener la salida correcta. (Si alguien tiene curiosidad, le mostraré cómo hacerlo ROOT).
jwimberley
1
Una ventaja potencial del enfoque estadístico del problema es que permite agrupar las estimaciones de varianza entre las observaciones a diferentes niveles. Si la varianza subyacente es constante o tiene alguna relación definida con las mediciones como en los procesos de Poisson, entonces el análisis generalmente se mejorará en comparación con lo que se obtiene de la suposición (típicamente poco realista) de que la varianza medida para cada punto de datos es correcta y, por lo tanto, ponderación injustamente Algunos puntos de datos. En los datos del OP, supongo que la suposición de varianza constante podría ser mejor.
EdM
1
σσ2
1
Hay una buena discusión sobre estos temas en el Capítulo 8 de Andreon, S. y Weaver, B. (2015) Métodos bayesianos para las ciencias físicas. Saltador. springer.com/us/book/9783319152868
Tony Ladson