Ana içeriğe geç

R ile Doğrusal Olmayan Modellere Giriş ve İçgörüler

Doğrusal olmayan modellerin doğrusal modellere kıyasla inceliklerini keşfedin. Gerçek veri setleri kullanarak uygulamalarını, sınırlamalarını ve nasıl uydurulacağını öğrenin.
· 11 dk. oku

Yapay Zeka ile Keşfedin

Bu eğitim, topluluğumuzdan değerli bir katkıdır ve netlik ile doğruluk için DataCamp tarafından düzenlenmiştir.

Kendi uzmanlığınızı paylaşmak ister misiniz? Sizden haber almaktan memnuniyet duyarız! Makalelerinizi veya fikirlerinizi Topluluk Katkı Formu üzerinden gönderebilirsiniz.

Doğrusal olmayan modeller artık eskisi kadar popüler değil. Günümüzde birçok kitap, doğrusal olmayan modellere ya hiç yer vermiyor ya da sınırlı ölçüde açıklıyor. Bunun bir dizi nedeni var. Öncelikle, daha yüksek dereceden polinom terimleri kullanarak veya bir temel fonksiyon uygulayarak (başka bir deyişle, açıklayıcı değişkenler üzerinde log veya karekök dönüşümü uygulayarak) doğrusal regresyonla doğrusal olmayan bir eğri uydurulabilir. İkinci olarak, doğrusal modellerin yorumlanması ve açıklanması kolay olduğundan, karmaşık modellere kıyasla sadelik tercih edilebilir.

Ayrıca, doğrusal olmayan bir modeli uygulamak için veriyi görselleştirmek ve eğilimi hissetmek önemlidir; bu da çok değişkenli bir düzende mümkün değildir. Son olarak, doğrusal olmayan modeller, olguların tamamen fiziksel ya da deterministik olduğu mekanistik durumlar için en uygunudur; bu ise kullanıcı aktivitelerinin makineler tarafından kaydedildiği büyük veri için geçerli değildir.

Yine de tüm bu geçerli nedenlere rağmen, doğrusal olmayan modelleme keşfedilmeye ve doğrusal karşılığıyla karşılaştırılmaya değer, güzel bir bilimdir.

Doğrusal Olmayan Regresyon Modeli

Doğrusal olmayan bir model için tahmin teknikleri açıkça yinelemelidir. Ayrıca, doğrusal olmayan bir formülün uygulanışında, doğrusal formülden farklı temel bir fark vardır. Aşağıdaki üç farklı denklem/formülün her biri, y değişkeni ile B0, B1 ve B2 arasındaki ilişkinin doğru bir çizgi olması nedeniyle doğrusal kabul edilir.

Bir formülü doğrusal olmayan yapan ise şuna benzer bir şeydir:

B0 veya B1 kullanımı keyfidir. Ancak son iki denklemde, y değişkeni ile B0 arasında doğru bir çizgi ilişkisi yoktur.

Ne yazık ki bu, hesaplamaları daha zor hale getirir ve tahmin problemine sayısal bir çözümün başarılı olması garanti edilmez. Dolayısıyla, doğrusal olmayan modeller, sonuçlara ulaşmanın sezgisel ya da isabetli olmayabileceğine dair bir uyarı taşır.

Uzmanlaşmış Model

Genellikle doğrusal olmayan bir model uygulanırken, uzmanlaşmış türler kullanılır. Bu, doğrusal olmayan bir modeli uydurmayı daha uygun veya sayısal olarak daha kolay hale getirir; ancak bir konu uzmanı tarafından onaylanması ve verilerle uyumlu olması gerekir. Uzmanlaşmış türlerden kastımız, önceden tanımlı bir matematiksel denklemin kullanılmasıdır. En sık kullanılan doğrusal olmayan denklemlerin listesi aşağıdadır (bazıları kısalık adına çıkarılmıştır).

