Modelo linear em que os dados têm incerteza, usando R

9

Digamos que eu tenha dados que tenham alguma incerteza. Por exemplo:

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

A natureza da incerteza pode ser repetir medições ou experimentos, ou medir a incerteza do instrumento, por exemplo.

Eu gostaria de ajustar uma curva usando R, algo com o qual normalmente faria lm. No entanto, isso não leva em consideração a incerteza nos dados quando me fornece a incerteza nos coeficientes de ajuste e, consequentemente, nos intervalos de previsão. Observando a documentação, a lmpágina possui:

... pesos podem ser usados ​​para indicar que observações diferentes têm variações diferentes ...

Então, isso me faz pensar que talvez isso tenha algo a ver com isso. Conheço a teoria de fazê-lo manualmente, mas estava pensando se é possível fazer isso com a lmfunção. Caso contrário, existe alguma outra função (ou pacote) capaz de fazer isso?

EDITAR

Vendo alguns dos comentários, aqui estão alguns esclarecimentos. Veja este exemplo:

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)

Dá-me:

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

Então, basicamente, meus coeficientes são a = 39,8 ± 22,3, b = 92,0 ± 9,3, c = -4,3 ± 0,8. Agora vamos dizer que, para cada ponto de dados, o erro é 20. Usarei weights = rep(20,10)a lmchamada e recebo isso:

Residual standard error: 84.87 on 7 degrees of freedom

mas os erros padrão nos coeficientes não são alterados.

Manualmente, eu sei como fazer isso com o cálculo da matriz de covariância usando álgebra de matriz e colocando os pesos / erros lá, e derivando os intervalos de confiança usando isso. Então, existe uma maneira de fazê-lo na própria função lm ou em qualquer outra função?

Gimelist
fonte
Se você conhece a distribuição dos dados, é possível inicializá-los usando o bootpacote em R. Depois, você pode permitir uma regressão linear sobre o conjunto de dados inicializados.
Ferdi
lmusará as variações normalizadas como pesos e assumirá que seu modelo é estatisticamente válido para estimar a incerteza dos parâmetros. Se você acha que esse não é o caso (barras de erro muito pequenas ou muito grandes), não confie em nenhuma estimativa de incerteza.
Pascal
Veja também esta pergunta aqui: stats.stackexchange.com/questions/113987/…
jwimberley

Respostas:

14

Esse tipo de modelo é realmente muito mais comum em certos ramos da ciência (por exemplo, física) e engenharia do que a regressão linear "normal". Assim, em ferramentas de física como ROOT, esse tipo de ajuste é trivial, enquanto a regressão linear não é implementada nativamente! Os físicos tendem a chamar isso de apenas um "ajuste" ou um ajuste minimizador de qui-quadrado.

σ

euEue-1 12(yEu-(umaxEu+b)σ)2
registro(eu)=constumant-1 12σ2Eu(yEu-(umaxEu+b))2
σ
eue-1 12(y-(umax+b)σEu)2
registro(eu)=constumant-1 12(yEu-(umaxEu+b)σEu)2
1 1/σEu2registro(eu)

F=mumaF=muma+ϵlmσ2lm

lm pesos e o erro padrão

Existem algumas soluções possíveis dadas nas respostas. Em particular, uma resposta anônima sugere o uso de

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

lmσ

EDITAR

Se você está fazendo esse tipo de coisa, pode considerar usar ROOT (o que parece fazer isso nativamente enquanto lme glmnão). Aqui está um breve exemplo de como fazer isso ROOT. Primeiro, ROOTpode ser usado via C ++ ou Python, e é um enorme download e instalação. Você pode experimentá-lo no navegador usando um notebook Jupiter, seguindo o link aqui , escolhendo "Binder" à direita e "Python" à esquerda.

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()

Eu coloquei raízes quadradas como as incertezas no 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    

e um belo enredo é produzido:

quadfit

xlm

SEGUNDA EDIÇÃO

A outra resposta da mesma pergunta anterior de @Wolfgang fornece uma solução ainda melhor: o rma ferramenta do metaforpacote (eu originalmente interpretei o texto nessa resposta para dizer que não calculou a interceptação, mas esse não é o caso). Tomando as variações nas medidas y como simplesmente 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 é definitivamente a melhor ferramenta R pura para esse tipo de regressão que eu encontrei.

jwimberley
fonte
Eu acho que é basicamente errado desfazer a escala lm. Se você fizer isso, as estatísticas de validação, como o qui-quadrado, serão desativadas. Se a dispersão dos seus resíduos não corresponder às suas barras de erro, algo está errado no modelo estatístico (na escolha do modelo ou nas barras de erro ou na hipótese normal ...). Em ambos os casos, as incertezas dos parâmetros não serão confiáveis ​​!!!
Pascal
@PascalPERNOT Ainda não pensei sobre isso; Vou pensar nos seus comentários. Para ser sincero, concordo em um sentido geral, pois acho que a melhor solução é usar software de física ou engenharia garantido para resolver esse problema corretamente, em vez de cortar lmpara obter a saída correta. (Se alguém estiver curioso, mostrarei como fazer isso ROOT).
precisa saber é o seguinte
11
Uma vantagem potencial da abordagem do estatístico ao problema é que ele permite agrupar estimativas de variância entre observações em diferentes níveis. Se a variação subjacente for constante ou tiver alguma relação definida com as medidas, como nos processos de Poisson, a análise será tipicamente aprimorada em relação ao que você obtém da suposição (geralmente irrealista) de que a variação medida para cada ponto de dados está correta e, portanto, pesa injustamente alguns pontos de dados. Nos dados do OP, eu acho que a suposição de variação constante pode ser melhor.
EdM
11
σσ2
11
Há uma boa discussão sobre essas questões no capítulo 8 de Andreon, S. e Weaver, B. (2015) métodos bayesianos para as ciências físicas. Springer. springer.com/us/book/9783319152868
Tony Ladson