簡體   English   中英

正態分布計算錯誤-數學函數的非數字參數

[英]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

實際上,我在Excel中有這兩個數據幀df1和df1,並且在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 (翻轉得到的表)。

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) 

通過逐步進行操作,您通常會更容易找到錯誤的來源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM