如何将已知的线性方程拟合到R中的数据?

问题描述

我使用线性模型来获得最适合我的数据的lm()函数。 从文献中我知道,最佳拟合将是线性回归,其斜率= 1,截距=0。我想看看这个方程(y = x)与我的数据拟合得如何?如何找到R ^ 2和p值?

这是我的数据 (y =建模,x =测量)

measured<-c(67.39369,28.73695,60.18499,49.32405,166.39318,222.29022,271.83573,241.72247,368.46304,220.27018,169.92343,56.49579,38.18381,49.33753,130.91752,161.63536,294.14740,363.91029,358.32905,239.84112,129.65078,32.76462,30.13952,52.83656,67.35427,132.23034,366.87857,247.40125,273.19316,278.27902,123.24256,45.98363,83.50199,240.99459,266.95707,308.69814,228.34256,220.51319,83.97942,58.32171,57.93815,94.64370,264.78007,274.25863,245.72940,155.41777,77.45236,70.44223,104.22838,294.01645,312.42321,122.80831,41.65770,242.22661,300.07147,291.59902,230.54478,89.42498,55.81760,55.60525,111.64263,305.76432,264.27192,233.28214,192.75603,75.60803,63.75376)

modelled<-c(42.58318,71.64667,111.08853,67.06974,156.47303,240.41188,238.25893,196.42247,404.28974,138.73164,116.73998,55.21672,82.71556,64.27752,145.84891,133.67465,295.01014,335.25432,253.01847,166.69241,68.84971,26.03600,45.04720,75.56405,109.55975,202.57084,288.52887,140.58476,152.20510,153.99427,75.70720,92.56287,144.93923,335.90871,NA,264.25732,141.93407,122.80440,83.23812,42.18676,107.97732,123.96824,270.52620,388.93979,308.35117,100.79047,127.70644,91.23133,162.53323,276.46554,100.79440,81.10756,272.17680,387.28700,208.29715,152.91548,62.54459,31.98732,74.26625,115.50051,324.91248,210.14204,168.29598,157.30373,45.76027,76.07370)

现在我想看看方程y = x与上面给出的数据(R ^ 2和p值)的拟合程度如何?

非常感谢有人可以帮助我解决这个(基本)问题,因为我没有找到关于stackoverflow的问题的答案?

最诚挚的问候西里尔

解决方法

让我们清楚您在这里要问什么。您有一个现有模型,即“ modelled值是measured值的期望值”,换句话说就是measured = modelled + e,其中e是通常的分布残差。

您说“最佳拟合”应该是一条截距为0且斜率为1的直线,这是另一种说法。

问题是,“最佳拟合”不是对您实际数据的最佳拟合,正如我们可以通过以下操作轻松看到的那样:

summary(lm(measured ~ modelled))
#> 
#> Call:
#> lm(formula = measured ~ modelled)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -103.328  -39.130   -4.881   40.428  114.829 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept) 23.09461   13.11026   1.762    0.083 .  
#> modelled     0.91143    0.07052  12.924   <2e-16 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
#> Residual standard error: 55.13 on 63 degrees of freedom
#> Multiple R-squared:  0.7261,Adjusted R-squared:  0.7218 
#> F-statistic:   167 on 1 and 63 DF,p-value: < 2.2e-16

这将向我们显示一条线,该线将减少残差平方和,从而最适合您的数据。

但是我想您想问的是“我的数据如何适合模型measured = modelled + e?”

试图强迫lm给出固定的截距和斜率可能不是回答此问题的最佳方法。请记住,斜率的p值仅告诉您实际斜率是否与0明显不同。上述模型已经证实了这一点。如果您想知道measured = modelled + e的r平方,只需要知道measured解释的modelled方差的比例即可。换句话说:

1 - var(measured - modelled) / var(measured)
#> [1] 0.7192672

这非常接近lm调用中的r平方。

我认为您有足够的证据表明您的数据与模型measured = modelled保持一致,因为lm模型中的斜率在其95%置信区间内包括值1,并且截距在其95%置信区间内包含值0。

,

如评论中所述,您可以使用lm()函数,但这实际上可以为您估计斜率和截距,而您想要的却有所不同。

如果斜率= 1且截距= 0,则实际上您已经拟合,并且modelled已经是预测值。您需要此拟合的r平方。 R平方定义为:

R2 = MSS / TSS =(TSS-RSS)/ TSS

有关RSS和TSS的定义,请参见this link

我们只能处理完整的观测值(非NA)。因此,我们计算它们中的每一个:

TSS = nonNA  = !is.na(modelled) & !is.na(measured) 
# residuals from your prediction
RSS = sum((modelled[nonNA] - measured[nonNA])^2,na.rm=T)
# total residuals from data
TSS = sum((measured[nonNA] - mean(measured[nonNA]))^2,na.rm=T)    

1 - RSS/TSS
[1] 0.7116585
,

如果measuredmodelled代表未公开模型的实际值和拟合值,如另一个答案下面的注释所述,则如果fm是{{1 }}那个未公开模型的对象

lm

将显示该模型的R ^ 2和p值。

实际上可以仅使用summary(fm) measured计算R平方值,但是,如果未公开模型中存在截距,则公式不同。迹象表明没有拦截,因为如果有拦截modelled应该为0,但实际上距离还很远。

在任何情况下,sum(fm)的输出中都会显示R ^ 2和p值,其中fm是未公开的线性模型,因此将讨论限于sum(modelled - measured,an.rm = TRUE)和{{1 }},如果您有未公开模型的measured对象。

例如,如果未公开的模型是以下模型,则使用内置的modelled数据框:

lm

我们有this输出,最后两行显示R平方和p值。

CO2