m_qtlmap_incidence_linear

[ Top ] [ ANALYSE ] [ Modules ]

NAME

    m_qtlmap_incidence_linear

SYNOPSIS

    Model Homoscedastic and Heteroscedastic Linear analysis
    Implementation of a likelihood ratio test linearised for Homoscedastic and Heteroscedastic Linear

DESCRIPTION

    i   : sire index
    j   : Dam index
    k   : Progeny index
    N i : Number of progeny of Sire i

     ~
    SIG i : Sqrt Variance of Sire family i under H0
     ^
    SIG i : Sqrt Variance of Sire family i under H1 at a position dx

    General Case (Heteroscedastic model) :
    -----------------------------------

          |   B = (X'.V-1.X)-1 . X' . V-1.Y
   System |    ^
          |   SIG² i = SUM [ Y ijk  - X ijk . B]² CD² ijk  / Ni

    becomes in homoscedastic model :
    ------------------------------

          |  B = (X'.X)-1 . X'.Y
   System |   ^
          |  SIG² = SUM [ Y ijk  - X ijk . B]² CD² ijk  / Ni
                  ~           ^                       ~           ^
     LRT = -2*Log(VL) + 2*Log(VL) = SUM i[ Ni * (Log(SIG²) - Log(SIG²))  ]

NOTES

SEE ALSO


model_lin_h0

[ Top ] [ m_qtlmap_incidence_linear ] [ Subroutines ]

NAME

    model_lin_h0

DESCRIPTION

    compute under H0 the LRT and the solution

INPUTS

    xinc             : incidence matrix
    incidenceDesc    : description of incidence matrix (see INCIDENCE_TYPE)
    workstruct       : configuration and information about analysis (see INCIDENCE_GEN_STRUCT)
    performPrecision : boolean to compute for each parameter the precision (fill the variable embeded INCIDENCE_TYPE%precis)

OUTPUTS

    sigsquareEstime  : the variance of each sire family
    Bestim           : the solution of the estimation

NOTES

SOURCE

257       subroutine model_lin_h0(xinc,incidenceDesc,workstruct,sigsquareEstime,Bestim,performPrecision)
258          type(INCIDENCE_TYPE)                  , intent(inout)     :: incidenceDesc
259          real (kind=dp) , dimension(nd,incidenceDesc%ntnivmax), intent(in)       :: xinc
260          type(INCIDENCE_GEN_STRUCT)              ,intent(in)       :: workstruct
261          real (kind=dp) , dimension(np)        ,intent(out)        :: sigsquareEstime
262          real (kind=dp) , dimension(incidenceDesc%ntnivmax)  ,intent(out)        :: Bestim
263          logical                               ,intent(in)         :: performPrecision!,tConf
264       !   real (kind=dp),dimension(ntnivmax,ntnivmax) ,intent(out)  :: tempForConfusion
265 
266          real (kind=dp),dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax) :: temp
267          real (kind=dp)                              :: startsig(np)
268          integer :: hypothesis,ip
269 
270          !print *,ic
271          !call debug_write_incidence(xinc,incidenceDesc)
272          select case (workstruct%type_model)
273            case (LINEAR_HOMOSCEDASTIC)
274              call modele_homoscedastic(xinc,incidenceDesc,sigsquareEstime,Bestim,performPrecision,temp)
275           !   print *,"HOMO:",osigsquare
276            case (LINEAR_HETEROSCEDASTIC)
277              do ip=1,np
278                startsig(ip) = incidenceDesc%dataset%lSires(ip)%sig0(1)
279              end do
280              call modele_heteroscedastic(xinc,incidenceDesc,startsig,sigsquareEstime,Bestim,performPrecision,temp)
281           !   print *,"HETERO:",osigsquare
282            case default
283              call stop_application("Devel Error : Unknown linear type : "//trim(str(workstruct%type_model)))
284          end select
285         !  print *,"H0:",sigsquareEstime
286 
287       end subroutine model_lin_h0

model_lin_hn

[ Top ] [ m_qtlmap_incidence_linear ] [ Subroutines ]

NAME

    model_lin_hn

DESCRIPTION

    compute under Hn the LRT and the solution

INPUTS

    xinc             : incidence matrix
    incidenceDesc    : description of incidence matrix (see INCIDENCE_TYPE)
    curPos           : current point to test (see POSITION_LRT_INCIDENCE)
    workstruct       : configuration and information about analysis (see INCIDENCE_GEN_STRUCT)
    performPrecision : boolean to compute for each parameter the precision (fill the variable embeded INCIDENCE_TYPE%precis)
    tConf            : boolean to get an array used by the confusion method
    invlrt           : boolean to compute the LRT

OUTPUTS

    sigsquareEstime  : the variance of each sire family
    Bestim           : the solution of the estimation
    tempForConfusion : the buffer array for the confusion function

NOTES

SOURCE

310       subroutine model_lin_hn(xinc,incidenceDesc,curPos,workstruct,sigsquareEstime,Bestim,&
311                               performPrecision,tConf,tempForConfusion,invlrt)
312          type(INCIDENCE_TYPE)                  , intent(inout)     :: incidenceDesc
313          real (kind=dp) , dimension(nd,incidenceDesc%ntnivmax), intent(in)       :: xinc
314          type(POSITION_LRT_INCIDENCE)            ,intent(inout)    :: curPos
315          type(INCIDENCE_GEN_STRUCT)              ,intent(in)       :: workstruct
316          real (kind=dp) , dimension(incidenceDesc%ntnivmax)  ,intent(out)        :: Bestim
317          real (kind=dp) , dimension(np)        ,intent(out)        :: sigsquareEstime
318          logical                               ,intent(in)         :: performPrecision,tConf
319          real (kind=dp),dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax) ,intent(out)  :: tempForConfusion
320          logical                                     ,intent(in)   :: invlrt
321 
322          real (kind=dp),dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax) :: temp
323          real (kind=dp)                              :: startsig(np)
324          integer :: hypothesis,ip,kd1,kd2
325 
326          !print *,ic
327          !call debug_write_incidence(xinc,incidenceDesc)
328 
329          select case (workstruct%type_model)
330            case (LINEAR_HOMOSCEDASTIC)
331              call modele_homoscedastic(xinc,incidenceDesc,sigsquareEstime,Bestim,performPrecision,temp)
332            case (LINEAR_HETEROSCEDASTIC)
333              startsig=sqrt(workstruct%sigsquare(workstruct%nqtl,:,1))
334              call modele_heteroscedastic(xinc,incidenceDesc,startsig,sigsquareEstime,Bestim,performPrecision,temp)
335            case default
336              call stop_application("Devel Error : Unknown linear type : "//trim(str(workstruct%type_model)))
337          end select
338 
339          curPos%lrt=0.d0
340 
341          !compute LRT
342 
343          if (invLrt) then
344              do ip=1,np
345               kd1=incidenceDesc%dataset%lSires(ip)%half_sib%firstKd
346               kd2=incidenceDesc%dataset%lSires(ip)%half_sib%lastkd
347               if (kd2>kd1) then
348                do hypothesis=1,workstruct%nqtl
349                 curPos%lrt(hypothesis)=curPos%lrt(hypothesis) + &
350                 (kd2-kd1+1)*(log(sigsquareEstime(ip))-log(workstruct%sigsquare(hypothesis,ip,1))) !  (IQ-1) / NQTL QTL
351                end do
352               end if
353              end do
354          else
355           do ip=1,np
356            kd1=incidenceDesc%dataset%lSires(ip)%half_sib%firstKd
357            kd2=incidenceDesc%dataset%lSires(ip)%half_sib%lastkd
358            if (kd2>kd1) then
359             do hypothesis=1,workstruct%nqtl
360 
361              curPos%lrt(hypothesis)=curPos%lrt(hypothesis) + &
362              (kd2-kd1+1)*(log(workstruct%sigsquare(hypothesis,ip,1)) - log(sigsquareEstime(ip))) !  (IQ-1) / NQTL QTL
363             end do
364            end if
365           end do
366          end if
367 
368          if (tConf) then
369            tempForConfusion = temp
370          end if
371       end subroutine model_lin_hn

modele_heteroscedastic

[ Top ] [ m_qtlmap_incidence_linear ] [ Subroutines ]

NAME

    modele_heteroscedastic

DESCRIPTION

  From a incidence matrix, get the B estimation and the variance of each sires in a heteroscedastic model

   Bs   = (X'.V-1.X)-1 . X'.Vs -1 .Y
   SIGs = SUM   CD * [ Y    - X   . Bs]² / N
      i      jk   ijk   ijk    ijk          i

NOTES

SOURCE

156      subroutine modele_heteroscedastic(xinc,incidenceDesc,startsig,osigsquare,Bestim,performPrecision,tempForConfusion)
157          type(INCIDENCE_TYPE)                  , intent(inout)     :: incidenceDesc
158          real (kind=dp) , dimension(nd,incidenceDesc%ntnivmax), intent(in)       :: xinc
159          real (kind=dp) , dimension(np)        ,intent(in)         :: startsig
160          real (kind=dp) , dimension(np)        ,intent(out)        :: osigsquare
161          real (kind=dp) , dimension(incidenceDesc%ntnivmax)  ,intent(out)        :: Bestim
162          logical                               ,intent(in)         :: performPrecision
163          real (kind=dp),dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax) ,intent(out)  :: tempForConfusion
164 
165          !local
166          real (kind=dp) , dimension(incidenceDesc%ntnivmax)           :: RHS,YTemp
167          real (kind=dp) ,dimension(incidenceDesc%dataset%nkd,incidenceDesc%dataset%nkd) :: Vinv
168          real (kind=dp) ,dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax)   :: XVX
169          real (kind=dp) , dimension(nd,incidenceDesc%ntnivmax)        :: xincreduit
170          real (kind=dp) , dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax)  :: XX,Mr
171          real (kind=dp) , dimension(incidenceDesc%ntniv,incidenceDesc%ntniv)  :: triang
172          integer                  :: ip,ERROR,it,i,j,kd1,kd2
173          real (kind=dp)           :: f,XB(incidenceDesc%dataset%nkd),lrtv,diff,lrt,oldlrt,sig(np)
174 
175          RHS=0.d0
176          sig=startsig
177          diff = 2*EPS_LINEAR_HETEROSCEDASTIC
178          lrt=INIFINY_REAL_VALUE
179          it=0
180 
181          do while ( diff > EPS_LINEAR_HETEROSCEDASTIC )
182            if ( it < MAX_LINEAR_ITERATION) then
183             it=it+1
184             call set_VInv( incidenceDesc, sig,Vinv )
185             call model_XT_V_X(xinc,incidenceDesc,Vinv,XVX)
186 
187             call estim_cholesky(XVX,incidenceDesc,incidenceDesc%ntniv,triang)
188             call set_corrxinc(xinc,incidenceDesc,xincreduit)
189 
190             call set_RHS_V(xincreduit,Vinv,incidenceDesc,RHS)
191 
192             do i=1,incidenceDesc%nbnivest
193               YTemp(i) = RHS(i)
194               do j=i-1,1,-1
195                YTemp(i) = YTemp(i) - YTemp(j)*triang(i,j)
196               end do
197               YTemp(i) = YTemp(i) / triang(i,i)
198             end do
199 
200             do i=incidenceDesc%nbnivest,1,-1
201              Bestim(i) = YTemp(i)
202              do j=i+1,incidenceDesc%nbnivest
203                Bestim(i)  = Bestim(i) - Bestim(j)*triang(j,i)
204              end do
205                Bestim(i) = Bestim(i) / triang(i,i)
206             end do
207 
208             XB = matmul(xincreduit(:incidenceDesc%dataset%nkd,:incidenceDesc%nbnivest),Bestim(:incidenceDesc%nbnivest))
209             XB = incidenceDesc%dataset%Y(1,:)-XB
210             XB = XB*XB*incidenceDesc%dataset%CD(1,:)*incidenceDesc%dataset%CD(1,:)
211 
212             do ip=1,np
213              kd1=incidenceDesc%dataset%lSires(ip)%half_sib%firstKd
214              kd2=incidenceDesc%dataset%lSires(ip)%half_sib%lastkd
215              osigsquare(ip)=sum(XB(kd1:kd2)) / (kd2-kd1+1)
216             end do
217 
218             oldlrt=lrt
219             lrt = 0
220             do ip=1,np
221              kd1=incidenceDesc%dataset%lSires(ip)%half_sib%firstKd
222              kd2=incidenceDesc%dataset%lSires(ip)%half_sib%lastkd
223              lrt = lrt +(kd2-kd1+1)*(log(osigsquare(ip)) - log(sig(ip)*sig(ip)))
224              sig(ip)=sqrt(osigsquare(ip))
225             end do
226             diff = abs(lrt-oldlrt)
227           else
228            diff = EPS_LINEAR_HETEROSCEDASTIC
229           end if
230          end do
231 
232 
233          if (performPrecision) then
234           call get_precision(XVX,tempForConfusion,incidenceDesc)
235          end if
236 
237       end subroutine modele_heteroscedastic

