Soru:
Bilinen denklemi verilere uydurma
Kay
2015-09-04 23:24:51 UTC
view on stackexchange narkive permalink

Büyüme oranlarını bir dizi sıcaklıkta (sıcaklık tepki eğrisi) ölçtüm ve zaten oluşturulmuş bir denklemi / modeli buna uydurmak istiyorum. R konusunda çok yeniyim ve doğru kodlamakta zorlanıyorum.

Bu benim verilerim:

  x <- c (37.8, 34.8, 32.25, 29.65, 26.75 , 24.4, 21.45, 19.15, 16.2, 13.7, 10.95, 8.2, 5.4) y <- c (0.0381, 0.018133333, 1.057033333, 2.3395, 2.5188, 2.6132, 2.398466667, 2.082966667, 1.687366667, 1.389233333, 0.9835) code> 

Sığdırmaya çalıştığım denklem aşağıdaki gibidir:

$ y = (3.5-x / 10) (x / 25) ^ {(5/2) } $

Başka bir veri seti daha var:

  x2 <- c (34.8, 32.25, 29.65, 26.75, 24.4, 21.45, 19.15, 16.2, 5.4)  

ve

  y2 <- c (0.033966667, 1.5153, 2.226266667, 2.3462, 2.096766667, 2.0986, 1.941866667, 1.5183, 0.2717)  

Burada bulduğum kodu denklemime değiştirmeyi denedim, ancak şimdiye kadar başarısız oldum. Birisi, aptallar için adım adım bir kılavuzla bu konuda yardımcı olabilir mi?

Veri kümem için güncellenmiş model:

$$ y = Y_ {max} \ frac {T_ {max} - x} {T_ {max} -T_ {opt}} \ left (\ frac {x} {T_ {opt}} \ right) ^ {(T_ {opt} / (T_ {max} -T_ {opt})) } $$