Doğrusal Olmayan Regresyon Modelinde İzlenecek Strateji

  1. Verileri görselleştirerek en iyi açıklamayı yapabilecek uzmanlaşmış bir matematiksel fonksiyon olup olmadığını görün.
  2. Grafiği göz kararıyla inceleyerek veya bir self-starter fonksiyonu (aşağıda açıklanmıştır) kullanarak başlangıç parametre değerlerini seçin.
  3. Modeli uydurun ve inceleyin.
  4. Parametre güven aralığını, artık hatayı ve açıklanan varyasyonu anlamak için uydurulan model üzerinde istatistiksel analiz yapın.
  5. Artık hatayı azaltmaya yardımcı oluyorsa modele daha fazla parametre eklemeyi deneyin.
  6. Daima bir doğrusal model de uydurun ve doğrusal olmayan ve doğrusal modellerin sonuçlarını karşılaştırın.

Bir Örnek Üzerinden Doğrusal Olmayan Modelin Açıklanması

Popüler bir veri kümesi olan Puromycin üzerinde uzmanlaşmış bir doğrusal olmayan model uyduracağız. Bu veri kümesi, Puromycin ilacıyla etkileşen hücreleri içeren bir enzimatik reaksiyon için reaksiyon hızını ve yoğunluk bilgisini sunar. Veriler, biri Puromycin ile tedavi edilmiş, diğeri bu ilaçla tedavi edilmemiş iki hücre sınıfını içerir.

names(Puromycin)Puromycin'conc''rate''state'

Bu veri çerçevesindeki üç değişken; substratın derişimi, reaksiyonun başlangıç hızı ve tedavi edilmiş/edilmemiş göstergesidir.

Hızı derişime karşı çizip iki tedavi düzeyini etiketlediğimizde genel bir örüntü görebiliriz. Eğriler asimptotiktir ve tedavi edilmiş ve edilmemiş hücre kohortları için oldukça farklıdır.

plot(Puromycin$conc, Puromycin$rate, type="n", xlab = "conc", ylab = "rate")text(Puromycin$conc, Puromycin$rate,      ifelse(Puromycin$state == "treated", "T", "U"))

Bu veriler, reaksiyon hızı ile derişim arasında güçlü bir Michaelis-Menten ilişkisi sergilediğinden, deney yapanlar aşağıdaki matematiksel denklemi uydurmayı bekler.

Burada E, deney hatasıdır. Doğrusal model için kullanılan benzetmeyle, doğrusal olmayan uzmanlaşmış bir model aracılığıyla, artıkların kareleri toplamını en aza indirecek Vmax ve K parametrelerini tahmin etmeye çalışırız (yine de bu parametreleri tahmin etmek için kullanılabilecek başka yöntemler de vardır):

Doğrusal Olmayan Bir Modelin Uydurulması

İlişkiyi biliyor olsak da, doğrusal olmayan bir modelin uydurulması o kadar da basit değildir çünkü model Vmax ve K için başlangıç tahminleri gerektirir. İyi bir başlangıç tahmini seçilemezse model veriye kötü uyabilir. İki seçenek vardır:

  • Başlangıç değerlerini bulmak için grafiği göz kararıyla incelemek.
  • Veya bir self-starter fonksiyonu kullanmak (aşağıda verilmiştir).

Self-Starter Fonksiyonu

Model

SSasymp

asimptotik regresyon modeli

SSasympOff

ötelemeli asimptotik regresyon modeli

SSasympOrig

orijinden geçen asimptotik regresyon modeli

SSbiexp

çift üstel model

SSfol

birinci dereceden bölmeli model

SSfpl

dört parametreli lojistik model

SSgompertz

Gompertz büyüme modeli

SSlogis

lojistik model

SSmicmen

Michaelis–Menten modeli

SSweibull

Weibull büyüme eğrisi modeli

Her model türü için başlangıç tahmini olarak kullanılabilecek karşılık gelen bir self-starter fonksiyonu vardır.

Başlangıç Tahmini Kullanarak Model Uydurma

Vmax = 160, K = 0.05 başlangıç değerleri grafikten gözle bulunarak, R'deki nls() fonksiyonu veriyi uydurmak için kullanılabilir. Genellikle doğrusal regresyonda Vm veya K parametrelerini belirtmemiz gerekmez, ancak doğrusal olmayan modelde durum farklıdır. Her yinelemeli algoritmanın iyi bir başlangıç noktasına ihtiyacı vardır; aksi halde yakınsamayabilir. Puromycin üzerinde başlangıç değerleriyle doğrusal olmayan bir modeli şu şekilde uydururuz.

