zhijie zhang
2008-Mar-24 09:23 UTC
[R] Great difference for piecewise linear function between R and SAS
Dear Rusers,
I am now using R and SAS to fit the piecewise linear functions, and what
surprised me is that they have a great differrent result. See below.
#R code--Knots for distance are 16.13 and 24, respectively, and Knots for y
are -0.4357 and -0.3202
m.glm<-glm(mark~x+poly(elevation,2)+bs(distance,degree=1,knots=c(16.13,24))
+bs(y,degree=1,knots=c(-0.4357,-0.3202
)),family=binomial(logit),data=point)
summary(m.glm)
Coefficients:
Estimate Std. Error z
value Pr(>|z|)
(Intercept) 12.104 3.138
3.857 0.000115 ***
x 5.815 1.987
2.926 0.003433 **
poly(elevation, 2)1 6.654 4.457
1.493 0.135444
poly(elevation, 2)2 -6.755 3.441 -
1.963 0.049645 *
bs(distance, degree = 1, knots = c(16.13, 24))1 -1.291 1.139 -
1.133 0.257220
bs(distance, degree = 1, knots = c(16.13, 24))2 -10.348 2.025 -
5.110 3.22e-07 ***
bs(distance, degree = 1, knots = c(16.13, 24))3 -3.530 3.752 -
0.941 0.346850
bs(y, degree = 1, knots = c(-0.4357, -0.3202))1 -6.828 1.836 -
3.719 0.000200 ***
bs(y, degree = 1, knots = c(-0.4357, -0.3202))2 -4.426 1.614 -
2.742 0.006105 **
bs(y, degree = 1, knots = c(-0.4357, -0.3202))3 -11.216 2.861 -
3.920 8.86e-05 ***
#SAS codes
data b;
set a;
if distance > 16.13 then d1=1; else d1=0;
distance2=d1*(distance - 16.13);
if distance > 24 then d2=1; else d2=0;
distance3=d2*(distance - 24);
if y>-0.4357 then dd1=1; else dd1=0;
y2=dd1*(y+0.4357);
if y>-0.3202 then dd2=1; else dd2=0;
y3=dd2*(y+0.3202);
run;
proc logistic descending data=b;
model mark =x elevation elevation*elevation distance distance2 distance3 y
y2 y3;
run;
The LOGISTIC Procedure Analysis of Maximum Likelihood
Estimates
Standard Wald
Parameter DF Estimate Error
Chi-Square Pr > ChiSq
Intercept 1 -2.6148 2.1445
1.4867
0.2227
x 1 5.8146 1.9872
8.5615
0.0034
elevation 1 0.4457 0.1506
8.7545
0.0031
elevation*elevation 1 -0.0279 0.0142
3.8533
0.0496
distance 1 -0.1091 0.0963
1.2836
0.2572
distance2 1 -1.0418 0.2668
15.2424
<.0001
distance3 1 2.8633 0.7555
14.3625
0.0002
y 1 -16.2032 4.3568
13.8314
0.0002
y2 1 36.9974 10.3219
12.8476
0.0003
y3 1 -58.4938 14.0279
17.3875
<.0001
Q: What is the problem? which one is correct for the piecewise linear
function?
Thanks very much.
--
With Kind Regards,
oooO:::::::::
(..):::::::::
:\.(:::Oooo::
::\_)::(..)::
:::::::)./:::
::::::(_/::::
:::::::::::::
[***********************************************************************]
Zhi Jie,Zhang ,PHD
Tel:+86-21-54237149
Dept. of Epidemiology,School of Public Health,Fudan University
Address:No. 138 Yi Xue Yuan Road,Shanghai,China
Postcode:200032
Email:epistat@gmail.com
Website: www.statABC.com
[***********************************************************************]
oooO:::::::::
(..):::::::::
:\.(:::Oooo::
::\_)::(..)::
:::::::)./:::
::::::(_/::::
:::::::::::::
[[alternative HTML version deleted]]
Duncan Murdoch
2008-Mar-24 09:48 UTC
[R] Great difference for piecewise linear function between R and SAS
On 24/03/2008 5:23 AM, zhijie zhang wrote:> Dear Rusers, > I am now using R and SAS to fit the piecewise linear functions, and what > surprised me is that they have a great differrent result. See below.You're using different bases. Compare the predictions, not the coefficients. To see the bases that R uses, do this: matplot(distance, bs(distance,degree=1,knots=c(16.13,24))) matplot(y, bs(y,degree=1,knots=c(-0.4357,-0.3202))) Duncan Murdoch> #R code--Knots for distance are 16.13 and 24, respectively, and Knots for y > are -0.4357 and -0.3202 > m.glm<-glm(mark~x+poly(elevation,2)+bs(distance,degree=1,knots=c(16.13,24)) > +bs(y,degree=1,knots=c(-0.4357,-0.3202 > )),family=binomial(logit),data=point) > summary(m.glm) > > Coefficients: > Estimate Std. Error z > value Pr(>|z|) > (Intercept) 12.104 3.138 > 3.857 0.000115 *** > x 5.815 1.987 > 2.926 0.003433 ** > poly(elevation, 2)1 6.654 4.457 > 1.493 0.135444 > poly(elevation, 2)2 -6.755 3.441 - > 1.963 0.049645 * > bs(distance, degree = 1, knots = c(16.13, 24))1 -1.291 1.139 - > 1.133 0.257220 > bs(distance, degree = 1, knots = c(16.13, 24))2 -10.348 2.025 - > 5.110 3.22e-07 *** > bs(distance, degree = 1, knots = c(16.13, 24))3 -3.530 3.752 - > 0.941 0.346850 > bs(y, degree = 1, knots = c(-0.4357, -0.3202))1 -6.828 1.836 - > 3.719 0.000200 *** > bs(y, degree = 1, knots = c(-0.4357, -0.3202))2 -4.426 1.614 - > 2.742 0.006105 ** > bs(y, degree = 1, knots = c(-0.4357, -0.3202))3 -11.216 2.861 - > 3.920 8.86e-05 *** > > #SAS codes > data b; > set a; > if distance > 16.13 then d1=1; else d1=0; > distance2=d1*(distance - 16.13); > if distance > 24 then d2=1; else d2=0; > distance3=d2*(distance - 24); > if y>-0.4357 then dd1=1; else dd1=0; > y2=dd1*(y+0.4357); > if y>-0.3202 then dd2=1; else dd2=0; > y3=dd2*(y+0.3202); > run; > > proc logistic descending data=b; > model mark =x elevation elevation*elevation distance distance2 distance3 y > y2 y3; > run; > > > The LOGISTIC Procedure Analysis of Maximum Likelihood > Estimates > > Standard Wald > Parameter DF Estimate Error > Chi-Square Pr > ChiSq > > Intercept 1 -2.6148 2.1445 > 1.4867 > 0.2227 > x 1 5.8146 1.9872 > 8.5615 > 0.0034 > elevation 1 0.4457 0.1506 > 8.7545 > 0.0031 > elevation*elevation 1 -0.0279 0.0142 > 3.8533 > 0.0496 > distance 1 -0.1091 0.0963 > 1.2836 > 0.2572 > distance2 1 -1.0418 0.2668 > 15.2424 > <.0001 > distance3 1 2.8633 0.7555 > 14.3625 > 0.0002 > y 1 -16.2032 4.3568 > 13.8314 > 0.0002 > y2 1 36.9974 10.3219 > 12.8476 > 0.0003 > y3 1 -58.4938 14.0279 > 17.3875 > <.0001 > Q: What is the problem? which one is correct for the piecewise linear > function? > Thanks very much. > >
Seemingly Similar Threads
- What is the correct model formula for the results of piecewise linear function?
- Bug in lnme package?
- fastest way to compute the squared Euclidean distance between two vectors in R
- Scaling behavior ov bVar from lmer models
- what's wrong with my "gls"? it does not allocate memory... even for the simplest AR1 model...