问题描述
我使用线性模型来获得最适合我的数据的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
,
如果measured
和modelled
代表未公开模型的实际值和拟合值,如另一个答案下面的注释所述,则如果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