modele_homoscedastic

[ Top ] [ m_qtlmap_incidence_linear ] [ Subroutines ]

NAME

    modele_homoscedastic

DESCRIPTION

  From a incidence matrix, get the B estimation and the variance of each sires in a homoscedastic model

   Bs   = (X'.X)-1 . X'.Y
   SIGs = SUM   [ Y    - X   . Bs]² / N
      i      jk    ijk    ijk          i

NOTES

SOURCE

 83      subroutine modele_homoscedastic(xinc,incidenceDesc,osigsquare,Bestim,performPrecision,tempForConfusion)
 84          type(INCIDENCE_TYPE)                  , intent(inout)     :: incidenceDesc
 85          real (kind=dp) , dimension(nd,incidenceDesc%ntnivmax), intent(in)       :: xinc
 86          real (kind=dp) , dimension(np)        ,intent(out)        :: osigsquare
 87          real (kind=dp) , dimension(incidenceDesc%ntnivmax)  ,intent(out)        :: Bestim
 88          logical                               ,intent(in)         :: performPrecision
 89          real (kind=dp),dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax) ,intent(out)  :: tempForConfusion
 90 
 91          !local
 92          real (kind=dp) , dimension(incidenceDesc%ntnivmax)           :: RHS,YTemp
 93          real (kind=dp) , dimension(nd,incidenceDesc%ntnivmax)        :: xincreduit
 94          real (kind=dp) , dimension(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax)  :: XX!,Mr
 95          real (kind=dp) , dimension(incidenceDesc%ntniv,incidenceDesc%ntniv)  :: triang
 96          integer                  :: ip,kd1,kd2,jm,i,ERROR,jjm,j
 97          real (kind=dp)           :: f,XB(incidenceDesc%dataset%nkd),sigsq
 98 
 99          ! create X'.X matrix from incidence matrix
