R迭代使用while循环和if语句

R Iteration using while loop and if statement

我是 R 的新手,我遇到以下问题:我需要解决一个数值优化问题,在该问题中我重新分配一个单位的劳动投入 (V20),从而增加整体生产率差异。我必须重复这个过程,直到它收敛。为此,优化后每行的生产率差异 (Diff20) 必须相等。

我的方法是计算最大和最小生产率差异(Diff_max,Diff_min)并从生产率差异最大的行移动一个单位的劳动投入(V20)Diff_max(表示生产率下降,因为一定水平的产出需要更多的劳动力投入)到生产率差异最小的行 Diff_min(表示生产率提高,因为需要较少的劳动力投入一定程度的产出)。

我尝试将 while 循环与 if 条件相结合,使该行成为 Diff_max 或 Diff_min。

不幸的是,这根本不起作用,所以我什至无法提供正确的错误消息。

你们中有人知道如何解决/处理这个问题吗?如果你能帮助我,那就太好了!非常感谢!

df <- data.frame("PF"=c("PF1","PF2","PF3","PF4","PF5"),"V19"=c(2.6,5.9,0.5,0.1,3.0),"V20"=c(2.1,7.2,0.3,0.2,2.3), "F19"=c(26,80,10,7,24), "F20"=c(28,90,3,5,13), "A19"=c(4,320,5,0,80), "A20"=c(2.7,458,0,0,45), "B19"=c(1,6,0,0,5), "B20"=c(2,5,0,0,3))


df$num19 <- df$V19*220
df$denom19 <- (df$F19+df$A19+df$B19)
df$num20 <- df$V20*220
df$denom20 <- (df$F20+df$A20+df$B20)


df$rat19 <- df$num19/df$denom19
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
df$Diff_mean <- mean(df$Diff20)
df$Diff_max <- max(df$Diff20)
df$Diff_min <- min(df$Diff20)

while (df$Diff_max> df$Diff_mean) {
  if (df$Diff20 == df$Diff_max) {
    df$V20 <- df$V20+0.1
  }
  if (df$Diff20 == df$Diff_min) {
    df$V20 <- df$V20-0.1
  }
}

正如 JKupzig 所指出的,循环中没有更新条件。

运行 我注意到另外两件事的代码:

  1. 通过增加最大值的提名者并减少最小值的提名者,它不会收敛。
  2. 在 0.1 时,grid-size 似乎太大而无法收敛,我把它变小了,所以最小的工作示例收敛了。
    df <- data.frame("PF"=c("PF1","PF2","PF3","PF4","PF5"),
                 "V19"=c(2.6,5.9,0.5,0.1,3.0),
                 "V20"=c(2.1,7.2,0.3,0.2,2.3), 
                 "F19"=c(26,80,10,7,24), 
                 "F20"=c(28,90,3,5,13), 
                 "A19"=c(4,320,5,0,80), 
                 "A20"=c(2.7,458,0,0,45), 
                 "B19"=c(1,6,0,0,5), 
                 "B20"=c(2,5,0,0,3))

df$num19 <- df$V19*220
df$denom19 <- (df$F19+df$A19+df$B19)
df$num20 <- df$V20*220
df$denom20 <- (df$F20+df$A20+df$B20)

df$rat19 <- df$num19/df$denom19
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
# df$Diff_mean <- mean(df$Diff20)
# df$Diff_max <- max(df$Diff20)
# df$Diff_min <- min(df$Diff20)

df

while(round(max(df$Diff20),3) > round(mean(df$Diff20),3)){
  df[df$Diff20 == max(df$Diff20), "V20"] <-  df[df$Diff20 == max(df$Diff20), "V20"] - 0.00001
  df[df$Diff20 == min(df$Diff20), "V20"] <-  df[df$Diff20 == min(df$Diff20), "V20"] + 0.00001
  df$num20 <- df$V20*220
  df$rat20 <- df$num20/df$denom20
  df$Diff20 <- df$rat20 - df$rat19
}

df