Stargazer为lm(和其他)物体生产非常漂亮的乳胶桌.假设我按最大可能性拟合模型.我希望观星者为我的估计生成一个类似于lm的表格.我怎样才能做到这一点?
虽然它有点hacky,但有一种方法可能是创建一个包含我的估计值的"假"lm对象 - 我认为只要summary(my.fake.lm.object)有效,它就会起作用.那容易行吗?
一个例子:
library(stargazer)
N <- 200
df <- data.frame(x=runif(N, 0, 50))
df$y <- 10 + 2 * df$x + 4 * rt(N, 4) # True params
plot(df$x, df$y)
model1 <- lm(y ~ x, data=df)
stargazer(model1, title="A Model") # I'd like to produce a similar table for the model below
ll <- function(params) {
## Log likelihood for y ~ x + student's t errors
params <- as.list(params)
return(sum(dt((df$y - params$const - params$beta*df$x) / params$scale, df=params$degrees.freedom, log=TRUE) - …
Run Code Online (Sandbox Code Playgroud) 假设我有一个创建数据帧的函数.我想用不同的输入值运行该函数,然后将结果整合到一个大数据框中,如下所示:
CreateDataFrame <- function(type="A", n=10, n.true=8) {
data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type)
}
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame))
Run Code Online (Sandbox Code Playgroud)
我的CreateDataFrame函数有三个参数.在上面的示例中,第二个和第三个参数保持不变.我想像上面一样做,但每次调用都会改变第二个和第三个参数.我想我必须使用mapply,像这样:
mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)
Run Code Online (Sandbox Code Playgroud)
我遇到了麻烦,因为mapply没有返回列表,这阻止了我运行do.call(rbind, mapply(...))
.我怎么能得到一个数据框,就像我在顶部的例子中所做的那样?
看起来mapply正在返回一个列表矩阵.我期待它返回一个数据框列表.我该怎么办?
我正在尝试在app引擎网站上使用recorderjs,用户上传短音频录音(比如说,长达1到12秒).我注意到我上传的WAV文件比我预期的要大得多.例如,我刚刚创建了一个持续大约9秒的记录,上传的blob是1736769字节,大于1.5兆字节.
题:
如何修改recorderjs代码(或我自己的代码 - 也许我正在使用recorderjs),以便我的音频blob具有较低的比特率?我希望10秒钟的录音能够安全地低于1 MB.
我的猜测是我需要在这里修改encodeWAV函数,或者可能是exportWAV,但我不确定如何.在exportWAV中删除交错缓冲区的每个其他元素是否有意义?有更聪明的方法吗?导出的WAV的比特率如何取决于我的计算机的属性(例如我的声卡的采样率)?
如果它可能有用,我可以在我自己的代码上添加一些细节.
编辑:如果您想查看实际示例,请安装Google Chrome测试版并尝试此页面.在我的电脑上,5-10秒长的录音超过1 MB.
非常感谢,
阿德里安
为什么
f <- function(a) {
g <- function(a=a) {
return(a + 2)
}
return(g())
}
f(3) # Error in a + 2: 'a' is missing
Run Code Online (Sandbox Code Playgroud)
导致错误?它与a = a参数有关,特别是与变量名相同的事实.到底发生了什么?
以下是一些按预期工作的类似代码:
f <- function(a) {
g <- function(a) {
return(a + 2)
}
return(g(a))
}
f(3) # 5
f <- function(a) {
g <- function(g_a=a) {
return(g_a + 2)
}
return(g())
}
f(3) # 5
g <- function(a) a + 2
f <- function(a) g(a)
f(3) # 5
Run Code Online (Sandbox Code Playgroud) 我想在R中的函数中调用predict(...).我遇到了一些与范围有关的问题,但我无法弄清楚什么是错的或如何解决它.有人可以帮忙吗?例:
df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60))
summary(df)
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df)
summary(logit.model)
PredictOnNewData <- function() {
df <- data.frame(x=51:100)
df$probability <- round(predict(logit.model, df, type="response"), digits=3)
return(df)
}
PredictOnNewData()
Run Code Online (Sandbox Code Playgroud)
最后一行失败了:
错误
$<-.data.frame
(*tmp*
,"概率",值= c(0.274,0.282,:替换有20行,数据有50个另外:警告消息:'newdata'有50行但找到的变量有20行
如果我正确理解错误消息,它看起来像我传递给预测的df对象(...)被评估为父/全局环境中的df.那一行有20行,用于训练.但我希望调用预测(...)在另一个 df数据框上进行评估- 我在PredictOnNewData函数中创建的数据框.如何实现(不更改数据框的名称)?
[现在我重读了这篇文章 - 我向后看了吗?在行中(df $ probability < - ...),其中一个dfs正在以错误的方式进行评估,但是它是哪个?
我也试过get("df",envir = sys.frame()),明确想要在当前函数框架中定义的df对象:
PredictOnNewData <- function() {
df <- data.frame(x=51:100)
# df$probability <- round(predict(logit.model, df, type="response"), digits=3)
df$probability <- round(predict(logit.model, get("df", envir=sys.frame()), type="response"), digits=3)
return(df)
}
PredictOnNewData() …
Run Code Online (Sandbox Code Playgroud) 我想强制facet_wrap从左上角填充,但总是完全填充底行.(也就是说,从左上角加上完全填充底行所需的水平偏移量.)
library(ggplot2)
n <- 1000
df <- data.frame(x=runif(n), y=rnorm(n), label=sample(letters[1:7], size=n, replace=TRUE))
df$label.rev <- factor(df$label, levels=sort(unique(df$label), decreasing=TRUE))
p <- ggplot(df, aes(x=x, y=y)) + geom_point()
p1 <- p + facet_wrap(~ label, ncol=3)
p2 <- p + facet_wrap(~ label, ncol=3, as.table=FALSE)
p3 <- p + facet_wrap(~ label.rev, ncol=3, as.table=FALSE)
Run Code Online (Sandbox Code Playgroud)
p1:我很满意标签的从左到右,从上到下排序,但我希望间隙位于左上角而不是右下角.
p2:Gap现在位于顶行(不幸的是,右上角而不是左上角),但标签顺序错误.
p3:与p2相似; 尝试修复标签订单,但失败了.
我想要像这样订购方面:
_ _ A
B C D
E F G
Run Code Online (Sandbox Code Playgroud)
...所以沿整个底行都有轴,因为我觉得它看起来比默认更好.我怎样才能做到这一点?
假设我有一个pandas数据帧和一个我想要应用于每一行的函数.我可以打电话df.apply(apply_fn, axis=1)
,这应该花费时间线性的大小df
.或者我可以拆分df
并使用pool.map
在每个部分上调用我的函数,然后连接结果.
我期望使用的加速因子pool.map
大致等于池中的进程数(new_execution_time = original_execution_time/N,如果使用N个处理器 - 并且假设零开销).
相反,在这个玩具示例中,使用4个处理器时,时间下降到2%左右(0.005272/0.230757).我最多只期望25%.发生了什么事,我不理解什么?
import numpy as np
from multiprocessing import Pool
import pandas as pd
import pdb
import time
n = 1000
variables = {"hello":np.arange(n), "there":np.random.randn(n)}
df = pd.DataFrame(variables)
def apply_fn(series):
return pd.Series({"col_5":5, "col_88":88,
"sum_hello_there":series["hello"] + series["there"]})
def call_apply_fn(df):
return df.apply(apply_fn, axis=1)
n_processes = 4 # My machine has 4 CPUs
pool = Pool(processes=n_processes)
t0 = time.process_time()
new_df = df.apply(apply_fn, axis=1)
t1 = time.process_time()
df_split …
Run Code Online (Sandbox Code Playgroud) 我用 ViewPager 制作了一个非常简单的 Android 拼图应用程序,让用户可以浏览一系列拼图。我在生产中看到一个错误,我不知道如何重现或调试:
java.lang.IllegalStateException:
at android.support.v4.view.ViewPager.a (ViewPager.java:204)
at android.support.v4.view.ViewPager.c (ViewPager.java:2)
at android.support.v4.view.ViewPager.onMeasure (ViewPager.java:207)
at android.view.View.measure (View.java:22002)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6580)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:185)
at android.view.View.measure (View.java:22002)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6580)
at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure (ActionBarOverlayLayout.java:257)
at android.view.View.measure (View.java:22002)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6580)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:185)
at android.view.View.measure (View.java:22002)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6580)
at android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical (LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure (LinearLayout.java:685)
at android.view.View.measure (View.java:22002)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6580)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure (DecorView.java:721)
at android.view.View.measure (View.java:22002)
at android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:2414)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2159)
at android.view.ViewRootImpl.doTraversal …
Run Code Online (Sandbox Code Playgroud) 我是HTML,Javascript和公司的新手,所以请原谅我提出一个可能很明显的问题.
我想建立一个webapp,用户可以上传音频和一些自己的信息.我有一个看起来像这样的表单:
<form method="post" action="/add_recording" enctype="multipart/form-data">
<label>Name: </label>
<input type="text" name="user_name" maxlength="20" size="20" value="Joe">
<br>
<label>Audio File: </label>
<input type="file" name="user_audio"/>
<br>
<input value="Upload" type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
这可行,但它不是非常用户友好:人们必须弄清楚如何创建自己的音频文件,即使他们知道如何,这很烦人.我想允许用户在浏览器中录制.我找到了https://github.com/mattdiamond/Recorderjs和http://webaudiodemos.appspot.com/AudioRecorder/index.html,这看起来非常酷(暂时忽略了它们只适用于最新版本的铬,据我所知).
我的问题是:我如何修改recorderjs代码,以便记录的blob自动上传到我的表单中,用户无需下载文件并通过单击type ="file"输入手动浏览到它?
我的网络开发技能非常有限,所以我非常感谢任何帮助.我的第一个猜测是自动将音频blob下载到我选择的文件名,并修改表单中的type ="file"输入指向那里,但显然这是不可能的(从我在例如如何设置值中看到的以HTML格式输入文件?).
谢谢,
阿德里安
编辑:这里有一个类似的问题:RecorderJS通过AJAX上传记录的blob.我的问题的一个解决方案是学习AJAX并按照该问题的答案.不过,我有兴趣知道是否有任何方法可以使用老式文件输入(或更普遍的html格式)上传recorderjs音频.
有人可以解释为什么以下代码片段的行为与它一样吗?
l <- list()
AddFn <- function(str) { l[[length(l) + 1]] <<- function() { return(str) }}
AddFn("hello")
AddFn("there")
l[[1]]() # Returns "hello" as expected
l[[2]]() # Returns "there" as expected
for (letter in letters) AddFn(letter)
l[[3]]() # Returns "z"
Run Code Online (Sandbox Code Playgroud)
我期望l[[3]]()
回归"a".我错过了什么?我的AddFn函数究竟做了什么?
先感谢您,
阿德里安
我在R中做了一些优化,与此相关,我需要编写一个返回jacobian的函数.这是一个非常简单的雅各比 - 只有零和一个 - 但我想快速干净地填充它.我目前的代码有效,但非常草率.
我有一个四维概率阵列.索引尺寸i, j, k, l
.我的约束是,对于每个i, j, k
,索引上的概率总和l
必须等于1.
我像这样计算我的约束向量:
get_prob_array_from_vector <- function(prob_vector, array_dim) {
return(array(prob_vector, array_dim))
}
constraint_function <- function(prob_vector, array_dim) {
prob_array <- get_prob_array_from_vector(prob_vector, array_dim)
prob_array_sums <- apply(prob_array, MARGIN=c(1, 2, 3), FUN=sum)
return(as.vector(prob_array_sums) - 1) # Should equal zero
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:什么是计算jacobian的干净,快速的方法as.vector(apply(array(my_input_vector, array_dim), MARGIN=c(1, 2, 3), FUN=sum))
- 即,我constraint_function
在上面的代码中 - 关于my_input_vector
?
这是我的草率解决方案(我从numDeriv包中检查了jacobian函数的正确性):
library(numDeriv)
array_dim <- c(5, 4, 3, 3)
get_prob_array_from_vector <- function(prob_vector, array_dim) …
Run Code Online (Sandbox Code Playgroud) 我有两个 github 存储库(称为 A 和 B),它们都有一个.github/workflows/build_and_test.yml
看起来几乎与此相同的文件:
name: Build and test
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-with-docker:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- uses: docker/setup-buildx-action@v2
- uses: docker/build-push-action@v3
with:
tags: my_tag:latest
load: true
context: .
cache-from: type=gha
cache-to: type=gha,mode=max
- run: docker run my_tag pytest
Run Code Online (Sandbox Code Playgroud)
在回购协议A中
Dockerfile
是r-base:4.2.1
,大约 782MBdocker run my_tag pytest
运行,一切都很好)在仓库 B 中
Dockerfile
是pytorch/pytorch
,大约 5.82GB我想将一个函数应用于数据帧的每一行,如下所示.我知道如何在数据框只包含数字的情况下使用apply,但是如果行包含booleans/logicals,字符串和整数呢?例:
df <- data.frame(x=1:10,
y=c(TRUE, FALSE),
z=letters[1:10],
stringsAsFactors=FALSE)
RowFunction <- function(row) {
if (row$y) return(row$x)
return (row$z)
}
sapply(1:dim(df)[1], function(i) { RowFunction(df[i, ]) })
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?我的第一个想法是apply(df, 1, RowFunction)
在添加row <- as.list(row)
到RowFunction的开头之后使用,但这不起作用,因为应用将df强制转换为数组,该数组无法处理包含不同数据类型的行.
仅仅为了我的R知识,我想知道是否有更清洁的方法来做到这一点sapply(1:dim(df)[1], ... )
.有任何想法吗?
提前致谢!