Lỗi gradient số ít trong nls với giá trị bắt đầu chính xác


19

Tôi đang cố gắng khớp một đường + hàm mũ theo một số dữ liệu. Để bắt đầu, tôi đã cố gắng làm điều này trên một số dữ liệu nhân tạo. Hàm này là: Đây thực sự là một đường cong hàm mũ với một phần tuyến tính, cũng như một tham số dịch chuyển ngang bổ sung ( m ). Tuy nhiên, khi tôi sử dụng chức năng của R, tôi gặp lỗi " ma trận độ dốc số ít ở mức ước tính tham số ban đầu ", ngay cả khi tôi sử dụng cùng một tham số mà tôi đã sử dụng để tạo dữ liệu ở vị trí đầu tiên. Tôi đã thử các thuật toán khác nhau, các giá trị bắt đầu khác nhau và đã thử sử dụng

y= =một+br(x-m)+cx
nls()
optimđể giảm thiểu tổng số bình phương còn lại, tất cả đều vô ích. Tôi đã đọc rằng một lý do có thể cho việc này có thể là một tham số quá mức của công thức, nhưng tôi không nghĩ đó là (phải không?)
Có ai có gợi ý cho vấn đề này không? Hay đây chỉ là một mô hình vụng về?

Một ví dụ ngắn:

#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)

#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)

Cảm ơn!


2
Gợi ý: xem xét hệ số của (đối với cố định ) và lưu ý rằng có họ giải pháp một chiều với . r b r - m = hằng số ( b , m ) b = r mkhông đổirxrbr-m= =không thay đổi(b,m)b= =rmkhông thay đổi
whuber

1
Đây không phải là một mô hình được xác định, trừ khi hoặc bị ràng buộc bằng cách nào đó. Tôi nghĩ rằng yêu cầu sẽ thực hiện công việc. r r ( 0 , 1 )brr(0,1)
Macro

Câu trả lời:


16

Tôi đã bị cắn bởi điều này gần đây. Ý định của tôi là như nhau, tạo ra một số mô hình nhân tạo và thử nghiệm nó. Lý do chính là lý do được đưa ra bởi @whuber và @marco. Mô hình như vậy không được xác định. Để thấy điều đó, hãy nhớ rằng NLS giảm thiểu chức năng:

Σtôi= =1n(ytôi-một-brxtôi-m-cxtôi)2

Nói rằng nó được thu nhỏ bằng tập các tham số . Không khó để thấy rằng tập hợp các tham số sẽ cho cùng một giá trị của hàm được thu nhỏ. Do đó mô hình không được xác định, tức là không có giải pháp duy nhất.(một,b,m,r,c)(một,br-m,0,r,c)

Cũng không khó để thấy lý do tại sao gradient là số ít. Chứng tỏ

f(một,b,r,m,c,x)= =một+brx-m+cx

Sau đó

fb= =rx-m

fm= =-blnrrx-m

và chúng tôi nhận được điều đó cho tất cảx

blnrfb+fm= =0.

Do đó ma trận

(f(x1)f(xn))

sẽ không được xếp hạng đầy đủ và đây là lý do tại sao nlssẽ đưa ra thông báo gradient số ít.

Tôi đã dành hơn một tuần để tìm kiếm các lỗi trong mã của mình ở nơi khác cho đến khi tôi nhận thấy rằng lỗi chính nằm ở mô hình :)


2
Tôi đã biết tuổi này nhưng chỉ tự hỏi, điều này có nghĩa là nls không thể được sử dụng trên các mô hình không thể nhận dạng? Ví dụ, một mạng lưới thần kinh?
Đếm số 0

cơ hội chất béo, tôi biết, nhưng bạn có thể phá vỡ điều này cho những người ít nhớ calc? :). Ngoài ra, giải pháp cho vấn đề của OP là gì? Bỏ cuộc và về nhà?
bác sĩ lâm sàng

2
Giải pháp cho vấn đề OP là sử dụng một tham số thay vì hai, tức là thay vì sử dụng . Các tham số là thành vô, vì nó kết hợp vào , tức là . brx-mβrxmββ= =br-m
mpiktas

@CountZero, về cơ bản là có, các phương thức tối ưu hóa thông thường sẽ thất bại nếu các tham số không được xác định. Tuy nhiên, các mạng lưới thần kinh vượt qua vấn đề này bằng cách thêm các chống chỉ định và sử dụng các thủ thuật thú vị khác.
mpiktas

Tôi sẽ nghĩ ? Có một lnr bị thiếu trong câu trả lời? fm= =-blnr rx-m
khôn ngoan

17

Các câu trả lời ở trên, tất nhiên, chính xác. Đối với giá trị của nó, ngoài những giải thích được đưa ra, nếu bạn đang thử điều này trên bộ dữ liệu nhân tạo, theo trang trợ giúp của nls được tìm thấy tại: http://stat.ethz.ch/R-manual/R-patched/ thư viện / thống kê / html / nls.html

Nls của R sẽ không thể xử lý nó. Trang trợ giúp nêu cụ thể:

Cảnh báo

Không sử dụng nls trên dữ liệu "không dư" nhân tạo.

Hàm nls sử dụng tiêu chí hội tụ bù tương đối để so sánh độ chính xác số tại các ước tính tham số hiện tại với tổng bình phương còn lại. Điều này thực hiện tốt trên dữ liệu của biểu mẫu

y = f (x,) + eps

(với var (eps)> 0). Không thể chỉ ra sự hội tụ trên dữ liệu của biểu mẫu

y = f (x,)

bởi vì tiêu chí này so sánh hai thành phần của lỗi làm tròn số. Nếu bạn muốn kiểm tra nls trên dữ liệu nhân tạo, vui lòng thêm một thành phần nhiễu, như trong ví dụ dưới đây.

Vì vậy, không có tiếng ồn == không tốt cho nls của R.


Chào mừng đến với trang web, @B_D_Dubbya. Tôi đã tự do định dạng câu trả lời của bạn, tôi hy vọng bạn không phiền. Bạn có thể tìm thêm thông tin về việc chỉnh sửa câu trả lời của bạn trên CV tại đây .
gung - Phục hồi Monica

1
Tôi nhận thức được vấn đề này - do đó sử dụng chức năng "jitter" để thêm tiếng ồn
steiny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.