|
|
也许可以试试看piecewise linear regression,既然你已经知道应该分成两段了。我当时是用R语言的一个名叫“segmented”的包来做的,相应的网址为 https://cran.r-project.org/web/packages/segmented/index.html ,需要注意的是如果在正式发表的工作中用到“segmented”这个包的话,要引用网址开头提到的几篇文献。安装过程我简单说一下,得先装好R语言和RStudio,然后打开RStudio,在左边输入“install.packages(c("nlme", "MASS", "segmented"))”。
然后在Excel中从第二行开始写好两列数据,在A1单元格写“x”,在B1单元格写“y”,然后单击“File”,再单击“Save”,把“Save as type:”改成“CSV (Comma delimited) (*.csv)”。把csv文件放在桌面上,为方便起见,文件名就是file.csv。我当时是在英文版的Windows上操作的,中文版上有些许不同。
然后打开RStudio,输入以下代码:
- #pay attention to the format of the directory
- setwd("C:\\Users\\[USERNAME]\\Desktop")
- df <- read.csv("file.csv", sep = ",")
- View(df)
- library(segmented)
- #fit simple linear regression model
- fit <- lm(y ~ x, data=df)
- #fit piecewise regression model to original model, estimating a breakpoint at x=12
- segmented.fit <- segmented(fit, seg.Z = ~x, psi=12)
- #view summary of segmented model
- summary(segmented.fit)
复制代码 代码的第二行就是桌面的路径,里面的“[USERNAME]”得换成用户名。我从未在Windows操作系统上用过中文用户名,如果你是中文用户名的话,建议换个目录存储csv文件,相应的,代码的第二行需要改动。Windows上R语言里面路径的格式有点繁琐,需要留心。代码的第12行需要对所谓的“变点”提供一个初始猜测,这个实际操作中用的就是肉眼观察到的斜率发生变化的区域的自变量的值。
然后,输出如下(我直接用的我的一次操作中的输出):
- ***Regression Model with Segmented Relationship(s)***
- Call:
- segmented.lm(obj = fit, seg.Z = ~x, psi = 12)
- Estimated Break-Point(s):
- Est. St.Err
- psi1.x 13.42 1.179
- Meaningful coefficients of the linear terms:
- Estimate Std. Error t value Pr(>|t|)
- (Intercept) 38.1363 0.9392 40.605 < 2e-16 ***
- x -1.0005 0.1233 -8.112 5.73e-11 ***
- U1.x 1.0832 0.1439 7.529 NA
- ---
- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
- Residual standard error: 2.451 on 55 degrees of freedom
- Multiple R-Squared: 0.7354, Adjusted R-squared: 0.7209
- Boot restarting based on 7 samples. Last fit:
- Convergence attained in 2 iterations (rel. change 1.1647e-08)
复制代码 输出的解读略有点繁琐,如果x小于13.42的话,y=-1.0005x+38.1363。如果x大于等于13.42的话,y=-1.0005*13.42+38.1363+(-1.0005+1.0832)(x-13.42)=0.0827x+23.5998。
|
|