Нелинейная регрессия в R с фиктивными переменными - PullRequest
0 голосов
/ 05 августа 2020

Мне нужно выполнить три нелинейных регрессии по следующим формулам:

fire_vertical<-nls(R~0.23-exp(A*lnNt+C)+d*fire,start=list(A=-0.33,C=0.45,d=-0.001),trace=T)

fire_lateral<-nls(R~0.23-exp((A*lnNt)+(C+d*fire)),start=list(A=-0.33,C=0.45,d=-0.001),trace=T)

fire_nonlinear<-nls(R~0.23-exp((A+d*fire)*lnNt+C),start=list(A=-0.33,C=0.45,d=-0.001),trace=T)

У меня есть следующие данные: R<-c(0.02,0.00,-0.06,0.11,0.06,0.00,-0.05,-0.06,0.02,-0.26,0.00,0.07,-0.07,0.23,0.06,-0.14,-0.04,0.09,-0.09,0.09,-0.02)

lnNt<-c(6.14,6.14,5.76,6.42,6.81,6.81,6.49,6.14,6.24,4.81,4.81,5.14,4.81,6.03,6.42,5.59,5.39,5.90,5.39,5.90,5.76)

fire<-c("before","before","before","before","before","before","before","afterone","afterone","afterone","afterone","afterone","afterone","afterone","aftertwo","aftertwo","aftertwo","aftertwo","aftertwo","aftertwo","aftertwo")

«lnNt» и «fire» - мои независимые переменные. lnNt - это непрерывные данные, а «огонь» - это категориальная переменная с тремя уровнями: «до», «после» и «после двух».

Мне нужно преобразовать мою категориальную переменную («огонь») в фиктивную переменная для запуска модели. Я не могу запустить модель с фиктивной переменной.

1 Ответ

0 голосов
/ 05 августа 2020

Используйте функцию gnls из пакета nlme. Он позволяет моделировать параметры в зависимости от категориальной переменной (используя обычные контрасты обработки по умолчанию).

DF <- data.frame(R, lnNt, fire, stringsAsFactors = TRUE)

fire_model<-nls(R~0.23-exp(A*lnNt+C)+d,
                start=list(A=-0.33,C=0.45,d=-0.001),trace=T, data = DF)
coef(fire_model)
#         A          C          d 
#-1.1367053  3.6708032 -0.1673437 

library(nlme)
fire_model_2 <- gnls(R~0.23-exp(A*lnNt+C)+d,params = list(A + C ~ 1, d ~ fire), 
                     start=c(coef(fire_model), rep(0, length(levels(DF$fire))- 1)), 
                     data = DF)

summary(fire_model_2)
# Generalized nonlinear least squares fit
# Model: R ~ 0.23 - exp(A * lnNt + C) + d 
# Data: DF 
#      AIC       BIC  logLik
# -33.3584 -27.09127 22.6792

# Coefficients:
#                    Value Std.Error    t-value p-value
# A              -1.247828  1.652336 -0.7551907  0.4611
# C               4.558928  7.565058  0.6026296  0.5552
# d.(Intercept)  -0.097251  0.128043 -0.7595203  0.4586
# d.fireaftertwo -0.062324  0.062210 -1.0018480  0.3313
# d.firebefore   -0.083946  0.064853 -1.2944170  0.2139
# 
# Correlation: 
#                A      C      d.(In) d.frft
# C              -0.999                     
# d.(Intercept)   0.864 -0.842              
# d.fireaftertwo  0.435 -0.454  0.050       
# d.firebefore   -0.148  0.117 -0.538  0.492
# 
# Standardized residuals:
#         Min          Q1         Med          Q3         Max 
# -1.66299973 -0.48743154  0.04367184  0.85175935  1.58042481 

В этом примере мы ясно видим, что fire не оказывает значительного влияния.

fire_model <- gnls(R~0.23-exp(A*lnNt+C)+d,
                     start=coef(fire_model), data = DF)

anova(fire_model, fire_model_2)
#             Model df       AIC       BIC   logLik   Test  L.Ratio p-value
#fire_model       1  4 -35.05862 -30.88053 21.52931                        
#fire_model_2     2  6 -33.35840 -27.09127 22.67920 1 vs 2 2.299789  0.3167
...