100          call model_XT_X(xinc,incidenceDesc,XX)
101 
102         ! Check all parameters to remove from the estimation
103         call estim_cholesky(XX,incidenceDesc,incidenceDesc%ntniv,triang)
104          ! compute the precision of each parameter
105          if (performPrecision) call get_precision(XX,tempForConfusion,incidenceDesc)
106         ! call debug_write_incidence(xinc,incidenceDesc)
107 
108          call set_corrxinc(xinc,incidenceDesc,xincreduit)
109          call set_RHS(xincreduit,incidenceDesc,RHS)
110 
111 !         print *,"RHS****"
112 !         print *,RHS(:incidenceDesc%nbnivest)
113 
114          do i=1,incidenceDesc%nbnivest
115            YTemp(i) = RHS(i)
116            do j=i-1,1,-1
117             YTemp(i) = YTemp(i) - YTemp(j)*triang(i,j)
118            end do
119            YTemp(i) = YTemp(i) / triang(i,i)
120           ! print *,'Temp(',i,')=',YTemp(i)
121          end do
122 
123          do i=incidenceDesc%nbnivest,1,-1
124           Bestim(i) = YTemp(i)
125           do j=i+1,incidenceDesc%nbnivest
126              Bestim(i)  = Bestim(i) - Bestim(j)*triang(j,i)
127           end do
128           Bestim(i) = Bestim(i) / triang(i,i)
129          end do
130 
131          XB = matmul(xincreduit(:incidenceDesc%dataset%nkd,:incidenceDesc%nbnivest),Bestim(:incidenceDesc%nbnivest))
132          XB = incidenceDesc%dataset%Y(1,:)-XB
133          XB = XB*XB
134          sigsq=sum(XB)
135 
136 !         do i=1,10
137 !           print *,XB(i),incidenceDesc%dataset%Y(1,i)
138 !         end do
139          sigsq = sigsq / incidenceDesc%dataset%nkd
140          osigsquare = sigsq
141 
142      end subroutine modele_homoscedastic