Purboth_1 <- nls(rate ~ (Vm)*conc/(K+conc), Puromycin, list(Vm=160, K=0.05))summary(Purboth_1)Formula: rate ~ (Vm) * conc/(K + conc)Parameters:Estimate Std. Error t value Pr(>|t|)Vm 190.80624 8.76459 21.770 6.84e-16 ***K 0.06039 0.01077 5.608 1.45e-05 ***---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 18.61 on 21 degrees of freedomNumber of iterations to convergence: 5Achieved convergence tolerance: 5.121e-06

Artık hatanın hesaplanması

Artık hatayı şu şekilde hesaplarız:

sse <- Purboth_1$m$deviance()sse7276.54697931423

Açıklanan varyansın hesaplanması

Bu modelin açıkladığı varyansı bulmak için (doğrusal model terminolojisinde temelde R-kare), bir null model uydurarak toplam varyansı bulmamız, genel ortalamayı tahmin etmemiz ve null model özetinden toplam kareler toplamını, sst'yi çıkarmamız ve ardından açıklanan varyans yüzdesini hesaplamak için bunu kullanmamız gerekir.

sse <- Purboth_1$m$deviance()null <- lm(rate~1, Puromycin)sst <- data.frame(summary.aov(null)[[1]])$Sum.Sqpercent_variation_explained = 100*(sst-sse)/sstpercent_variation_explained85.3488323994681

Bu model, verideki değişimlerin %85,34'ünü açıklar.

Self-Start Fonksiyonu Kullanarak Uydurma

Michaelis-Menten modelini kullandığımız için, bunun yerine SSmicmen() self-start fonksiyonu kullanılabilir. Ancak bu aynı sonuçları verir.

Purboth_self <- nls(rate~SSmicmen(conc,Vm,K), Puromycin)summary(Purboth_self)Formula: rate ~ SSmicmen(conc, Vm, K)Parameters:Estimate Std. Error t value Pr(>|t|)Vm 190.80667 8.76462 21.770 6.84e-16 ***K 0.06039 0.01077 5.608 1.45e-05 ***---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 18.61 on 21 degrees of freedomNumber of iterations to convergence: 4Achieved convergence tolerance: 6.745e-06

Artık hatanın hesaplanması

sse <- Purboth_self$m$deviance()sse7276.54697947673

Açıklanan Varyansın Hesaplanması

Modelin açıkladığı varyansı kontrol edebilirsiniz.

sse <- Purboth_self$m$deviance()null <- lm(rate~1, Puromycin)sst <- data.frame(summary.aov(null)[[1]])$Sum.Sqpercent_variation_explained = 100*(sst-sse)/sstpercent_variation_explained85.348832399141

Genel olarak, hız ile derişim arasındaki ilişki olan uydurulmuş denklem şöyle görünür:

Uydurmanın Görselleştirilmesi

Veri üzerine uydurulmuş bir çizgi çizerek modelin nasıl performans gösterdiği görselleştirilebilir; bu da doğrusal olmayan bir görünüm verir.

plot(Puromycin$conc, Puromycin$rate, xlab="conc", ylab = "rate")lines(Puromycin[Puromycin$state == "treated",]$conc,       predict(Purboth_1, Puromycin[Puromycin$state == "treated",]), col=2)lines(Puromycin[Puromycin$state != "treated",]$conc,       predict(Purboth_1, Puromycin[Puromycin$state != "treated",]), col=2)

Daha İyi Model Seçimi

Modele daha fazla parametre ekleyerek ayar yapılabilir. Hız ile derişim arasındaki grafiği incelerseniz, farklı sınıfların (tedavi edilmiş vs edilmemiş) farklı eğriler izlediğini ve iki sınıf eğrisi arasındaki hız farkının (y ekseni) yaklaşık 40 olarak kestirilebileceğini fark edebilirsiniz.

