我想在 R 中实现以下 SAS 代码。
$$ N_e = N_o {1-exp [\ frac {(d + bN_o)(T_h N_e - T)} {(1 + c N_o)}]} $$
其中$ b> 0 $,$ c \ geq 0 $,$ T_h> 0 $,$ T = 72 $。
SAS代码
DATA NOTONECT;
INPUT N0 REP FATE NE N02 N03 PROPEAT;
DATALINES;
5 1 0 0 25 125 0
5 2 0 1 25 125 0.2
5 3 0 1 25 125 0.2
5 4 0 2 25 125 0.4
5 5 0 2 25 125 0.4
5 6 0 2 25 125 0.4
5 7 0 2 25 125 0.4
5 8 0 3 25 125 0.6
7 1 0 0 49 343 0
7 2 0 0 49 343 0
7 3 0 1 49 343 0.14286
7 4 0 1 49 343 0.14286
7 5 0 2 49 343 0.28571
7 6 0 2 49 343 0.28571
7 7 0 2 49 343 0.28571
7 8 0 3 49 343 0.42857
10 1 0 1 100 1000 0.1
10 2 0 1 100 1000 0.1
10 3 0 2 100 1000 0.2
10 4 0 2 100 1000 0.2
10 5 0 3 100 1000 0.3
10 6 0 3 100 1000 0.3
10 7 0 3 100 1000 0.3
10 8 0 4 100 1000 0.4
10 9 0 7 100 1000 0.7
15 1 0 1 225 3375 0.06667
15 2 0 1 225 3375 0.06667
15 3 0 3 225 3375 0.2
15 4 0 3 225 3375 0.2
15 5 0 4 225 3375 0.26667
15 6 0 5 225 3375 0.33333
15 7 0 5 225 3375 0.33333
15 8 0 5 225 3375 0.33333
20 1 0 3 400 8000 0.15
20 2 0 4 400 8000 0.2
20 3 0 7 400 8000 0.35
20 4 0 7 400 8000 0.35
20 5 0 8 400 8000 0.4
20 6 0 8 400 8000 0.4
20 7 0 9 400 8000 0.45
20 8 0 11 400 8000 0.55
25 1 0 4 625 15625 0.16
25 2 0 5 625 15625 0.2
25 3 0 6 625 15625 0.24
25 4 0 7 625 15625 0.28
25 5 0 9 625 15625 0.36
25 6 0 9 625 15625 0.36
25 7 0 13 625 15625 0.52
25 8 0 14 625 15625 0.56
30 1 0 5 900 27000 0.16667
30 2 0 8 900 27000 0.26667
30 3 0 10 900 27000 0.33333
30 4 0 11 900 27000 0.36667
30 5 0 11 900 27000 0.36667
30 6 0 12 900 27000 0.4
30 7 0 14 900 27000 0.46667
30 8 0 20 900 27000 0.66667
45 1 0 4 2025 91125 0.08889
45 2 0 7 2025 91125 0.15556
45 3 0 8 2025 91125 0.17778
45 4 0 10 2025 91125 0.22222
45 5 0 11 2025 91125 0.24444
45 6 0 14 2025 91125 0.31111
45 7 0 15 2025 91125 0.33333
45 8 0 19 2025 91125 0.42222
60 1 0 9 3600 216000 0.15
60 2 0 14 3600 216000 0.23333
60 3 0 14 3600 216000 0.23333
60 4 0 16 3600 216000 0.26667
60 5 0 18 3600 216000 0.3
60 6 0 21 3600 216000 0.35
60 7 0 24 3600 216000 0.4
60 8 0 26 3600 216000 0.43333
80 1 0 7 6400 512000 0.0875
80 2 0 11 6400 512000 0.1375
80 3 0 12 6400 512000 0.15
80 4 0 15 6400 512000 0.1875
80 5 0 17 6400 512000 0.2125
80 6 0 12 6400 512000 0.15
80 7 0 21 6400 512000 0.2625
80 8 0 23 6400 512000 0.2875
100 1 0 7 10000 1000000 0.07
100 2 0 8 10000 1000000 0.08
100 3 0 10 10000 1000000 0.1
100 4 0 11 10000 1000000 0.11
100 5 0 15 10000 1000000 0.15
100 6 0 24 10000 1000000 0.24
100 7 0 26 10000 1000000 0.26
100 8 0 33 10000 1000000 0.33
;
PROC NLIN DATA=NOTONEC2;
PARMS BHAT= 0.001 0.01 0.1 /* initial parameter estimates */
CHAT= 0.001 0.01 0.1
DHAT= 0 THHAT=3.0;
BOUNDS BHAT>0,CHAT>=0,
THHAT>0; /* parameter bounds */
T=72; /* experimental period in H */
X=NE; /* initial predicted value */
A=(DHAT+BHAT*N0)/(1+CHAT*N0); /* expression for A */
/* define the implicit function */
C1=EXP(-A*T); /* components of the implicit function */
C2=A*THHAT;
H=N0*C1*EXP(C2*X)+X-N0; /* the implicit function */
ITER=0; /* iterations for Newton's method */
/* Newton's method employed to find predicted number eaten */
DO WHILE(ABS(H)>0.0001 AND ITER<50); /* stop criteria for Newton's method */
X=X-H/(N0*C1*C2*EXP(C2*X)+1); /* new predicted value */
H=N0*C1*EXP(C2*X)+X-N0; /* new value of implicit function */
ITER=ITER+1; /* iteration counter */
END;
MODEL NE=X; /* model for nonlinear least squares */
Run;
SAS输出
The NLIN Procedure
Dependent Variable NE
Grid Search
Sum of
BHAT CHAT DHAT THHAT Squares
0.00100 0.00100 0 3.0000 3714.9
0.0100 0.00100 0 3.0000 47602.6
0.1000 0.00100 0 3.0000 100896
0.00100 0.0100 0 3.0000 3118.3
0.0100 0.0100 0 3.0000 29395.6
0.1000 0.0100 0 3.0000 97841.3
0.00100 0.1000 0 3.0000 1804.1
0.0100 0.1000 0 3.0000 6625.5
0.1000 0.1000 0 3.0000 53940.3
The NLIN Procedure
Dependent Variable NE
Method: Gauss-Newton
Iterative Phase
Sum of
Iter BHAT CHAT DHAT THHAT Squares
0 0.00100 0.1000 0 3.0000 1804.1
1 0.000396 0.0176 0.00190 3.2240 1774.5
2 0.000327 0.00578 0.00206 3.5044 1762.4
3 0.000307 0.00193 0.00208 3.6507 1754.8
4 0.000302 0.000793 0.00208 3.7006 1752.3
5 0.000299 0.000265 0.00208 3.7246 1751.1
6 0.000299 0.000123 0.00208 3.7312 1750.7
7 0.000298 0.000039 0.00208 3.7351 1750.6
8 0.000298 0.000013 0.00208 3.7363 1750.5
9 0.000298 5.224E-6 0.00208 3.7367 1750.5
10 0.000298 2.547E-7 0.00208 3.7369 1750.5
11 0.000298 6.092E-8 0.00208 3.7369 1750.5
12 0.000298 3.59E-10 0.00208 3.7369 1750.5
13 0.000298 6.37E-11 0.00208 3.7369 1750.5
14 0.000298 -287E-13 0.00208 3.7369 1750.5
15 0.000298 -864E-13 0.00208 3.7369 1750.5
16 0.000298 -955E-13 0.00208 3.7369 1750.5
17 0.000298 -983E-13 0.00208 3.7369 1750.5
18 0.000298 -992E-13 0.00208 3.7369 1750.5
19 0.000298 -997E-13 0.00208 3.7369 1750.5
20 0.000298 -999E-13 0.00208 3.7369 1750.5
21 0.000298 -1E-10 0.00208 3.7369 1750.5
22 0.000298 -1E-10 0.00208 3.7369 1750.5
23 0.000298 -1E-10 0.00208 3.7369 1750.5
24 0.000298 -1E-10 0.00208 3.7369 1750.5
25 0.000298 -1E-10 0.00208 3.7369 1750.5
26 0.000298 -1E-10 0.00208 3.7369 1750.5
27 0.000298 -1E-10 0.00208 3.7369 1750.5
28 0.000407 0 0.000884 4.0885 1733.8
29 0.000416 0 0.000825 4.0645 1733.2
30 0.000415 0 0.000832 4.0640 1733.2
31 0.000416 0 0.000832 4.0640 1733.2
NOTE: Convergence criterion met.
Estimation Summary
Method Gauss-Newton
Iterations 31
Subiterations 108
Average Subiterations 3.483871
R 1.51E-6
The NLIN Procedure
Estimation Summary
PPC(DHAT) 0.000057
RPC(DHAT) 0.000663
Object 2.84E-10
Objective 1733.203
Observations Read 89
Observations Used 89
Observations Missing 0
NOTE: An intercept was not specified for this model.
Sum of Mean Approx
Source DF Squares Square F Value Pr > F
Model 3 9526.8 3175.6 157.57 <.0001
Error 86 1733.2 20.1535
Uncorrected Total 89 11260.0
Approx Approximate 95%
Parameter Estimate Std Error Confidence Limits Label
BHAT 0.000416 0.000228 -0.00004 0.000869
CHAT 0 0 0 0
DHAT 0.000832 0.00382 -0.00676 0.00842
THHAT 4.0640 0.3575 3.3534 4.7747
Bound0 107.9 315.6 -509.1 725.0 0 <= CHAT
Approximate Correlation Matrix
BHAT CHAT DHAT THHAT
BHAT 1.0000000 . -0.8928900 0.7190236
CHAT . . . .
DHAT -0.8928900 . 1.0000000 -0.5474038
THHAT 0.7190236 . -0.5474038 1.0000000
我不知道如何在nls
中使用牛顿法。如果有人帮助我弄清楚这个问题,我将非常感激。提前谢谢。
答案 0 :(得分:11)
我没有和你完全一样,但我认为答案应该没问题。
设置起始条件
s0 <- list(b=0.1,c=0.1,d=0,Th=3)
X <- read.table("rogersdat.txt",header=TRUE)
计算出的预期吃数的函数:
predfun <- function(b,c,d,Th,Te,N0,debug=FALSE) {
a <- (d+b*N0)/(1+c*N0)
r <- N0 - (1/(a*Th))*lambertW(a*Th*N0*exp(a*(Th*N0-Te)))
if (debug) cat(mean(a),b,c,d,Th,mean(r),"\n")
r
}
绘制数据(只是为了确保):
with(X,plot(Ne~N0))
## check starting value
lines(1:100,with(c(s0,X),predfun(b,c,d,Th,Te=72,N0=1:100)))
适用于:
library(emdbook)
n1 <- nls(Ne~predfun(b,c,d,Th,Te=72,N0),data=X,
lower=c(1e-6,1e-6,-Inf,1e-6),algorithm="port",
start=list(b=0.1,c=0.1,d=0.002,Th=3))
summary(n1)
Formula: Ne ~ predfun(b, c, d, Th, Te = 72, N0)
Parameters:
Estimate Std. Error t value Pr(>|t|)
b 0.0004155 0.0008745 0.475 0.63591
c 0.0000010 0.0657237 0.000 0.99999
d 0.0008318 0.0067374 0.123 0.90203
Th 4.0639937 1.4665102 2.771 0.00686 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.516 on 85 degrees of freedom
Algorithm "port", convergence message: relative convergence (4)
confint.default(n1)
2.5 % 97.5 %
b -0.001298523 0.002129547
c -0.128815083 0.128817083
d -0.012373153 0.014036799
Th 1.189686504 6.938300956
估计匹配得很好,置信区间不会(这些类型的置信区间在边界上有点冒险......)
我实际上建议使用二项式误差进行最大似然估计会更好一些。
pdat <- data.frame(N0=1:100,Ne=predict(n1,newdata=data.frame(N0=1:100)))
with(pdat,lines(N0,Ne,col=2))
library(ggplot2)
ggplot(X,aes(x=N0,y=Ne))+stat_sum(aes(size=factor(..n..)),alpha=0.5)+theme_bw()+
geom_line(data=pdat,colour="red")