如何将对数回归拟合到“a”;负指数“;R中的散点图
我有一个日降雨量(x)和观测值(y)的散点图,它看起来像是x^-2图的右/正x值的一半,或者是以1/2为底的对数图。基本上,当x值非常低时,y值非常高。x值越大,y值越低。但是y值的下降速度变慢,y值永远不会为负 以下是一个具有代表性的样本:如何将对数回归拟合到“a”;负指数“;R中的散点图,r,regression,logarithm,R,Regression,Logarithm,我有一个日降雨量(x)和观测值(y)的散点图,它看起来像是x^-2图的右/正x值的一半,或者是以1/2为底的对数图。基本上,当x值非常低时,y值非常高。x值越大,y值越低。但是y值的下降速度变慢,y值永远不会为负 以下是一个具有代表性的样本: rain <- c(1, 1.2, 1.3, 2.5, 3.2, 4.2, 5, 7, 7.5, 10.3, 11.7, 12.9, 14.1, 15, 15.5, 17.5, 18.3, 20, 20.2, 20.3, 25, 28, 30, 3
rain <- c(1, 1.2, 1.3, 2.5, 3.2, 4.2, 5, 7, 7.5, 10.3, 11.7, 12.9, 14.1, 15, 15.5, 17.5, 18.3, 20, 20.2, 20.3, 25, 28, 30, 34, 40)
obs <- c(42, 44, 43.9, 43.5, 35, 22, 18.4, 15.3, 10, 6.2, 5.7, 4, 3.7, 2.3, 2, 2.7, 3.5, 3, 2.9, 4, 1.6, 2.2, 1.6, 1.3, 0.8)
rain您的obs
变量非常适合rain
的倒数。比如说
dev.new(width=12, height=6)
oldp <- par(mfrow=c(1, 2))
plot(obs~rain)
lines(rain, 1/rain*40)
因此,k
的最佳估计值为57.145。nls的主要缺点是必须提供系数的起始值。它也可能无法收敛,但对于我们在这里使用的简单函数,只要您能够估计合理的起始值,它就可以正常工作
如果rain
可以有零值,则可以添加截距:
obs.nls <- nls(obs ~ k / (a + rain), start=list(a=1, k=40))
summary(obs.nls)
#
# Formula: obs ~ k/(a + rain)
#
# Parameters:
# Estimate Std. Error t value Pr(>|t|)
# a 1.4169 0.4245 3.337 0.00286 **
# k 117.5345 16.6878 7.043 3.55e-07 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 4.638 on 23 degrees of freedom
Number of iterations to convergence: 10
Achieved convergence tolerance: 6.763e-06
obs.nls | t |)
#a 1.4169 0.4245 3.337 0.00286**
#k 117.5345 16.6878 7.043.55e-07***
# ---
#签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
#
#剩余标准误差:23个自由度上的4.638
收敛的迭代次数:10
达到收敛公差:6.763e-06
请注意,标准误差较小,但曲线高估了rain>10的实际值
您的obs
变量与rain
的倒数非常吻合。比如说
dev.new(width=12, height=6)
oldp <- par(mfrow=c(1, 2))
plot(obs~rain)
lines(rain, 1/rain*40)
因此,k
的最佳估计值为57.145。nls的主要缺点是必须提供系数的起始值。它也可能无法收敛,但对于我们在这里使用的简单函数,只要您能够估计合理的起始值,它就可以正常工作
如果rain
可以有零值,则可以添加截距:
obs.nls <- nls(obs ~ k / (a + rain), start=list(a=1, k=40))
summary(obs.nls)
#
# Formula: obs ~ k/(a + rain)
#
# Parameters:
# Estimate Std. Error t value Pr(>|t|)
# a 1.4169 0.4245 3.337 0.00286 **
# k 117.5345 16.6878 7.043 3.55e-07 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 4.638 on 23 degrees of freedom
Number of iterations to convergence: 10
Achieved convergence tolerance: 6.763e-06
obs.nls | t |)
#a 1.4169 0.4245 3.337 0.00286**
#k 117.5345 16.6878 7.043.55e-07***
# ---
#签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
#
#剩余标准误差:23个自由度上的4.638
收敛的迭代次数:10
达到收敛公差:6.763e-06
请注意,标准误差较小,但曲线高估了rain>10的实际值
您能给我们显示一个?我添加了一个显示曲线的数据样本!试试obs~exp(a+b/rain+c*log(rain))你能给我们看看a?我添加了一个显示曲线的数据样本!试试obs~exp(a+b/rain+c*log(rain)),你也可以试试glm(obs~rain,family=gaussian(link=“inverse”)
谢谢你!回归是否有截距,或者只是obs=57.145*rain^-1?没有截距,因为1/0是无穷大。如果存在rain=0的观测值,则可以添加一个项将曲线向左移动:obs~1/(rain+a)*k
或等效项:obs~k/(rain+a)
。从a=1开始
。您也可以尝试glm(obs~rain,family=gaussian(link=“inverse”)
谢谢您!回归是否有截距,或者只是obs=57.145*rain^-1?没有截距,因为1/0是无穷大。如果存在rain=0的观测值,则可以添加一个项将曲线向左移动:obs~1/(rain+a)*k
或等效项:obs~k/(rain+a)
。从a=1开始。
obs.nls <- nls(obs ~ k / (a + rain), start=list(a=1, k=40))
summary(obs.nls)
#
# Formula: obs ~ k/(a + rain)
#
# Parameters:
# Estimate Std. Error t value Pr(>|t|)
# a 1.4169 0.4245 3.337 0.00286 **
# k 117.5345 16.6878 7.043 3.55e-07 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 4.638 on 23 degrees of freedom
Number of iterations to convergence: 10
Achieved convergence tolerance: 6.763e-06