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. > >
Apparently Analagous 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...