opti_0qtl_linear

[ Top ] [ m_qtlmap_incidence_linear ] [ Subroutines ]

NAME

    opti_0qtl_linear

DESCRIPTION

    <DEV>pour l interaction...voir opti_0qtl

NOTES

SOURCE

382  subroutine opti_0qtl_linear(    ic,       &  ! the trait
383                                  incsol   ,       &  !
384                                  sigsquareEstime, &
385                                    typeModel,     &  ! type of model homoscedastic or heteroscedastic
386                                     maxqtl)          ! maximum qtl to find
387 
388       integer                                 ,intent(in)       :: ic,typeModel,maxqtl
389       type(TYPE_INCIDENCE_SOLUTION)           ,intent(out)      :: incsol
390        real (kind=dp) ,dimension(np),intent(out)    :: sigsquareEstime
391 
392       integer :: chr,ip,i,hypothesis
393 
394       real (kind=dp) ,dimension(:,:),pointer      :: xinc
395       real (kind=dp) , dimension(:) ,pointer      :: Bestim
396       type(INCIDENCE_TYPE)                        :: incidenceDesc
397       character(len=500) :: additional_info
398       real (kind=dp) ,dimension(0:maxqtl-1)       :: listDx
399       integer        ,dimension(0:maxqtl-1)       :: listN
400       real (kind=dp)   ,dimension(0:maxqtl-1)     :: dxmax
401       integer          ,dimension(1)              :: listnteff
402       type(INCIDENCE_GEN_STRUCT)                  :: workstruct
403 
404       workstruct%type_incidence=INCIDENCE_TYPE_CLASSIC
405 
406       call init_workstruct(workstruct,INCIDENCE_TYPE_CLASSIC,LINEAR_HOMOSCEDASTIC,0,.true.,.false.,.false.)
407       !initialisation of incidence matrix
408       call init_incidence(ic,0,incidenceDesc,workstruct%type_incidence)
409       allocate (xinc(nd,incidenceDesc%ntnivmax))
410       xinc=0.d0
411       allocate (Bestim(incidenceDesc%ntnivmax))
412       Bestim=0.d0
413       !add general mean to estim
414       call add_general_mean(xinc,incidenceDesc)
415       !add polygenic effect
416       call add_polygenic_effect(xinc,incidenceDesc)
417       !add fixed effect and covariate
418       call add_effcov(xinc,incidenceDesc,0,0)
419       !call debug_write_incidence(xinc,incidenceDesc)
420       !call model analysis
421       sigsquareEstime=0.d0
422       call model_lin_h0(xinc,incidenceDesc,workstruct,sigsquareEstime,Bestim,.true.)
423 
424       call set_solution(0,workstruct,sigsquareEstime,Bestim,incidenceDesc,incsol,1,listnteff)
425       !PRINT *,sigsquareEstime
426 
427       call end_incidence(incidenceDesc)
428       deallocate (xinc)
429       deallocate (Bestim)
430       call release_ws(workstruct)
431 
432       end subroutine opti_0qtl_linear

