تمرین درس R(رگرسیون غیر خطی در R) هلیا علیزده

1402/06/14

دسترسی سریع


هلیا علیزاده تمرین درس R رگرسیون غیر خطی در R  

  • برای بررسی معادله روابط متغییر هایی که نوه ی تغییرات متقابل انها به صورت خطی نباشند از رگرسیون غیر خطی استفاده می شود .

رگرسیون غیر خطی انواع خاصی دارد که رد ان یک مدل ریاضیتی غیر خطی برای تشریح رابطه متغییر ها ب کار گرفته می شود . در مدل غیر خطی  حداقل یکی از ضرایب مدل در شکل غیر خطی حضور دارد. یکی از مشهورترین مدل های غیر خطی مدل های رشد نمایی است . تجزیه رگرسیون غیر خطی در نرم افزار R  با تابع nls() صورت میگیرد . شکل کلی استفاده از تابع  غیرخطی به صورت زیر است : ((رابطه غیر خطی)~  متغیر وابسته ) nls نحوه ی استفاده از تابع nls مثال : رابطه وزن جوجه ها بر حسب کیلو گرم (آبجکت weight)  با سن آنها بر حسب روز (آبجکت time) با اندازه گیری یازده  فرد مورد مطالعه قرار گرفته است . برای یافتن معادلات غیر خطی و رسم منحنی آنها به مقادیر اولیه ضرایب (پارامتر ها) مدل نیاز است . ابتدا نمودار پراکنش نقاط ترسیم می شود تا رابطه دو متغییر بیان گردد . در همین راستا نیز می توانید از مقاله ای تخصصی رگرسیون ریچ را بررسی کنید.

> time<-c(6,7,8,9,10,11,12,13,14,15,16)

> weight<-c(29,52,79,125,181,261,425,738,1130,1882,2812)

> plot(time,weight)

  در نمودار مشاهده می کنیم که تغییرات وزن جوجه ها در هر زمان ب صورت یک منحنی (غیر خطی) افزایش یافته است . استفاده از رگرسیمو غیر خطی دقت بیشتری در تخمین وزن جوجه دارد   استفاده از تابع nls

> para.st<-c(a=0.006,b=4.600)

> nlmodel1<-nls(weight~(a*time^b),start=para.st,trace=T)

693847.5 :  0.006 4.600

683618.5 :  0.005566805 4.627912047

673420.9 :  0.005169855 4.655487761

663254.8 :  0.004805834 4.682726097

653120.7 :  0.004471749 4.709626300

643019.7 :  0.004164896 4.736187896

632953.4 :  0.003882832 4.762410665

632450 :  0.00336386 4.81417864

630663.7 :  0.002924614 4.864847248

627549.1 :  0.002551942 4.914382422

623094.7 :  0.002234944 4.962756063

617317.7 :  0.001964585 5.009945907

610259.6 :  0.001733368 5.055935377

601981.8 :  0.001535064 5.100713305

592561.8 :  0.001364497 5.144273649

582088.8 :  0.001217356 5.186615153

570660.7 :  0.001090046 5.227740969

558380.8 :  0.0009795636 5.2676582659

545355.1 :  0.0008833981 5.3063778449

531690 :  0.000799443 5.343913729

517490.4 :  0.0007259293 5.3802827905

502858.2 :  0.0006613679 5.4155043504

487890.7 :  0.0006045025 5.4495998273

472680.3 :  0.000554271 5.482592408

471126.9 :  0.000465275 5.546421017

462810.3 :  0.0003953606 5.6064939036

448930.8 :  0.0003399161 5.6628571207

430723.7 :  0.0002955267 5.7156051004

409361.6 :  0.0002596515 5.7648688326

385896 :  0.0002303887 5.8108050259

361228 :  0.0002063054 5.8535867796

351469.4 :  0.0001663235 5.9332050763

322507.9 :  0.0001387286 6.0024949047

284170.7 :  0.0001191369 6.0623167246

261374.8 :  9.055774e-05 6.165176e+00

241809.6 :  0.0000603775 6.3158220281

20093.78 :  4.643976e-05 6.454989e+00

13958.51 :  4.889906e-05 6.443546e+00

13941.47 :  4.898083e-05 6.443344e+00

13941.47 :  4.898192e-05 6.443336e+00

> summary(nlmodel1)

Formula: weight ~ (a * time^b)

Parameters:

   Estimate Std. Error t value Pr(>|t|)   

a 4.898e-05  2.043e-05   2.397   0.0401 * 

b 6.443e+00  1.529e-01  42.137 1.19e-11 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 39.36 on 9 degrees of freedom

Number of iterations to convergence: 39

Achieved convergence tolerance: 6.912e-07

  همانگونه که می شود از براطش مدل  رابطه وزن جوجه و سن آن بصورت    به دست آمده است . برای رسم نمودار پراکنش نقاط و مشاهده منحنی دستور زیر را به کار می بریم

(plot(time,weight<

((lines(time,fitted.values(nlmodel1<

  مقادیر برآورد اولیه ضرایب مدل (b,a) ب صورت تجربی و یا با ملاحضات تئوری توصیف می شود در این مثال از براورد های اولیه a=0.006  و b=4.6 استفاده گردید . روش ساده برآورد مقادیر اولیه ضرایب مدل استفاده از رگرسیون خطی یا داده های تبدیل شده می باشد . در مثال زیر نحوه برآورد این مقادیر اولیه در مورد این داده ها نشان داده شده است .

(( lm(log(weight)~log(time<

 

Call:

((lm(formula = log(weight) ~ log(time

Coefficients:

(Intercept)    log(time) 

     -5.174        4.611 

  همانگونه که مشاهده می شود مدل تبدیل شده بصورت زیر می باشد

(ln(weight)=-5.174+4.611 ln(time

b=4.6 و  برآورد های اولیه ضرایب مدل نمایی می باشد . در مواردی که مدل ها ناشناخته اند و برآورد اولیه پارامترها کمی دشوار باشد می توان از تابع getInitial() و یک تابع همراه دیگر (بر حسب نوع رابطه ) استفاده کرد . در مثال زیرداده هایی که دارای رابطه به شکل منحنی لجستیک هستند مورد استفاده قرارگرفته است تابه کارگیری توابع  nls() و getInitial() و Sslogis()  مدل غیر خطی مناسب برازش داده شود .   داده های پیشرفت شدت بیماری (severity) در طی زمان (time) بصورت داده چارچوب دار (با استفاده از تابع data.frame()) در ابجکت disease نگهداری شده اند . ایتدا نمودار پراکنش نقاط با استفاده از تابع plot() ترسیم می شود  

 disease<

data.frame(severity=c(42,51,59,64,76,93,106,125,149,171,199),time=c(0,1,2,3,4,5,6,7,8,9,10))

( plot(disease$time,disease$severity<

  همانگونه که مشاهده می شود نوع ارتباط 2متغیر از نوع غیر خطی است . تجربیات قبلی  و شکل پرا کنش نقاط نشان می دهد که نوع رابطه بصورت یک تابع لجستیک  می باشد . ابتدا با استفاده از توابع  getInitial() و Sslogis() مقادیر اولیه ضرایب مدل لجستیک تخمین زده می شود .

> getInitial(severity~SSlogis(time,a,xmid,scale),data=disease)

          a        xmid       scale

9907.723356   34.581254    6.329369

تخمین اولیه ضریب b نیز برابر با کسر xmid/scale است . تخمین های اولیه را درون آبجکت para1  نگهداری می نماییم .

> para1<-c(a=9907.73,b=34.58/6.33,r=1.633)

> para1

          a           b           r

9907.730000    5.462875    1.633000

  مقادیر تخمین های اولیه را رد برهان start= قرار می دهیم .  

> nlmodel2<-nls(severity~(a/(1+exp(b-r*time))),data=disease,start=para1)

> nlmodel2

Nonlinear regression model

  model: severity ~ (a/(1 + exp(b - r * time)))

   data: disease

       a        b        r

9902.828    5.463    0.158

 residual sum-of-squares: 32.39

 

Number of iterations to convergence: 31

Achieved convergence tolerance: 2.455e-06

  چنانچه بخواهیم دوره های تخمین ضرایب را مشاهده کنیم برهان trace=T را نیز در تابع فوق قرار می دهیم . همانگونه که در خروجی فوق مشاهده می شود رابطه شدت بیماری (severity) و زمان (time) بصورت  می باشد .  

> summary(nlmodel2)

Formula: severity ~ (a/(1 + exp(b - r * time)))

Parameters:

   Estimate Std. Error t value Pr(>|t|)   

a 9.903e+03  5.499e+04   0.180    0.862   

b 5.463e+00  5.556e+00   0.983    0.354   

r 1.580e-01  1.082e-02  14.606 4.73e-07 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.012 on 8 degrees of freedom

Number of iterations to convergence: 31

Achieved convergence tolerance: 2.455e-06

    برای مشاهده منحنی این رابطه به همراه نقاط مشاهده شده دستورات زیر را اضافه می نماییم .  

> plot(disease$time,disease$severity)

> curve(9902.134/(1+exp(5.463-0.158*x)),from=0,to=10,add=TRUE)

  همانگونه که مشاهده می شود با استفاده از  تابع curve() و معادله منحنی ، شکل آن ترسیم شده است برهان add=TRUE به شما اجازه می دهد تا منحنی را روی نمودار پراکنش نقاط اضافه نمایید . در این مورد که رابطه متغییر ها ب صورت تابع لجستیک بود از تابع Sslogis() برای تخمین اولیه ضرایب مدل استفاده گردید . در نرم افزار R توابع مشابهی برای تخمین ضرایب مدل های نمایی همانند Ssexp()  و مدل ویبولی  همانند Ssweibull() وجود دارد .   در زیر مثالی برای تابع nls() گفته ایم :

Examples

require(graphics)

DNase1 <- subset(DNase, Run == 1)

 

## using a selfStart model## با استفاده از مدل خود شروع

fm1DNase1 <- nls(density ~ SSlogis(log(conc), Asym, xmid, scal), DNase1)

summary(fm1DNase1)

## the coefficients only:  # # فقط ضرایب:

coef(fm1DNase1)

## including their SE, etc:  ## جمله SE خود، و غیره:

coef(summary(fm1DNase1))

 

## using conditional linearity  ## با استفاده از خطی مشروط

fm2DNase1 <- nls(density ~ 1/(1 + exp((xmid - log(conc))/scal)),

                 data = DNase1,

                 start = list(xmid = 0, scal = 1),

                 algorithm = "plinear")

summary(fm2DNase1)

 

## without conditional linearity  ## با استفاده از خطی مشروط

fm3DNase1 <- nls(density ~ Asym/(1 + exp((xmid - log(conc))/scal)),

                 data = DNase1,

                 start = list(Asym = 3, xmid = 0, scal = 1))

summary(fm3DNase1)

## using Port's nl2sol algorithm   ## با استفاده از الگوریتم nl2sol پورتر

fm4DNase1 <- nls(density ~ Asym/(1 + exp((xmid - log(conc))/scal)),

                 data = DNase1,

                 start = list(Asym = 3, xmid = 0, scal = 1),

                 algorithm = "port")

summary(fm4DNase1)

## weighted nonlinear regression  ## رگرسیون غیر خطی وزن دار

Treated <- Puromycin[Puromycin$state == "treated", ]

weighted.MM <- function(resp, conc, Vm, K)

{

    ## Purpose: exactly as white book p. 451 -- RHS for nls()

    ##  Weighted version of Michaelis-Menten model

    ## ----------------------------------------------------------

    ## Arguments: 'y', 'x' and the two parameters (see book)

    ## ----------------------------------------------------------

    ## Author: Martin Maechler, Date: 23 Mar 2001

## هدف: دقیقا به عنوان سفید ص کتاب. 451 - RHS برای NLS () ## نسخه وزنی مدل Michaelis به-منتن ## ------------------------------------------------ ---------- برهان ##: 'Y'، 'X' و دو پارامتر (کتاب را ببینید) ## ------------------------------------------------ ---------- ## نویسنده: مارتین Maechler، تاریخ: 2001 مارس 23

    pred <- (Vm * conc)/(K + conc)

    (resp - pred) / sqrt(pred)

}   Pur.wt <- nls( ~ weighted.MM(rate, conc, Vm, K), data = Treated, start = list(Vm = 200, K = 0.1))

summary(Pur.wt)

## Passing arguments using a list that can not be coerced to a data.frame

## عبور استدلال با استفاده از یک لیست است که می تواند به یک data.frame تومی نمیتواند مجبور

lisTreat <- with(Treated,

                 list(conc1 = conc[1], conc.1 = conc[-1], rate = rate))

weighted.MM1 <- function(resp, conc1, conc.1, Vm, K)

{

     conc <- c(conc1, conc.1)

     pred <- (Vm * conc)/(K + conc)

    (resp - pred) / sqrt(pred)

}

Pur.wt1 <- nls( ~ weighted.MM1(rate, conc1, conc.1, Vm, K),

               data = lisTreat, start = list(Vm = 200, K = 0.1))

stopifnot(all.equal(coef(Pur.wt), coef(Pur.wt1)))

## Chambers and Hastie (1992) Statistical Models in S  (p. 537):

## If the value of the right side [of formula] has an attribute called

## 'gradient' this should be a matrix with the number of rows equal

## to the length of the response and one column for each parameter.

## اتاق و HASTIE (1992) مدل های آماری در S (ص 537): ## اگر مقدار سمت راست [از فرمول] دارای یک ویژگی به نام ##، شیب، این باید یک ماتریس با تعداد ردیف برابر باشد # # به طول پاسخ و یک ستون برای هر پارامتر.

weighted.MM.grad <- function(resp, conc1, conc.1, Vm, K)

{

  conc <- c(conc1, conc.1)

  K.conc <- K+conc

  dy.dV <- conc/K.conc

  dy.dK <- -Vm*dy.dV/K.conc

  pred <- Vm*dy.dV

  pred.5 <- sqrt(pred)

  dev <- (resp - pred) / pred.5

  Ddev <- -0.5*(resp+pred)/(pred.5*pred)

  attr(dev, "gradient") <- Ddev * cbind(Vm = dy.dV, K = dy.dK)

  dev

}

Pur.wt.grad <- nls( ~ weighted.MM.grad(rate, conc1, conc.1, Vm, K),

                   data = lisTreat, start = list(Vm = 200, K = 0.1))

rbind(coef(Pur.wt), coef(Pur.wt1), coef(Pur.wt.grad))

## In this example, there seems no advantage to providing the gradient.

## In other cases, there might be.

## The two examples below show that you can fit a model to

## artificial data with noise but not to artificial data

## without noise.

## در این مثال، به نظر می رسد هیچ مزیت به ارائه شیب وجود دارد. ## در موارد دیگر، ممکن است وجود داشته باشد. # # دو مثال زیر نشان می دهد که شما می توانید یک مدل را به تناسب ## داده های مصنوعی با سر و صدا اما نه به داده های مصنوعی ## بدون سر و صدا.

x <- 1:10

y <- 2*x + 3                            # perfect fit

yeps <- y + rnorm(length(y), sd = 0.01) # added noise

nls(yeps ~ a + b*x, start = list(a = 0.12345, b = 0.54321))

## terminates in an error, because convergence cannot be confirmed:

## خاتمه یافته در یک خطا، به دلیل همگرایی نمی توان تایید کرد:

try(nls(y ~ a + b*x, start = list(a = 0.12345, b = 0.54321)))

## the nls() internal cheap guess for starting values can be sufficient:

# # NLS به () حدس ارزان داخلی برای شروع مقادیر می تواند به اندازه کافی:

x <- -(1:100)/10

y <- 100 + 10 * exp(x / 2) + rnorm(x)/10

nlmod <- nls(y ~  Const + A * exp(B * x))

plot(x,y, main = "nls(*), data, true function and fit, n=100")

curve(100 + 10 * exp(x / 2), col = 4, add = TRUE)

lines(x, predict(nlmod), col = 2)

## The muscle dataset in MASS is from an experiment on muscle

## contraction on 21 animals.  The observed variables are Strip

## (identifier of muscle), Conc (Cacl concentration) and Length

## (resulting length of muscle section).

## مجموعه داده عضلانی در جرم از یک آزمایش در مورد عضله ## انقباض در 21 حیوانات. متغیرهای مشاهده شده است نوار ## (شناسه عضلانی)، بتنی (غلظت CACL) و طول ## (طول بخش عضله ناشی).

utils::data(muscle, package = "MASS")

## The non linear model considered is

##       Length = alpha + beta*exp(-Conc/theta) + error

## where theta is constant but alpha and beta may vary with Strip.

## مدل غیر خطی در نظر گرفته است ## طول = آلفا + بتا * EXP (-Conc / تتا) + خطا ## که در آن تتا ثابت است اما آلفا و بتا ممکن است با نوار متفاوت است.

with(muscle, table(Strip)) # 2, 3 or 4 obs per strip

## We first use the plinear algorithm to fit an overall model,

## ignoring that alpha and beta might vary with Strip.

## ما برای اولین بار استفاده از الگوریتم خطی به جا یک مدل به طور کلی، ## نادیده گرفتن که آلفا و بتا ممکن است با نوار متفاوت است.

musc.1 <- nls(Length ~ cbind(1, exp(-Conc/th)), muscle,

              start = list(th = 1), algorithm = "plinear")

summary(musc.1)

## Then we use nls' indexing feature for parameters in non-linear

## models to use the conventional algorithm to fit a model in which

## alpha and beta vary with Strip.  The starting values are provided

## by the previously fitted model.

## Note that with indexed parameters, the starting values must be

## given in a list (with names):

## سپس با استفاده از ویژگی های نمایه سازی NLS برای پارامترها در غیر خطی مدل ## به استفاده از الگوریتم معمولی به تناسب مدل که در آن ## آلفا و بتا با نوار متفاوت است. ارزش شروع ارائه شده است ## با استفاده از مدل قبلا نصب شده است. ## توجه داشته باشید که با پارامترهای نمایه، ارزش شروع باید ## داده شده در یک لیست (با نام):

b <- coef(musc.1)

musc.2 <- nls(Length ~ a[Strip] + b[Strip]*exp(-Conc/th), muscle,

              start = list(a = rep(b[2], 21), b = rep(b[3], 21), th = b[1]))

summary(musc.2)

   

نظرات

هیچ نظری وجود ندارد.


افزودن نظر

Sitemap
Copyright © 2017 - 2023 Khavarzadeh®. All rights reserved