2015-10-09 19 views
5

Tôi đã đọc một bài đăng (Đường cong Sigmoidal Fit trong R). Nó được dán nhãn trùng lặp, nhưng tôi không thể thấy bất cứ điều gì liên quan đến các bài viết. Và câu trả lời cho bài viết là không đủ.Sử dụng R để vừa với Đường cong Sigmoidal

tôi đọc một webpage

Tương tự như những người khác, ông sử dụng định dạng này để phù hợp với những dòng:

fitmodel <- nls(y~a/(1 + exp(-b * (x-c))), start=list(a=1,b=.5,c=25)) 

Vấn đề là, a, b, c được đưa ra ở hầu hết các trường hợp và tôi không có manh mối nào thiết lập a, b, c nên tôi sử dụng cho tập hợp dữ liệu của mình. Ai đó có thể cho tôi một số lời khuyên về làm thế nào để có được các thông số?

Dưới đây là bộ của tôi về con số:

x <- c(3.9637878,3.486667,3.0095444,2.5324231,2.0553019,1.5781806,1.1010594,0.6242821) 
y <- c(6491.314,6190.092,2664.021,2686.414,724.707,791.243,1809.586,541.243) 
+0

bạn phải đoán 'a, b, c'. Nếu bạn có một ý tưởng làm thế nào các đường cong sẽ trông giống như nó luôn luôn giúp vẽ một đường cong với các hệ số ngẫu nhiên (ví dụ: 'a = 20, b = 0,1, c = 0,2, đường cong (a/(1 + exp (-b * (xc))), 0, 100) 'và xem dự đoán của bạn như thế nào kiểm tra xem' xc' có đúng không. Không phải là 'x^(- c)' – Mateusz1981

+0

Đó là một cách có thể nhưng có bất kỳ cách nào khác có thể cho tôi để làm điều đó theo cách "thống kê thuyết phục" hơn? Ví dụ, có thể tạo vòng lặp để tìm tập hợp kết hợp tối ưu của a, b, c. Hoặc, nếu có, tôi có thể sử dụng không một số chức năng hoặc lệnh để nó cho chương trình để tính toán nó cho tôi? – FunnyFunkyBuggy

+0

một khi tôi cũng đang tìm kiếm này "gral" .Tôi chưa tìm thấy.Tôi không thống kê nhưng tôi nghĩ rằng đoán giá trị bắt đầu là một cách phổ biến của ước tính các tham số phương trình trong 'nlm' – Mateusz1981

Trả lời

5

May mắn R cung cấp một mô hình selfstarting cho mô hình logistic. Nó sử dụng một reparametrization nhẹ, nhưng thực sự là mô hình tương tự như của bạn: Asym/(1+exp((xmid-input)/scal))

Một mô hình selfstarting có thể ước tính giá trị khởi đầu tốt cho bạn, vì vậy bạn không cần phải xác định chúng.

plot(y ~ x) 
fit <- nls(y ~ SSlogis(x, Asym, xmid, scal), data = data.frame(x, y)) 

summary(fit) 
#Formula: y ~ SSlogis(x, Asym, xmid, scal) 
# 
#Parameters: 
#  Estimate Std. Error t value Pr(>|t|) 
#Asym 1.473e+04 2.309e+04 0.638 0.551 
#xmid 4.094e+00 2.739e+00 1.495 0.195 
#scal 9.487e-01 5.851e-01 1.622 0.166 
# 
#Residual standard error: 941.9 on 5 degrees of freedom 
# 
#Number of iterations to convergence: 0 
#Achieved convergence tolerance: 4.928e-06 

lines(seq(0.5, 4, length.out = 100), 
     predict(fit, newdata = data.frame(x = seq(0.5, 4, length.out = 100)))) 

resulting plot

Tất nhiên dữ liệu của bạn không thực sự hỗ trợ của mô hình. Điểm giữa được ước tính chỉ ở giới hạn đúng của phạm vi dữ liệu của bạn và do đó các ước tính tham số (đặc biệt đối với asymptote) là rất không chắc chắn.

+0

Cảm ơn, câu trả lời của bạn rất hữu ích cho tôi. Có một câu hỏi khác: tại sao hình dạng của đường cong không nằm trong hình chữ 'S'? Nó giống như một đường cong theo hàm mũ với tôi. Tôi thấy phương trình của bạn là giống với tôi nhưng đâu là vấn đề? – FunnyFunkyBuggy

+0

Mô hình là đường cong sigmoidal. Bạn chỉ không thấy phần trên của S vì nó nằm ngoài giới hạn cốt truyện. – Roland

1

Tôi thấy hai vấn đề.

  1. thuật toán mặc định của nls rất nhạy cảm với tham số bắt đầu. Trong dữ liệu mẫu của bạn, tôi thấy hữu ích khi sử dụng algorithm='port'. Ngoài ra, việc chuyển sang triển khai "mạnh mẽ" cũng có thể hữu ích.

  2. Giúp hiểu vai trò của tham số trong mô hình của bạn.

Cách giải thích đơn giản cho kiểu máy của bạn là: Biến dạng sigmoid đi trong y từ 0 đến a. Nó đạt đến điểm "nửa đường" tại x = c. b có vai trò của độ dốc, và nếu tiêu cực, mô hình sẽ chuyển từ a sang 0.

Cụ thể số liệu kiểm tra đăng bởi bạn tôi sẽ ước tính giá trị khởi đầu như sau:

  • Điều đầu tiên tôi nhận thấy - dữ liệu của bạn là không chính xác 'gần' để không như vậy có lẽ nó có thể có ích để thêm một d bù đắp đó là khoảng 1000.
  • a là sau đó 5000 hoặc cao hơn
  • c là ở đâu đó lớn hơn 2 - có lẽ 3
  • b ta cần phải đoán - từ x 2-3,5 tín hiệu của bạn nhảy 1000-6000 cho 5000 khác biệt - chia cho - độ dốc 1/1,5 = 0,66 hoặc lớn hơn ... l ets vòng một.

Vì vậy, cuối cùng sử dụng công thức

fitmodel <- nls(y ~a/(1 + exp(-b * (x-c))) + d, start=list(a=5000,b=1,c=3, d=1000)) 

cho phù hợp (cũng làm việc mà không có d). Đang thử xung quanh tôi tìm thấy thiết lập algorithm='port' làm cho lệnh thậm chí ít nhạy cảm hơn với các giá trị bắt đầu.

2

Code tôi sử dụng để phù hợp với dữ liệu của bạn:

df <- data.frame(x=c(3.9637878,3.486667,3.0095444,2.5324231,2.0553019,1.5781806,1.1010594,0.6242821),      
        y=c(6491.314,6190.092,2664.021,2686.414,724.707,791.243,1809.586,541.243)) 

library(drc) 
fm <- drm(y ~ x, data = df, fct = G.3()) 

plot(fm) 
summary(fm) 

Cách nó chăm sóc phù hợp: enter image description here

Các vấn đề liên quan