Формат отображения модели в формате texreg или stargazer R как научный
Я только что запустил статистическую модель, и я хочу, чтобы она отображала результаты модели в виде таблицы, используя Stargazer. Тем не менее, большие цифры отображаются в полном объеме.
fit2<-lm(A~B,data=C)
stargazer(fit2,type="text")
С этой таблицей как результат
===================================================
Dependent variable:
-------------------------------
A
---------------------------------------------------
B -0.599
(1.698)
32,126,391.000
(24,004,268.000)
---------------------------------------------------
Observations 5
R2 0.040
Adjusted R2 -0.280
Residual Std. Error 31,217,258.000 (df = 3e+00)
F Statistic 0.124 (df = 1e+00; 3e+00)
===================================================
Note: *p<1e-01; **p<5e-02; ***p<1e-02
Как я могу получить большие цифры, отображаемые как научные, то есть: 3.12e+07, пожалуйста? Я пытался:
options("scipen"=-20,"digit"=2)
fit1<-format(lm(A~B,data=C),scientific=T)
Это, однако, приводит к тому, что сводная информация о модели искажается и отображается в виде одной строки. Каковы наилучшие способы форматирования чисел и сохранения структуры таблицы, пожалуйста?
CO NO2 SM
Dec 2004 2.750000e+18 1.985136e+15 0.2187433
Jan 2005 2.980000e+18 2.144211e+15 0.1855678
Feb 2005 2.810000e+18 1.586491e+15 0.1764805
Dec 2005 3.010000e+18 1.755409e+15 0.2307153
Jan 2006 3.370000e+18 2.205888e+15 0.2046671
Feb 2006 3.140000e+18 2.084682e+15 0.1834232
Dec 2006 2.940000e+18 1.824735e+15 0.1837391
Jan 2007 3.200000e+18 2.075785e+15 0.1350665
Feb 2007 3.060000e+18 1.786481e+15 0.1179924
Dec 2007 2.750000e+18 1.645800e+15 0.2037340
Jan 2008 3.030000e+18 1.973517e+15 0.1515871
Feb 2008 3.040000e+18 1.753803e+15 0.1289968
Dec 2008 2.800000e+18 1.649315e+15 0.1968024
Jan 2009 3.090000e+18 1.856762e+15 0.1630173
Feb 2009 2.880000e+18 1.610011e+15 0.1446938
Dec 2009 2.660000e+18 1.562971e+15 0.1986012
Jan 2010 2.864333e+18 1.733843e+15 0.1559205
Feb 2010 2.881474e+18 1.469982e+15 0.1397536
Dec 2010 2.730000e+18 1.652751e+15 0.2129476
Jan 2011 3.030000e+18 1.862774e+15 0.1681295
Feb 2011 2.850000e+18 1.658988e+15 0.1531579
1 ответ
Чтобы сделать это, вы можете написать свою собственную функцию, чтобы взять большие числа и поместить их в научную запись.
Сначала загрузите stargazer
пакет:
library(stargazer)
Затем создайте данные с большими числами для примера:
set.seed(1)
C <- data.frame("A" = rnorm(10000, 30000, 10000),
"B" = rnorm(10000, 7500, 2500))
Установите модель и сохраните stargazer
таблица результатов в объекте:
fit2 <- lm(A ~ B, data = C)
myResults <- stargazer(fit2, type = "text")
Создать функцию, чтобы взять stargazer
таблица и преобразовать большие числа в научную запись. (Это не очень гибко, но может быть с простыми модификациями. Сейчас работает только на 1000 - 99 999)
fixNumbers <- function(stargazer.object){
so <- stargazer.object
rows <- grep(".*[\\d+],[\\d+].*", so, perl = T)
for(row in rows){
# Get number and format into scientific notation
number <- as.numeric(sub(".*([0-9]{1,2}),([0-9]+\\.?[0-9]*).*", "\\1\\2", so[row], perl = T))
formatted_num <- sprintf("%.2e", number)
so[row] <- sub("(.*)[0-9]{1,2},[0-9]+\\.?[0-9]*(.*)", paste0("\\1", formatted_num, "\\2"), so[row], perl = T)
}
# Print result
for(i in 1:length(so)){
cat(so[i], "\n")
}
}
Дайте новую функцию (fixNumbers
) твой stargazer
объект:
fixNumbers(myResults)
Вот код всего в одном куске:
library(stargazer)
set.seed(1)
C <- data.frame("A" = rnorm(10000, 30000, 10000),
"B" = rnorm(10000, 7500, 2500))
fit2 <- lm(A ~ B, data = C)
myResults <- stargazer(fit2, type = "text")
fixNumbers <- function(stargazer.object){
so <- stargazer.object
rows <- grep(".*[\\d+],[\\d+].*", so, perl = T)
for(row in rows){
# Get number and format into scientific notation
number <- as.numeric(sub(".*([0-9]{1,2}),([0-9]+\\.?[0-9]*).*", "\\1\\2", so[row], perl = T))
formatted_num <- sprintf("%.2e", number)
so[row] <- sub("(.*)[0-9]{1,2},[0-9]+\\.?[0-9]*(.*)", paste0("\\1", formatted_num, "\\2"), so[row], perl = T)
}
# Print result
for(i in 1:length(so)){
cat(so[i], "\n")
}
}
fixNumbers(myResults)
Следуя идее Адама К, но с немного большим количеством оптимизированных регулярных выражений (и используя векторизацию, что является хорошей идеей в R):
fit2<-lm(CO~NO2,data=df)
test <- stargazer(fit2,type="text",)
Это регулярное выражение из двух строк: вам нужно найти число (здесь более пяти чисел), которое представляет собой строку с номером, запятой и точками
m <- gregexpr("([0-9\\.,]{5,})", test)
вам нужно применить функцию преобразования к этому (здесь введите запятую, введите число и отобразите его в научной форме из 2 цифр. Вы также можете рассмотреть formatC
что дает много возможностей):
f = function(x){
sprintf("%.2e",as.numeric( gsub(",","",x)))
}
и вы применяете его к своему регулярному выражению, используя regmatches
функция
regmatches(test, m) <- lapply(regmatches(test, m), f)
test
[1] ""
[2] "========================================================"
[3] " Dependent variable: "
[4] " ------------------------------------"
[5] " CO "
[6] "--------------------------------------------------------"
[7] "NO2 6.26e+02** "
[8] " (2.41e+02) "
[9] " "
[10] "Constant 1.81e+18*** "
[11] " (4.62e+17) "
[12] " "
[13] "--------------------------------------------------------"
[14] "Observations 10 "
[15] "R2 4.58e-01 "
[16] "Adjusted R2 3.90e-01 "
[17] "Residual Std. Error 1.57e+17 (df = 8)"
[18] "F Statistic 6.76e+00** (df = 1; 8) "
[19] "========================================================"
[20] "Note: *p<0.1; **p<0.05; ***p<0.01"
Чтобы получить тот же вывод, что и оригинал:
print(as.data.frame(test),quote = F,row.names = FALSE)
test
========================================================
Dependent variable:
------------------------------------
CO
--------------------------------------------------------
NO2 6.26e+02**
(2.41e+02)
Constant 1.81e+18***
(4.62e+17)
--------------------------------------------------------
Observations 10
R2 4.58e-01
Adjusted R2 3.90e-01
Residual Std. Error 1.57e+17 (df = 8)
F Statistic 6.76e+00** (df = 1; 8)
========================================================
Note: *p<0.1; **p<0.05; ***p<0.01
данные:
df <- read.table(text = "
CO NO2 SM
2.750000e+18 1.985136e+15 0.2187433
2.980000e+18 2.144211e+15 0.1855678
2.810000e+18 1.586491e+15 0.1764805
3.010000e+18 1.755409e+15 0.2307153
3.370000e+18 2.205888e+15 0.2046671
3.140000e+18 2.084682e+15 0.1834232
2.940000e+18 1.824735e+15 0.1837391
3.200000e+18 2.075785e+15 0.1350665
3.060000e+18 1.786481e+15 0.1179924
2.750000e+18 1.645800e+15 0.2037340",header = T)
Проблема не в том, что эти пакеты не могут отображать научную запись. Проблема скорее в том, что ваши независимые переменные имеют чрезвычайно малый масштаб. Вы должны изменить их масштаб, прежде чем использовать их в своей модели, умножив значения на некоторую константу. Например, когда вы имеете дело с размерами людей в километрах, вы можете захотеть изменить их размеры до метров или сантиметров. Это сделало бы таблицу намного легче читать, чем отображать результаты в научной записи.
Рассмотрим следующий пример:
a <- c(4.17, 5.58, 5.18, 6.11, 4.50, 4.61, 5.17, 4.53, 5.33, 5.14)
b <- c(0.00020, 0.00024, 0.00024, 0.00026, 0.00021, 0.00022, 0.00023,
0.00022, 0.00023, 0.00022)
model.1 <- lm(a ~ b)
Затем создайте свою таблицу с texreg
:
library("texreg")
screenreg(model.1)
Это приводит к следующей таблице:
=========================
Model 1
-------------------------
(Intercept) -2.27 *
(0.94)
b 32168.58 ***
(4147.00)
-------------------------
R^2 0.88
Adj. R^2 0.87
Num. obs. 10
=========================
*** p < 0.001, ** p < 0.01, * p < 0.05
Так что коэффициенты довольно большие. Давайте попробуем то же самое с stargazer
:
library("stargazer")
stargazer(model.1, type = "text")
Полученная таблица:
===============================================
Dependent variable:
---------------------------
a
-----------------------------------------------
b 32,168.580***
(4,146.999)
Constant -2.270**
(0.944)
-----------------------------------------------
Observations 10
R2 0.883
Adjusted R2 0.868
Residual Std. Error 0.212 (df = 8)
F Statistic 60.172*** (df = 1; 8)
===============================================
Note: *p<0.1; **p<0.05; ***p<0.01
Та же проблема: большие коэффициенты. Теперь измените масштаб вашей исходной переменной b
и пересчитать модель:
b <- b * 10000
model.2 <- lm(a ~ b)
Попробуйте еще раз с texreg
:
screenreg(model.2)
======================
Model 1
----------------------
(Intercept) -2.27 *
(0.94)
b 3.22 ***
(0.41)
----------------------
R^2 0.88
Adj. R^2 0.87
Num. obs. 10
======================
*** p < 0.001, ** p < 0.01, * p < 0.05
И с stargazer
:
stargazer(model.2, type = "text")
===============================================
Dependent variable:
---------------------------
a
-----------------------------------------------
b 3.217***
(0.415)
Constant -2.270**
(0.944)
-----------------------------------------------
Observations 10
R2 0.883
Adjusted R2 0.868
Residual Std. Error 0.212 (df = 8)
F Statistic 60.172*** (df = 1; 8)
===============================================
Note: *p<0.1; **p<0.05; ***p<0.01
Теперь коэффициенты выглядят лучше, и вам не нужны научные обозначения.