- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
R
有多个软件包,可帮助从统计模型输出中打印“漂亮”表(LaTeX/HTML/TEXT),并轻松比较替代模型规范的结果。
其中一些软件包是apsrtable
,xtable
,memisc
,texreg
,outreg
和stargazer
(示例请参见https://www.r-statistics.com/2013/01/stargazer-package-for-beautiful-latex-tables-from-r-statistical-models-output/)。
是否有支持R
包模型的可比h2o
包?
这是两个带有h2o
的简单GLM模型的示例,我希望将它们彼此并排打印为“美丽”表。
# Load package and setup h2o
library(h2o)
localH2O <- h2o.init(ip = 'localhost', port = 54321, max_mem_size = '4g')
# Load data
prostatePath <- system.file("extdata", "prostate.csv", package = "h2o")
prostate.hex <- h2o.importFile(path = prostatePath, destination_frame = "prostate.hex")
# Run GLMs
model.output.1 <- h2o.glm(y = "CAPSULE", x = c("RACE","PSA","DCAPS"),
training_frame = prostate.hex,family = "binomial", nfolds = 0,
alpha = 0.5, lambda_search = FALSE)
model.output.2 <- h2o.glm(y = "CAPSULE", x = c("AGE","RACE","PSA","DCAPS"),
training_frame = prostate.hex, family = "binomial", nfolds = 0,
alpha = 0.5, lambda_search = FALSE)
screenreg()
包中的
texreg
的常规GLM对象的外观:
library(data.table)
library(texreg)
d <- fread(prostatePath)
model.output.1.glm <- glm(CAPSULE ~ RACE + PSA + DCAPS, data=d)
model.output.2.glm <- glm(CAPSULE ~ AGE + RACE + PSA + DCAPS, data=d)
screenreg(list(model.output.1.glm, model.output.2.glm))
最佳答案
texreg
包作者在这里。 texreg
基于通用函数,这意味着任何用户都可以为任意模型添加自定义extract
方法,并使它们与texreg
一起使用。我将在下面引导您完成此过程。我希望这个详细的展览会帮助过去曾经问过类似问题的其他人设计自己的texreg
扩展名。
另请参见2013 paper in the Journal of Statistical Software中的第6节。但是,首先,我将描述texreg
体系结构如何更一般地工作,以使您了解可能的情况。texreg
和通用extract
函数
共有三个功能:texreg
(用于LaTeX输出),htmlreg
(用于HTML输出,在大多数使用场景下也可以由Word或Markdown解释)和screenreg
(用于控制台中的ASCII文本输出)。这三个功能用于将一些清理后的信息(系数,标准误差,置信区间,p值,拟合优度统计信息,模型标签等)转换为相应的输出格式。这并不完美,甚至可以更加灵活,但是我认为目前有很多自定义参数,包括对booktabs
和dcolumn
的支持。因此,最大的挑战是首先获得清理后的模型信息。
这可以通过为这三个函数中的任何一个提供texreg
对象来完成。 texreg
对象只是系数等的容器,并使用S4类正式定义。要创建texreg
对象,您可以使用构造函数createTexreg
(如帮助页面中所述),该函数接受所有不同的信息作为参数,例如标准错误等。或者(更好)您可以使用extract
函数从一些估计的模型中提取这些信息,并返回texreg
对象以与这三个函数中的任何一个一起使用。通常,您的方法是将几个模型的列表移交给texreg
或screenreg
等函数,此函数将在内部调用extract
来创建texreg
对象,然后处理这些对象中的信息。
但是,将extract
函数的调用输出保存到一个对象,可能会操纵该texreg
对象,然后在被操纵的对象上调用texreg
函数以将其显示为表同样有效。这样可以在调整结果时有一定的灵活性。
之前,我提到该程序包使用通用函数。这意味着extract
函数是通用的,因为您可以为其注册适用于任意类模型的方法。例如,如果extract
函数不知道如何处理h2o
对象以及如何从此类对象中提取相关信息,则可以编写一种方法来完成该操作,然后将其注册到extract
函数中。下面,我将逐步引导您完成该过程,希望人们可以从这个详细的博览会中学到东西并开始编写自己的扩展。 (注意:如果有人开发了一种有用的方法,请给我发送电子邮件,我可以将其包含在下一个texreg
版本中。)还值得指出的是,该包的源文件包含70多个extract
方法的示例,您可以使用这些示例可以用作模板。这些示例存储在文件R/extract.R
中。
标识类标签并设置extract
方法
第一步是识别对象的类名称。在您的示例中,class(model.output.1)
返回以下类标签:“H2OBinomialModel”和“h2o”。第一个标签是更具体的标签,第二个标签是更一般的标签。如果所有h2o
模型对象的结构都相似,则有必要编写h2o
对象的扩展名,然后在方法内决定如何继续使用特定模型。由于我对h2o
包几乎一无所知,因此我更喜欢在这种情况下以针对extract
对象的更特定的H2OBinomialModel
方法开始。如果我们希望以后可以进行调整。extract
方法的结构如下:您编写了一个名为extract.xyz
的函数(用类标签替换“xyz”),至少有一个名为model
的参数,该参数接受模型对象(例如,示例中的model.output.1
),并在其中添加了一些代码从model
对象提取相关信息的主体,使用texreg
构造函数创建createTexreg
对象,然后返回此对象。这是一个空容器:
extract.H2OBinomialModel <- function(model, ...) {
s <- summary(model)
# extract information from model and summary object here
# then create and return a texreg object (replace NULL with actual values):
tr <- createTexreg(
coef.names = NULL, # character vector of coefficient labels
coef = NULL, # numeric vector with coefficients
se = NULL, # numeric vector with standard error values
pvalues = NULL, # numeric vector with p-values
gof.names = NULL, # character vector with goodness-of-fit labels
gof = NULL, # numeric vector of goodness-of-fit statistics
gof.decimal = NULL # logical vector: GOF statistic has decimal points?
)
return(tr)
}
...
参数,该参数可用于应传递给
extract
方法内的函数调用的自定义参数。
s
的对象中。这通常很有用,因为许多软件包编写者决定将一些信息存储在摘要中的更简单版本中,因此通常应将模型及其摘要都视为有用的信息源。在某些情况下,可能需要查看相应程序包中summary方法的实际定义,以找出调用
summary
命令时如何计算显示在摘要页面上的信息,因为并非所有
summary
方法都存储不同的方法。显示在
summary
对象中的元素。
H2OBinomialModel
对象中找到正确的信息
model.output.1
的输出,我猜想以下部分应该构成表底部的GOF块:
MSE: 0.202947
R^2: 0.1562137
LogLoss: 0.5920097
Mean Per-Class Error: 0.3612191
AUC: 0.7185655
Gini: 0.4371311
Null Deviance: 512.2888
Residual Deviance: 449.9274
AIC: 457.9274
Coefficients: glm coefficients
names coefficients standardized_coefficients
1 Intercept -1.835223 -0.336428
2 RACE -0.625222 -0.193052
3 DCAPS 1.314428 0.408336
4 PSA 0.046861 0.937107
model.output.1
对象(或其适用的摘要)中找到所有这些内容。为此,有几个有用的命令。其中包括
str(model.output.1)
,
names(summary(model.output.1))
和类似的命令。
str(model)
将显示S4对象中存在一个名为
model
的插槽。我们可以通过调用
model.output.1@model
来查看其内容。结果是一个包含几个命名元素的列表,其中包括
coefficients_table
。因此,我们可以通过调用
model.output.1@model$coefficients_table
来访问系数表。结果是一个数据框,我们可以使用
$
运算符访问其列。特别是,我们需要名称和系数。这里有两种类型的系数,标准化的和非标准化的,以后我们可以在我们的提取方法中添加一个参数,让用户决定他或她想要什么。这是我们提取系数及其标签的方法:
coefnames <- model.output.1@model$coefficients_table$names
coefs <- model.output.1@model$coefficients_table$coefficients
coefs.std <- model.output.1@model$coefficients_table$standardized_coefficients
R
中的任何现有函数名,例如
names
或
coef
。尽管这样做在技术上应该可行,因为代码是在以后的函数中执行的,但是在尝试时很容易导致混淆,因此您最好避免这种情况。
str(model.output.1)
的输出,我们看到拟合优度统计信息包含在
model@model$training_metrics@metrics
下的几个插槽中。让我们将它们保存到一些更易于访问的对象中:
mse <- model.output.1@model$training_metrics@metrics$MSE
r2 <- model.output.1@model$training_metrics@metrics$r2
logloss <- model.output.1@model$training_metrics@metrics$logloss
mpce <- model.output.1@model$training_metrics@metrics$mean_per_class_error
auc <- model.output.1@model$training_metrics@metrics$AUC
gini <- model.output.1@model$training_metrics@metrics$Gini
nulldev <- model.output.1@model$training_metrics@metrics$null_deviance
resdev <- model.output.1@model$training_metrics@metrics$residual_deviance
aic <- model.output.1@model$training_metrics@metrics$AIC
nobs(model)
),AIC(
AIC(model)
),BIC(
BIC(model)
),偏差(
deviance(model)
) ,或对数似然(
logLik(model)[[1]]
)。因此,您可能首先要尝试这些。但是
h2o
包似乎没有提供这种方便的方法。
extract.H2OBinomialModel
函数
extract.H2OBinomialModel
函数中。
texreg
对象中。
s <- summary(model)
行,这是因为实际上我们不需要摘要中的任何信息,因为我们在模型对象中找到了所需的一切。
# extension for H2OBinomialModel objects (h2o package)
extract.H2OBinomialModel <- function(model, standardized = FALSE,
include.mse = TRUE, include.rsquared = TRUE, include.logloss = TRUE,
include.meanerror = TRUE, include.auc = TRUE, include.gini = TRUE,
include.deviance = TRUE, include.aic = TRUE, ...) {
# extract coefficient table from model:
coefnames <- model@model$coefficients_table$names
if (standardized == TRUE) {
coefs <- model@model$coefficients_table$standardized_coefficients
} else {
coefs <- model@model$coefficients_table$coefficients
}
# create empty GOF vectors and subsequently add GOF statistics from model:
gof <- numeric()
gof.names <- character()
gof.decimal <- logical()
if (include.mse == TRUE) {
mse <- model@model$training_metrics@metrics$MSE
gof <- c(gof, mse)
gof.names <- c(gof.names, "MSE")
gof.decimal <- c(gof.decimal, TRUE)
}
if (include.rsquared == TRUE) {
r2 <- model@model$training_metrics@metrics$r2
gof <- c(gof, r2)
gof.names <- c(gof.names, "R^2")
gof.decimal <- c(gof.decimal, TRUE)
}
if (include.logloss == TRUE) {
logloss <- model@model$training_metrics@metrics$logloss
gof <- c(gof, logloss)
gof.names <- c(gof.names, "LogLoss")
gof.decimal <- c(gof.decimal, TRUE)
}
if (include.meanerror == TRUE) {
mpce <- model@model$training_metrics@metrics$mean_per_class_error
gof <- c(gof, mpce)
gof.names <- c(gof.names, "Mean Per-Class Error")
gof.decimal <- c(gof.decimal, TRUE)
}
if (include.auc == TRUE) {
auc <- model@model$training_metrics@metrics$AUC
gof <- c(gof, auc)
gof.names <- c(gof.names, "AUC")
gof.decimal <- c(gof.decimal, TRUE)
}
if (include.gini == TRUE) {
gini <- model@model$training_metrics@metrics$Gini
gof <- c(gof, gini)
gof.names <- c(gof.names, "Gini")
gof.decimal <- c(gof.decimal, TRUE)
}
if (include.deviance == TRUE) {
nulldev <- model@model$training_metrics@metrics$null_deviance
resdev <- model@model$training_metrics@metrics$residual_deviance
gof <- c(gof, nulldev, resdev)
gof.names <- c(gof.names, "Null Deviance", "Residual Deviance")
gof.decimal <- c(gof.decimal, TRUE, TRUE)
}
if (include.aic == TRUE) {
aic <- model@model$training_metrics@metrics$AIC
gof <- c(gof, aic)
gof.names <- c(gof.names, "AIC")
gof.decimal <- c(gof.decimal, TRUE)
}
# create texreg object:
tr <- createTexreg(
coef.names = coefnames,
coef = coefs,
gof.names = gof.names,
gof = gof,
gof.decimal = gof.decimal
)
return(tr)
}
gof.decimal
逻辑向量为每个GOF统计信息指示其是否具有小数位(
TRUE
)(例如,观察数中为
FALSE
)。
extract
功能的方法。这是使用一个简单的命令完成的:
setMethod("extract", signature = className("H2OBinomialModel", "h2o"),
definition = extract.H2OBinomialModel)
className
的第一个参数是类标签,第二个参数是在其中定义类的包。
H2OBinomialModel
版本1.36.13中添加了
texreg
方法,该方法在CRAN上可用。
texreg
版本,因为以前的版本无法处理既没有标准错误也没有置信区间的模型。我认为这是一个相当专业的设置,我没有遇到过一个仅提供估计值而没有任何不确定性度量的程序包。我现在已经在
texreg
中修复了这个问题。
extract
方法
setMethod
命令,就可以使用以下命令创建表:
screenreg(list(model.output.1, model.output.2), custom.note = "")
======================================
Model 1 Model 2
--------------------------------------
Intercept -1.84 -1.11
RACE -0.63 -0.62
DCAPS 1.31 1.31
PSA 0.05 0.05
AGE -0.01
--------------------------------------
MSE 0.20 0.20
R^2 0.16 0.16
LogLoss 0.59 0.59
Mean Per-Class Error 0.36 0.38
AUC 0.72 0.72
Gini 0.44 0.44
Null Deviance 512.29 512.29
Residual Deviance 449.93 449.51
AIC 457.93 459.51
======================================
custom.note = ""
参数是有意义的,因为我们不需要重要的图例,因为模型没有报告任何不确定性度量。
screenreg(list(model.output.1, model.output.2), custom.note = "",
include.deviance = FALSE, include.auc = FALSE, standardized = TRUE)
======================================
Model 1 Model 2
--------------------------------------
Intercept -0.34 -0.34
RACE -0.19 -0.19
DCAPS 0.41 0.41
PSA 0.94 0.94
AGE -0.07
--------------------------------------
MSE 0.20 0.20
R^2 0.16 0.16
LogLoss 0.59 0.59
Mean Per-Class Error 0.36 0.38
Gini 0.44 0.44
AIC 457.93 459.51
======================================
createTexreg
一起使用的其他插槽
createTexreg
构造函数在任何
extract
方法中调用。上面的示例显示了一些简单的信息。除了示例中包含的详细信息之外,
texreg
对象中还提供了以下插槽:
texreg
对象
screenreg
,
texreg
或
htmlreg
函数之外,还可以先将提取的信息保存到
texreg
对象,然后在显示或保存表之前对其进行操作。附加值是,即使对表进行复杂的更改也很容易以这种方式应用。例如,可以重命名系数或GOF统计信息,添加新行,重命名模型,修改值或更改系数或GOF统计信息的顺序。您可以按照以下方法进行操作:首先,调用
extract
函数将信息保存到
texreg
对象:
tr <- extract(model.output.1)
texreg
来显示
tr
对象的内容,这将显示以下输出:
No standard errors and p-values were defined for this texreg object.
coef.
Intercept -1.83522343
RACE -0.62522179
DCAPS 1.31442834
PSA 0.04686106
GOF dec. places
MSE 0.2029470 TRUE
R^2 0.1562137 TRUE
LogLoss 0.5920097 TRUE
Mean Per-Class Error 0.3612191 TRUE
AUC 0.7185655 TRUE
Gini 0.4371311 TRUE
Null Deviance 512.2888402 TRUE
Residual Deviance 449.9273825 TRUE
AIC 457.9273825 TRUE
str(tr)
所示:
Formal class 'texreg' [package "texreg"] with 10 slots
..@ coef.names : chr [1:4] "Intercept" "RACE" "DCAPS" "PSA"
..@ coef : num [1:4] -1.8352 -0.6252 1.3144 0.0469
..@ se : num(0)
..@ pvalues : num(0)
..@ ci.low : num(0)
..@ ci.up : num(0)
..@ gof.names : chr [1:9] "MSE" "R^2" "LogLoss" "Mean Per-Class Error" ...
..@ gof : num [1:9] 0.203 0.156 0.592 0.361 0.719 ...
..@ gof.decimal: logi [1:9] TRUE TRUE TRUE TRUE TRUE TRUE ...
..@ model.name : chr(0)
tr@gof.names <- c(tr@gof.names, "new statistic")
tr@gof <- c(tr@gof, 12)
tr@gof.decimal <- c(tr@gof.decimal, FALSE)
tr@coef.names <- tr@coef.names[c(4, 1, 2, 3)]
tr@coef <- tr@coef[c(4, 1, 2, 3)]
texreg
对象而不是原始模型,例如
screenreg
:
screenreg(list(tr, model.output.2), custom.note = "")
======================================
Model 1 Model 2
--------------------------------------
PSA 0.05 0.05
Intercept -1.84 -1.11
RACE -0.63 -0.62
DCAPS 1.31 1.31
AGE -0.01
--------------------------------------
MSE 0.20 0.20
R^2 0.16 0.16
LogLoss 0.59 0.59
Mean Per-Class Error 0.36 0.38
AUC 0.72 0.72
Gini 0.44 0.44
Null Deviance 512.29 512.29
Residual Deviance 449.93 449.51
AIC 457.93 459.51
new statistic 12
======================================
texreg
可以由用户自定义。只需编写上面显示的提取方法,然后使用
setMethods
调用进行注册即可。我已经在
latest H2OBinomialModel
version 1.36.13中包括了
texreg
方法,以及一个用于修正使用没有标准错误(例如此错误)的模型的错误修正。
关于r - 在R中为H2O模型打印 “pretty”表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38894044/
在使用 requests 库中的状态代码时,我遇到了一些奇怪的事情。每个 HTTP 状态代码都有一个常量,有些具有别名(例如,包括 200 的复选标记): url = 'https://httpbin
这是我得到的代码,但我不知道这两行是什么意思: o[arr[i]] = o[arr[i]] || {}; o = o[arr[i]]; 完整代码: var GLOBAL={}; GLOBAL.name
所以这个问题的答案What is the difference between Θ(n) and O(n)? 指出“基本上,当我们说算法是 O(n) 时,它也是 O(n2)、O(n1000000)、O
这是一个快速的想法;有人会说 O(∞) 实际上是 O(1) 吗? 我的意思是它不依赖于输入大小? 所以在某种程度上它是恒定的,尽管它是无限的。 或者是唯一“正确”的表达方式 O(∞)? 最佳答案 无穷
这是真的: log(A) + log(B) = log(A * B) [0] 这也是真的吗? O(log(A)) + O(log(B)) = O(log(A * B)) [1] 据我了解 O(f
我正在解决面试练习的问题,但我似乎无法找出以下问题的时间和空间复杂度的答案: Given two sorted Linked Lists, merge them into a third list i
我了解 Big-Oh 表示法。但是我该如何解释 O(O(f(n))) 是什么意思呢?是指增长率的增长率吗? 最佳答案 x = O(n)基本上意味着 x <= kn对于一些常量 k . 因此 x = O
我正在编写一个函数,该函数需要一个对象和一个投影来了解它必须在哪个字段上工作。 我想知道是否应该使用这样的字符串: const o = { a: 'Hello There' }; funct
直觉上,我认为这三个表达式是等价的。 例如,如果一个算法在 O(nlogn) + O(n) 或 O(nlogn + n) 中运行(我很困惑),我可以假设这是一个O(nlogn) 算法? 什么是真相?
根据 O'Reilly 的 Python in a Nutshell 中的 Alex Martelli,复杂度类 O(n) + O(n) = O(n)。所以我相信。但是我很困惑。他解释说:“N 的两个
O(n^2)有什么区别和 O(n.log(n)) ? 最佳答案 n^2 的复杂性增长得更快。 关于big-o - 大 O 符号 : differences between O(n^2) and O(n
每当我收到来自 MS outlook 的电子邮件时,我都会收到此标记 & nbsp ; (没有空格)哪个显示为?在 <>. 当我将其更改为 ISO-8859-1 时,浏览器页面字符集编码为 UTF-8
我很难理解 Algorithms by S. Dasgupta, C.H. Papadimitriou, and U.V. Vazirani - page 24 中的以下陈述它们将 O(n) 的总和表
我在面试蛋糕上练习了一些问题,并在问题 2给出的解决方案使用两个单独的 for 循环(非嵌套),解决方案提供者声称他/她在 O(n) 时间内解决了它。据我了解,这将是 O(2n) 时间。是我想错了吗,
关于 Java 语法的幼稚问题。什么 T accept(ObjectVisitorEx visitor); 是什么意思? C# 的等价物是什么? 最佳答案 在 C# 中它可能是: O Accept(
假设我有一个长度为 n 的数组,我使用时间为 nlogn 的排序算法对它进行了排序。得到这个排序后的数组后,我遍历它以找到任何具有线性时间的重复元素。我的理解是,由于操作是分开发生的,所以时间是 O(
总和 O(1)+O(2)+ .... +O(n) 的计算结果是什么? 我在某处看到它的解决方案: O(n(n+1) / 2) = O(n^2) 但我对此并不满意,因为 O(1) = O(2) = co
这个问题在这里已经有了答案: 11 年前关闭。 Possible Duplicate: Plain english explanation of Big O 我想这可能是类里面教的东西,但作为一个自学
假设我有两种算法: for (int i = 0; i 2)更长的时间给定的一些n - 其中n这种情况的发生实际上取决于所涉及的算法 - 对于您的具体示例, n 2)分别时间,您可能会看到: Θ(n)
这个问题在这里已经有了答案: Example of a factorial time algorithm O( n! ) (4 个回答) 6年前关闭。 我见过表示为 O(X!) 的 big-o 示例但
我是一名优秀的程序员,十分优秀!