计算方程中的参数

时间:2015-02-22 21:19:30

标签: r

SMDIt=p*SMDIt-1+q*SMDt
SMDIt=SMDt/50

我想将上述等式用于我的数据集(SMD)。我首先需要将我的数据集的第一列用50(eqn 2)划分并称之为SMDI,然后转到第一个等式,其中我用原始SMD添加SMDIt-1。我有两个p和q值(p_dry和p_wet ,q_dry和q_wet)。如果我的单元格值为正,我想使用p_dry和q_dry,否则在方程式1中使用p_wet和q_wet。我写了下面的代码,但它给了我错误。 NA / NAN参数。请帮忙。

3.343327144 0.076583722 -4.316073117    -6.064319011    -1.034313982    1.711678831 2.062381759 5.632386548 6.017760438
4.467709087 1.632745678 -2.045736377    -3.601413064    1.695347213 3.295933998 4.070685302 7.743864617 8.348716373
8.256385028 5.635534811 2.707796712 1.572985845 6.066710978 7.095101029 7.941167874 11.37490758 12.15712496
NA  NA  NA  NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA  NA  NA  NA
-47.4749727 -62.45954133    -69.42311677    -68.04854477    -69.86363461    -56.6566393 -44.02624374    -34.68257496    -5.528397863
-57.44464723    -74.11667952    -83.07777747    -81.88546602    -84.32488173    -72.37428075    -61.04778523    -51.84892678    -20.81696219
-12.6032741 -26.27089119    -36.55478576    -30.40468773    -36.15889518    -33.71339142    -16.63378788    -4.849972012    -1.667644897
-28.28948158    -38.05693676    -43.2879285 -35.34546364    -40.09848824    -34.40754496    -18.41988896    -9.867125675    -7.493617422
NA  NA  NA  NA  NA  NA  NA  NA  NA
-35.04117468    -38.74252722    -42.69080876    -43.06064215    -40.85844545    -36.79603495    -37.92408262    -34.51428202    -32.54118632
-29.35688054    -33.7004665 -37.88555224    -39.06340145    -37.19884049    -29.8488303 -32.48244008    -28.52426895    -28.39245064
-1.422800439    -6.972537109    -11.86824507    -13.14543917    -9.893061342    1.11258721  -0.415834635    2.424939039 2.65615071

代码:

data=read.table('SMD.csv', header=TRUE, sep=',')
SMD=data.matrix(data)
p_dry<-0.1542
q_dry<-0.0338
p_wet<-0.1660
q_wet<-0.0333
SMDI<-  matrix(0,nrow=nrow(SMD),ncol=ncol(SMD))
      for (i in 2:nrow(SMD)) {
        for(j in 1:ncol){
        if(is.na(SMD[i,j])){
        SMD[i,j]<-NaN
          SMDI[1,j] <-SMD[1,j]/50
        if(SMD[i,j]<0)
          SMDI[i,j]<- p_dry[j]*SMDI[i-1,j]+SMD[i,j]*q_dry[j] else
          SMDI[i,j]<- p_wet[j]*SMDI[i-1,j]+SMD[i,j]*q_wet[j]
          }                                                                                                
          }
}

write.table(SMDI,(file='SMDI.csv')

1 个答案:

答案 0 :(得分:0)

你不需要循环。在R中,我们使用向量。

SMDIt <- SMD/50 # second equation
# defining vectors of p and q values corresponding to SMDIt
p <- ifelse(SMDIt>0, p_dry, p_wet) 
q <- ifelse(SMDIt>0, q_dry, q_wet)
SMDIt <- p*SMDIt - 1 + q*SMD # first equation

修改:将SMD[, 1]替换为SMD以计算整个矩阵的值。