opti_2qtl_linear_interaction

[ Top ] [ m_qtlmap_incidence_linear ] [ Subroutines ]

NAME

    opti_2qtl_linear_interaction

DESCRIPTION

  <DEV>

NOTES

SOURCE

444       subroutine opti_2qtl_linear_interaction(ic,workstruct,incsol,lrtsol,type)
445 
446       integer                             , intent(in)      :: ic,type
447       type(INCIDENCE_GEN_STRUCT)           , intent(in)     :: workstruct
448       type(TYPE_INCIDENCE_SOLUTION)           ,intent(out)      :: incsol
449       type(TYPE_LRT_SOLUTION)                 ,intent(out)      :: lrtsol
450 
451       integer :: n,init_n1
452       integer :: n1,ii,iq,npar2,ip,chr,chr2,nteff1,nteff2,nteffinter,listnteff(2)
453       real (kind=dp) :: dx,dx1,f,lrt,sigsquare_t(np)
454 
455       real (kind=dp) ,dimension(:,:),pointer      :: xinc,tempConfusion
456       real (kind=dp) , dimension(:) ,pointer      :: Bestim
457       real (kind=dp) , dimension(np)              :: sigsquareEstime
458       type(INCIDENCE_TYPE)                        :: incidenceDesc
459 
460       type(POSITION_LRT_INCIDENCE)                :: curPos
461 
462       call new(2,lrtsol)
463 
464       !initialisation of incidence matrix
465       call init_incidence(ic,2,incidenceDesc,workstruct%type_incidence)
466       allocate (xinc(nd,incidenceDesc%ntnivmax))
467       xinc=0.d0
468       !Position Allocation
469       allocate (curPos%listN(2))
470       allocate (curPos%listChr(2))
471       allocate (curPos%lrt(2))
472 
473       lrtsol%lrtmax=-INIFINY_REAL_VALUE
474 
475       allocate (Bestim(incidenceDesc%ntnivmax))
476       allocate (tempConfusion(incidenceDesc%ntnivmax,incidenceDesc%ntnivmax))
477       Bestim=0.d0
478       chr=1;n=1;n1=n+1
479       !add general mean to estim
480       call add_general_mean(xinc,incidenceDesc)
481       nteff1=2
482       !add qtl effect/interaction at position n to estim
483       call add_qtleffect(nteff1,n,chr,n,xinc,incidenceDesc,0,.true.)
484       nteff2=incidenceDesc%nteff+1
485       !add qtl effect/interaction at position n+1 to estim
486       call add_qtleffect(nteff2,n1,chr,n+1,xinc,incidenceDesc,0,.true.)
487 
488       !add polygenic effect
489       call add_polygenic_effect(xinc,incidenceDesc)
490       !add fixed effect and covariate
491       call add_effcov(xinc,incidenceDesc,0,0)
492 
493       !add interaction
494       nteffinter=incidenceDesc%nteff+1
495       call add_qtlinteraction(nteffinter,chr,chr,n,n1,xinc,incidenceDesc)
496       !call debug_write_incidence(xinc,incidenceDesc)
497 
498       !Initalisation of the maximum finded
499 
500       do chr=1,nchr
501         curPos%listChr(1)=chr
502         do n=1,get_npo(chr)
503         curPos%listN(1)=n
504         !change qtl effect/interaction at position on the 2nd effect (the third is qtl dam) to estim
505         call change_qtleffect(nteff1,1,chr,n,xinc,incidenceDesc,0,.true.)
506         do chr2=chr,nchr
507          curPos%listChr(2)=chr2
508          init_n1=n+1
509          if ( chr2 /= chr) then
510            init_n1=1
511          end if
512          do n1=init_n1,get_npo(chr2)
513           curPos%listN(2)=n1
514           !change qtl effect/interaction at the nteff2 th position to estim
515           call change_qtleffect(nteff2,2,chr2,n1,xinc,incidenceDesc,0,.true.)
516           call change_interaction_effect(nteffinter,chr,chr2,n,n1,xinc,incidenceDesc)
517 
518          ! call debug_write_incidence(xinc,incidenceDesc)
519         !  print *,"pos:",n
520           !call model
521           call model_lin_hn(xinc,incidenceDesc,curPos,workstruct,sigsquareEstime,Bestim,.false.,.false.,tempConfusion,.false.)
522 !          !compute LRT
523 !          lrt = 0.d0
524 !          !print *,sigsquare_t
525 !          do ip=1,np
526 !            lrt=lrt + effp(ip)*(log(sigsquare(ip)) - log(sigsquare_t(ip)))
527 !          end do
528      !     print *,n,n1,"LRT :",curPos%lrt
529         !  stop
530 
531           lrtsol%lrt1_2(chr,chr2,n,n1)=lrt
532           lrtsol%lrt0_2(chr,chr2,n,n1)=lrt
533 
534          ! print *,absi(chr,n),absi(chr2,n1),lrt
535           !print *,incidenceDesc%vecsol
536 
537           !print *,incidenceDesc%vecsol(:incidenceDesc%ntniv)
538          ! stop
539 
540 
541           if ( lrtsol%lrtmax(0) < lrt ) then
542             lrtsol%nxmax(0)=n
543             lrtsol%nxmax(1)=n1
544             lrtsol%chrmax(0)=chr
545             lrtsol%chrmax(1)=chr2
546             lrtsol%lrtmax=lrt
547           end if
548        end do
549         end do
550       end do
551      end do
552 
553       call change_qtleffect(nteff1,1,lrtsol%chrmax(0),lrtsol%nxmax(0),xinc,incidenceDesc,0,.true.)
554       call change_qtleffect(nteff2,2,lrtsol%chrmax(1),lrtsol%nxmax(1),xinc,incidenceDesc,0,.true.)
555       call change_interaction_effect(nteffinter,lrtsol%chrmax(0),lrtsol%chrmax(1),lrtsol%nxmax(0),lrtsol%nxmax(1),&
556                                      xinc,incidenceDesc)
557 
558       call model_lin_hn(xinc,incidenceDesc,curPos,workstruct,sigsquareEstime,Bestim,.false.,.false.,tempConfusion,.false.)
559    !   call debug_write_incidence(xinc,incidenceDesc)
560 
561    !   print *,"Bestime:"
562 
563 
564       listnteff(1)=nteff1
565       listnteff(2)=nteff2
566       call set_solution(2,workstruct,sigsquareEstime,Bestim,incidenceDesc,incsol,2,listnteff)
567 
568       call end_incidence(incidenceDesc)
569       deallocate (xinc)
570       deallocate(Bestim)
571       deallocate (tempConfusion)
572       deallocate (curPos%listN)
573       deallocate (curPos%listChr)
574       deallocate (curPos%lrt)
575 
576       end subroutine opti_2qtl_linear_interaction