正态分布计算错误 - 数学函数的非数字参数
normal distribution calculation error - Non-numeric argument to mathematical function
我有 2 个数据框,我在数据框上应用 pnorm()
和 qnorm()
,但在计算时出现错误。
n <- c(0.3,0.5,0.1,0.2)
m <- c(0.1,0.4,0.5,0.3)
o <- c(0.2,0.2,0.2,0.4)
p <- c(0.3,0.1,0.3,0.3)
df1 = data.frame(n,m,o,p)
df1
n m o p
1 0.3 0.1 0.2 0.3
2 0.5 0.4 0.2 0.1
3 0.1 0.5 0.2 0.3
4 0.2 0.3 0.4 0.3
r <- c(0.2,0.4,0.1,0.3)
df2 = rbind.data.frame(r)
df2
X2 X4 X1 X3
1 0.2 0.4 0.1 0.3
b <- 0.15
result <- pnorm((qnorm(df1)+sqrt(b)*df2)/sqrt(1-b))
Output:
Getting an error:
Error in qnorm(df1) : Non-numeric argument to mathematical function
预期输出:
Output:
0.3139178 0.110853 0.1919158 0.3289671
0.5334785 0.4574897 0.1919158 0.1031127
0.0957727 0.5667216 0.1919158 0.3289671
0.2035948 0.3442989 0.4079641 0.3289671
实际上我有这 2 个数据帧 df1 和 df1,在 excel 中,我在 excel 中有一个公式,我需要将其转换为 R。
=NORMSDIST((NORMSINV(A1)+SQRT(0.15)*H1)/SQRT(1-0.15))
这里 A1 是 df1 的第一个值等等,H1 是 df2 的值等等。
您要做的是:对 df1
中的每一行应用一个函数。为此,我们需要编写一个函数。
getDist <- function(x, b = 0.15) {
pnormInput <- as.numeric((qnorm(as.numeric(x)) + sqrt(b) * df2) / sqrt(1 - b))
pnorm(pnormInput)
}
接下来我们将此函数应用于 df1
中的每一行(使用 apply
)。
result <- apply(df1, 1, function(x) getDist(x))
接下来我们必须转置 result
(翻转我们得到的 table)。
result <- t(result)
# [,1] [,2] [,3] [,4]
# [1,] 0.3139178 0.1108530 0.1919158 0.3289671
# [2,] 0.5334785 0.4574897 0.1919158 0.1031127
# [3,] 0.0957727 0.5667216 0.1919158 0.3289671
# [4,] 0.2035948 0.3442989 0.4079641 0.3289671
我认为这是一个典型的案例,试图在一行中执行许多操作,却忘记了每个函数在做什么。我的回答与@PoGibas 的回答基本相同,但更加明确但不够优雅。
我先单独算一下,然后再合并:
num1 <- apply(df1, 1, qnorm) # Apply 'qnorm' row-wise
num2 <- sqrt(b) * r # Add the constant sqrt(b) to vector r
num <- sweep(num1, 1, num2, "+") # Add the vector num2 row-wise to the dataframe num2
den <- sqrt(1-b) # den is a constant
result <- pnorm(num/den) # num is a data frame, which is elementwise divided by the constant den.
t(result)
通过逐步执行操作,您通常会更容易找到错误的根源。
我有 2 个数据框,我在数据框上应用 pnorm()
和 qnorm()
,但在计算时出现错误。
n <- c(0.3,0.5,0.1,0.2)
m <- c(0.1,0.4,0.5,0.3)
o <- c(0.2,0.2,0.2,0.4)
p <- c(0.3,0.1,0.3,0.3)
df1 = data.frame(n,m,o,p)
df1
n m o p
1 0.3 0.1 0.2 0.3
2 0.5 0.4 0.2 0.1
3 0.1 0.5 0.2 0.3
4 0.2 0.3 0.4 0.3
r <- c(0.2,0.4,0.1,0.3)
df2 = rbind.data.frame(r)
df2
X2 X4 X1 X3
1 0.2 0.4 0.1 0.3
b <- 0.15
result <- pnorm((qnorm(df1)+sqrt(b)*df2)/sqrt(1-b))
Output:
Getting an error:
Error in qnorm(df1) : Non-numeric argument to mathematical function
预期输出:
Output:
0.3139178 0.110853 0.1919158 0.3289671
0.5334785 0.4574897 0.1919158 0.1031127
0.0957727 0.5667216 0.1919158 0.3289671
0.2035948 0.3442989 0.4079641 0.3289671
实际上我有这 2 个数据帧 df1 和 df1,在 excel 中,我在 excel 中有一个公式,我需要将其转换为 R。
=NORMSDIST((NORMSINV(A1)+SQRT(0.15)*H1)/SQRT(1-0.15))
这里 A1 是 df1 的第一个值等等,H1 是 df2 的值等等。
您要做的是:对 df1
中的每一行应用一个函数。为此,我们需要编写一个函数。
getDist <- function(x, b = 0.15) {
pnormInput <- as.numeric((qnorm(as.numeric(x)) + sqrt(b) * df2) / sqrt(1 - b))
pnorm(pnormInput)
}
接下来我们将此函数应用于 df1
中的每一行(使用 apply
)。
result <- apply(df1, 1, function(x) getDist(x))
接下来我们必须转置 result
(翻转我们得到的 table)。
result <- t(result)
# [,1] [,2] [,3] [,4]
# [1,] 0.3139178 0.1108530 0.1919158 0.3289671
# [2,] 0.5334785 0.4574897 0.1919158 0.1031127
# [3,] 0.0957727 0.5667216 0.1919158 0.3289671
# [4,] 0.2035948 0.3442989 0.4079641 0.3289671
我认为这是一个典型的案例,试图在一行中执行许多操作,却忘记了每个函数在做什么。我的回答与@PoGibas 的回答基本相同,但更加明确但不够优雅。
我先单独算一下,然后再合并:
num1 <- apply(df1, 1, qnorm) # Apply 'qnorm' row-wise
num2 <- sqrt(b) * r # Add the constant sqrt(b) to vector r
num <- sweep(num1, 1, num2, "+") # Add the vector num2 row-wise to the dataframe num2
den <- sqrt(1-b) # den is a constant
result <- pnorm(num/den) # num is a data frame, which is elementwise divided by the constant den.
t(result)
通过逐步执行操作,您通常会更容易找到错误的根源。