【问题标题】:R Error: Possible "misspecification" of input ranges resulting in missing values?R 错误:输入范围可能“错误指定”导致缺失值?
【发布时间】:2021-09-20 19:56:17
【问题描述】:

我正在使用 R 编程语言。我正在尝试使用以下库 (https://cran.r-project.org/web/packages/mopsocd/mopsocd.pdf) 来优化带有约束的函数。

首先,我加载了库:

#Load library:
library(mopsocd)

然后,我为这个例子创建了一些数据:

#load libraries
library(dplyr)


# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,5)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)

然后我定义了这个例子中使用的函数:

#define function:

funct_set <- function (x) {
    
    
    
    #bin data according to random criteria
    train_data <- train_data %>%
        mutate(cat = ifelse(a1 <= x[1] & b1 <= x[3], "a",
                            ifelse(a1 <= x[2] & b1 <= x[4], "b", "c")))
    
    train_data$cat = as.factor(train_data$cat)
    
    #new splits
    a_table = train_data %>%
        filter(cat == "a") %>%
        select(a1, b1, c1, cat)
    
    b_table = train_data %>%
        filter(cat == "b") %>%
        select(a1, b1, c1, cat)
    
    c_table = train_data %>%
        filter(cat == "c") %>%
        select(a1, b1, c1, cat)
    
    
    
    #calculate  quantile ("quant") for each bin
    
    table_a = data.frame(a_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > x[5],1,0 )))
    
    table_b = data.frame(b_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > x[6],1,0 )))
    
    table_c = data.frame(c_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > x[7],1,0 )))
    
    f1 = mean(table_a$quant)
    f2 = mean(table_b$quant)
    f3 = mean(table_c$quant)
    
    
    #group all tables
    
    final_table = rbind(table_a, table_b, table_c)
    # calculate the total mean : this is what needs to be optimized
    
    f4 = mean(final_table$quant)
    
    
    return (c(f1, f2, f3, f4));
}

然后,我定义了约束:

#define constraints

gn <- function(x) {
    g1 <- x[3] - x[1] >= 0.0
    g2 <- x[4] - x[2] >= 0.0
    g3 <- x[7] - x[6] >0
    g4<- x[6] - x[5] >0
    return(c(g1,g2,g3, g4))
}

接下来,我为优化函数定制了一些选项(例如变量的数量、范围的下限和上限等)

## Set Arguments

varcount <- 7
fncount <- 4
lbound <- c(80,85,100,120,90, 110, 130)
ubound <- c(220,220,220,220,220, 145, 189)
optmin <- 0

最后,我自己运行了优化函数:

#run optimization



ex1 <- mopsocd(funct_set,gn, varcnt=varcount,fncnt=fncount,
                lowerbound=lbound,upperbound=ubound,opt=optmin)

问题:但是,这会产生以下错误:

Error in if ((max(rowSums(x)) == fncnt) == FALSE) { : 
  missing value where TRUE/FALSE needed

有谁知道为什么会产生这个错误?是因为我使用了不正确的格式来定义函数吗?是不是因为范围(例如“lbound”和“ubound”)不合逻辑?

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

  • 您在复制过程中遗漏了一些代码。例如,看起来您应该加载library(tidyverse),而您在第一行代码中拼错了mopsocd。您似乎也没有在问题中包含您的train_data(或任何合适的替代品)。无论如何,作为猜测,尝试将na.rm = TRUE 设置为max 函数的参数。
  • @J. Mini:谢谢你的建议!我修正了错字并添加了“train_data”
  • 为什么您在过滤数据后按cat 分组,以便您尝试分组的数据只有一个值cat

标签: r function loops optimization


【解决方案1】:

您的错误表明缺失值已在某处进入您的流程。进入您的最终函数调用 ex1 &lt;- mopsocd(...) 并运行它,直到错误显示具有 NaN 值的几个内部变量之前。从一开始就仔细检查最后一次调用,我们看到缺失值首先大致出现在内部变量popFit 生成时。这是一个有四列的表,每个fs 列。这表明错误是您的fs 之一是缺失值的原因。目视检查让我责怪f2f3

f4 处设置一个新断点并在运行代码时不时检查它(真的,自己尝试一下——它很有启发性)告诉我们你的b_tablec_table 通常是空的。用简单的英语来说,你的错误的原因是在 b 或 c 类中经常没有值。

【讨论】:

  • 非常感谢您的回答!这是我一直在努力解决的问题。如果您有时间,可以在这里查看这个问题:stackoverflow.com/questions/68324822/… 吗?我想我能够想出一个答案,但我不确定我是否做得正确。非常感谢您的帮助!
  • @stats555 您对约束的定义似乎忠实于库给出的示例代码,并且您的输出似乎满足所述约束。我认为没有理由担心。
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
相关资源
最近更新 更多