İşleviniz herhangi bir bilinmeyen içermiyor.Hangi anlamda bir "uydurma" oluyor?Ayrıca ... "(x / 25) exp (5/2)" kısmını yazarken gerçekten (x / 25) ^ (5/2) mi demek istiyorsun?Bu, verilerinizin şekline daha çok benziyor (ancak tüm işlev olması gerekenin yalnızca% 37'si kadardır).Bu değişiklikle bile işlev tam olarak doğru değil, ancak biraz yakın.
Merhaba Glen, o zaman sanırım uydurmak yanlış kelime.Temel olarak verilerimin denkleme ne kadar iyi uyduğunu görmek istiyorum.Orijinal denklemde ölçümlerle doldurulabilecek bazı bilinmeyenler var.Aşağıdaki denklem de kullanılabilir: y = ((35 − x / (35-z)) (x / z) ^ (z / (10))
"Güncellenen modelinizin" önceki sürümüyle, y hiçbir zaman 1'den büyük bir değere ulaşamaz. Y için tepe, $ x = T_ {opt} $ 'da ve bu x, y = 1 değerinde gerçekleşir.Sorunuzu, bunu kapsayacak şekilde ek bir $ Y_ {max} $ parametresi ekleyecek şekilde düzenledim.Ayrıca (soruların aksine) yorumlar kaybolabileceğinden, ek veri setini (şimdi parametre değerleri arasındaki farkları incelemek için kullandığım) doğrudan sorunuza ekliyorum.Farklı deneylerdeki yerleştirilmiş parametreler arasındaki farklar hakkında endişelenmeye başlamadan önce grafikleri gözle kontrol ettiğinizden ve makul uyuşmalara sahip olduğunuzdan emin olun.
Bir cevap:
EdM
2015-09-05 04:52:34 UTC
view on stackexchange narkive permalink

Verileri ücretsiz parametreleri olmayan bir denkleme sığdırma

Öncelikle, sabit bir denkleminiz olduğunda "verilerimin denkleme ne kadar iyi uyduğunu görmenin" ne anlama geldiğini açıklayalım orijinal sorunuzdaki gibi. $ X $ ve $ y $ ile ilgili verileriniz var ve denkleminiz: $$ y = (3.5- (x / 10)) (x / 25) ^ {5/2} $$ ücretsiz parametrelere sahip değil. İşte bir olay örgüsü; veri noktaları dairelerdir, denklem katı bir eğridir:

original curve and data

Dolayısıyla, orijinal sorunuzu yanıtlamak için verileriniz bu denkleme uymuyor çok iyi.

Bir denklemin parametrelerini verilerle eşleşecek şekilde uydurmak

İkinci olarak, "bir denklemi uydurmak" genellikle $ y $ ve $ x $ akılda tutulur, ancak formun ayrıntıları denklemin bazı bilinmeyen parametrelerine bağlıdır. Bu durumda "sığdırma", veriyle en iyi eşleşen parametrelerin değerlerini tahmin etmek için verilerin kullanılması anlamına gelir; örneğin eğri ile veriler arasındaki tutarsızlıkların karelerinin toplamını en aza indirerek. Yorumunuzdaki denklem biçiminde örtülü olan budur. (Görünüşe göre eksik olan bir parantezi $ z = 25 $ 'daki orijinal parametresiz denkleminizle eşleşecek şekilde düzelttim): $$ y = \ frac {35-x} {35-z} \ left (\ frac {x} { z} \ right) ^ {(z / 10)} $$ Şimdi "sığacak" bir şey var: verilerinize en yakın $ z $ değerini bulun. Bunu yapmak için en basit R işlevi nls 'dir. (Kullandığım R kodu cevabın sonundadır.) $ X $ ve $ y $ verilerinize en iyi uyan, ilk parametrenizle eşleşen 25 değeri değil, 33.1 $ z $ değeri tarafından sağlanır. -ücretsiz denklem. Yaklaşır, ancak gerçek değerlerin çoğunun büyük ölçüde altında olması da pek iyi değildir:

fit z only

Görünüşe göre denklemin daha genel bir biçimi olabilir, örneğin: $$ y = \ frac {ax} {az} \ left (\ frac {x} {z} \ right) ^ {(z / b)} $$ $ z $, $ a $ ve $ b $, değerleri verilerden tahmin edilebilecek parametrelerdir. Bu daha genel biçimle, verilerinize oldukça yaklaşabilirsiniz: $ z = 34.0 $, $ a = 36.7 $ ve $ b = 17.8 $: enter image description here

Denklemleri yerleştirmedeki tehlikeler

Üçüncüsü, bu uygun yola girerken çok dikkatli olmalısınız. John von Neumann'ın söylediği gibi, "Dört parametreyle bir fili sığdırabilirim ve beşiyle de hortumunu oynatmasını sağlayabilirim." Verilerle oynamaya başladığınızda aşırı uyum ciddi bir cazibedir.

Sizinki gibi bir durumda, parametrelerin gerçek dünyada ne anlama gelebileceğini düşünmeniz gerekir. Görünüşe göre, belirli bir sıcaklıkta ($ x $) büyüme oranında ($ y $) zirveye yol açan rekabet eden süreçler var ve eğer $ z $, $ a $ ve $ b $ parametreleri terimlerde belirli anlamlara sahipse Birbiriyle yarışan süreçler arasında bu tür bir uyumu yapmakta haklı olabilirsiniz. Diyelim ki, bu süreçlerin bir bakteri türünden diğerine nasıl farklılaştığı hakkında bir şeyler öğrenebilirsiniz. Ancak, bu tür parametreler (veya orijinal denkleminizdeki sabit değerler), belirli bir eğriye uyan daha önceki bazı veri kümelerini sağlamak için biri tarafından basitçe seçildiyse, o zaman büyük bir sorunla karşılaşırsınız.

Karşılaştırma uyumları farklı veri kümelerine

İki farklı veri kümesine uyan parametre değerlerini karşılaştırmak istiyorsanız, veri kümeleri arasında genel uyumların farklı olup olmadığını inceleyerek başlamak en iyisidir. Peter Dalgaard'ın R-help üzerine yakın tarihli bir yanıtında belirttiği gibi, bunu nls ile yapmanın "yararlı ve oldukça kolay gözden kaçan" bir yolu var. ( nls yardım sayfasının en altında bulunabilir.)

Farklı deneylerden $ x $ ve $ y $ değerlerinden oluşan ayrı vektörlerle çalışmak yerine, tüm verileri içeren havuzlanmış bir veri çerçevesi oluşturun. Her satır bir $ x $ değeri, ilişkili gözlemlenen $ y $ değeri ve spesifik denemeyi gösteren bir faktör değişkeni içermelidir. (Deneylerin sayı olarak değil faktör olarak kodlandığından emin olun.)

nls daha sonra farklı deneylere farklı parametre değerleri kümeleri sığdırmanıza olanak tanır. Çağrınızda Topt gibi genel parametreleri belirtmek yerine, parametreleri deneyle, örn. Topt [expt] , burada "expt" faktör ayırt edici deneylerin adıdır.

Bu nedenle, bir uyumu herkesle karşılaştırmak için anova 'yı kullanabilirsiniz. veriler, farklı deneyler için farklı parametre değerlerine izin veren bir uyuma karşı bireysel deneyleri yok sayarak. Bu uyumlar istatistiksel olarak ayırt edilebilir değilse, deneyler arasında ayrı ayrı uyan parametre değerlerinin farklılıklarına bakmamalısınız. Aşağıda R kodunu sunduğum bir örnek var.

Uyumlar farklıysa, o zaman uyan parametre değerlerini karşılaştırmayı düşünebilirsiniz. Çok büyük örneklem sınırında, uyan değerler normal dağılımlara sahip olmalıdır, ancak doğrusal olmayan uyumlar için "büyük" ün ne anlama geldiği açık değildir ve denkleme bağlı olarak anlam değişebilir. Bu nedenle p değerlerinin geçerliliği ile ilgili sorular olacaktır.

Normalliği varsaymak istiyorsanız, nls , bu varsayım altında p -değerlerini elde etmek için kullanabileceğiniz parametre değerleri için standart hataları bildirir. Bir z testi kabaca bir genel bakış sağlayabilir, ancak muhtemelen Welch'in t -testi yaklaşımını kullanmak daha iyi olacaktır. farklı standart hatalar ve iki parametre tahmini arasındaki serbestlik dereceleri. Bu yaklaşımı uygulamak için, Welch'in testi formülündeki $ \ frac {s_i ^ 2} {N_i} $ gibi terimlerin nls çıktısındaki $ SE_i ^ 2 $ ile eşdeğer olduğuna dikkat edin.

R kodu

R kodu açısından, sıcaklık-tepki eğriniz için genel bir fonksiyon tanımlamak en basitiydi:

  trcFunc <- function (x, z, a, b) {((ax) / (az)) * ((x / z) ^ (z / b))}  

ardından verilerinizi eğri ile karşılaştırmak için orijinal denkleminizle eşleşen parametreler için belirli değerler verin:

  plot (x, y) curve (trcFunc (x, 25,35,10), add = TRUE)  

Uydurma için nls işlevini kullandım, örneğin tek başına $ z $

  Zfit < - nls (y ~ trcFunc (x, z, 35,10), start = list (z = 30))  

veya 3 parametre değerinin tümü için

  ZABfit <- nls (y ~ trcFunc (x, z, a, b), start = list (z = 30, a = 35, b = 10))  

  ZABfit Doğrusal Olmayan regresyon modeli modeli: y ~ trcFunc (x, z, a, b) ile uydurulmuş parametre değerleri data: parent.frame () zab 33.98 36.74 17.84 artık kareler toplamı: 1.228 Yakınsamaya kadar yineleme sayısı: 5 Elde edilen yakınsama toleransı: 1.35e-06  

ve verileri ve eğriyi karşılaştırın :

  plot (x, y, main = "fit z, a, b") eğri (trcFunc (x, 33.98,36.74,17.84), add = TRUE)  

Yeni ilişki biçimi; uyumları karşılaştırma OP'de yapılan bir düzenlemede $ y $ ile $ x $ arasındaki ilişkinin yeni genel biçimi ile, uydurma için yeni bir genel işlev şu şekilde tanımlanır:

  newFunc <- function (x, Topt, Tmax, Ymax) {Ymax * ((Tmax-x) / (Tmax-Topt)) * (x / Topt) ^ (Topt / (Tmax-Topt) )}  

İki deneyi karşılaştırmak için, sorunun başında veri olarak expt1 ve ikinci veri kümesi olarak expt2 alın (x2, y2) sonuna doğru ve yukarıda önerildiği gibi havuzlanmış bir veri çerçevesi oluşturun. Daha sonra deneyler arasındaki farkları göz ardı ederek uygunluk şudur:

  fitPool <- nls (y ~ newFunc (x, Topt, Tmax, Ymax), data = newDF, start = list (Topt = 25, Tmax = 35, Ymax = 2.5))  

ve iki deney için ayrı parametre değerlerine izin verme şudur:

  fitSeparate <- nls (y ~ newFunc (x, Topt [expt], Tmax [expt], Ymax [expt]), data = newDF, start = list (Topt = c (25,25), Tmax = c (35,35), Ymax = c (2,5 , 2.5)))  

Havuzlanmış ve ayrı uyumlar önemli ölçüde farklı değildir:

  > anova (fitPool, fitSeparate) Varyans TableModel'in Analizi 1: y ~ newFunc (x, Topt, Tmax, Ymax) Model 2: y ~ newFunc (x, Topt [expt], Tmax [expt], Ymax [expt]) Res.Df Res.Sum Sq Df Sum Sq F değeri Pr (>F) 1 19 1.9215 2 16 1.4410 3 0.48046 1.7782 0.1918  

Başlangıç ​​değerleri seçiminde uyarı

Not Doğrusal olmayan eğri uydurmada olabileceği gibi, "en iyi" uyum, parametre değerleri için ilk tahmin olarak sağladığınız şeye bağlı olabilir. Verilerinizle, $ z $ için 26 ilk tahmin ve $ a $ ve $ b $ için 35 ve 10 sabit değerler sağlasaydım:

  Zfit26start <- nls (y ~ trcFunc (x, z, 35,10), start = list (z = 26))  

$ z $ için döndürülen değer 13.1'dir ve bu hiç uymuyor:

fit with different initial parameter choice

Bunun nedeni, programın tüm $ z $ değerleri aralığını değerlendirecek şekilde ayarlanmaması ve $ z = 26 $ 'dan aramaya başladığında "yerel optimum" olarak adlandırılan durumda kalmasıdır. $ Z $ başlangıç ​​değerlerini 20'den 25'e kadar denediğimde nls programı bir hata verdi:

  numericDeriv'de hata (form [[3L]], isimler (ind), env): Model değerlendirilirken eksik değer veya sonsuzluk üretildi  

19 veya daha düşük başlangıç ​​değerleri z $ z $ için 13.1 gibi çok uygun olmayan bir tahmin verdi. Doğrusal olmayan bir eğri uydurma ile çok fazla keşif yapmadan "küresel" optimumun elde edileceğine güvenemezsiniz.

Merhaba Ed, detaylı cevabınız ve yorumlarınız için çok teşekkürler!Bu bana çok yardımcı oluyor!
@Kay Doğrusal olmayan eğri uydurmadaki ilk parametre değerlerinin seçimi konusunda, verilerinizle güzel bir şekilde gösterilen ek bir uyarı ekledim ve önceki yazımda birkaç hatayı düzelttim.
Merhaba Ed, bunu takip ettiğiniz için çok teşekkürler.Başlangıç değerlerini değiştirdiğimde aynı eğilimleri fark ettim.3 farklı sıcaklık ayarını karşılaştırıyorum ve başlangıç değerlerinin belirtilen problemlerle karşılaşmaması için bilinçli bir tahmin yapabilirim.Daha da iyi bir uyum sağlayan denkleme eklenebilecek üçüncü bir parametre var, ancak sizin de belirttiğiniz gibi biyolojik bir anlamı olmayabilir.Sahip olduğum denklemi birbirleriyle karşılaştırmaya çalışacağım ve hangisinin en uygun VE en biyolojik anlamı olduğuna bakacağım.
Ayrıca şu veri kümesine sahibim: x <- c (34,8, 32.25, 29.65, 26,75, 24.4, 21.45, 19.15, 16.2, 5.4) y <- c (0,033966667, 1.5153, 2.226266667, 2.3462, 2.096766667, 2.0986, 1.941866667, 1.5183, 0.2717) İki optima'ya sahip olan ve genel denklem benim tarafımda pek iyi çalışmadığı için başımı belaya sokuyor.
Başlangıç parametre değerlerinin seçimi çok önemli olabilir.$ Z = 30, a = 35, b = 10 $ başlangıç değerlerini kullandığımda ikinci veri kümenizle hiçbir sorun yaşamadım, bu da optimum değerlere çok yakın oldu ($ z = 33.1, a = 35.1, b =12.3 $).Kararsızlık, denkleminizde $ z $ görünme biçiminden gelebilir: $ z $ 'ı artırmak, ilk faktörü patlatır ($ z = a $' da sonsuza) ve ikinci faktörü azaltmasına rağmen, ikinci faktörün üssünü yükseltir.
Merhaba Ed, eğrime yardım ettiğin için tekrar çok teşekkürler.Modeli iki veri setime uydurdum ve iki modelin katsayılarını nasıl karşılaştırabileceğimi merak ediyordum.Optimum sıcaklık değişiminin önemli olup olmadığını test etmek istiyorum.Böyle bir testi nasıl yapacağımı bulabileceğim yeri bana gösterebilir misin?Teşekkür ederim!
@Kay: Parametrelerin genel bir fonksiyonu olarak optimum sıcaklığı bulmak için hesabı kullanın.Ardından, her model için "nls" deki (örneklerimde yaptığım gibi, örneğin "ZABfit") çıktıları kaydettiğinizden emin olun.Ardından, "g" bağımsız değişkeni olarak maksimum sıcaklık için genel formülü sağlayarak, her bir uyumunuz için maksimum sıcaklığın standart hatasını tahmin etmek için R "araba" paketindeki "deltaMethod" işlevini kullanın.Daha sonra her model için maksimum sıcaklık Tahmini ve standart hatası olacaktır.Daha sonra standart hataları verilen 2 değerin standart bir karşılaştırmasını yaparsınız.
Teşekkürler Ed!Model özeti ayrıca bana standart bir hata veriyor: `# Estimate Std.Hata t değeri Pr (> | t |) #Topt 24.45320 0.16900 144.69 <2e-16 *** # Tmax 34.82563 0.13087 266.11 <2e-16 *** `Bunları da kullanabilir miyim yoksa yaklaşımınızdan farklı mı?Standart karşılaştırmayla ne demek istiyorsun?Bir t testi gibi mi?Bunları daha önce bir veri kümesinde yaptım, ancak "sadece" bir değer ve standart hatasıyla değil.
@Kay Görünüşe göre şu anda "nls" için ilk tartıştığımızdan farklı bir denklem biçimi kullanıyorsunuz, burada "Tmax" bir parametre olarak görünmüyor.Yeni denklem formuna bağlı olarak, deneyler arasında karşılaştırma yapmanın farklı veya daha iyi yolları olabilir.Sorunun sonuna yeni formu eklemek için yayınınızı düzenlemeyi düşünün.Bu arada, basit bir yaklaşık test, katsayılar arasındaki farkın standart hatasını tahmin etmek için $ \ sqrt {SE_1 ^ 2 + SE_2 ^ 2} $ kullanmak ve bunu bir _z_-testinde kullanmaktır.
Kullandığım modeli orijinal soruma ekledim.Doğru anlarsam, tüm katsayılarım ("Topt ve Tmax") için z testini yapabilir miyim?
Z testi, başlamak için iyi bir yoldur.Parametre değerlerinin tekrarlanan deneyler arasındaki dağılımlarının normal dağılımlara sahip olduğunu varsayar, bu da çok sayıda durum sınırında doğrudur.Ne yazık ki, doğrusal olmayan modeller için çok sayıda durum oluşturan şey, doğrusal olmayan modeller arasında farklılık gösterebilen zor bir sorundur.Bir veya iki gün içinde daha fazla zamanım olduğunda cevabıma başka bir yaklaşım önereceğim.
Aman Tanrım, bu harika!Çok teşekkür ederim.Orijinal cevabınıza eklediğiniz yaklaşımı kullandım ve aşağıdaki anova `Res.Df Res.Sum Sq Df Sum Sq F değeri Pr (> F) çıktısını aldım. 1 57 0.28152 2 55 0.24198 2 0.039544 4.4941 0.01557 * `` Ama aynı zamanda katsayılarımın veri setlerini ayrı ayrı çalıştırdığımda elde ettiğimden biraz farklı olduğunu da fark ettim.Yani anova'ya göre iki modelim genel olarak önemli ölçüde farklı mı?Şimdi Welch'in t-testini öneririm?
Devam etmeden önce uyumların iyi göründüğünden emin olun;bunları yayınladığınızda göstermelisiniz.Bireysel analizlere karşı birleşik analizlerin katsayılarındaki küçük farklılıklar şaşırtıcı olmayabilir.Uyumların önemli ölçüde farklı olduğunu gösterdiniz, böylece uyumlar arasındaki katsayı farklılıklarına bakabilirsiniz.Bazıları, Welch t-testi için gereken uydurulmuş katsayı değerlerinin normalliği varsayımına meydan okuyabilir, ancak muhtemelen yapabileceğinizin en iyisi budur.Önemli uyum farkı (yalnızca artık hataların normalliğine bağlıdır), katsayılarda farklılıklar olması gerektiği fikrini destekler.
Tamam, kontrol edeceğim.Alanımdaki herkes adına konuşmak istemiyorum, ancak meslektaşlarımın çoğunun istatistik konusunda o kadar akıcı olmadığından nispeten eminim.Varsayımıma işaret ettiğim sürece, sanırım iyi olmalı.Kişisel istatistikçim olduğunuz için çok teşekkür ederim EdM!Bütün bunları nereden öğrendin?Önerebileceğin iyi bir kitap var mı?


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...