plot(Puromycin$conc, Puromycin$rate, type="n", xlab = "conc", ylab = "rate")text(Puromycin$conc, Puromycin$rate,      ifelse(Puromycin$state == "treated", "+", "*"))

Esasen, durum değişkenine koşullandırılmış bir model uydurmaya çalışıyoruz; bu da aşağıdaki doğrusal olmayan denkleme yol açıyor.

Model, ek bir delV parametresiyle daha iyi performans gösterir. delV için başlangıç değeri olarak 40 atayıp modeli üç parametre ile nls kullanarak uyduruyoruz.

Purboth <- nls(rate ~ (Vm + delV*(state=="treated"))*conc/(K+conc), Puromycin,                list(Vm=160, delV=40, K=0.05))summary(Purboth)Formula: rate ~ (Vm + delV * (state == "treated")) * conc/(K + conc)Parameters:      Estimate Std. Error t value Pr(>|t|)    Vm   166.60397    5.80742  28.688  < 2e-16 ***delV  42.02591    6.27214   6.700 1.61e-06 ***K      0.05797    0.00591   9.809 4.37e-09 ***---Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 10.59 on 20 degrees of freedomNumber of iterations to convergence: 5 Achieved convergence tolerance: 8.93e-06

Özet, üç parametrenin de istatistiksel olarak anlamlı olduğunu gösteriyor.

Artık Hatanın Hesaplanması

Bu model için artık hatanın önemli ölçüde azaldığı görülebilir:

sse <- Purboth$m$deviance()sse2240.89143883885

Açıklanan Varyansın Hesaplanması

Bu model tarafından açıklanan varyans daha fazladır.

sse <- Purboth$m$deviance()null <- lm(rate~1, Puromycin)sst <- data.frame(summary.aov(null)[[1]])$Sum.Sqpercent_variation_explained = 100*(sst-sse)/sstpercent_variation_explained95.4880142822744

AIC Kontrolü

Her iki model için de AIC kontrolü yapılabilir; gerçi günümüzde yaygın uygulama çapraz doğrulamadır, ancak bu genelde daha fazla veri gerektirir. Genel olarak AIC ne kadar düşükse model o kadar iyidir.

AIC(Purboth)AIC(Purboth_1)178.591273238391203.680274951742

Uydurmanın Görselleştirilmesi

Ayarlanmış modelin nasıl performans gösterdiği, veri üzerinde uydurulmuş bir çizgi çizilerek görselleştirilebilir; şaşırtıcı değil, ayarlanmış model farklı sınıflar için daha iyi bir uyum verir.

plot(Puromycin$conc, Puromycin$rate, xlab="conc", ylab = "rate")lines(Puromycin[Puromycin$state == "treated",]$conc, predict(Purboth, Puromycin[Puromycin$state == "treated",]), col=2)lines(Puromycin[Puromycin$state != "treated",]$conc, predict(Purboth, Puromycin[Puromycin$state != "treated",]), col=3)legend(0, 200, legend = c("treated", "untreated"), fill = c(2,3))

Parametrelerin Güven Aralığı

Sadece p-değerlerine güvenilemez; %95 güven aralığı, her anlamlı parametre için katsayı değerlerini %2,5 ve %97,5 seviyelerinde verir. Hiçbiri 0'ı içermemektedir.

confint(Purboth)

Güven aralığı değerini kullanarak, örneğin Vmax gibi bir parametrenin gerçek değerinin yukarıda verilen aralık içinde yer alma olasılığının %95 olduğunu istatistiksel olarak söyleyebiliriz; Vmax için bu aralık (154.62, 179.25)'tir.

Profilleme

Amaç fonksiyonunu doğrudan inceleyerek, parametre tahminindeki belirsizliği anlamak için model daha ileri düzeyde profillenebilir. Modelimizde Vmax, delV, K olmak üzere üç parametre vardır; bunları profileyebiliriz:

  • Güven aralığını elde etmek için.
  • Ve, doğrusal modelde kullanılan t-istatistiğine benzer profile t fonksiyonunu kullanmak için. Profile t fonksiyonu grafikleri, bireysel parametreler için olabilirlik aralıklarını sağlar ve tahminin ne kadar doğrusal olmayan olduğunu açıklar.

Güven aralığının çizilmesi

Bu, farklı (farklı güven aralıklarına (%%99, %%95, %%90, %%80 ve %%50) karşılık gelen) değerleri için parametrelerin güven aralığını çizer. confint(object, parm, level = 0.95, ...) fonksiyonunun verdiği (%95) güven aralığına benzer.

Purbothpf = profile(Purboth)par( mfrow= c(2,2) )plot(Purbothpf)

T ile parametrelerin çizilmesi

Üç parametre olan Vmax, delV, K'nın T'ye karşı çizilmesi, uyumun doğrusal mı doğrusal olmayan mı olduğu konusunda bir fikir verir. delV ve Vm parametreleri için doğrunun doğrusal göründüğü, K için ise hafifçe eğri olduğu gözlenebilir. Bu beklenir; çünkü K parametresi doğrusal olmayan bir ilişki sergiler.

dataVm = data.frame(Purbothpf$Vm$par.vals)datadelV = data.frame(Purbothpf$delV$par.vals)dataK = data.frame(Purbothpf$K$par.vals)par( mfrow= c(2,2) )plot(dataVm$Vm,Purbothpf$Vm$tau, type="l", xlab = "Vm", ylab = "Tau")plot(datadelV$delV,Purbothpf$delV$tau, type="l", xlab = "delV", ylab = "Tau")plot(dataK$K,Purbothpf$K$tau, type="l", xlab = "K", ylab = "Tau")

Doğrusal Bir Modelin Uydurulması

Aşağıda gösterildiği gibi, aynı R kütüphane fonksiyonu nls() doğrusal bir modeli uydurmak için de kullanılabilir. Yorumlanabilirlik ve karşılaştırma için her zaman bir doğrusal model denemenin iyi bir alışkanlık olduğunu düşünüyorum.

PurbothRealLinear <- nls(rate ~ i + m*conc, Puromycin, list(i=160, m=0.05) )summary(PurbothRealLinear)Formula: rate ~ i + m * concParameters:  Estimate Std. Error t value Pr(>|t|)    i    93.92       8.00   11.74 1.09e-10 ***m   105.40      16.92    6.23 3.53e-06 ***---Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 28.82 on 21 degrees of freedomNumber of iterations to convergence: 2 Achieved convergence tolerance: 2.571e-09

Parametreler anlamlı görünse de uyum zayıftır. Artıkların standart hatası yüksektir.

Uydurmanın Görselleştirilmesi

Doğrusal modelin zayıf performans gösterdiği görülüyor; veriye uydurulmuş bir çizgi çizilerek ve doğrusal olmayan muadiliyle karşılaştırılarak görselleştirilebilir.

plot(Puromycin$conc, Puromycin$rate, xlab="conc", ylab = "rate")lines(Puromycin$conc, predict(PurbothRealLinear), col=4)

Doğrusal Olmayan ve Doğrusal Modelin Analitik Olarak Karşılaştırılması

Yukarıdaki grafikten, doğrusal modelin kötü iş çıkardığını biliyoruz; peki bu modelleri nasıl karşılaştırırız? Elma ile armudu karşılaştırmak gibi olacaktır. AIC sonuçları doğrudan kullanılamaz.

Uyum İyiliği

İyi bir uyumu ne oluşturur? Regresyon için, tahmin edilen değer ile gerçek değerin olabildiğince birbirine yakın olmasıdır. Dolayısıyla, bir modelin R'deki lm() fonksiyonu kullanılarak tahmin ettiklerinin kalitesini incelersek, bunları karşılaştırabiliriz. Daha doğru olan modelde noktalar ideal doğruya yakın düşer. İdeal doğru, %100 isabetli bir modeli temsil eder — her veri noktası için tahmin edilen değer gerçek değerin aynıdır. Bu nedenle tüm noktalar düz bir çizgi üzerinde olacaktır.

Doğrusal Olmayan Uyum

