2013-06-14 27 views
5

Phép đo cho thấy tín hiệu được hình thành giống như hàm gốc có bù và một yếu tố. Làm thế nào tôi có thể tìm thấy các hệ số và vẽ các dữ liệu thô và đường cong được trang bị trong một ô?Làm thế nào để phù hợp với dữ liệu với hàm phi tuyến và dữ liệu lô và phù hợp với ggplot()

require(ggplot2) 
require(nlmrt) # may be this will help later..? 

# generate simulated measurement data 

time <- seq(-10,20,0.2) 

signal <- sqrt(time + 2) # generate sqrt signal; includes some NA 
signal[is.na(signal)] <- 0 # set all NA to zero 
signal <- signal + rnorm(length(time)) * 0.1 # add noise 

df <- data.frame(x=time, y=signal) 

# find coefficiants for y ~ b * sqrt(x - a) 
# no idea how... 

# plot raw data and fitted curve in one ggplot diagram 

ggplot()+ 
    geom_point(data=df, aes(x=x, y=y)) 

enter image description here

+1

Chỉ cần gợi ý, bạn có thể muốn khớp với 'y ~ b * sqrt (x - a)', trái ngược với 'a + b * sqrt (c * x)'. –

+1

Nếu bạn không thể chỉ định điểm cắt * ưu tiên * (nghĩa là nếu đó là thông số được trang bị), có thể bạn sẽ phải phù hợp với điều này (nó sẽ không phù hợp với khung mô hình tuyến tính và đặc biệt là các khía cạnh phức tạp để phù hợp với việc cắt giảm vì sự tốt đẹp phù hợp là phẳng trong khoảng thời gian giữa các điểm dữ liệu). Nếu bạn có thể chỉ định các cutoff sau đó tôi nghĩ rằng bạn có thể xây dựng một biến giả và làm điều này ... –

+0

Bước đầu tiên tôi có thể xác định một hằng số cho cutoff bằng tay. Sau đó tôi muốn tìm thấy điều này tự động. Nhưng đây có thể là chủ đề của một câu hỏi khác. –

Trả lời

5

Miễn là bạn biết nơi mà các điểm cắt là gì và rằng giá trị trước khi điểm cắt là zero:

sfun <- function(x,brk,a=1) { 
    ifelse(x<brk,0,suppressWarnings(a*sqrt(x-brk))) 
} 

(suppressWarnings() là có vì ifelse đánh giá cả nếuelse trường hợp cho tất cả các giá trị của x và chúng tôi không muốn cảnh báo về việc lấy squar e gốc của số âm)

Test (không hiển thị):

curve(sfun(x,1,1),from=0,to=10) ## test (not shown) 

Mô phỏng một số dữ liệu:

x <- seq(0,10,length=101) 
set.seed(1) 
y <- rnorm(length(x),sfun(x,1,1),sd=0.25) 
DF <- data.frame(x,y) 

Vì tất cả chúng ta cần phải tìm ra là làm thế nào các chức năng căn bậc hai được thu nhỏ, chúng ta có thể làm điều này với hồi quy thông qua nguồn gốc (lấy ra -1 nếu bạn muốn cho phép giá trị dưới điểm cắt không khác):

library("ggplot2") 
theme_set(theme_bw()) 
ggplot(DF,aes(x,y))+geom_point()+ 
    geom_smooth(method="lm", 
       formula=y~sfun(x,brk=1)-1) 
ggsave("truncsqrt.png") 

enter image description here

+0

oops, tôi thậm chí không nhận thấy rằng bạn đã cung cấp mã mô phỏng của riêng bạn. Bất cứ ai muốn có thể cảm thấy tự do để chỉnh sửa trong ví dụ của OP. –

+0

Hoàn hảo! Độ rộng của dải màu xám được xác định như thế nào? Và tôi có thể nhận được các hệ số dưới dạng số không? –

+1

dải màu xám là khoảng tin cậy 95%. Nếu bạn muốn các hệ số, chỉ cần làm 'lm (y ~ sfun (x, brk = 1) -1, dữ liệu = DF)' –