Her bir girdiye karşılık modelle hedef değeri tahmin eder ve ardından aşağıda gösterildiği gibi lm() fonksiyonunu uygularız. Gerçek hız (x ekseni) ile tahmin edilen hız (y ekseni) arasında bir saçılım grafiği çizip ideal bir doğru ekleyerek noktaların bu doğruya ne kadar yakın olduğunu gözlemleyebilirsiniz.

nonLinear_df = data.frame("rate"=Puromycin$rate, "pred_rate"= predict(Purboth))fit_nonLinear = lm(nonLinear_df$rate ~ nonLinear_df$pred_rate)AIC(fit_nonLinear)plot(nonLinear_df$rate, nonLinear_df$pred_rate, xlab="actual_rate",      ylab = "pred_rate",      main = "Comparing Actual vs Predicted for Non Linear Model")lines(Puromycin$rate, Puromycin$rate)174.711198508104

Doğrusal Uyum

Yukarıdaki doğrusal olmayan grafik, aşağıdaki doğrusal grafiğe kıyasla açıkça daha iyi bir uyumdur.

linear_df = data.frame("rate"=Puromycin$rate, "pred_rate"= predict(PurbothRealLinear))fit_linear = lm(linear_df$rate~linear_df$pred_rate)AIC(fit_linear)plot(linear_df$rate, linear_df$pred_rate, xlab="actual_rate", ylab = "pred_rate",      main= "Comparing Actual vs Predicted using lm()")lines(Puromycin$rate, Puromycin$rate)223.783416979551

Doğrusal Modelin İyileştirilmesi

Verilerin düz bir çizgiyi takip etmediği açık olduğundan, doğrusal modele haksızlık ediyor olabiliriz; bu nedenle dönüştürülmüş verilerle modeli uydurmayı deneyebiliriz. Aşağıda gösterildiği gibi conc üzerinde sqrt() dönüşümünü seçip doğrusal bir model uyduruyoruz.

PurbothLinearSqrt = nls(rate ~ i + m*sqrt(conc), Puromycin, list(i=160, m=0.05) )summary(PurbothLinearSqrt)Formula: rate ~ i + m * sqrt(conc)Parameters:  Estimate Std. Error t value Pr(>|t|)    i   60.961      8.758   6.961 7.11e-07 ***m  139.134     15.675   8.876 1.50e-08 ***---Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 22.31 on 21 degrees of freedomNumber of iterations to convergence: 2 Achieved convergence tolerance: 1.838e-09

Gerçekten de artıkların standart hatasında bir düşüş var, ancak beklediğimiz kadar değil.

Uydurmanın çizimi

conc üzerinde sqrt() kullanmanın doğrusal modeli iyileştirdiği açıkça görülebilir. Ancak doğrusal olmayan Purboth modeliyle karşılaştırıldığında daha iyi değildir. PurbothLinearSqrt modelinin artıkların standart hatası Purboth'un neredeyse iki katıdır, bu nedenle bu modeli daha fazla analiz etmeyeceğiz. Daha yüksek dereceli polinom terimleri uydurmayı (polinom regresyon) deneyebilirsiniz; ancak bu modeli ince ayar yapmak için gereken çaba, doğrusal olmayan bir modelle daha iyi sonuçlar elde edilebilirken çok daha fazladır.

plot(Puromycin$conc, Puromycin$rate, xlab="conc", ylab = "rate")lines(Puromycin[Puromycin$state != "treated",]$conc, predict(PurbothLinearSqrt, Puromycin[Puromycin$state != "treated",]), col=2)lines(Puromycin[Puromycin$state != "treated",]$conc, predict(PurbothLinearSqrt, Puromycin[Puromycin$state != "treated",]), col=3)

Doğrusal Olmayan Denklemi Çözümleme

Doğrusal olmayan bir fonksiyonu çözümlemek ve doğrusal bir model uydurmak için bir yöntem uygulanabilir. Bu teknik, hesaplamalar elle yapıldığında, bilgisayarlarla değil, geçmişte kullanılmıştır. Ancak bu tür modeller daha iyi iş çıkaramaz.

Doğrusal Olmayanı Doğrusal Formuna Dönüştürme

Örneğin, Michaelis-Menten denklemi aşağıda gösterildiği gibi tersini alarak değiştirilebilir ve doğrusal bir model uygulamak için bu değiştirilmiş form kullanılabilir.

Aynı nls() fonksiyonunu yeni denklemi uydurmak için kullanabiliriz.

PurbothPseudoLinear <- nls((1/rate) ~ K /(Vm*conc) + 1/Vm , Puromycin,                            list(Vm=160, K=0.05))summary(PurbothPseudoLinear)Formula: (1/rate) ~ K/(Vm * conc) + 1/VmParameters:    Estimate Std. Error t value Pr(>|t|)    Vm 1.674e+02  1.362e+01  12.287 4.70e-11 ***K  3.900e-02  6.172e-03   6.318 2.89e-06 ***---Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 0.001786 on 21 degrees of freedomNumber of iterations to convergence: 3 Achieved convergence tolerance: 2.997e-09

Artıkların standart hatası düşüktür; ancak kullanılan veri bu nedenle doğrusal olmayan modellerle karşılaştırmak için kullanılamaz. En iyi yöntem, her iki modelin de orijinal veri kümesindeki performansını görselleştirmektir.

Uydurmanın çizimi

İki parametre Vmax, K kullanan Purboth_1 modeli ile PurbothPseudoLinear'ı karşılaştırıyoruz. Grafik, doğrusal olmayan bir modelin daha iyi iş çıkardığını açıkça gösteriyor.

plot(Puromycin$conc, Puromycin$rate, xlab="conc", ylab = "rate",      main = "Scatterplot conc vs rate")lines(Puromycin[Puromycin$state == "treated",]$conc,       predict(Purboth_1, Puromycin[Puromycin$state == "treated",]), col=2)lines(Puromycin[Puromycin$state != "treated",]$conc,       predict(Purboth_1, Puromycin[Puromycin$state != "treated",]), col=2)lines(Puromycin[Puromycin$state == "treated",]$conc,       1/predict(PurbothPseudoLinear, Puromycin[Puromycin$state == "treated",])      , col=4)lines(Puromycin[Puromycin$state != "treated",]$conc,       1/predict(PurbothPseudoLinear, Puromycin[Puromycin$state != "treated",])      , col=4)legend(0, 200, legend = c("nls", "nls-turned-linear"), fill = c(2,4))

Uyum İyiliği

Modelin uyum iyiliği karşılaştırılabilir.

nonLinear_df = data.frame("rate"=Puromycin$rate, "pred_rate"= predict(Purboth_1))fit_nonLinear = lm(nonLinear_df$rate ~ nonLinear_df$pred_rate)AIC(fit_nonLinear)203.017860461858
linear_df = data.frame("rate"=Puromycin$rate,                        "pred_rate"= 1/predict(PurbothPseudoLinear))fit_linear = lm(linear_df$rate~linear_df$pred_rate)AIC(fit_linear)206.999538212925

Bu, doğrusal olmayan bir fonksiyon kullanan bir modelin çok daha iyi performans gösterdiğini ortaya koyar.

par( mfrow= c(1,2) )plot(nonLinear_df$rate, nonLinear_df$pred_rate, xlab="actual_rate",      ylab = "pred_rate",      main = "Non-Linear")lines(Puromycin$rate, Puromycin$rate)plot(linear_df$rate, linear_df$pred_rate, xlab="actual_rate", ylab = "pred_rate",      main = "Turned Linear")lines(Puromycin$rate, Puromycin$rate)

Sonuç

Doğrusal olmayan model, özellikle mekanistik verilerin bulunduğu durumlarda doğrusal muadilinden daha iyi performans gösterir. Ancak doğrusal olmayan bir model, bir tahmin problemine sayısal bir çözüm garantisi vermez. Bir matematiksel fonksiyon, veriler arasındaki ilişkiyi en iyi şekilde açıklayacak şekilde çizilip seçilebilir. Bu gibi durumlarda doğrusal olmayan model, doğrusal muadilini geride bırakabilir.

Bu makaleyi aydınlatıcı bulduysanız ve regresyon modelleri dünyasına daha derin dalmak isterseniz, DataCamp'in Intermediate Regression in R kursuna göz atın.

Konular

İlgili